diff --git a/go.mod b/go.mod index 401c6b06..af4b21e0 100644 --- a/go.mod +++ b/go.mod @@ -13,6 +13,7 @@ require ( github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 // indirect github.com/corpix/uarand v0.1.1 github.com/derekparker/trie v0.0.0-20200317170641-1fdf38b7b0e9 + github.com/gobwas/glob v0.2.3 github.com/gorilla/css v1.0.0 github.com/mafredri/cdp v0.30.0 github.com/natefinch/lumberjack v2.0.0+incompatible diff --git a/go.sum b/go.sum index 863f2f8e..20700fa2 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,4 @@ +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/Masterminds/glide v0.13.2/go.mod h1:STyF5vcenH/rUqTEv+/hBXlSTo7KYwg2oc2f4tzPWic= github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= @@ -13,9 +14,11 @@ github.com/antchfx/xpath v1.1.11 h1:WOFtK8TVAjLm3lbgqeP0arlHpvCEeTANeWZ/csPpJkQ= github.com/antchfx/xpath v1.1.11/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= github.com/antlr/antlr4 v0.0.0-20200417160354-8c50731894e0 h1:j7MyDjg6pb7A2ziow17FDZ2Oj5vGnJsLyDmjpN4Jkcg= github.com/antlr/antlr4 v0.0.0-20200417160354-8c50731894e0/go.mod h1:T7PbCXFs94rrTttyxjbyT5+/1V8T2TYDejxUfHJjw1Y= +github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/codegangsta/cli v1.20.0/go.mod h1:/qJNoX69yVSKu5o4jLyXAENLRyk1uhi7zkbQ3slBdOA= @@ -24,43 +27,55 @@ github.com/corpix/uarand v0.1.1 h1:RMr1TWc9F4n5jiPDzFHtmaUXLKLNUFK0SgCLo4BhX/U= github.com/corpix/uarand v0.1.1/go.mod h1:SFKZvkcRoLqVRFZ4u25xPmp6m9ktANfbpXZ7SJ0/FNU= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/derekparker/trie v0.0.0-20200317170641-1fdf38b7b0e9 h1:G765iDCq7bP5opdrPkXk+4V3yfkgV9iGFuheWZ/X/zY= github.com/derekparker/trie v0.0.0-20200317170641-1fdf38b7b0e9/go.mod h1:D6ICZm05D9VN1n/8iOtBxLpXtoGp6HDFUJ1RNVieOSE= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/google/go-cmp v0.4.1 h1:/exdXoGamhu5ONeUJH0deniYLWYvQwW66yvlfiiKTu0= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mafredri/cdp v0.30.0 h1:Lvcwjajq6wB6Uk8dYeCLrF26LG85rUdpMxgrwdEvU0o= github.com/mafredri/cdp v0.30.0/go.mod h1:71D84qPmWUvBWYj24Zp+U69mrUof4o8qL2X1fQJ/lHc= github.com/mafredri/go-lint v0.0.0-20180911205320-920981dfc79e/go.mod h1:k/zdyxI3q6dup24o8xpYjJKTCf2F7rfxLp6w/efTiWs= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/natefinch/lumberjack v2.0.0+incompatible h1:4QJd3OLAMgj7ph+yZTuX13Ld4UpgHp07nNdFX7mqFfM= github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk= github.com/ngdinhtoan/glide-cleanup v0.2.0/go.mod h1:UQzsmiDOb8YV3nOsCxK/c9zPpCZVNoHScRE3EO9pVMM= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.19.0 h1:hYz4ZVdUgjXTBUmrkrw55j1nHx68LfOKIQk5IYtyScg= github.com/rs/zerolog v1.19.0/go.mod h1:IzD0RJ65iWH0w97OQQebJEvTZYvsCUm9WVLWBQrJRjo= +github.com/segmentio/encoding v0.1.10 h1:0b8dva47cSuNQR5ZcU3d0pfi9EnPpSK6q7y5ZGEW36Q= github.com/segmentio/encoding v0.1.10/go.mod h1:RWhr02uzMB9gQC1x+MfYxedtmBibb9cZ6Vv9VxRSSbw= github.com/sethgrid/pester v1.1.0 h1:IyEAVvwSUPjs2ACFZkBe5N59BBUpSIkQ71Hr6cM5A+w= github.com/sethgrid/pester v1.1.0/go.mod h1:Ad7IjTpvzZO8Fl0vh9AzQ+j/jYZfyp2diGwI8m5q+ns= @@ -70,6 +85,7 @@ github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIK github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/wI2L/jettison v0.7.1 h1:XNq/WvSOAiJhFww9F5JZZcBZtKFL2Y/9WHHEHLDq9TE= github.com/wI2L/jettison v0.7.1/go.mod h1:dj49nOP41M7x6Jql62BqqF/+nW+XJgBaWzJR0hd6M84= @@ -104,9 +120,13 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20200601175630-2caf76543d99/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/pkg/compiler/compiler_like_test.go b/pkg/compiler/compiler_like_test.go new file mode 100644 index 00000000..c1dd7c2b --- /dev/null +++ b/pkg/compiler/compiler_like_test.go @@ -0,0 +1,82 @@ +package compiler_test + +import ( + "context" + "github.com/MontFerret/ferret/pkg/compiler" + . "github.com/smartystreets/goconvey/convey" + "testing" +) + +func TestLikeOperator(t *testing.T) { + Convey("RETURN \"foo\" LIKE \"f*\" ", t, func() { + c := compiler.New() + + out1, err := c.MustCompile(` + RETURN "foo" LIKE "f*" + `).Run(context.Background()) + + So(err, ShouldBeNil) + So(string(out1), ShouldEqual, `true`) + }) + + Convey("RETURN LIKE('foo', 'f*')", t, func() { + c := compiler.New() + + out1, err := c.MustCompile(` + RETURN LIKE('foo', 'f*') + `).Run(context.Background()) + + So(err, ShouldBeNil) + So(string(out1), ShouldEqual, `true`) + }) + + Convey("RETURN \"foo\" NOT LIKE \"b*\" ", t, func() { + c := compiler.New() + + out1, err := c.MustCompile(` + RETURN "foo" NOT LIKE "b*" + `).Run(context.Background()) + + So(err, ShouldBeNil) + So(string(out1), ShouldEqual, `true`) + }) + + Convey("LET t = \"foo\" LIKE \"f*\" ", t, func() { + c := compiler.New() + + out1, err := c.MustCompile(` + LET res = "foo" LIKE "f*" + + RETURN res + `).Run(context.Background()) + + So(err, ShouldBeNil) + So(string(out1), ShouldEqual, `true`) + }) + + Convey("FOR IN LIKE", t, func() { + c := compiler.New() + + out1, err := c.MustCompile(` + FOR str IN ["foo", "bar", "qaz"] + FILTER str LIKE "*a*" + RETURN str + `).Run(context.Background()) + + So(err, ShouldBeNil) + So(string(out1), ShouldEqual, `["bar","qaz"]`) + }) + + Convey("FOR IN LIKE 2", t, func() { + c := compiler.New() + + out1, err := c.MustCompile(` + FOR str IN ["foo", "bar", "qaz"] + FILTER str LIKE "*a*" + RETURN str + `).Run(context.Background()) + + So(err, ShouldBeNil) + So(string(out1), ShouldEqual, `["bar","qaz"]`) + }) +} diff --git a/pkg/compiler/visitor.go b/pkg/compiler/visitor.go index 785eaff9..7b724c2a 100644 --- a/pkg/compiler/visitor.go +++ b/pkg/compiler/visitor.go @@ -448,47 +448,7 @@ func (v *visitor) doVisitLimitClauseValue(ctx *fql.LimitClauseValueContext, scop } func (v *visitor) doVisitFilterClause(ctx *fql.FilterClauseContext, scope *scope) (core.Expression, error) { - exp := ctx.Expression().(*fql.ExpressionContext) - - exps, err := v.doVisitAllExpressions(exp.AllExpression(), scope) - - if err != nil { - return nil, err - } - - if len(exps) == 2 { - left := exps[0] - right := exps[1] - - equalityOp := exp.EqualityOperator() - - if equalityOp != nil { - return operators.NewEqualityOperator(v.getSourceMap(ctx), left, right, equalityOp.GetText()) - } - - regexpOp := exp.RegexpOperator() - - if regexpOp != nil { - return operators.NewRegexpOperator(v.getSourceMap(ctx), left, right, regexpOp.GetText()) - } - - logicalAndOp := exp.LogicalAndOperator() - - if logicalAndOp != nil { - return operators.NewLogicalOperator(v.getSourceMap(ctx), left, right, logicalAndOp.GetText()) - } - - logicalOrOp := exp.LogicalOrOperator() - - if logicalOrOp != nil { - return operators.NewLogicalOperator(v.getSourceMap(ctx), left, right, logicalOrOp.GetText()) - } - } else { - // should be unary operator - return v.doVisitExpression(exp, scope) - } - - return nil, core.Error(ErrInvalidToken, ctx.GetText()) + return v.doVisitExpression(ctx.Expression().(*fql.ExpressionContext), scope) } func (v *visitor) doVisitSortClause(ctx *fql.SortClauseContext, scope *scope) ([]*clauses.SorterExpression, error) { @@ -1288,9 +1248,7 @@ func (v *visitor) doVisitMathOperator(ctx *fql.ExpressionContext, scope *scope) ) } -func (v *visitor) doVisitUnaryOperator(ctx *fql.ExpressionContext, scope *scope) (core.OperatorExpression, error) { - op := ctx.UnaryOperator().(*fql.UnaryOperatorContext) - +func (v *visitor) doVisitUnaryOperator(ctx *fql.ExpressionContext, op *fql.UnaryOperatorContext, scope *scope) (core.OperatorExpression, error) { exps, err := v.doVisitAllExpressions(ctx.AllExpression(), scope) if err != nil { @@ -1335,8 +1293,7 @@ func (v *visitor) doVisitLogicalOperator(ctx *fql.ExpressionContext, scope *scop return operators.NewLogicalOperator(v.getSourceMap(ctx), left, right, operator) } -func (v *visitor) doVisitEqualityOperator(ctx *fql.ExpressionContext, scope *scope) (core.OperatorExpression, error) { - equalityOp := ctx.EqualityOperator().(*fql.EqualityOperatorContext) +func (v *visitor) doVisitEqualityOperator(ctx *fql.ExpressionContext, op *fql.EqualityOperatorContext, scope *scope) (core.OperatorExpression, error) { exps, err := v.doVisitAllExpressions(ctx.AllExpression(), scope) if err != nil { @@ -1346,11 +1303,10 @@ func (v *visitor) doVisitEqualityOperator(ctx *fql.ExpressionContext, scope *sco left := exps[0] right := exps[1] - return operators.NewEqualityOperator(v.getSourceMap(equalityOp), left, right, equalityOp.GetText()) + return operators.NewEqualityOperator(v.getSourceMap(op), left, right, op.GetText()) } -func (v *visitor) doVisitRegexpOperator(ctx *fql.ExpressionContext, scope *scope) (core.Expression, error) { - regexpOp := ctx.RegexpOperator().(*fql.RegexpOperatorContext) +func (v *visitor) doVisitRegexpOperator(ctx *fql.ExpressionContext, op *fql.RegexpOperatorContext, scope *scope) (core.Expression, error) { rawExps := ctx.AllExpression() exps, err := v.doVisitAllExpressions(rawExps, scope) @@ -1376,7 +1332,7 @@ func (v *visitor) doVisitRegexpOperator(ctx *fql.ExpressionContext, scope *scope return nil, errors.Wrap(errors.New("expected a string literal or a function call"), src.String()) } - return operators.NewRegexpOperator(v.getSourceMap(regexpOp), left, right, regexpOp.GetText()) + return operators.NewRegexpOperator(v.getSourceMap(op), left, right, op.GetText()) } func (v *visitor) doVisitInOperator(ctx *fql.ExpressionContext, scope *scope) (core.OperatorExpression, error) { @@ -1403,16 +1359,28 @@ func (v *visitor) doVisitInOperator(ctx *fql.ExpressionContext, scope *scope) (c ) } +func (v *visitor) doVisitLikeOperator(ctx *fql.ExpressionContext, op *fql.LikeOperatorContext, s *scope) (core.Expression, error) { + exps, err := v.doVisitAllExpressions(ctx.AllExpression(), s) + + if err != nil { + return nil, err + } + + left := exps[0] + right := exps[1] + + return operators.NewLikeOperator(v.getSourceMap(op), left, right, op.Not() != nil) +} + func (v *visitor) doVisitArrayOperator(ctx *fql.ExpressionContext, scope *scope) (core.OperatorExpression, error) { var comparator core.OperatorExpression var err error - switch { - case ctx.InOperator() != nil: + if op := ctx.InOperator(); op != nil { comparator, err = v.doVisitInOperator(ctx, scope) - case ctx.EqualityOperator() != nil: - comparator, err = v.doVisitEqualityOperator(ctx, scope) - default: + } else if op := ctx.EqualityOperator(); op != nil { + comparator, err = v.doVisitEqualityOperator(ctx, op.(*fql.EqualityOperatorContext), scope) + } else { return nil, v.unexpectedToken(ctx) } @@ -1459,129 +1427,91 @@ func (v *visitor) doVisitExpressionGroup(ctx *fql.ExpressionGroupContext, scope } func (v *visitor) doVisitExpression(ctx *fql.ExpressionContext, scope *scope) (core.Expression, error) { - seq := ctx.ExpressionGroup() - - if seq != nil { - return v.doVisitExpressionGroup(seq.(*fql.ExpressionGroupContext), scope) + if exp := ctx.ExpressionGroup(); exp != nil { + return v.doVisitExpressionGroup(exp.(*fql.ExpressionGroupContext), scope) } - member := ctx.MemberExpression() - - if member != nil { - return v.doVisitMemberExpression(member.(*fql.MemberExpressionContext), scope) + if exp := ctx.MemberExpression(); exp != nil { + return v.doVisitMemberExpression(exp.(*fql.MemberExpressionContext), scope) } - funCall := ctx.FunctionCallExpression() - - if funCall != nil { - return v.doVisitFunctionCallExpression(funCall.(*fql.FunctionCallExpressionContext), scope) + if exp := ctx.FunctionCallExpression(); exp != nil { + return v.doVisitFunctionCallExpression(exp.(*fql.FunctionCallExpressionContext), scope) } - notOp := ctx.UnaryOperator() - - if notOp != nil { - return v.doVisitUnaryOperator(ctx, scope) + if exp := ctx.UnaryOperator(); exp != nil { + return v.doVisitUnaryOperator(ctx, exp.(*fql.UnaryOperatorContext), scope) } - multiOp := ctx.MultiplicativeOperator() - - if multiOp != nil { + if exp := ctx.MultiplicativeOperator(); exp != nil { return v.doVisitMathOperator(ctx, scope) } - addOp := ctx.AdditiveOperator() - - if addOp != nil { + if exp := ctx.AdditiveOperator(); exp != nil { return v.doVisitMathOperator(ctx, scope) } - arrOp := ctx.ArrayOperator() - - if arrOp != nil { + if exp := ctx.ArrayOperator(); exp != nil { return v.doVisitArrayOperator(ctx, scope) } - equalityOp := ctx.EqualityOperator() - - if equalityOp != nil { - return v.doVisitEqualityOperator(ctx, scope) + if exp := ctx.EqualityOperator(); exp != nil { + return v.doVisitEqualityOperator(ctx, exp.(*fql.EqualityOperatorContext), scope) } - inOp := ctx.InOperator() - - if inOp != nil { + if exp := ctx.InOperator(); exp != nil { return v.doVisitInOperator(ctx, scope) } - logicalAndOp := ctx.LogicalAndOperator() + if exp := ctx.LikeOperator(); exp != nil { + return v.doVisitLikeOperator(ctx, exp.(*fql.LikeOperatorContext), scope) + } - if logicalAndOp != nil { + if exp := ctx.LogicalAndOperator(); exp != nil { return v.doVisitLogicalOperator(ctx, scope) } - logicalOrOp := ctx.LogicalOrOperator() - - if logicalOrOp != nil { + if exp := ctx.LogicalOrOperator(); exp != nil { return v.doVisitLogicalOperator(ctx, scope) } - regexpOp := ctx.RegexpOperator() - - if regexpOp != nil { - return v.doVisitRegexpOperator(ctx, scope) + if exp := ctx.RegexpOperator(); exp != nil { + return v.doVisitRegexpOperator(ctx, exp.(*fql.RegexpOperatorContext), scope) } - variable := ctx.Variable() - - if variable != nil { - return v.doVisitVariable(variable.(*fql.VariableContext), scope) + if exp := ctx.Variable(); exp != nil { + return v.doVisitVariable(exp.(*fql.VariableContext), scope) } - str := ctx.StringLiteral() - - if str != nil { - return v.doVisitStringLiteral(str.(*fql.StringLiteralContext)) + if exp := ctx.StringLiteral(); exp != nil { + return v.doVisitStringLiteral(exp.(*fql.StringLiteralContext)) } - integ := ctx.IntegerLiteral() - - if integ != nil { - return v.doVisitIntegerLiteral(integ.(*fql.IntegerLiteralContext)) + if exp := ctx.IntegerLiteral(); exp != nil { + return v.doVisitIntegerLiteral(exp.(*fql.IntegerLiteralContext)) } - float := ctx.FloatLiteral() - - if float != nil { - return v.doVisitFloatLiteral(float.(*fql.FloatLiteralContext)) + if exp := ctx.FloatLiteral(); exp != nil { + return v.doVisitFloatLiteral(exp.(*fql.FloatLiteralContext)) } - boolean := ctx.BooleanLiteral() - - if boolean != nil { - return v.doVisitBooleanLiteral(boolean.(*fql.BooleanLiteralContext)) + if exp := ctx.BooleanLiteral(); exp != nil { + return v.doVisitBooleanLiteral(exp.(*fql.BooleanLiteralContext)) } - arr := ctx.ArrayLiteral() - - if arr != nil { - return v.doVisitArrayLiteral(arr.(*fql.ArrayLiteralContext), scope) + if exp := ctx.ArrayLiteral(); exp != nil { + return v.doVisitArrayLiteral(exp.(*fql.ArrayLiteralContext), scope) } - obj := ctx.ObjectLiteral() - - if obj != nil { - return v.doVisitObjectLiteral(obj.(*fql.ObjectLiteralContext), scope) + if exp := ctx.ObjectLiteral(); exp != nil { + return v.doVisitObjectLiteral(exp.(*fql.ObjectLiteralContext), scope) } - none := ctx.NoneLiteral() - - if none != nil { - return v.doVisitNoneLiteral(none.(*fql.NoneLiteralContext)) + if exp := ctx.NoneLiteral(); exp != nil { + return v.doVisitNoneLiteral(exp.(*fql.NoneLiteralContext)) } - questionCtx := ctx.QuestionMark() - - if questionCtx != nil { + if exp := ctx.QuestionMark(); exp != nil { exps, err := v.doVisitAllExpressions(ctx.AllExpression(), scope) if err != nil { @@ -1595,19 +1525,14 @@ func (v *visitor) doVisitExpression(ctx *fql.ExpressionContext, scope *scope) (c ) } - rangeOp := ctx.RangeOperator() - - if rangeOp != nil { - return v.doVisitRangeOperator(rangeOp.(*fql.RangeOperatorContext), scope) + if exp := ctx.RangeOperator(); exp != nil { + return v.doVisitRangeOperator(exp.(*fql.RangeOperatorContext), scope) } - param := ctx.Param() - - if param != nil { + if param := ctx.Param(); param != nil { return v.doVisitParamContext(param.(*fql.ParamContext), scope) } - // TODO: Complete it return nil, ErrNotImplemented } diff --git a/pkg/parser/antlr/FqlLexer.tokens b/pkg/parser/antlr/FqlLexer.tokens index 63ad602d..be124fde 100644 --- a/pkg/parser/antlr/FqlLexer.tokens +++ b/pkg/parser/antlr/FqlLexer.tokens @@ -55,13 +55,14 @@ Aggregate=54 Like=55 Not=56 In=57 -While=58 -Param=59 -Identifier=60 -StringLiteral=61 -IntegerLiteral=62 -FloatLiteral=63 -NamespaceSegment=64 +Do=58 +While=59 +Param=60 +Identifier=61 +StringLiteral=62 +IntegerLiteral=63 +FloatLiteral=64 +NamespaceSegment=65 ':'=5 ';'=6 '.'=7 @@ -109,5 +110,6 @@ NamespaceSegment=64 'AGGREGATE'=54 'LIKE'=55 'IN'=57 -'WHILE'=58 -'@'=59 +'DO'=58 +'WHILE'=59 +'@'=60 diff --git a/pkg/parser/antlr/FqlParser.g4 b/pkg/parser/antlr/FqlParser.g4 index 9a8af00c..c4b19fcc 100644 --- a/pkg/parser/antlr/FqlParser.g4 +++ b/pkg/parser/antlr/FqlParser.g4 @@ -285,6 +285,7 @@ expression | expressionGroup | expression arrayOperator (inOperator | equalityOperator) expression | expression inOperator expression + | expression likeOperator expression | expression equalityOperator expression | expression regexpOperator expression | expression logicalAndOperator expression @@ -320,6 +321,11 @@ inOperator | Not In ; +likeOperator + : Like + | Not Like + ; + equalityOperator : Gt | Lt @@ -357,5 +363,4 @@ unaryOperator : Not | Plus | Minus - | Like ; \ No newline at end of file diff --git a/pkg/parser/fql/FqlParser.interp b/pkg/parser/fql/FqlParser.interp index e7207702..85da9ccc 100644 --- a/pkg/parser/fql/FqlParser.interp +++ b/pkg/parser/fql/FqlParser.interp @@ -192,6 +192,7 @@ expression forTernaryExpression arrayOperator inOperator +likeOperator equalityOperator regexpOperator logicalAndOperator @@ -202,4 +203,4 @@ unaryOperator atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 67, 627, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 3, 2, 7, 2, 132, 10, 2, 12, 2, 14, 2, 135, 11, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 6, 7, 6, 147, 10, 6, 12, 6, 14, 6, 150, 11, 6, 3, 6, 3, 6, 3, 7, 3, 7, 5, 7, 156, 10, 7, 3, 8, 3, 8, 5, 8, 160, 10, 8, 3, 9, 3, 9, 5, 9, 164, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 169, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 177, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 183, 10, 10, 3, 10, 3, 10, 3, 10, 7, 10, 188, 10, 10, 12, 10, 14, 10, 191, 11, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 198, 10, 10, 3, 10, 3, 10, 3, 10, 7, 10, 203, 10, 10, 12, 10, 14, 10, 206, 11, 10, 3, 10, 3, 10, 5, 10, 210, 10, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 223, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 229, 10, 14, 3, 15, 3, 15, 5, 15, 233, 10, 15, 3, 16, 3, 16, 5, 16, 237, 10, 16, 3, 17, 3, 17, 5, 17, 241, 10, 17, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 250, 10, 19, 3, 20, 3, 20, 5, 20, 254, 10, 20, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 260, 10, 21, 12, 21, 14, 21, 263, 11, 21, 3, 22, 3, 22, 5, 22, 267, 10, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 5, 23, 287, 10, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 7, 25, 296, 10, 25, 12, 25, 14, 25, 299, 11, 25, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 305, 10, 26, 12, 26, 14, 26, 308, 11, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 320, 10, 28, 5, 28, 322, 10, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 344, 10, 30, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 5, 33, 354, 10, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 360, 10, 33, 3, 34, 3, 34, 5, 34, 364, 10, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 7, 35, 372, 10, 35, 12, 35, 14, 35, 375, 11, 35, 5, 35, 377, 10, 35, 3, 35, 5, 35, 380, 10, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 37, 3, 37, 3, 38, 3, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 41, 3, 41, 6, 41, 396, 10, 41, 13, 41, 14, 41, 397, 3, 41, 7, 41, 401, 10, 41, 12, 41, 14, 41, 404, 11, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 415, 10, 42, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 5, 45, 426, 10, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 48, 7, 48, 436, 10, 48, 12, 48, 14, 48, 439, 11, 48, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 5, 51, 450, 10, 51, 3, 52, 3, 52, 3, 52, 7, 52, 455, 10, 52, 12, 52, 14, 52, 458, 11, 52, 6, 52, 460, 10, 52, 13, 52, 14, 52, 461, 3, 52, 3, 52, 3, 52, 3, 52, 7, 52, 468, 10, 52, 12, 52, 14, 52, 471, 11, 52, 7, 52, 473, 10, 52, 12, 52, 14, 52, 476, 11, 52, 3, 52, 3, 52, 3, 52, 7, 52, 481, 10, 52, 12, 52, 14, 52, 484, 11, 52, 7, 52, 486, 10, 52, 12, 52, 14, 52, 489, 11, 52, 5, 52, 491, 10, 52, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 7, 54, 500, 10, 54, 12, 54, 14, 54, 503, 11, 54, 5, 54, 505, 10, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 5, 55, 526, 10, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 5, 55, 540, 10, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 5, 55, 567, 10, 55, 3, 55, 3, 55, 7, 55, 571, 10, 55, 12, 55, 14, 55, 574, 11, 55, 3, 56, 3, 56, 3, 56, 5, 56, 579, 10, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 5, 56, 604, 10, 56, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 5, 58, 611, 10, 58, 3, 59, 3, 59, 3, 60, 3, 60, 3, 61, 3, 61, 3, 62, 3, 62, 3, 63, 3, 63, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 2, 3, 108, 66, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 2, 10, 3, 2, 46, 47, 5, 2, 30, 31, 37, 59, 63, 63, 4, 2, 46, 46, 54, 55, 3, 2, 17, 22, 3, 2, 35, 36, 3, 2, 23, 25, 3, 2, 26, 27, 4, 2, 26, 27, 57, 58, 2, 656, 2, 133, 3, 2, 2, 2, 4, 138, 3, 2, 2, 2, 6, 140, 3, 2, 2, 2, 8, 142, 3, 2, 2, 2, 10, 148, 3, 2, 2, 2, 12, 155, 3, 2, 2, 2, 14, 159, 3, 2, 2, 2, 16, 176, 3, 2, 2, 2, 18, 209, 3, 2, 2, 2, 20, 211, 3, 2, 2, 2, 22, 213, 3, 2, 2, 2, 24, 222, 3, 2, 2, 2, 26, 228, 3, 2, 2, 2, 28, 232, 3, 2, 2, 2, 30, 236, 3, 2, 2, 2, 32, 240, 3, 2, 2, 2, 34, 242, 3, 2, 2, 2, 36, 245, 3, 2, 2, 2, 38, 253, 3, 2, 2, 2, 40, 255, 3, 2, 2, 2, 42, 264, 3, 2, 2, 2, 44, 286, 3, 2, 2, 2, 46, 288, 3, 2, 2, 2, 48, 292, 3, 2, 2, 2, 50, 300, 3, 2, 2, 2, 52, 309, 3, 2, 2, 2, 54, 321, 3, 2, 2, 2, 56, 323, 3, 2, 2, 2, 58, 343, 3, 2, 2, 2, 60, 345, 3, 2, 2, 2, 62, 348, 3, 2, 2, 2, 64, 353, 3, 2, 2, 2, 66, 361, 3, 2, 2, 2, 68, 367, 3, 2, 2, 2, 70, 383, 3, 2, 2, 2, 72, 385, 3, 2, 2, 2, 74, 387, 3, 2, 2, 2, 76, 389, 3, 2, 2, 2, 78, 391, 3, 2, 2, 2, 80, 393, 3, 2, 2, 2, 82, 414, 3, 2, 2, 2, 84, 416, 3, 2, 2, 2, 86, 418, 3, 2, 2, 2, 88, 425, 3, 2, 2, 2, 90, 427, 3, 2, 2, 2, 92, 431, 3, 2, 2, 2, 94, 437, 3, 2, 2, 2, 96, 440, 3, 2, 2, 2, 98, 442, 3, 2, 2, 2, 100, 449, 3, 2, 2, 2, 102, 490, 3, 2, 2, 2, 104, 492, 3, 2, 2, 2, 106, 495, 3, 2, 2, 2, 108, 525, 3, 2, 2, 2, 110, 603, 3, 2, 2, 2, 112, 605, 3, 2, 2, 2, 114, 610, 3, 2, 2, 2, 116, 612, 3, 2, 2, 2, 118, 614, 3, 2, 2, 2, 120, 616, 3, 2, 2, 2, 122, 618, 3, 2, 2, 2, 124, 620, 3, 2, 2, 2, 126, 622, 3, 2, 2, 2, 128, 624, 3, 2, 2, 2, 130, 132, 5, 4, 3, 2, 131, 130, 3, 2, 2, 2, 132, 135, 3, 2, 2, 2, 133, 131, 3, 2, 2, 2, 133, 134, 3, 2, 2, 2, 134, 136, 3, 2, 2, 2, 135, 133, 3, 2, 2, 2, 136, 137, 5, 10, 6, 2, 137, 3, 3, 2, 2, 2, 138, 139, 5, 6, 4, 2, 139, 5, 3, 2, 2, 2, 140, 141, 5, 8, 5, 2, 141, 7, 3, 2, 2, 2, 142, 143, 7, 49, 2, 2, 143, 144, 5, 92, 47, 2, 144, 9, 3, 2, 2, 2, 145, 147, 5, 12, 7, 2, 146, 145, 3, 2, 2, 2, 147, 150, 3, 2, 2, 2, 148, 146, 3, 2, 2, 2, 148, 149, 3, 2, 2, 2, 149, 151, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 151, 152, 5, 14, 8, 2, 152, 11, 3, 2, 2, 2, 153, 156, 5, 98, 50, 2, 154, 156, 5, 58, 30, 2, 155, 153, 3, 2, 2, 2, 155, 154, 3, 2, 2, 2, 156, 13, 3, 2, 2, 2, 157, 160, 5, 16, 9, 2, 158, 160, 5, 18, 10, 2, 159, 157, 3, 2, 2, 2, 159, 158, 3, 2, 2, 2, 160, 15, 3, 2, 2, 2, 161, 163, 7, 38, 2, 2, 162, 164, 7, 39, 2, 2, 163, 162, 3, 2, 2, 2, 163, 164, 3, 2, 2, 2, 164, 165, 3, 2, 2, 2, 165, 177, 5, 108, 55, 2, 166, 168, 7, 38, 2, 2, 167, 169, 7, 39, 2, 2, 168, 167, 3, 2, 2, 2, 168, 169, 3, 2, 2, 2, 169, 170, 3, 2, 2, 2, 170, 171, 7, 13, 2, 2, 171, 172, 5, 18, 10, 2, 172, 173, 7, 14, 2, 2, 173, 177, 3, 2, 2, 2, 174, 175, 7, 38, 2, 2, 175, 177, 5, 110, 56, 2, 176, 161, 3, 2, 2, 2, 176, 166, 3, 2, 2, 2, 176, 174, 3, 2, 2, 2, 177, 17, 3, 2, 2, 2, 178, 179, 7, 37, 2, 2, 179, 182, 5, 20, 11, 2, 180, 181, 7, 10, 2, 2, 181, 183, 5, 22, 12, 2, 182, 180, 3, 2, 2, 2, 182, 183, 3, 2, 2, 2, 183, 184, 3, 2, 2, 2, 184, 185, 7, 59, 2, 2, 185, 189, 5, 24, 13, 2, 186, 188, 5, 30, 16, 2, 187, 186, 3, 2, 2, 2, 188, 191, 3, 2, 2, 2, 189, 187, 3, 2, 2, 2, 189, 190, 3, 2, 2, 2, 190, 192, 3, 2, 2, 2, 191, 189, 3, 2, 2, 2, 192, 193, 5, 32, 17, 2, 193, 210, 3, 2, 2, 2, 194, 195, 7, 37, 2, 2, 195, 197, 5, 20, 11, 2, 196, 198, 7, 60, 2, 2, 197, 196, 3, 2, 2, 2, 197, 198, 3, 2, 2, 2, 198, 199, 3, 2, 2, 2, 199, 200, 7, 61, 2, 2, 200, 204, 5, 108, 55, 2, 201, 203, 5, 30, 16, 2, 202, 201, 3, 2, 2, 2, 203, 206, 3, 2, 2, 2, 204, 202, 3, 2, 2, 2, 204, 205, 3, 2, 2, 2, 205, 207, 3, 2, 2, 2, 206, 204, 3, 2, 2, 2, 207, 208, 5, 32, 17, 2, 208, 210, 3, 2, 2, 2, 209, 178, 3, 2, 2, 2, 209, 194, 3, 2, 2, 2, 210, 19, 3, 2, 2, 2, 211, 212, 7, 63, 2, 2, 212, 21, 3, 2, 2, 2, 213, 214, 7, 63, 2, 2, 214, 23, 3, 2, 2, 2, 215, 223, 5, 98, 50, 2, 216, 223, 5, 66, 34, 2, 217, 223, 5, 68, 35, 2, 218, 223, 5, 62, 32, 2, 219, 223, 5, 104, 53, 2, 220, 223, 5, 64, 33, 2, 221, 223, 5, 60, 31, 2, 222, 215, 3, 2, 2, 2, 222, 216, 3, 2, 2, 2, 222, 217, 3, 2, 2, 2, 222, 218, 3, 2, 2, 2, 222, 219, 3, 2, 2, 2, 222, 220, 3, 2, 2, 2, 222, 221, 3, 2, 2, 2, 223, 25, 3, 2, 2, 2, 224, 229, 5, 36, 19, 2, 225, 229, 5, 40, 21, 2, 226, 229, 5, 34, 18, 2, 227, 229, 5, 44, 23, 2, 228, 224, 3, 2, 2, 2, 228, 225, 3, 2, 2, 2, 228, 226, 3, 2, 2, 2, 228, 227, 3, 2, 2, 2, 229, 27, 3, 2, 2, 2, 230, 233, 5, 58, 30, 2, 231, 233, 5, 98, 50, 2, 232, 230, 3, 2, 2, 2, 232, 231, 3, 2, 2, 2, 233, 29, 3, 2, 2, 2, 234, 237, 5, 28, 15, 2, 235, 237, 5, 26, 14, 2, 236, 234, 3, 2, 2, 2, 236, 235, 3, 2, 2, 2, 237, 31, 3, 2, 2, 2, 238, 241, 5, 16, 9, 2, 239, 241, 5, 18, 10, 2, 240, 238, 3, 2, 2, 2, 240, 239, 3, 2, 2, 2, 241, 33, 3, 2, 2, 2, 242, 243, 7, 40, 2, 2, 243, 244, 5, 108, 55, 2, 244, 35, 3, 2, 2, 2, 245, 246, 7, 42, 2, 2, 246, 249, 5, 38, 20, 2, 247, 248, 7, 10, 2, 2, 248, 250, 5, 38, 20, 2, 249, 247, 3, 2, 2, 2, 249, 250, 3, 2, 2, 2, 250, 37, 3, 2, 2, 2, 251, 254, 7, 65, 2, 2, 252, 254, 5, 60, 31, 2, 253, 251, 3, 2, 2, 2, 253, 252, 3, 2, 2, 2, 254, 39, 3, 2, 2, 2, 255, 256, 7, 41, 2, 2, 256, 261, 5, 42, 22, 2, 257, 258, 7, 10, 2, 2, 258, 260, 5, 42, 22, 2, 259, 257, 3, 2, 2, 2, 260, 263, 3, 2, 2, 2, 261, 259, 3, 2, 2, 2, 261, 262, 3, 2, 2, 2, 262, 41, 3, 2, 2, 2, 263, 261, 3, 2, 2, 2, 264, 266, 5, 108, 55, 2, 265, 267, 7, 45, 2, 2, 266, 265, 3, 2, 2, 2, 266, 267, 3, 2, 2, 2, 267, 43, 3, 2, 2, 2, 268, 269, 7, 44, 2, 2, 269, 287, 5, 56, 29, 2, 270, 271, 7, 44, 2, 2, 271, 287, 5, 50, 26, 2, 272, 273, 7, 44, 2, 2, 273, 274, 5, 48, 25, 2, 274, 275, 5, 50, 26, 2, 275, 287, 3, 2, 2, 2, 276, 277, 7, 44, 2, 2, 277, 278, 5, 48, 25, 2, 278, 279, 5, 54, 28, 2, 279, 287, 3, 2, 2, 2, 280, 281, 7, 44, 2, 2, 281, 282, 5, 48, 25, 2, 282, 283, 5, 56, 29, 2, 283, 287, 3, 2, 2, 2, 284, 285, 7, 44, 2, 2, 285, 287, 5, 48, 25, 2, 286, 268, 3, 2, 2, 2, 286, 270, 3, 2, 2, 2, 286, 272, 3, 2, 2, 2, 286, 276, 3, 2, 2, 2, 286, 280, 3, 2, 2, 2, 286, 284, 3, 2, 2, 2, 287, 45, 3, 2, 2, 2, 288, 289, 7, 63, 2, 2, 289, 290, 7, 33, 2, 2, 290, 291, 5, 108, 55, 2, 291, 47, 3, 2, 2, 2, 292, 297, 5, 46, 24, 2, 293, 294, 7, 10, 2, 2, 294, 296, 5, 46, 24, 2, 295, 293, 3, 2, 2, 2, 296, 299, 3, 2, 2, 2, 297, 295, 3, 2, 2, 2, 297, 298, 3, 2, 2, 2, 298, 49, 3, 2, 2, 2, 299, 297, 3, 2, 2, 2, 300, 301, 7, 56, 2, 2, 301, 306, 5, 52, 27, 2, 302, 303, 7, 10, 2, 2, 303, 305, 5, 52, 27, 2, 304, 302, 3, 2, 2, 2, 305, 308, 3, 2, 2, 2, 306, 304, 3, 2, 2, 2, 306, 307, 3, 2, 2, 2, 307, 51, 3, 2, 2, 2, 308, 306, 3, 2, 2, 2, 309, 310, 7, 63, 2, 2, 310, 311, 7, 33, 2, 2, 311, 312, 5, 98, 50, 2, 312, 53, 3, 2, 2, 2, 313, 314, 7, 50, 2, 2, 314, 322, 5, 46, 24, 2, 315, 316, 7, 50, 2, 2, 316, 319, 7, 63, 2, 2, 317, 318, 7, 51, 2, 2, 318, 320, 7, 63, 2, 2, 319, 317, 3, 2, 2, 2, 319, 320, 3, 2, 2, 2, 320, 322, 3, 2, 2, 2, 321, 313, 3, 2, 2, 2, 321, 315, 3, 2, 2, 2, 322, 55, 3, 2, 2, 2, 323, 324, 7, 52, 2, 2, 324, 325, 7, 53, 2, 2, 325, 326, 7, 50, 2, 2, 326, 327, 7, 63, 2, 2, 327, 57, 3, 2, 2, 2, 328, 329, 7, 43, 2, 2, 329, 330, 7, 63, 2, 2, 330, 331, 7, 33, 2, 2, 331, 344, 5, 108, 55, 2, 332, 333, 7, 43, 2, 2, 333, 334, 7, 63, 2, 2, 334, 335, 7, 33, 2, 2, 335, 336, 7, 13, 2, 2, 336, 337, 5, 18, 10, 2, 337, 338, 7, 14, 2, 2, 338, 344, 3, 2, 2, 2, 339, 340, 7, 43, 2, 2, 340, 341, 7, 63, 2, 2, 341, 342, 7, 33, 2, 2, 342, 344, 5, 110, 56, 2, 343, 328, 3, 2, 2, 2, 343, 332, 3, 2, 2, 2, 343, 339, 3, 2, 2, 2, 344, 59, 3, 2, 2, 2, 345, 346, 7, 62, 2, 2, 346, 347, 7, 63, 2, 2, 347, 61, 3, 2, 2, 2, 348, 349, 7, 63, 2, 2, 349, 63, 3, 2, 2, 2, 350, 354, 5, 74, 38, 2, 351, 354, 5, 62, 32, 2, 352, 354, 5, 60, 31, 2, 353, 350, 3, 2, 2, 2, 353, 351, 3, 2, 2, 2, 353, 352, 3, 2, 2, 2, 354, 355, 3, 2, 2, 2, 355, 359, 7, 32, 2, 2, 356, 360, 5, 74, 38, 2, 357, 360, 5, 62, 32, 2, 358, 360, 5, 60, 31, 2, 359, 356, 3, 2, 2, 2, 359, 357, 3, 2, 2, 2, 359, 358, 3, 2, 2, 2, 360, 65, 3, 2, 2, 2, 361, 363, 7, 11, 2, 2, 362, 364, 5, 80, 41, 2, 363, 362, 3, 2, 2, 2, 363, 364, 3, 2, 2, 2, 364, 365, 3, 2, 2, 2, 365, 366, 7, 12, 2, 2, 366, 67, 3, 2, 2, 2, 367, 376, 7, 15, 2, 2, 368, 373, 5, 82, 42, 2, 369, 370, 7, 10, 2, 2, 370, 372, 5, 82, 42, 2, 371, 369, 3, 2, 2, 2, 372, 375, 3, 2, 2, 2, 373, 371, 3, 2, 2, 2, 373, 374, 3, 2, 2, 2, 374, 377, 3, 2, 2, 2, 375, 373, 3, 2, 2, 2, 376, 368, 3, 2, 2, 2, 376, 377, 3, 2, 2, 2, 377, 379, 3, 2, 2, 2, 378, 380, 7, 10, 2, 2, 379, 378, 3, 2, 2, 2, 379, 380, 3, 2, 2, 2, 380, 381, 3, 2, 2, 2, 381, 382, 7, 16, 2, 2, 382, 69, 3, 2, 2, 2, 383, 384, 7, 48, 2, 2, 384, 71, 3, 2, 2, 2, 385, 386, 7, 64, 2, 2, 386, 73, 3, 2, 2, 2, 387, 388, 7, 65, 2, 2, 388, 75, 3, 2, 2, 2, 389, 390, 7, 66, 2, 2, 390, 77, 3, 2, 2, 2, 391, 392, 9, 2, 2, 2, 392, 79, 3, 2, 2, 2, 393, 402, 5, 108, 55, 2, 394, 396, 7, 10, 2, 2, 395, 394, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 395, 3, 2, 2, 2, 397, 398, 3, 2, 2, 2, 398, 399, 3, 2, 2, 2, 399, 401, 5, 108, 55, 2, 400, 395, 3, 2, 2, 2, 401, 404, 3, 2, 2, 2, 402, 400, 3, 2, 2, 2, 402, 403, 3, 2, 2, 2, 403, 81, 3, 2, 2, 2, 404, 402, 3, 2, 2, 2, 405, 406, 5, 88, 45, 2, 406, 407, 7, 7, 2, 2, 407, 408, 5, 108, 55, 2, 408, 415, 3, 2, 2, 2, 409, 410, 5, 86, 44, 2, 410, 411, 7, 7, 2, 2, 411, 412, 5, 108, 55, 2, 412, 415, 3, 2, 2, 2, 413, 415, 5, 84, 43, 2, 414, 405, 3, 2, 2, 2, 414, 409, 3, 2, 2, 2, 414, 413, 3, 2, 2, 2, 415, 83, 3, 2, 2, 2, 416, 417, 5, 62, 32, 2, 417, 85, 3, 2, 2, 2, 418, 419, 7, 11, 2, 2, 419, 420, 5, 108, 55, 2, 420, 421, 7, 12, 2, 2, 421, 87, 3, 2, 2, 2, 422, 426, 7, 63, 2, 2, 423, 426, 5, 72, 37, 2, 424, 426, 5, 60, 31, 2, 425, 422, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 425, 424, 3, 2, 2, 2, 426, 89, 3, 2, 2, 2, 427, 428, 7, 13, 2, 2, 428, 429, 5, 108, 55, 2, 429, 430, 7, 14, 2, 2, 430, 91, 3, 2, 2, 2, 431, 432, 5, 94, 48, 2, 432, 433, 7, 63, 2, 2, 433, 93, 3, 2, 2, 2, 434, 436, 7, 67, 2, 2, 435, 434, 3, 2, 2, 2, 436, 439, 3, 2, 2, 2, 437, 435, 3, 2, 2, 2, 437, 438, 3, 2, 2, 2, 438, 95, 3, 2, 2, 2, 439, 437, 3, 2, 2, 2, 440, 441, 9, 3, 2, 2, 441, 97, 3, 2, 2, 2, 442, 443, 5, 94, 48, 2, 443, 444, 5, 96, 49, 2, 444, 445, 5, 106, 54, 2, 445, 99, 3, 2, 2, 2, 446, 450, 7, 63, 2, 2, 447, 450, 5, 98, 50, 2, 448, 450, 5, 60, 31, 2, 449, 446, 3, 2, 2, 2, 449, 447, 3, 2, 2, 2, 449, 448, 3, 2, 2, 2, 450, 101, 3, 2, 2, 2, 451, 452, 7, 9, 2, 2, 452, 456, 5, 88, 45, 2, 453, 455, 5, 86, 44, 2, 454, 453, 3, 2, 2, 2, 455, 458, 3, 2, 2, 2, 456, 454, 3, 2, 2, 2, 456, 457, 3, 2, 2, 2, 457, 460, 3, 2, 2, 2, 458, 456, 3, 2, 2, 2, 459, 451, 3, 2, 2, 2, 460, 461, 3, 2, 2, 2, 461, 459, 3, 2, 2, 2, 461, 462, 3, 2, 2, 2, 462, 491, 3, 2, 2, 2, 463, 474, 5, 86, 44, 2, 464, 465, 7, 9, 2, 2, 465, 469, 5, 88, 45, 2, 466, 468, 5, 86, 44, 2, 467, 466, 3, 2, 2, 2, 468, 471, 3, 2, 2, 2, 469, 467, 3, 2, 2, 2, 469, 470, 3, 2, 2, 2, 470, 473, 3, 2, 2, 2, 471, 469, 3, 2, 2, 2, 472, 464, 3, 2, 2, 2, 473, 476, 3, 2, 2, 2, 474, 472, 3, 2, 2, 2, 474, 475, 3, 2, 2, 2, 475, 487, 3, 2, 2, 2, 476, 474, 3, 2, 2, 2, 477, 482, 5, 86, 44, 2, 478, 479, 7, 9, 2, 2, 479, 481, 5, 88, 45, 2, 480, 478, 3, 2, 2, 2, 481, 484, 3, 2, 2, 2, 482, 480, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 486, 3, 2, 2, 2, 484, 482, 3, 2, 2, 2, 485, 477, 3, 2, 2, 2, 486, 489, 3, 2, 2, 2, 487, 485, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 491, 3, 2, 2, 2, 489, 487, 3, 2, 2, 2, 490, 459, 3, 2, 2, 2, 490, 463, 3, 2, 2, 2, 491, 103, 3, 2, 2, 2, 492, 493, 5, 100, 51, 2, 493, 494, 5, 102, 52, 2, 494, 105, 3, 2, 2, 2, 495, 504, 7, 13, 2, 2, 496, 501, 5, 108, 55, 2, 497, 498, 7, 10, 2, 2, 498, 500, 5, 108, 55, 2, 499, 497, 3, 2, 2, 2, 500, 503, 3, 2, 2, 2, 501, 499, 3, 2, 2, 2, 501, 502, 3, 2, 2, 2, 502, 505, 3, 2, 2, 2, 503, 501, 3, 2, 2, 2, 504, 496, 3, 2, 2, 2, 504, 505, 3, 2, 2, 2, 505, 506, 3, 2, 2, 2, 506, 507, 7, 14, 2, 2, 507, 107, 3, 2, 2, 2, 508, 509, 8, 55, 1, 2, 509, 510, 5, 128, 65, 2, 510, 511, 5, 108, 55, 25, 511, 526, 3, 2, 2, 2, 512, 526, 5, 98, 50, 2, 513, 526, 5, 90, 46, 2, 514, 526, 5, 64, 33, 2, 515, 526, 5, 72, 37, 2, 516, 526, 5, 74, 38, 2, 517, 526, 5, 76, 39, 2, 518, 526, 5, 70, 36, 2, 519, 526, 5, 66, 34, 2, 520, 526, 5, 68, 35, 2, 521, 526, 5, 62, 32, 2, 522, 526, 5, 104, 53, 2, 523, 526, 5, 78, 40, 2, 524, 526, 5, 60, 31, 2, 525, 508, 3, 2, 2, 2, 525, 512, 3, 2, 2, 2, 525, 513, 3, 2, 2, 2, 525, 514, 3, 2, 2, 2, 525, 515, 3, 2, 2, 2, 525, 516, 3, 2, 2, 2, 525, 517, 3, 2, 2, 2, 525, 518, 3, 2, 2, 2, 525, 519, 3, 2, 2, 2, 525, 520, 3, 2, 2, 2, 525, 521, 3, 2, 2, 2, 525, 522, 3, 2, 2, 2, 525, 523, 3, 2, 2, 2, 525, 524, 3, 2, 2, 2, 526, 572, 3, 2, 2, 2, 527, 528, 12, 24, 2, 2, 528, 529, 5, 124, 63, 2, 529, 530, 5, 108, 55, 25, 530, 571, 3, 2, 2, 2, 531, 532, 12, 23, 2, 2, 532, 533, 5, 126, 64, 2, 533, 534, 5, 108, 55, 24, 534, 571, 3, 2, 2, 2, 535, 536, 12, 20, 2, 2, 536, 539, 5, 112, 57, 2, 537, 540, 5, 114, 58, 2, 538, 540, 5, 116, 59, 2, 539, 537, 3, 2, 2, 2, 539, 538, 3, 2, 2, 2, 540, 541, 3, 2, 2, 2, 541, 542, 5, 108, 55, 21, 542, 571, 3, 2, 2, 2, 543, 544, 12, 19, 2, 2, 544, 545, 5, 114, 58, 2, 545, 546, 5, 108, 55, 20, 546, 571, 3, 2, 2, 2, 547, 548, 12, 18, 2, 2, 548, 549, 5, 116, 59, 2, 549, 550, 5, 108, 55, 19, 550, 571, 3, 2, 2, 2, 551, 552, 12, 17, 2, 2, 552, 553, 5, 118, 60, 2, 553, 554, 5, 108, 55, 18, 554, 571, 3, 2, 2, 2, 555, 556, 12, 16, 2, 2, 556, 557, 5, 120, 61, 2, 557, 558, 5, 108, 55, 17, 558, 571, 3, 2, 2, 2, 559, 560, 12, 15, 2, 2, 560, 561, 5, 122, 62, 2, 561, 562, 5, 108, 55, 16, 562, 571, 3, 2, 2, 2, 563, 564, 12, 14, 2, 2, 564, 566, 7, 34, 2, 2, 565, 567, 5, 108, 55, 2, 566, 565, 3, 2, 2, 2, 566, 567, 3, 2, 2, 2, 567, 568, 3, 2, 2, 2, 568, 569, 7, 7, 2, 2, 569, 571, 5, 108, 55, 15, 570, 527, 3, 2, 2, 2, 570, 531, 3, 2, 2, 2, 570, 535, 3, 2, 2, 2, 570, 543, 3, 2, 2, 2, 570, 547, 3, 2, 2, 2, 570, 551, 3, 2, 2, 2, 570, 555, 3, 2, 2, 2, 570, 559, 3, 2, 2, 2, 570, 563, 3, 2, 2, 2, 571, 574, 3, 2, 2, 2, 572, 570, 3, 2, 2, 2, 572, 573, 3, 2, 2, 2, 573, 109, 3, 2, 2, 2, 574, 572, 3, 2, 2, 2, 575, 576, 5, 108, 55, 2, 576, 578, 7, 34, 2, 2, 577, 579, 5, 108, 55, 2, 578, 577, 3, 2, 2, 2, 578, 579, 3, 2, 2, 2, 579, 580, 3, 2, 2, 2, 580, 581, 7, 7, 2, 2, 581, 582, 7, 13, 2, 2, 582, 583, 5, 18, 10, 2, 583, 584, 7, 14, 2, 2, 584, 604, 3, 2, 2, 2, 585, 586, 5, 108, 55, 2, 586, 587, 7, 34, 2, 2, 587, 588, 7, 13, 2, 2, 588, 589, 5, 18, 10, 2, 589, 590, 7, 14, 2, 2, 590, 591, 7, 7, 2, 2, 591, 592, 5, 108, 55, 2, 592, 604, 3, 2, 2, 2, 593, 594, 5, 108, 55, 2, 594, 595, 7, 34, 2, 2, 595, 596, 7, 13, 2, 2, 596, 597, 5, 18, 10, 2, 597, 598, 7, 14, 2, 2, 598, 599, 7, 7, 2, 2, 599, 600, 7, 13, 2, 2, 600, 601, 5, 18, 10, 2, 601, 602, 7, 14, 2, 2, 602, 604, 3, 2, 2, 2, 603, 575, 3, 2, 2, 2, 603, 585, 3, 2, 2, 2, 603, 593, 3, 2, 2, 2, 604, 111, 3, 2, 2, 2, 605, 606, 9, 4, 2, 2, 606, 113, 3, 2, 2, 2, 607, 611, 7, 59, 2, 2, 608, 609, 7, 58, 2, 2, 609, 611, 7, 59, 2, 2, 610, 607, 3, 2, 2, 2, 610, 608, 3, 2, 2, 2, 611, 115, 3, 2, 2, 2, 612, 613, 9, 5, 2, 2, 613, 117, 3, 2, 2, 2, 614, 615, 9, 6, 2, 2, 615, 119, 3, 2, 2, 2, 616, 617, 7, 30, 2, 2, 617, 121, 3, 2, 2, 2, 618, 619, 7, 31, 2, 2, 619, 123, 3, 2, 2, 2, 620, 621, 9, 7, 2, 2, 621, 125, 3, 2, 2, 2, 622, 623, 9, 8, 2, 2, 623, 127, 3, 2, 2, 2, 624, 625, 9, 9, 2, 2, 625, 129, 3, 2, 2, 2, 58, 133, 148, 155, 159, 163, 168, 176, 182, 189, 197, 204, 209, 222, 228, 232, 236, 240, 249, 253, 261, 266, 286, 297, 306, 319, 321, 343, 353, 359, 363, 373, 376, 379, 397, 402, 414, 425, 437, 449, 456, 461, 469, 474, 482, 487, 490, 501, 504, 525, 539, 566, 570, 572, 578, 603, 610] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 67, 638, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 3, 2, 7, 2, 134, 10, 2, 12, 2, 14, 2, 137, 11, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 6, 7, 6, 149, 10, 6, 12, 6, 14, 6, 152, 11, 6, 3, 6, 3, 6, 3, 7, 3, 7, 5, 7, 158, 10, 7, 3, 8, 3, 8, 5, 8, 162, 10, 8, 3, 9, 3, 9, 5, 9, 166, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 171, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 179, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 185, 10, 10, 3, 10, 3, 10, 3, 10, 7, 10, 190, 10, 10, 12, 10, 14, 10, 193, 11, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 200, 10, 10, 3, 10, 3, 10, 3, 10, 7, 10, 205, 10, 10, 12, 10, 14, 10, 208, 11, 10, 3, 10, 3, 10, 5, 10, 212, 10, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 225, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 231, 10, 14, 3, 15, 3, 15, 5, 15, 235, 10, 15, 3, 16, 3, 16, 5, 16, 239, 10, 16, 3, 17, 3, 17, 5, 17, 243, 10, 17, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 252, 10, 19, 3, 20, 3, 20, 5, 20, 256, 10, 20, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 262, 10, 21, 12, 21, 14, 21, 265, 11, 21, 3, 22, 3, 22, 5, 22, 269, 10, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 5, 23, 289, 10, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 7, 25, 298, 10, 25, 12, 25, 14, 25, 301, 11, 25, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 307, 10, 26, 12, 26, 14, 26, 310, 11, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 322, 10, 28, 5, 28, 324, 10, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 346, 10, 30, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 5, 33, 356, 10, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 362, 10, 33, 3, 34, 3, 34, 5, 34, 366, 10, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 7, 35, 374, 10, 35, 12, 35, 14, 35, 377, 11, 35, 5, 35, 379, 10, 35, 3, 35, 5, 35, 382, 10, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 37, 3, 37, 3, 38, 3, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 41, 3, 41, 6, 41, 398, 10, 41, 13, 41, 14, 41, 399, 3, 41, 7, 41, 403, 10, 41, 12, 41, 14, 41, 406, 11, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 417, 10, 42, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 5, 45, 428, 10, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 48, 7, 48, 438, 10, 48, 12, 48, 14, 48, 441, 11, 48, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 5, 51, 452, 10, 51, 3, 52, 3, 52, 3, 52, 7, 52, 457, 10, 52, 12, 52, 14, 52, 460, 11, 52, 6, 52, 462, 10, 52, 13, 52, 14, 52, 463, 3, 52, 3, 52, 3, 52, 3, 52, 7, 52, 470, 10, 52, 12, 52, 14, 52, 473, 11, 52, 7, 52, 475, 10, 52, 12, 52, 14, 52, 478, 11, 52, 3, 52, 3, 52, 3, 52, 7, 52, 483, 10, 52, 12, 52, 14, 52, 486, 11, 52, 7, 52, 488, 10, 52, 12, 52, 14, 52, 491, 11, 52, 5, 52, 493, 10, 52, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 7, 54, 502, 10, 54, 12, 54, 14, 54, 505, 11, 54, 5, 54, 507, 10, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 5, 55, 528, 10, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 5, 55, 542, 10, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 5, 55, 573, 10, 55, 3, 55, 3, 55, 7, 55, 577, 10, 55, 12, 55, 14, 55, 580, 11, 55, 3, 56, 3, 56, 3, 56, 5, 56, 585, 10, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 5, 56, 610, 10, 56, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 5, 58, 617, 10, 58, 3, 59, 3, 59, 3, 59, 5, 59, 622, 10, 59, 3, 60, 3, 60, 3, 61, 3, 61, 3, 62, 3, 62, 3, 63, 3, 63, 3, 64, 3, 64, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 2, 3, 108, 67, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 2, 10, 3, 2, 46, 47, 5, 2, 30, 31, 37, 59, 63, 63, 4, 2, 46, 46, 54, 55, 3, 2, 17, 22, 3, 2, 35, 36, 3, 2, 23, 25, 3, 2, 26, 27, 4, 2, 26, 27, 58, 58, 2, 668, 2, 135, 3, 2, 2, 2, 4, 140, 3, 2, 2, 2, 6, 142, 3, 2, 2, 2, 8, 144, 3, 2, 2, 2, 10, 150, 3, 2, 2, 2, 12, 157, 3, 2, 2, 2, 14, 161, 3, 2, 2, 2, 16, 178, 3, 2, 2, 2, 18, 211, 3, 2, 2, 2, 20, 213, 3, 2, 2, 2, 22, 215, 3, 2, 2, 2, 24, 224, 3, 2, 2, 2, 26, 230, 3, 2, 2, 2, 28, 234, 3, 2, 2, 2, 30, 238, 3, 2, 2, 2, 32, 242, 3, 2, 2, 2, 34, 244, 3, 2, 2, 2, 36, 247, 3, 2, 2, 2, 38, 255, 3, 2, 2, 2, 40, 257, 3, 2, 2, 2, 42, 266, 3, 2, 2, 2, 44, 288, 3, 2, 2, 2, 46, 290, 3, 2, 2, 2, 48, 294, 3, 2, 2, 2, 50, 302, 3, 2, 2, 2, 52, 311, 3, 2, 2, 2, 54, 323, 3, 2, 2, 2, 56, 325, 3, 2, 2, 2, 58, 345, 3, 2, 2, 2, 60, 347, 3, 2, 2, 2, 62, 350, 3, 2, 2, 2, 64, 355, 3, 2, 2, 2, 66, 363, 3, 2, 2, 2, 68, 369, 3, 2, 2, 2, 70, 385, 3, 2, 2, 2, 72, 387, 3, 2, 2, 2, 74, 389, 3, 2, 2, 2, 76, 391, 3, 2, 2, 2, 78, 393, 3, 2, 2, 2, 80, 395, 3, 2, 2, 2, 82, 416, 3, 2, 2, 2, 84, 418, 3, 2, 2, 2, 86, 420, 3, 2, 2, 2, 88, 427, 3, 2, 2, 2, 90, 429, 3, 2, 2, 2, 92, 433, 3, 2, 2, 2, 94, 439, 3, 2, 2, 2, 96, 442, 3, 2, 2, 2, 98, 444, 3, 2, 2, 2, 100, 451, 3, 2, 2, 2, 102, 492, 3, 2, 2, 2, 104, 494, 3, 2, 2, 2, 106, 497, 3, 2, 2, 2, 108, 527, 3, 2, 2, 2, 110, 609, 3, 2, 2, 2, 112, 611, 3, 2, 2, 2, 114, 616, 3, 2, 2, 2, 116, 621, 3, 2, 2, 2, 118, 623, 3, 2, 2, 2, 120, 625, 3, 2, 2, 2, 122, 627, 3, 2, 2, 2, 124, 629, 3, 2, 2, 2, 126, 631, 3, 2, 2, 2, 128, 633, 3, 2, 2, 2, 130, 635, 3, 2, 2, 2, 132, 134, 5, 4, 3, 2, 133, 132, 3, 2, 2, 2, 134, 137, 3, 2, 2, 2, 135, 133, 3, 2, 2, 2, 135, 136, 3, 2, 2, 2, 136, 138, 3, 2, 2, 2, 137, 135, 3, 2, 2, 2, 138, 139, 5, 10, 6, 2, 139, 3, 3, 2, 2, 2, 140, 141, 5, 6, 4, 2, 141, 5, 3, 2, 2, 2, 142, 143, 5, 8, 5, 2, 143, 7, 3, 2, 2, 2, 144, 145, 7, 49, 2, 2, 145, 146, 5, 92, 47, 2, 146, 9, 3, 2, 2, 2, 147, 149, 5, 12, 7, 2, 148, 147, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 150, 151, 3, 2, 2, 2, 151, 153, 3, 2, 2, 2, 152, 150, 3, 2, 2, 2, 153, 154, 5, 14, 8, 2, 154, 11, 3, 2, 2, 2, 155, 158, 5, 98, 50, 2, 156, 158, 5, 58, 30, 2, 157, 155, 3, 2, 2, 2, 157, 156, 3, 2, 2, 2, 158, 13, 3, 2, 2, 2, 159, 162, 5, 16, 9, 2, 160, 162, 5, 18, 10, 2, 161, 159, 3, 2, 2, 2, 161, 160, 3, 2, 2, 2, 162, 15, 3, 2, 2, 2, 163, 165, 7, 38, 2, 2, 164, 166, 7, 39, 2, 2, 165, 164, 3, 2, 2, 2, 165, 166, 3, 2, 2, 2, 166, 167, 3, 2, 2, 2, 167, 179, 5, 108, 55, 2, 168, 170, 7, 38, 2, 2, 169, 171, 7, 39, 2, 2, 170, 169, 3, 2, 2, 2, 170, 171, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 172, 173, 7, 13, 2, 2, 173, 174, 5, 18, 10, 2, 174, 175, 7, 14, 2, 2, 175, 179, 3, 2, 2, 2, 176, 177, 7, 38, 2, 2, 177, 179, 5, 110, 56, 2, 178, 163, 3, 2, 2, 2, 178, 168, 3, 2, 2, 2, 178, 176, 3, 2, 2, 2, 179, 17, 3, 2, 2, 2, 180, 181, 7, 37, 2, 2, 181, 184, 5, 20, 11, 2, 182, 183, 7, 10, 2, 2, 183, 185, 5, 22, 12, 2, 184, 182, 3, 2, 2, 2, 184, 185, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 187, 7, 59, 2, 2, 187, 191, 5, 24, 13, 2, 188, 190, 5, 30, 16, 2, 189, 188, 3, 2, 2, 2, 190, 193, 3, 2, 2, 2, 191, 189, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 194, 3, 2, 2, 2, 193, 191, 3, 2, 2, 2, 194, 195, 5, 32, 17, 2, 195, 212, 3, 2, 2, 2, 196, 197, 7, 37, 2, 2, 197, 199, 5, 20, 11, 2, 198, 200, 7, 60, 2, 2, 199, 198, 3, 2, 2, 2, 199, 200, 3, 2, 2, 2, 200, 201, 3, 2, 2, 2, 201, 202, 7, 61, 2, 2, 202, 206, 5, 108, 55, 2, 203, 205, 5, 30, 16, 2, 204, 203, 3, 2, 2, 2, 205, 208, 3, 2, 2, 2, 206, 204, 3, 2, 2, 2, 206, 207, 3, 2, 2, 2, 207, 209, 3, 2, 2, 2, 208, 206, 3, 2, 2, 2, 209, 210, 5, 32, 17, 2, 210, 212, 3, 2, 2, 2, 211, 180, 3, 2, 2, 2, 211, 196, 3, 2, 2, 2, 212, 19, 3, 2, 2, 2, 213, 214, 7, 63, 2, 2, 214, 21, 3, 2, 2, 2, 215, 216, 7, 63, 2, 2, 216, 23, 3, 2, 2, 2, 217, 225, 5, 98, 50, 2, 218, 225, 5, 66, 34, 2, 219, 225, 5, 68, 35, 2, 220, 225, 5, 62, 32, 2, 221, 225, 5, 104, 53, 2, 222, 225, 5, 64, 33, 2, 223, 225, 5, 60, 31, 2, 224, 217, 3, 2, 2, 2, 224, 218, 3, 2, 2, 2, 224, 219, 3, 2, 2, 2, 224, 220, 3, 2, 2, 2, 224, 221, 3, 2, 2, 2, 224, 222, 3, 2, 2, 2, 224, 223, 3, 2, 2, 2, 225, 25, 3, 2, 2, 2, 226, 231, 5, 36, 19, 2, 227, 231, 5, 40, 21, 2, 228, 231, 5, 34, 18, 2, 229, 231, 5, 44, 23, 2, 230, 226, 3, 2, 2, 2, 230, 227, 3, 2, 2, 2, 230, 228, 3, 2, 2, 2, 230, 229, 3, 2, 2, 2, 231, 27, 3, 2, 2, 2, 232, 235, 5, 58, 30, 2, 233, 235, 5, 98, 50, 2, 234, 232, 3, 2, 2, 2, 234, 233, 3, 2, 2, 2, 235, 29, 3, 2, 2, 2, 236, 239, 5, 28, 15, 2, 237, 239, 5, 26, 14, 2, 238, 236, 3, 2, 2, 2, 238, 237, 3, 2, 2, 2, 239, 31, 3, 2, 2, 2, 240, 243, 5, 16, 9, 2, 241, 243, 5, 18, 10, 2, 242, 240, 3, 2, 2, 2, 242, 241, 3, 2, 2, 2, 243, 33, 3, 2, 2, 2, 244, 245, 7, 40, 2, 2, 245, 246, 5, 108, 55, 2, 246, 35, 3, 2, 2, 2, 247, 248, 7, 42, 2, 2, 248, 251, 5, 38, 20, 2, 249, 250, 7, 10, 2, 2, 250, 252, 5, 38, 20, 2, 251, 249, 3, 2, 2, 2, 251, 252, 3, 2, 2, 2, 252, 37, 3, 2, 2, 2, 253, 256, 7, 65, 2, 2, 254, 256, 5, 60, 31, 2, 255, 253, 3, 2, 2, 2, 255, 254, 3, 2, 2, 2, 256, 39, 3, 2, 2, 2, 257, 258, 7, 41, 2, 2, 258, 263, 5, 42, 22, 2, 259, 260, 7, 10, 2, 2, 260, 262, 5, 42, 22, 2, 261, 259, 3, 2, 2, 2, 262, 265, 3, 2, 2, 2, 263, 261, 3, 2, 2, 2, 263, 264, 3, 2, 2, 2, 264, 41, 3, 2, 2, 2, 265, 263, 3, 2, 2, 2, 266, 268, 5, 108, 55, 2, 267, 269, 7, 45, 2, 2, 268, 267, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, 43, 3, 2, 2, 2, 270, 271, 7, 44, 2, 2, 271, 289, 5, 56, 29, 2, 272, 273, 7, 44, 2, 2, 273, 289, 5, 50, 26, 2, 274, 275, 7, 44, 2, 2, 275, 276, 5, 48, 25, 2, 276, 277, 5, 50, 26, 2, 277, 289, 3, 2, 2, 2, 278, 279, 7, 44, 2, 2, 279, 280, 5, 48, 25, 2, 280, 281, 5, 54, 28, 2, 281, 289, 3, 2, 2, 2, 282, 283, 7, 44, 2, 2, 283, 284, 5, 48, 25, 2, 284, 285, 5, 56, 29, 2, 285, 289, 3, 2, 2, 2, 286, 287, 7, 44, 2, 2, 287, 289, 5, 48, 25, 2, 288, 270, 3, 2, 2, 2, 288, 272, 3, 2, 2, 2, 288, 274, 3, 2, 2, 2, 288, 278, 3, 2, 2, 2, 288, 282, 3, 2, 2, 2, 288, 286, 3, 2, 2, 2, 289, 45, 3, 2, 2, 2, 290, 291, 7, 63, 2, 2, 291, 292, 7, 33, 2, 2, 292, 293, 5, 108, 55, 2, 293, 47, 3, 2, 2, 2, 294, 299, 5, 46, 24, 2, 295, 296, 7, 10, 2, 2, 296, 298, 5, 46, 24, 2, 297, 295, 3, 2, 2, 2, 298, 301, 3, 2, 2, 2, 299, 297, 3, 2, 2, 2, 299, 300, 3, 2, 2, 2, 300, 49, 3, 2, 2, 2, 301, 299, 3, 2, 2, 2, 302, 303, 7, 56, 2, 2, 303, 308, 5, 52, 27, 2, 304, 305, 7, 10, 2, 2, 305, 307, 5, 52, 27, 2, 306, 304, 3, 2, 2, 2, 307, 310, 3, 2, 2, 2, 308, 306, 3, 2, 2, 2, 308, 309, 3, 2, 2, 2, 309, 51, 3, 2, 2, 2, 310, 308, 3, 2, 2, 2, 311, 312, 7, 63, 2, 2, 312, 313, 7, 33, 2, 2, 313, 314, 5, 98, 50, 2, 314, 53, 3, 2, 2, 2, 315, 316, 7, 50, 2, 2, 316, 324, 5, 46, 24, 2, 317, 318, 7, 50, 2, 2, 318, 321, 7, 63, 2, 2, 319, 320, 7, 51, 2, 2, 320, 322, 7, 63, 2, 2, 321, 319, 3, 2, 2, 2, 321, 322, 3, 2, 2, 2, 322, 324, 3, 2, 2, 2, 323, 315, 3, 2, 2, 2, 323, 317, 3, 2, 2, 2, 324, 55, 3, 2, 2, 2, 325, 326, 7, 52, 2, 2, 326, 327, 7, 53, 2, 2, 327, 328, 7, 50, 2, 2, 328, 329, 7, 63, 2, 2, 329, 57, 3, 2, 2, 2, 330, 331, 7, 43, 2, 2, 331, 332, 7, 63, 2, 2, 332, 333, 7, 33, 2, 2, 333, 346, 5, 108, 55, 2, 334, 335, 7, 43, 2, 2, 335, 336, 7, 63, 2, 2, 336, 337, 7, 33, 2, 2, 337, 338, 7, 13, 2, 2, 338, 339, 5, 18, 10, 2, 339, 340, 7, 14, 2, 2, 340, 346, 3, 2, 2, 2, 341, 342, 7, 43, 2, 2, 342, 343, 7, 63, 2, 2, 343, 344, 7, 33, 2, 2, 344, 346, 5, 110, 56, 2, 345, 330, 3, 2, 2, 2, 345, 334, 3, 2, 2, 2, 345, 341, 3, 2, 2, 2, 346, 59, 3, 2, 2, 2, 347, 348, 7, 62, 2, 2, 348, 349, 7, 63, 2, 2, 349, 61, 3, 2, 2, 2, 350, 351, 7, 63, 2, 2, 351, 63, 3, 2, 2, 2, 352, 356, 5, 74, 38, 2, 353, 356, 5, 62, 32, 2, 354, 356, 5, 60, 31, 2, 355, 352, 3, 2, 2, 2, 355, 353, 3, 2, 2, 2, 355, 354, 3, 2, 2, 2, 356, 357, 3, 2, 2, 2, 357, 361, 7, 32, 2, 2, 358, 362, 5, 74, 38, 2, 359, 362, 5, 62, 32, 2, 360, 362, 5, 60, 31, 2, 361, 358, 3, 2, 2, 2, 361, 359, 3, 2, 2, 2, 361, 360, 3, 2, 2, 2, 362, 65, 3, 2, 2, 2, 363, 365, 7, 11, 2, 2, 364, 366, 5, 80, 41, 2, 365, 364, 3, 2, 2, 2, 365, 366, 3, 2, 2, 2, 366, 367, 3, 2, 2, 2, 367, 368, 7, 12, 2, 2, 368, 67, 3, 2, 2, 2, 369, 378, 7, 15, 2, 2, 370, 375, 5, 82, 42, 2, 371, 372, 7, 10, 2, 2, 372, 374, 5, 82, 42, 2, 373, 371, 3, 2, 2, 2, 374, 377, 3, 2, 2, 2, 375, 373, 3, 2, 2, 2, 375, 376, 3, 2, 2, 2, 376, 379, 3, 2, 2, 2, 377, 375, 3, 2, 2, 2, 378, 370, 3, 2, 2, 2, 378, 379, 3, 2, 2, 2, 379, 381, 3, 2, 2, 2, 380, 382, 7, 10, 2, 2, 381, 380, 3, 2, 2, 2, 381, 382, 3, 2, 2, 2, 382, 383, 3, 2, 2, 2, 383, 384, 7, 16, 2, 2, 384, 69, 3, 2, 2, 2, 385, 386, 7, 48, 2, 2, 386, 71, 3, 2, 2, 2, 387, 388, 7, 64, 2, 2, 388, 73, 3, 2, 2, 2, 389, 390, 7, 65, 2, 2, 390, 75, 3, 2, 2, 2, 391, 392, 7, 66, 2, 2, 392, 77, 3, 2, 2, 2, 393, 394, 9, 2, 2, 2, 394, 79, 3, 2, 2, 2, 395, 404, 5, 108, 55, 2, 396, 398, 7, 10, 2, 2, 397, 396, 3, 2, 2, 2, 398, 399, 3, 2, 2, 2, 399, 397, 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 401, 3, 2, 2, 2, 401, 403, 5, 108, 55, 2, 402, 397, 3, 2, 2, 2, 403, 406, 3, 2, 2, 2, 404, 402, 3, 2, 2, 2, 404, 405, 3, 2, 2, 2, 405, 81, 3, 2, 2, 2, 406, 404, 3, 2, 2, 2, 407, 408, 5, 88, 45, 2, 408, 409, 7, 7, 2, 2, 409, 410, 5, 108, 55, 2, 410, 417, 3, 2, 2, 2, 411, 412, 5, 86, 44, 2, 412, 413, 7, 7, 2, 2, 413, 414, 5, 108, 55, 2, 414, 417, 3, 2, 2, 2, 415, 417, 5, 84, 43, 2, 416, 407, 3, 2, 2, 2, 416, 411, 3, 2, 2, 2, 416, 415, 3, 2, 2, 2, 417, 83, 3, 2, 2, 2, 418, 419, 5, 62, 32, 2, 419, 85, 3, 2, 2, 2, 420, 421, 7, 11, 2, 2, 421, 422, 5, 108, 55, 2, 422, 423, 7, 12, 2, 2, 423, 87, 3, 2, 2, 2, 424, 428, 7, 63, 2, 2, 425, 428, 5, 72, 37, 2, 426, 428, 5, 60, 31, 2, 427, 424, 3, 2, 2, 2, 427, 425, 3, 2, 2, 2, 427, 426, 3, 2, 2, 2, 428, 89, 3, 2, 2, 2, 429, 430, 7, 13, 2, 2, 430, 431, 5, 108, 55, 2, 431, 432, 7, 14, 2, 2, 432, 91, 3, 2, 2, 2, 433, 434, 5, 94, 48, 2, 434, 435, 7, 63, 2, 2, 435, 93, 3, 2, 2, 2, 436, 438, 7, 67, 2, 2, 437, 436, 3, 2, 2, 2, 438, 441, 3, 2, 2, 2, 439, 437, 3, 2, 2, 2, 439, 440, 3, 2, 2, 2, 440, 95, 3, 2, 2, 2, 441, 439, 3, 2, 2, 2, 442, 443, 9, 3, 2, 2, 443, 97, 3, 2, 2, 2, 444, 445, 5, 94, 48, 2, 445, 446, 5, 96, 49, 2, 446, 447, 5, 106, 54, 2, 447, 99, 3, 2, 2, 2, 448, 452, 7, 63, 2, 2, 449, 452, 5, 98, 50, 2, 450, 452, 5, 60, 31, 2, 451, 448, 3, 2, 2, 2, 451, 449, 3, 2, 2, 2, 451, 450, 3, 2, 2, 2, 452, 101, 3, 2, 2, 2, 453, 454, 7, 9, 2, 2, 454, 458, 5, 88, 45, 2, 455, 457, 5, 86, 44, 2, 456, 455, 3, 2, 2, 2, 457, 460, 3, 2, 2, 2, 458, 456, 3, 2, 2, 2, 458, 459, 3, 2, 2, 2, 459, 462, 3, 2, 2, 2, 460, 458, 3, 2, 2, 2, 461, 453, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 463, 461, 3, 2, 2, 2, 463, 464, 3, 2, 2, 2, 464, 493, 3, 2, 2, 2, 465, 476, 5, 86, 44, 2, 466, 467, 7, 9, 2, 2, 467, 471, 5, 88, 45, 2, 468, 470, 5, 86, 44, 2, 469, 468, 3, 2, 2, 2, 470, 473, 3, 2, 2, 2, 471, 469, 3, 2, 2, 2, 471, 472, 3, 2, 2, 2, 472, 475, 3, 2, 2, 2, 473, 471, 3, 2, 2, 2, 474, 466, 3, 2, 2, 2, 475, 478, 3, 2, 2, 2, 476, 474, 3, 2, 2, 2, 476, 477, 3, 2, 2, 2, 477, 489, 3, 2, 2, 2, 478, 476, 3, 2, 2, 2, 479, 484, 5, 86, 44, 2, 480, 481, 7, 9, 2, 2, 481, 483, 5, 88, 45, 2, 482, 480, 3, 2, 2, 2, 483, 486, 3, 2, 2, 2, 484, 482, 3, 2, 2, 2, 484, 485, 3, 2, 2, 2, 485, 488, 3, 2, 2, 2, 486, 484, 3, 2, 2, 2, 487, 479, 3, 2, 2, 2, 488, 491, 3, 2, 2, 2, 489, 487, 3, 2, 2, 2, 489, 490, 3, 2, 2, 2, 490, 493, 3, 2, 2, 2, 491, 489, 3, 2, 2, 2, 492, 461, 3, 2, 2, 2, 492, 465, 3, 2, 2, 2, 493, 103, 3, 2, 2, 2, 494, 495, 5, 100, 51, 2, 495, 496, 5, 102, 52, 2, 496, 105, 3, 2, 2, 2, 497, 506, 7, 13, 2, 2, 498, 503, 5, 108, 55, 2, 499, 500, 7, 10, 2, 2, 500, 502, 5, 108, 55, 2, 501, 499, 3, 2, 2, 2, 502, 505, 3, 2, 2, 2, 503, 501, 3, 2, 2, 2, 503, 504, 3, 2, 2, 2, 504, 507, 3, 2, 2, 2, 505, 503, 3, 2, 2, 2, 506, 498, 3, 2, 2, 2, 506, 507, 3, 2, 2, 2, 507, 508, 3, 2, 2, 2, 508, 509, 7, 14, 2, 2, 509, 107, 3, 2, 2, 2, 510, 511, 8, 55, 1, 2, 511, 512, 5, 130, 66, 2, 512, 513, 5, 108, 55, 26, 513, 528, 3, 2, 2, 2, 514, 528, 5, 98, 50, 2, 515, 528, 5, 90, 46, 2, 516, 528, 5, 64, 33, 2, 517, 528, 5, 72, 37, 2, 518, 528, 5, 74, 38, 2, 519, 528, 5, 76, 39, 2, 520, 528, 5, 70, 36, 2, 521, 528, 5, 66, 34, 2, 522, 528, 5, 68, 35, 2, 523, 528, 5, 62, 32, 2, 524, 528, 5, 104, 53, 2, 525, 528, 5, 78, 40, 2, 526, 528, 5, 60, 31, 2, 527, 510, 3, 2, 2, 2, 527, 514, 3, 2, 2, 2, 527, 515, 3, 2, 2, 2, 527, 516, 3, 2, 2, 2, 527, 517, 3, 2, 2, 2, 527, 518, 3, 2, 2, 2, 527, 519, 3, 2, 2, 2, 527, 520, 3, 2, 2, 2, 527, 521, 3, 2, 2, 2, 527, 522, 3, 2, 2, 2, 527, 523, 3, 2, 2, 2, 527, 524, 3, 2, 2, 2, 527, 525, 3, 2, 2, 2, 527, 526, 3, 2, 2, 2, 528, 578, 3, 2, 2, 2, 529, 530, 12, 25, 2, 2, 530, 531, 5, 126, 64, 2, 531, 532, 5, 108, 55, 26, 532, 577, 3, 2, 2, 2, 533, 534, 12, 24, 2, 2, 534, 535, 5, 128, 65, 2, 535, 536, 5, 108, 55, 25, 536, 577, 3, 2, 2, 2, 537, 538, 12, 21, 2, 2, 538, 541, 5, 112, 57, 2, 539, 542, 5, 114, 58, 2, 540, 542, 5, 118, 60, 2, 541, 539, 3, 2, 2, 2, 541, 540, 3, 2, 2, 2, 542, 543, 3, 2, 2, 2, 543, 544, 5, 108, 55, 22, 544, 577, 3, 2, 2, 2, 545, 546, 12, 20, 2, 2, 546, 547, 5, 114, 58, 2, 547, 548, 5, 108, 55, 21, 548, 577, 3, 2, 2, 2, 549, 550, 12, 19, 2, 2, 550, 551, 5, 116, 59, 2, 551, 552, 5, 108, 55, 20, 552, 577, 3, 2, 2, 2, 553, 554, 12, 18, 2, 2, 554, 555, 5, 118, 60, 2, 555, 556, 5, 108, 55, 19, 556, 577, 3, 2, 2, 2, 557, 558, 12, 17, 2, 2, 558, 559, 5, 120, 61, 2, 559, 560, 5, 108, 55, 18, 560, 577, 3, 2, 2, 2, 561, 562, 12, 16, 2, 2, 562, 563, 5, 122, 62, 2, 563, 564, 5, 108, 55, 17, 564, 577, 3, 2, 2, 2, 565, 566, 12, 15, 2, 2, 566, 567, 5, 124, 63, 2, 567, 568, 5, 108, 55, 16, 568, 577, 3, 2, 2, 2, 569, 570, 12, 14, 2, 2, 570, 572, 7, 34, 2, 2, 571, 573, 5, 108, 55, 2, 572, 571, 3, 2, 2, 2, 572, 573, 3, 2, 2, 2, 573, 574, 3, 2, 2, 2, 574, 575, 7, 7, 2, 2, 575, 577, 5, 108, 55, 15, 576, 529, 3, 2, 2, 2, 576, 533, 3, 2, 2, 2, 576, 537, 3, 2, 2, 2, 576, 545, 3, 2, 2, 2, 576, 549, 3, 2, 2, 2, 576, 553, 3, 2, 2, 2, 576, 557, 3, 2, 2, 2, 576, 561, 3, 2, 2, 2, 576, 565, 3, 2, 2, 2, 576, 569, 3, 2, 2, 2, 577, 580, 3, 2, 2, 2, 578, 576, 3, 2, 2, 2, 578, 579, 3, 2, 2, 2, 579, 109, 3, 2, 2, 2, 580, 578, 3, 2, 2, 2, 581, 582, 5, 108, 55, 2, 582, 584, 7, 34, 2, 2, 583, 585, 5, 108, 55, 2, 584, 583, 3, 2, 2, 2, 584, 585, 3, 2, 2, 2, 585, 586, 3, 2, 2, 2, 586, 587, 7, 7, 2, 2, 587, 588, 7, 13, 2, 2, 588, 589, 5, 18, 10, 2, 589, 590, 7, 14, 2, 2, 590, 610, 3, 2, 2, 2, 591, 592, 5, 108, 55, 2, 592, 593, 7, 34, 2, 2, 593, 594, 7, 13, 2, 2, 594, 595, 5, 18, 10, 2, 595, 596, 7, 14, 2, 2, 596, 597, 7, 7, 2, 2, 597, 598, 5, 108, 55, 2, 598, 610, 3, 2, 2, 2, 599, 600, 5, 108, 55, 2, 600, 601, 7, 34, 2, 2, 601, 602, 7, 13, 2, 2, 602, 603, 5, 18, 10, 2, 603, 604, 7, 14, 2, 2, 604, 605, 7, 7, 2, 2, 605, 606, 7, 13, 2, 2, 606, 607, 5, 18, 10, 2, 607, 608, 7, 14, 2, 2, 608, 610, 3, 2, 2, 2, 609, 581, 3, 2, 2, 2, 609, 591, 3, 2, 2, 2, 609, 599, 3, 2, 2, 2, 610, 111, 3, 2, 2, 2, 611, 612, 9, 4, 2, 2, 612, 113, 3, 2, 2, 2, 613, 617, 7, 59, 2, 2, 614, 615, 7, 58, 2, 2, 615, 617, 7, 59, 2, 2, 616, 613, 3, 2, 2, 2, 616, 614, 3, 2, 2, 2, 617, 115, 3, 2, 2, 2, 618, 622, 7, 57, 2, 2, 619, 620, 7, 58, 2, 2, 620, 622, 7, 57, 2, 2, 621, 618, 3, 2, 2, 2, 621, 619, 3, 2, 2, 2, 622, 117, 3, 2, 2, 2, 623, 624, 9, 5, 2, 2, 624, 119, 3, 2, 2, 2, 625, 626, 9, 6, 2, 2, 626, 121, 3, 2, 2, 2, 627, 628, 7, 30, 2, 2, 628, 123, 3, 2, 2, 2, 629, 630, 7, 31, 2, 2, 630, 125, 3, 2, 2, 2, 631, 632, 9, 7, 2, 2, 632, 127, 3, 2, 2, 2, 633, 634, 9, 8, 2, 2, 634, 129, 3, 2, 2, 2, 635, 636, 9, 9, 2, 2, 636, 131, 3, 2, 2, 2, 59, 135, 150, 157, 161, 165, 170, 178, 184, 191, 199, 206, 211, 224, 230, 234, 238, 242, 251, 255, 263, 268, 288, 299, 308, 321, 323, 345, 355, 361, 365, 375, 378, 381, 399, 404, 416, 427, 439, 451, 458, 463, 471, 476, 484, 489, 492, 503, 506, 527, 541, 572, 576, 578, 584, 609, 616, 621] \ No newline at end of file diff --git a/pkg/parser/fql/fql_lexer.go b/pkg/parser/fql/fql_lexer.go index 761c4985..11214f11 100644 --- a/pkg/parser/fql/fql_lexer.go +++ b/pkg/parser/fql/fql_lexer.go @@ -1,4 +1,4 @@ -// Code generated from antlr/FqlLexer.g4 by ANTLR 4.8. DO NOT EDIT. +// Code generated from antlr/FqlLexer.g4 by ANTLR 4.9.1. DO NOT EDIT. package fql @@ -268,9 +268,6 @@ var serializedLexerAtn = []uint16{ 2, 3, 2, } -var lexerDeserializer = antlr.NewATNDeserializer(nil) -var lexerAtn = lexerDeserializer.DeserializeFromUInt16(serializedLexerAtn) - var lexerChannelNames = []string{ "DEFAULT_TOKEN_CHANNEL", "HIDDEN", } @@ -324,18 +321,20 @@ type FqlLexer struct { // TODO: EOF string } -var lexerDecisionToDFA = make([]*antlr.DFA, len(lexerAtn.DecisionToState)) - -func init() { +// NewFqlLexer produces a new lexer instance for the optional input antlr.CharStream. +// +// The *FqlLexer instance produced may be reused by calling the SetInputStream method. +// The initial lexer configuration is expensive to construct, and the object is not thread-safe; +// however, if used within a Golang sync.Pool, the construction cost amortizes well and the +// objects can be used in a thread-safe manner. +func NewFqlLexer(input antlr.CharStream) *FqlLexer { + l := new(FqlLexer) + lexerDeserializer := antlr.NewATNDeserializer(nil) + lexerAtn := lexerDeserializer.DeserializeFromUInt16(serializedLexerAtn) + lexerDecisionToDFA := make([]*antlr.DFA, len(lexerAtn.DecisionToState)) for index, ds := range lexerAtn.DecisionToState { lexerDecisionToDFA[index] = antlr.NewDFA(ds, index) } -} - -func NewFqlLexer(input antlr.CharStream) *FqlLexer { - - l := new(FqlLexer) - l.BaseLexer = antlr.NewBaseLexer(input) l.Interpreter = antlr.NewLexerATNSimulator(l, lexerAtn, lexerDecisionToDFA, antlr.NewPredictionContextCache()) diff --git a/pkg/parser/fql/fql_parser.go b/pkg/parser/fql/fql_parser.go index b24c9e86..1f1ba167 100644 --- a/pkg/parser/fql/fql_parser.go +++ b/pkg/parser/fql/fql_parser.go @@ -1,4 +1,4 @@ -// Code generated from antlr/FqlParser.g4 by ANTLR 4.8. DO NOT EDIT. +// Code generated from antlr/FqlParser.g4 by ANTLR 4.9.1. DO NOT EDIT. package fql // FqlParser import ( @@ -15,7 +15,7 @@ var _ = reflect.Copy var _ = strconv.Itoa var parserATN = []uint16{ - 3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 67, 627, + 3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 67, 638, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, @@ -28,278 +28,280 @@ var parserATN = []uint16{ 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, - 3, 2, 7, 2, 132, 10, 2, 12, 2, 14, 2, 135, 11, 2, 3, 2, 3, 2, 3, 3, 3, - 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 6, 7, 6, 147, 10, 6, 12, 6, 14, 6, - 150, 11, 6, 3, 6, 3, 6, 3, 7, 3, 7, 5, 7, 156, 10, 7, 3, 8, 3, 8, 5, 8, - 160, 10, 8, 3, 9, 3, 9, 5, 9, 164, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 169, - 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 177, 10, 9, 3, 10, 3, - 10, 3, 10, 3, 10, 5, 10, 183, 10, 10, 3, 10, 3, 10, 3, 10, 7, 10, 188, - 10, 10, 12, 10, 14, 10, 191, 11, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, - 5, 10, 198, 10, 10, 3, 10, 3, 10, 3, 10, 7, 10, 203, 10, 10, 12, 10, 14, - 10, 206, 11, 10, 3, 10, 3, 10, 5, 10, 210, 10, 10, 3, 11, 3, 11, 3, 12, - 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 223, 10, - 13, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 229, 10, 14, 3, 15, 3, 15, 5, 15, - 233, 10, 15, 3, 16, 3, 16, 5, 16, 237, 10, 16, 3, 17, 3, 17, 5, 17, 241, - 10, 17, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 250, 10, - 19, 3, 20, 3, 20, 5, 20, 254, 10, 20, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, - 260, 10, 21, 12, 21, 14, 21, 263, 11, 21, 3, 22, 3, 22, 5, 22, 267, 10, - 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, - 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 5, 23, 287, 10, - 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 7, 25, 296, 10, 25, - 12, 25, 14, 25, 299, 11, 25, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 305, 10, - 26, 12, 26, 14, 26, 308, 11, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, - 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 320, 10, 28, 5, 28, 322, 10, 28, - 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, - 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, - 344, 10, 30, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 5, - 33, 354, 10, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 360, 10, 33, 3, 34, - 3, 34, 5, 34, 364, 10, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 7, - 35, 372, 10, 35, 12, 35, 14, 35, 375, 11, 35, 5, 35, 377, 10, 35, 3, 35, - 5, 35, 380, 10, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 37, 3, 37, 3, 38, 3, - 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 41, 3, 41, 6, 41, 396, 10, 41, 13, 41, - 14, 41, 397, 3, 41, 7, 41, 401, 10, 41, 12, 41, 14, 41, 404, 11, 41, 3, - 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 415, + 4, 66, 9, 66, 3, 2, 7, 2, 134, 10, 2, 12, 2, 14, 2, 137, 11, 2, 3, 2, 3, + 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 6, 7, 6, 149, 10, 6, 12, + 6, 14, 6, 152, 11, 6, 3, 6, 3, 6, 3, 7, 3, 7, 5, 7, 158, 10, 7, 3, 8, 3, + 8, 5, 8, 162, 10, 8, 3, 9, 3, 9, 5, 9, 166, 10, 9, 3, 9, 3, 9, 3, 9, 5, + 9, 171, 10, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 179, 10, 9, 3, + 10, 3, 10, 3, 10, 3, 10, 5, 10, 185, 10, 10, 3, 10, 3, 10, 3, 10, 7, 10, + 190, 10, 10, 12, 10, 14, 10, 193, 11, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, + 10, 5, 10, 200, 10, 10, 3, 10, 3, 10, 3, 10, 7, 10, 205, 10, 10, 12, 10, + 14, 10, 208, 11, 10, 3, 10, 3, 10, 5, 10, 212, 10, 10, 3, 11, 3, 11, 3, + 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 225, + 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 231, 10, 14, 3, 15, 3, 15, 5, + 15, 235, 10, 15, 3, 16, 3, 16, 5, 16, 239, 10, 16, 3, 17, 3, 17, 5, 17, + 243, 10, 17, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 252, + 10, 19, 3, 20, 3, 20, 5, 20, 256, 10, 20, 3, 21, 3, 21, 3, 21, 3, 21, 7, + 21, 262, 10, 21, 12, 21, 14, 21, 265, 11, 21, 3, 22, 3, 22, 5, 22, 269, + 10, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, + 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 5, 23, 289, + 10, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 7, 25, 298, 10, + 25, 12, 25, 14, 25, 301, 11, 25, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 307, + 10, 26, 12, 26, 14, 26, 310, 11, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, + 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 322, 10, 28, 5, 28, 324, 10, + 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, + 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, + 30, 346, 10, 30, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, + 5, 33, 356, 10, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 362, 10, 33, 3, + 34, 3, 34, 5, 34, 366, 10, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, + 7, 35, 374, 10, 35, 12, 35, 14, 35, 377, 11, 35, 5, 35, 379, 10, 35, 3, + 35, 5, 35, 382, 10, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 37, 3, 37, 3, 38, + 3, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 41, 3, 41, 6, 41, 398, 10, 41, 13, + 41, 14, 41, 399, 3, 41, 7, 41, 403, 10, 41, 12, 41, 14, 41, 406, 11, 41, + 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 417, 10, 42, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, - 5, 45, 426, 10, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, - 48, 7, 48, 436, 10, 48, 12, 48, 14, 48, 439, 11, 48, 3, 49, 3, 49, 3, 50, - 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 5, 51, 450, 10, 51, 3, 52, 3, - 52, 3, 52, 7, 52, 455, 10, 52, 12, 52, 14, 52, 458, 11, 52, 6, 52, 460, - 10, 52, 13, 52, 14, 52, 461, 3, 52, 3, 52, 3, 52, 3, 52, 7, 52, 468, 10, - 52, 12, 52, 14, 52, 471, 11, 52, 7, 52, 473, 10, 52, 12, 52, 14, 52, 476, - 11, 52, 3, 52, 3, 52, 3, 52, 7, 52, 481, 10, 52, 12, 52, 14, 52, 484, 11, - 52, 7, 52, 486, 10, 52, 12, 52, 14, 52, 489, 11, 52, 5, 52, 491, 10, 52, - 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 7, 54, 500, 10, 54, 12, - 54, 14, 54, 503, 11, 54, 5, 54, 505, 10, 54, 3, 54, 3, 54, 3, 55, 3, 55, + 5, 45, 428, 10, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, + 48, 7, 48, 438, 10, 48, 12, 48, 14, 48, 441, 11, 48, 3, 49, 3, 49, 3, 50, + 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 5, 51, 452, 10, 51, 3, 52, 3, + 52, 3, 52, 7, 52, 457, 10, 52, 12, 52, 14, 52, 460, 11, 52, 6, 52, 462, + 10, 52, 13, 52, 14, 52, 463, 3, 52, 3, 52, 3, 52, 3, 52, 7, 52, 470, 10, + 52, 12, 52, 14, 52, 473, 11, 52, 7, 52, 475, 10, 52, 12, 52, 14, 52, 478, + 11, 52, 3, 52, 3, 52, 3, 52, 7, 52, 483, 10, 52, 12, 52, 14, 52, 486, 11, + 52, 7, 52, 488, 10, 52, 12, 52, 14, 52, 491, 11, 52, 5, 52, 493, 10, 52, + 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 7, 54, 502, 10, 54, 12, + 54, 14, 54, 505, 11, 54, 5, 54, 507, 10, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, - 55, 3, 55, 3, 55, 3, 55, 3, 55, 5, 55, 526, 10, 55, 3, 55, 3, 55, 3, 55, - 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 5, 55, 540, + 55, 3, 55, 3, 55, 3, 55, 3, 55, 5, 55, 528, 10, 55, 3, 55, 3, 55, 3, 55, + 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 5, 55, 542, 10, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, - 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 5, 55, 567, 10, 55, 3, 55, 3, 55, - 7, 55, 571, 10, 55, 12, 55, 14, 55, 574, 11, 55, 3, 56, 3, 56, 3, 56, 5, - 56, 579, 10, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, + 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 5, 55, + 573, 10, 55, 3, 55, 3, 55, 7, 55, 577, 10, 55, 12, 55, 14, 55, 580, 11, + 55, 3, 56, 3, 56, 3, 56, 5, 56, 585, 10, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, - 56, 3, 56, 3, 56, 3, 56, 3, 56, 5, 56, 604, 10, 56, 3, 57, 3, 57, 3, 58, - 3, 58, 3, 58, 5, 58, 611, 10, 58, 3, 59, 3, 59, 3, 60, 3, 60, 3, 61, 3, - 61, 3, 62, 3, 62, 3, 63, 3, 63, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 2, 3, - 108, 66, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, - 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, - 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, - 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 2, 10, 3, 2, + 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 5, 56, 610, + 10, 56, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 5, 58, 617, 10, 58, 3, 59, 3, + 59, 3, 59, 5, 59, 622, 10, 59, 3, 60, 3, 60, 3, 61, 3, 61, 3, 62, 3, 62, + 3, 63, 3, 63, 3, 64, 3, 64, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 2, 3, 108, + 67, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, + 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, + 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, + 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 2, 10, 3, 2, 46, 47, 5, 2, 30, 31, 37, 59, 63, 63, 4, 2, 46, 46, 54, 55, 3, 2, 17, 22, - 3, 2, 35, 36, 3, 2, 23, 25, 3, 2, 26, 27, 4, 2, 26, 27, 57, 58, 2, 656, - 2, 133, 3, 2, 2, 2, 4, 138, 3, 2, 2, 2, 6, 140, 3, 2, 2, 2, 8, 142, 3, - 2, 2, 2, 10, 148, 3, 2, 2, 2, 12, 155, 3, 2, 2, 2, 14, 159, 3, 2, 2, 2, - 16, 176, 3, 2, 2, 2, 18, 209, 3, 2, 2, 2, 20, 211, 3, 2, 2, 2, 22, 213, - 3, 2, 2, 2, 24, 222, 3, 2, 2, 2, 26, 228, 3, 2, 2, 2, 28, 232, 3, 2, 2, - 2, 30, 236, 3, 2, 2, 2, 32, 240, 3, 2, 2, 2, 34, 242, 3, 2, 2, 2, 36, 245, - 3, 2, 2, 2, 38, 253, 3, 2, 2, 2, 40, 255, 3, 2, 2, 2, 42, 264, 3, 2, 2, - 2, 44, 286, 3, 2, 2, 2, 46, 288, 3, 2, 2, 2, 48, 292, 3, 2, 2, 2, 50, 300, - 3, 2, 2, 2, 52, 309, 3, 2, 2, 2, 54, 321, 3, 2, 2, 2, 56, 323, 3, 2, 2, - 2, 58, 343, 3, 2, 2, 2, 60, 345, 3, 2, 2, 2, 62, 348, 3, 2, 2, 2, 64, 353, - 3, 2, 2, 2, 66, 361, 3, 2, 2, 2, 68, 367, 3, 2, 2, 2, 70, 383, 3, 2, 2, - 2, 72, 385, 3, 2, 2, 2, 74, 387, 3, 2, 2, 2, 76, 389, 3, 2, 2, 2, 78, 391, - 3, 2, 2, 2, 80, 393, 3, 2, 2, 2, 82, 414, 3, 2, 2, 2, 84, 416, 3, 2, 2, - 2, 86, 418, 3, 2, 2, 2, 88, 425, 3, 2, 2, 2, 90, 427, 3, 2, 2, 2, 92, 431, - 3, 2, 2, 2, 94, 437, 3, 2, 2, 2, 96, 440, 3, 2, 2, 2, 98, 442, 3, 2, 2, - 2, 100, 449, 3, 2, 2, 2, 102, 490, 3, 2, 2, 2, 104, 492, 3, 2, 2, 2, 106, - 495, 3, 2, 2, 2, 108, 525, 3, 2, 2, 2, 110, 603, 3, 2, 2, 2, 112, 605, - 3, 2, 2, 2, 114, 610, 3, 2, 2, 2, 116, 612, 3, 2, 2, 2, 118, 614, 3, 2, - 2, 2, 120, 616, 3, 2, 2, 2, 122, 618, 3, 2, 2, 2, 124, 620, 3, 2, 2, 2, - 126, 622, 3, 2, 2, 2, 128, 624, 3, 2, 2, 2, 130, 132, 5, 4, 3, 2, 131, - 130, 3, 2, 2, 2, 132, 135, 3, 2, 2, 2, 133, 131, 3, 2, 2, 2, 133, 134, - 3, 2, 2, 2, 134, 136, 3, 2, 2, 2, 135, 133, 3, 2, 2, 2, 136, 137, 5, 10, - 6, 2, 137, 3, 3, 2, 2, 2, 138, 139, 5, 6, 4, 2, 139, 5, 3, 2, 2, 2, 140, - 141, 5, 8, 5, 2, 141, 7, 3, 2, 2, 2, 142, 143, 7, 49, 2, 2, 143, 144, 5, - 92, 47, 2, 144, 9, 3, 2, 2, 2, 145, 147, 5, 12, 7, 2, 146, 145, 3, 2, 2, - 2, 147, 150, 3, 2, 2, 2, 148, 146, 3, 2, 2, 2, 148, 149, 3, 2, 2, 2, 149, - 151, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 151, 152, 5, 14, 8, 2, 152, 11, - 3, 2, 2, 2, 153, 156, 5, 98, 50, 2, 154, 156, 5, 58, 30, 2, 155, 153, 3, - 2, 2, 2, 155, 154, 3, 2, 2, 2, 156, 13, 3, 2, 2, 2, 157, 160, 5, 16, 9, - 2, 158, 160, 5, 18, 10, 2, 159, 157, 3, 2, 2, 2, 159, 158, 3, 2, 2, 2, - 160, 15, 3, 2, 2, 2, 161, 163, 7, 38, 2, 2, 162, 164, 7, 39, 2, 2, 163, - 162, 3, 2, 2, 2, 163, 164, 3, 2, 2, 2, 164, 165, 3, 2, 2, 2, 165, 177, - 5, 108, 55, 2, 166, 168, 7, 38, 2, 2, 167, 169, 7, 39, 2, 2, 168, 167, - 3, 2, 2, 2, 168, 169, 3, 2, 2, 2, 169, 170, 3, 2, 2, 2, 170, 171, 7, 13, - 2, 2, 171, 172, 5, 18, 10, 2, 172, 173, 7, 14, 2, 2, 173, 177, 3, 2, 2, - 2, 174, 175, 7, 38, 2, 2, 175, 177, 5, 110, 56, 2, 176, 161, 3, 2, 2, 2, - 176, 166, 3, 2, 2, 2, 176, 174, 3, 2, 2, 2, 177, 17, 3, 2, 2, 2, 178, 179, - 7, 37, 2, 2, 179, 182, 5, 20, 11, 2, 180, 181, 7, 10, 2, 2, 181, 183, 5, - 22, 12, 2, 182, 180, 3, 2, 2, 2, 182, 183, 3, 2, 2, 2, 183, 184, 3, 2, - 2, 2, 184, 185, 7, 59, 2, 2, 185, 189, 5, 24, 13, 2, 186, 188, 5, 30, 16, - 2, 187, 186, 3, 2, 2, 2, 188, 191, 3, 2, 2, 2, 189, 187, 3, 2, 2, 2, 189, - 190, 3, 2, 2, 2, 190, 192, 3, 2, 2, 2, 191, 189, 3, 2, 2, 2, 192, 193, - 5, 32, 17, 2, 193, 210, 3, 2, 2, 2, 194, 195, 7, 37, 2, 2, 195, 197, 5, - 20, 11, 2, 196, 198, 7, 60, 2, 2, 197, 196, 3, 2, 2, 2, 197, 198, 3, 2, - 2, 2, 198, 199, 3, 2, 2, 2, 199, 200, 7, 61, 2, 2, 200, 204, 5, 108, 55, - 2, 201, 203, 5, 30, 16, 2, 202, 201, 3, 2, 2, 2, 203, 206, 3, 2, 2, 2, - 204, 202, 3, 2, 2, 2, 204, 205, 3, 2, 2, 2, 205, 207, 3, 2, 2, 2, 206, - 204, 3, 2, 2, 2, 207, 208, 5, 32, 17, 2, 208, 210, 3, 2, 2, 2, 209, 178, - 3, 2, 2, 2, 209, 194, 3, 2, 2, 2, 210, 19, 3, 2, 2, 2, 211, 212, 7, 63, - 2, 2, 212, 21, 3, 2, 2, 2, 213, 214, 7, 63, 2, 2, 214, 23, 3, 2, 2, 2, - 215, 223, 5, 98, 50, 2, 216, 223, 5, 66, 34, 2, 217, 223, 5, 68, 35, 2, - 218, 223, 5, 62, 32, 2, 219, 223, 5, 104, 53, 2, 220, 223, 5, 64, 33, 2, - 221, 223, 5, 60, 31, 2, 222, 215, 3, 2, 2, 2, 222, 216, 3, 2, 2, 2, 222, - 217, 3, 2, 2, 2, 222, 218, 3, 2, 2, 2, 222, 219, 3, 2, 2, 2, 222, 220, - 3, 2, 2, 2, 222, 221, 3, 2, 2, 2, 223, 25, 3, 2, 2, 2, 224, 229, 5, 36, - 19, 2, 225, 229, 5, 40, 21, 2, 226, 229, 5, 34, 18, 2, 227, 229, 5, 44, - 23, 2, 228, 224, 3, 2, 2, 2, 228, 225, 3, 2, 2, 2, 228, 226, 3, 2, 2, 2, - 228, 227, 3, 2, 2, 2, 229, 27, 3, 2, 2, 2, 230, 233, 5, 58, 30, 2, 231, - 233, 5, 98, 50, 2, 232, 230, 3, 2, 2, 2, 232, 231, 3, 2, 2, 2, 233, 29, - 3, 2, 2, 2, 234, 237, 5, 28, 15, 2, 235, 237, 5, 26, 14, 2, 236, 234, 3, - 2, 2, 2, 236, 235, 3, 2, 2, 2, 237, 31, 3, 2, 2, 2, 238, 241, 5, 16, 9, - 2, 239, 241, 5, 18, 10, 2, 240, 238, 3, 2, 2, 2, 240, 239, 3, 2, 2, 2, - 241, 33, 3, 2, 2, 2, 242, 243, 7, 40, 2, 2, 243, 244, 5, 108, 55, 2, 244, - 35, 3, 2, 2, 2, 245, 246, 7, 42, 2, 2, 246, 249, 5, 38, 20, 2, 247, 248, - 7, 10, 2, 2, 248, 250, 5, 38, 20, 2, 249, 247, 3, 2, 2, 2, 249, 250, 3, - 2, 2, 2, 250, 37, 3, 2, 2, 2, 251, 254, 7, 65, 2, 2, 252, 254, 5, 60, 31, - 2, 253, 251, 3, 2, 2, 2, 253, 252, 3, 2, 2, 2, 254, 39, 3, 2, 2, 2, 255, - 256, 7, 41, 2, 2, 256, 261, 5, 42, 22, 2, 257, 258, 7, 10, 2, 2, 258, 260, - 5, 42, 22, 2, 259, 257, 3, 2, 2, 2, 260, 263, 3, 2, 2, 2, 261, 259, 3, - 2, 2, 2, 261, 262, 3, 2, 2, 2, 262, 41, 3, 2, 2, 2, 263, 261, 3, 2, 2, - 2, 264, 266, 5, 108, 55, 2, 265, 267, 7, 45, 2, 2, 266, 265, 3, 2, 2, 2, - 266, 267, 3, 2, 2, 2, 267, 43, 3, 2, 2, 2, 268, 269, 7, 44, 2, 2, 269, - 287, 5, 56, 29, 2, 270, 271, 7, 44, 2, 2, 271, 287, 5, 50, 26, 2, 272, - 273, 7, 44, 2, 2, 273, 274, 5, 48, 25, 2, 274, 275, 5, 50, 26, 2, 275, - 287, 3, 2, 2, 2, 276, 277, 7, 44, 2, 2, 277, 278, 5, 48, 25, 2, 278, 279, - 5, 54, 28, 2, 279, 287, 3, 2, 2, 2, 280, 281, 7, 44, 2, 2, 281, 282, 5, - 48, 25, 2, 282, 283, 5, 56, 29, 2, 283, 287, 3, 2, 2, 2, 284, 285, 7, 44, - 2, 2, 285, 287, 5, 48, 25, 2, 286, 268, 3, 2, 2, 2, 286, 270, 3, 2, 2, - 2, 286, 272, 3, 2, 2, 2, 286, 276, 3, 2, 2, 2, 286, 280, 3, 2, 2, 2, 286, - 284, 3, 2, 2, 2, 287, 45, 3, 2, 2, 2, 288, 289, 7, 63, 2, 2, 289, 290, - 7, 33, 2, 2, 290, 291, 5, 108, 55, 2, 291, 47, 3, 2, 2, 2, 292, 297, 5, - 46, 24, 2, 293, 294, 7, 10, 2, 2, 294, 296, 5, 46, 24, 2, 295, 293, 3, - 2, 2, 2, 296, 299, 3, 2, 2, 2, 297, 295, 3, 2, 2, 2, 297, 298, 3, 2, 2, - 2, 298, 49, 3, 2, 2, 2, 299, 297, 3, 2, 2, 2, 300, 301, 7, 56, 2, 2, 301, - 306, 5, 52, 27, 2, 302, 303, 7, 10, 2, 2, 303, 305, 5, 52, 27, 2, 304, - 302, 3, 2, 2, 2, 305, 308, 3, 2, 2, 2, 306, 304, 3, 2, 2, 2, 306, 307, - 3, 2, 2, 2, 307, 51, 3, 2, 2, 2, 308, 306, 3, 2, 2, 2, 309, 310, 7, 63, - 2, 2, 310, 311, 7, 33, 2, 2, 311, 312, 5, 98, 50, 2, 312, 53, 3, 2, 2, - 2, 313, 314, 7, 50, 2, 2, 314, 322, 5, 46, 24, 2, 315, 316, 7, 50, 2, 2, - 316, 319, 7, 63, 2, 2, 317, 318, 7, 51, 2, 2, 318, 320, 7, 63, 2, 2, 319, - 317, 3, 2, 2, 2, 319, 320, 3, 2, 2, 2, 320, 322, 3, 2, 2, 2, 321, 313, - 3, 2, 2, 2, 321, 315, 3, 2, 2, 2, 322, 55, 3, 2, 2, 2, 323, 324, 7, 52, - 2, 2, 324, 325, 7, 53, 2, 2, 325, 326, 7, 50, 2, 2, 326, 327, 7, 63, 2, - 2, 327, 57, 3, 2, 2, 2, 328, 329, 7, 43, 2, 2, 329, 330, 7, 63, 2, 2, 330, - 331, 7, 33, 2, 2, 331, 344, 5, 108, 55, 2, 332, 333, 7, 43, 2, 2, 333, - 334, 7, 63, 2, 2, 334, 335, 7, 33, 2, 2, 335, 336, 7, 13, 2, 2, 336, 337, - 5, 18, 10, 2, 337, 338, 7, 14, 2, 2, 338, 344, 3, 2, 2, 2, 339, 340, 7, - 43, 2, 2, 340, 341, 7, 63, 2, 2, 341, 342, 7, 33, 2, 2, 342, 344, 5, 110, - 56, 2, 343, 328, 3, 2, 2, 2, 343, 332, 3, 2, 2, 2, 343, 339, 3, 2, 2, 2, - 344, 59, 3, 2, 2, 2, 345, 346, 7, 62, 2, 2, 346, 347, 7, 63, 2, 2, 347, - 61, 3, 2, 2, 2, 348, 349, 7, 63, 2, 2, 349, 63, 3, 2, 2, 2, 350, 354, 5, - 74, 38, 2, 351, 354, 5, 62, 32, 2, 352, 354, 5, 60, 31, 2, 353, 350, 3, - 2, 2, 2, 353, 351, 3, 2, 2, 2, 353, 352, 3, 2, 2, 2, 354, 355, 3, 2, 2, - 2, 355, 359, 7, 32, 2, 2, 356, 360, 5, 74, 38, 2, 357, 360, 5, 62, 32, - 2, 358, 360, 5, 60, 31, 2, 359, 356, 3, 2, 2, 2, 359, 357, 3, 2, 2, 2, - 359, 358, 3, 2, 2, 2, 360, 65, 3, 2, 2, 2, 361, 363, 7, 11, 2, 2, 362, - 364, 5, 80, 41, 2, 363, 362, 3, 2, 2, 2, 363, 364, 3, 2, 2, 2, 364, 365, - 3, 2, 2, 2, 365, 366, 7, 12, 2, 2, 366, 67, 3, 2, 2, 2, 367, 376, 7, 15, - 2, 2, 368, 373, 5, 82, 42, 2, 369, 370, 7, 10, 2, 2, 370, 372, 5, 82, 42, - 2, 371, 369, 3, 2, 2, 2, 372, 375, 3, 2, 2, 2, 373, 371, 3, 2, 2, 2, 373, - 374, 3, 2, 2, 2, 374, 377, 3, 2, 2, 2, 375, 373, 3, 2, 2, 2, 376, 368, - 3, 2, 2, 2, 376, 377, 3, 2, 2, 2, 377, 379, 3, 2, 2, 2, 378, 380, 7, 10, - 2, 2, 379, 378, 3, 2, 2, 2, 379, 380, 3, 2, 2, 2, 380, 381, 3, 2, 2, 2, - 381, 382, 7, 16, 2, 2, 382, 69, 3, 2, 2, 2, 383, 384, 7, 48, 2, 2, 384, - 71, 3, 2, 2, 2, 385, 386, 7, 64, 2, 2, 386, 73, 3, 2, 2, 2, 387, 388, 7, - 65, 2, 2, 388, 75, 3, 2, 2, 2, 389, 390, 7, 66, 2, 2, 390, 77, 3, 2, 2, - 2, 391, 392, 9, 2, 2, 2, 392, 79, 3, 2, 2, 2, 393, 402, 5, 108, 55, 2, - 394, 396, 7, 10, 2, 2, 395, 394, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, - 395, 3, 2, 2, 2, 397, 398, 3, 2, 2, 2, 398, 399, 3, 2, 2, 2, 399, 401, - 5, 108, 55, 2, 400, 395, 3, 2, 2, 2, 401, 404, 3, 2, 2, 2, 402, 400, 3, - 2, 2, 2, 402, 403, 3, 2, 2, 2, 403, 81, 3, 2, 2, 2, 404, 402, 3, 2, 2, - 2, 405, 406, 5, 88, 45, 2, 406, 407, 7, 7, 2, 2, 407, 408, 5, 108, 55, - 2, 408, 415, 3, 2, 2, 2, 409, 410, 5, 86, 44, 2, 410, 411, 7, 7, 2, 2, - 411, 412, 5, 108, 55, 2, 412, 415, 3, 2, 2, 2, 413, 415, 5, 84, 43, 2, - 414, 405, 3, 2, 2, 2, 414, 409, 3, 2, 2, 2, 414, 413, 3, 2, 2, 2, 415, - 83, 3, 2, 2, 2, 416, 417, 5, 62, 32, 2, 417, 85, 3, 2, 2, 2, 418, 419, - 7, 11, 2, 2, 419, 420, 5, 108, 55, 2, 420, 421, 7, 12, 2, 2, 421, 87, 3, - 2, 2, 2, 422, 426, 7, 63, 2, 2, 423, 426, 5, 72, 37, 2, 424, 426, 5, 60, - 31, 2, 425, 422, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 425, 424, 3, 2, 2, 2, - 426, 89, 3, 2, 2, 2, 427, 428, 7, 13, 2, 2, 428, 429, 5, 108, 55, 2, 429, - 430, 7, 14, 2, 2, 430, 91, 3, 2, 2, 2, 431, 432, 5, 94, 48, 2, 432, 433, - 7, 63, 2, 2, 433, 93, 3, 2, 2, 2, 434, 436, 7, 67, 2, 2, 435, 434, 3, 2, - 2, 2, 436, 439, 3, 2, 2, 2, 437, 435, 3, 2, 2, 2, 437, 438, 3, 2, 2, 2, - 438, 95, 3, 2, 2, 2, 439, 437, 3, 2, 2, 2, 440, 441, 9, 3, 2, 2, 441, 97, - 3, 2, 2, 2, 442, 443, 5, 94, 48, 2, 443, 444, 5, 96, 49, 2, 444, 445, 5, - 106, 54, 2, 445, 99, 3, 2, 2, 2, 446, 450, 7, 63, 2, 2, 447, 450, 5, 98, - 50, 2, 448, 450, 5, 60, 31, 2, 449, 446, 3, 2, 2, 2, 449, 447, 3, 2, 2, - 2, 449, 448, 3, 2, 2, 2, 450, 101, 3, 2, 2, 2, 451, 452, 7, 9, 2, 2, 452, - 456, 5, 88, 45, 2, 453, 455, 5, 86, 44, 2, 454, 453, 3, 2, 2, 2, 455, 458, - 3, 2, 2, 2, 456, 454, 3, 2, 2, 2, 456, 457, 3, 2, 2, 2, 457, 460, 3, 2, - 2, 2, 458, 456, 3, 2, 2, 2, 459, 451, 3, 2, 2, 2, 460, 461, 3, 2, 2, 2, - 461, 459, 3, 2, 2, 2, 461, 462, 3, 2, 2, 2, 462, 491, 3, 2, 2, 2, 463, - 474, 5, 86, 44, 2, 464, 465, 7, 9, 2, 2, 465, 469, 5, 88, 45, 2, 466, 468, - 5, 86, 44, 2, 467, 466, 3, 2, 2, 2, 468, 471, 3, 2, 2, 2, 469, 467, 3, - 2, 2, 2, 469, 470, 3, 2, 2, 2, 470, 473, 3, 2, 2, 2, 471, 469, 3, 2, 2, - 2, 472, 464, 3, 2, 2, 2, 473, 476, 3, 2, 2, 2, 474, 472, 3, 2, 2, 2, 474, - 475, 3, 2, 2, 2, 475, 487, 3, 2, 2, 2, 476, 474, 3, 2, 2, 2, 477, 482, - 5, 86, 44, 2, 478, 479, 7, 9, 2, 2, 479, 481, 5, 88, 45, 2, 480, 478, 3, - 2, 2, 2, 481, 484, 3, 2, 2, 2, 482, 480, 3, 2, 2, 2, 482, 483, 3, 2, 2, - 2, 483, 486, 3, 2, 2, 2, 484, 482, 3, 2, 2, 2, 485, 477, 3, 2, 2, 2, 486, - 489, 3, 2, 2, 2, 487, 485, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 491, - 3, 2, 2, 2, 489, 487, 3, 2, 2, 2, 490, 459, 3, 2, 2, 2, 490, 463, 3, 2, - 2, 2, 491, 103, 3, 2, 2, 2, 492, 493, 5, 100, 51, 2, 493, 494, 5, 102, - 52, 2, 494, 105, 3, 2, 2, 2, 495, 504, 7, 13, 2, 2, 496, 501, 5, 108, 55, - 2, 497, 498, 7, 10, 2, 2, 498, 500, 5, 108, 55, 2, 499, 497, 3, 2, 2, 2, - 500, 503, 3, 2, 2, 2, 501, 499, 3, 2, 2, 2, 501, 502, 3, 2, 2, 2, 502, - 505, 3, 2, 2, 2, 503, 501, 3, 2, 2, 2, 504, 496, 3, 2, 2, 2, 504, 505, - 3, 2, 2, 2, 505, 506, 3, 2, 2, 2, 506, 507, 7, 14, 2, 2, 507, 107, 3, 2, - 2, 2, 508, 509, 8, 55, 1, 2, 509, 510, 5, 128, 65, 2, 510, 511, 5, 108, - 55, 25, 511, 526, 3, 2, 2, 2, 512, 526, 5, 98, 50, 2, 513, 526, 5, 90, - 46, 2, 514, 526, 5, 64, 33, 2, 515, 526, 5, 72, 37, 2, 516, 526, 5, 74, - 38, 2, 517, 526, 5, 76, 39, 2, 518, 526, 5, 70, 36, 2, 519, 526, 5, 66, - 34, 2, 520, 526, 5, 68, 35, 2, 521, 526, 5, 62, 32, 2, 522, 526, 5, 104, - 53, 2, 523, 526, 5, 78, 40, 2, 524, 526, 5, 60, 31, 2, 525, 508, 3, 2, - 2, 2, 525, 512, 3, 2, 2, 2, 525, 513, 3, 2, 2, 2, 525, 514, 3, 2, 2, 2, - 525, 515, 3, 2, 2, 2, 525, 516, 3, 2, 2, 2, 525, 517, 3, 2, 2, 2, 525, - 518, 3, 2, 2, 2, 525, 519, 3, 2, 2, 2, 525, 520, 3, 2, 2, 2, 525, 521, - 3, 2, 2, 2, 525, 522, 3, 2, 2, 2, 525, 523, 3, 2, 2, 2, 525, 524, 3, 2, - 2, 2, 526, 572, 3, 2, 2, 2, 527, 528, 12, 24, 2, 2, 528, 529, 5, 124, 63, - 2, 529, 530, 5, 108, 55, 25, 530, 571, 3, 2, 2, 2, 531, 532, 12, 23, 2, - 2, 532, 533, 5, 126, 64, 2, 533, 534, 5, 108, 55, 24, 534, 571, 3, 2, 2, - 2, 535, 536, 12, 20, 2, 2, 536, 539, 5, 112, 57, 2, 537, 540, 5, 114, 58, - 2, 538, 540, 5, 116, 59, 2, 539, 537, 3, 2, 2, 2, 539, 538, 3, 2, 2, 2, - 540, 541, 3, 2, 2, 2, 541, 542, 5, 108, 55, 21, 542, 571, 3, 2, 2, 2, 543, - 544, 12, 19, 2, 2, 544, 545, 5, 114, 58, 2, 545, 546, 5, 108, 55, 20, 546, - 571, 3, 2, 2, 2, 547, 548, 12, 18, 2, 2, 548, 549, 5, 116, 59, 2, 549, - 550, 5, 108, 55, 19, 550, 571, 3, 2, 2, 2, 551, 552, 12, 17, 2, 2, 552, - 553, 5, 118, 60, 2, 553, 554, 5, 108, 55, 18, 554, 571, 3, 2, 2, 2, 555, - 556, 12, 16, 2, 2, 556, 557, 5, 120, 61, 2, 557, 558, 5, 108, 55, 17, 558, - 571, 3, 2, 2, 2, 559, 560, 12, 15, 2, 2, 560, 561, 5, 122, 62, 2, 561, - 562, 5, 108, 55, 16, 562, 571, 3, 2, 2, 2, 563, 564, 12, 14, 2, 2, 564, - 566, 7, 34, 2, 2, 565, 567, 5, 108, 55, 2, 566, 565, 3, 2, 2, 2, 566, 567, - 3, 2, 2, 2, 567, 568, 3, 2, 2, 2, 568, 569, 7, 7, 2, 2, 569, 571, 5, 108, - 55, 15, 570, 527, 3, 2, 2, 2, 570, 531, 3, 2, 2, 2, 570, 535, 3, 2, 2, - 2, 570, 543, 3, 2, 2, 2, 570, 547, 3, 2, 2, 2, 570, 551, 3, 2, 2, 2, 570, - 555, 3, 2, 2, 2, 570, 559, 3, 2, 2, 2, 570, 563, 3, 2, 2, 2, 571, 574, - 3, 2, 2, 2, 572, 570, 3, 2, 2, 2, 572, 573, 3, 2, 2, 2, 573, 109, 3, 2, - 2, 2, 574, 572, 3, 2, 2, 2, 575, 576, 5, 108, 55, 2, 576, 578, 7, 34, 2, - 2, 577, 579, 5, 108, 55, 2, 578, 577, 3, 2, 2, 2, 578, 579, 3, 2, 2, 2, - 579, 580, 3, 2, 2, 2, 580, 581, 7, 7, 2, 2, 581, 582, 7, 13, 2, 2, 582, - 583, 5, 18, 10, 2, 583, 584, 7, 14, 2, 2, 584, 604, 3, 2, 2, 2, 585, 586, - 5, 108, 55, 2, 586, 587, 7, 34, 2, 2, 587, 588, 7, 13, 2, 2, 588, 589, - 5, 18, 10, 2, 589, 590, 7, 14, 2, 2, 590, 591, 7, 7, 2, 2, 591, 592, 5, - 108, 55, 2, 592, 604, 3, 2, 2, 2, 593, 594, 5, 108, 55, 2, 594, 595, 7, - 34, 2, 2, 595, 596, 7, 13, 2, 2, 596, 597, 5, 18, 10, 2, 597, 598, 7, 14, - 2, 2, 598, 599, 7, 7, 2, 2, 599, 600, 7, 13, 2, 2, 600, 601, 5, 18, 10, - 2, 601, 602, 7, 14, 2, 2, 602, 604, 3, 2, 2, 2, 603, 575, 3, 2, 2, 2, 603, - 585, 3, 2, 2, 2, 603, 593, 3, 2, 2, 2, 604, 111, 3, 2, 2, 2, 605, 606, - 9, 4, 2, 2, 606, 113, 3, 2, 2, 2, 607, 611, 7, 59, 2, 2, 608, 609, 7, 58, - 2, 2, 609, 611, 7, 59, 2, 2, 610, 607, 3, 2, 2, 2, 610, 608, 3, 2, 2, 2, - 611, 115, 3, 2, 2, 2, 612, 613, 9, 5, 2, 2, 613, 117, 3, 2, 2, 2, 614, - 615, 9, 6, 2, 2, 615, 119, 3, 2, 2, 2, 616, 617, 7, 30, 2, 2, 617, 121, - 3, 2, 2, 2, 618, 619, 7, 31, 2, 2, 619, 123, 3, 2, 2, 2, 620, 621, 9, 7, - 2, 2, 621, 125, 3, 2, 2, 2, 622, 623, 9, 8, 2, 2, 623, 127, 3, 2, 2, 2, - 624, 625, 9, 9, 2, 2, 625, 129, 3, 2, 2, 2, 58, 133, 148, 155, 159, 163, - 168, 176, 182, 189, 197, 204, 209, 222, 228, 232, 236, 240, 249, 253, 261, - 266, 286, 297, 306, 319, 321, 343, 353, 359, 363, 373, 376, 379, 397, 402, - 414, 425, 437, 449, 456, 461, 469, 474, 482, 487, 490, 501, 504, 525, 539, - 566, 570, 572, 578, 603, 610, + 3, 2, 35, 36, 3, 2, 23, 25, 3, 2, 26, 27, 4, 2, 26, 27, 58, 58, 2, 668, + 2, 135, 3, 2, 2, 2, 4, 140, 3, 2, 2, 2, 6, 142, 3, 2, 2, 2, 8, 144, 3, + 2, 2, 2, 10, 150, 3, 2, 2, 2, 12, 157, 3, 2, 2, 2, 14, 161, 3, 2, 2, 2, + 16, 178, 3, 2, 2, 2, 18, 211, 3, 2, 2, 2, 20, 213, 3, 2, 2, 2, 22, 215, + 3, 2, 2, 2, 24, 224, 3, 2, 2, 2, 26, 230, 3, 2, 2, 2, 28, 234, 3, 2, 2, + 2, 30, 238, 3, 2, 2, 2, 32, 242, 3, 2, 2, 2, 34, 244, 3, 2, 2, 2, 36, 247, + 3, 2, 2, 2, 38, 255, 3, 2, 2, 2, 40, 257, 3, 2, 2, 2, 42, 266, 3, 2, 2, + 2, 44, 288, 3, 2, 2, 2, 46, 290, 3, 2, 2, 2, 48, 294, 3, 2, 2, 2, 50, 302, + 3, 2, 2, 2, 52, 311, 3, 2, 2, 2, 54, 323, 3, 2, 2, 2, 56, 325, 3, 2, 2, + 2, 58, 345, 3, 2, 2, 2, 60, 347, 3, 2, 2, 2, 62, 350, 3, 2, 2, 2, 64, 355, + 3, 2, 2, 2, 66, 363, 3, 2, 2, 2, 68, 369, 3, 2, 2, 2, 70, 385, 3, 2, 2, + 2, 72, 387, 3, 2, 2, 2, 74, 389, 3, 2, 2, 2, 76, 391, 3, 2, 2, 2, 78, 393, + 3, 2, 2, 2, 80, 395, 3, 2, 2, 2, 82, 416, 3, 2, 2, 2, 84, 418, 3, 2, 2, + 2, 86, 420, 3, 2, 2, 2, 88, 427, 3, 2, 2, 2, 90, 429, 3, 2, 2, 2, 92, 433, + 3, 2, 2, 2, 94, 439, 3, 2, 2, 2, 96, 442, 3, 2, 2, 2, 98, 444, 3, 2, 2, + 2, 100, 451, 3, 2, 2, 2, 102, 492, 3, 2, 2, 2, 104, 494, 3, 2, 2, 2, 106, + 497, 3, 2, 2, 2, 108, 527, 3, 2, 2, 2, 110, 609, 3, 2, 2, 2, 112, 611, + 3, 2, 2, 2, 114, 616, 3, 2, 2, 2, 116, 621, 3, 2, 2, 2, 118, 623, 3, 2, + 2, 2, 120, 625, 3, 2, 2, 2, 122, 627, 3, 2, 2, 2, 124, 629, 3, 2, 2, 2, + 126, 631, 3, 2, 2, 2, 128, 633, 3, 2, 2, 2, 130, 635, 3, 2, 2, 2, 132, + 134, 5, 4, 3, 2, 133, 132, 3, 2, 2, 2, 134, 137, 3, 2, 2, 2, 135, 133, + 3, 2, 2, 2, 135, 136, 3, 2, 2, 2, 136, 138, 3, 2, 2, 2, 137, 135, 3, 2, + 2, 2, 138, 139, 5, 10, 6, 2, 139, 3, 3, 2, 2, 2, 140, 141, 5, 6, 4, 2, + 141, 5, 3, 2, 2, 2, 142, 143, 5, 8, 5, 2, 143, 7, 3, 2, 2, 2, 144, 145, + 7, 49, 2, 2, 145, 146, 5, 92, 47, 2, 146, 9, 3, 2, 2, 2, 147, 149, 5, 12, + 7, 2, 148, 147, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, + 150, 151, 3, 2, 2, 2, 151, 153, 3, 2, 2, 2, 152, 150, 3, 2, 2, 2, 153, + 154, 5, 14, 8, 2, 154, 11, 3, 2, 2, 2, 155, 158, 5, 98, 50, 2, 156, 158, + 5, 58, 30, 2, 157, 155, 3, 2, 2, 2, 157, 156, 3, 2, 2, 2, 158, 13, 3, 2, + 2, 2, 159, 162, 5, 16, 9, 2, 160, 162, 5, 18, 10, 2, 161, 159, 3, 2, 2, + 2, 161, 160, 3, 2, 2, 2, 162, 15, 3, 2, 2, 2, 163, 165, 7, 38, 2, 2, 164, + 166, 7, 39, 2, 2, 165, 164, 3, 2, 2, 2, 165, 166, 3, 2, 2, 2, 166, 167, + 3, 2, 2, 2, 167, 179, 5, 108, 55, 2, 168, 170, 7, 38, 2, 2, 169, 171, 7, + 39, 2, 2, 170, 169, 3, 2, 2, 2, 170, 171, 3, 2, 2, 2, 171, 172, 3, 2, 2, + 2, 172, 173, 7, 13, 2, 2, 173, 174, 5, 18, 10, 2, 174, 175, 7, 14, 2, 2, + 175, 179, 3, 2, 2, 2, 176, 177, 7, 38, 2, 2, 177, 179, 5, 110, 56, 2, 178, + 163, 3, 2, 2, 2, 178, 168, 3, 2, 2, 2, 178, 176, 3, 2, 2, 2, 179, 17, 3, + 2, 2, 2, 180, 181, 7, 37, 2, 2, 181, 184, 5, 20, 11, 2, 182, 183, 7, 10, + 2, 2, 183, 185, 5, 22, 12, 2, 184, 182, 3, 2, 2, 2, 184, 185, 3, 2, 2, + 2, 185, 186, 3, 2, 2, 2, 186, 187, 7, 59, 2, 2, 187, 191, 5, 24, 13, 2, + 188, 190, 5, 30, 16, 2, 189, 188, 3, 2, 2, 2, 190, 193, 3, 2, 2, 2, 191, + 189, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 194, 3, 2, 2, 2, 193, 191, + 3, 2, 2, 2, 194, 195, 5, 32, 17, 2, 195, 212, 3, 2, 2, 2, 196, 197, 7, + 37, 2, 2, 197, 199, 5, 20, 11, 2, 198, 200, 7, 60, 2, 2, 199, 198, 3, 2, + 2, 2, 199, 200, 3, 2, 2, 2, 200, 201, 3, 2, 2, 2, 201, 202, 7, 61, 2, 2, + 202, 206, 5, 108, 55, 2, 203, 205, 5, 30, 16, 2, 204, 203, 3, 2, 2, 2, + 205, 208, 3, 2, 2, 2, 206, 204, 3, 2, 2, 2, 206, 207, 3, 2, 2, 2, 207, + 209, 3, 2, 2, 2, 208, 206, 3, 2, 2, 2, 209, 210, 5, 32, 17, 2, 210, 212, + 3, 2, 2, 2, 211, 180, 3, 2, 2, 2, 211, 196, 3, 2, 2, 2, 212, 19, 3, 2, + 2, 2, 213, 214, 7, 63, 2, 2, 214, 21, 3, 2, 2, 2, 215, 216, 7, 63, 2, 2, + 216, 23, 3, 2, 2, 2, 217, 225, 5, 98, 50, 2, 218, 225, 5, 66, 34, 2, 219, + 225, 5, 68, 35, 2, 220, 225, 5, 62, 32, 2, 221, 225, 5, 104, 53, 2, 222, + 225, 5, 64, 33, 2, 223, 225, 5, 60, 31, 2, 224, 217, 3, 2, 2, 2, 224, 218, + 3, 2, 2, 2, 224, 219, 3, 2, 2, 2, 224, 220, 3, 2, 2, 2, 224, 221, 3, 2, + 2, 2, 224, 222, 3, 2, 2, 2, 224, 223, 3, 2, 2, 2, 225, 25, 3, 2, 2, 2, + 226, 231, 5, 36, 19, 2, 227, 231, 5, 40, 21, 2, 228, 231, 5, 34, 18, 2, + 229, 231, 5, 44, 23, 2, 230, 226, 3, 2, 2, 2, 230, 227, 3, 2, 2, 2, 230, + 228, 3, 2, 2, 2, 230, 229, 3, 2, 2, 2, 231, 27, 3, 2, 2, 2, 232, 235, 5, + 58, 30, 2, 233, 235, 5, 98, 50, 2, 234, 232, 3, 2, 2, 2, 234, 233, 3, 2, + 2, 2, 235, 29, 3, 2, 2, 2, 236, 239, 5, 28, 15, 2, 237, 239, 5, 26, 14, + 2, 238, 236, 3, 2, 2, 2, 238, 237, 3, 2, 2, 2, 239, 31, 3, 2, 2, 2, 240, + 243, 5, 16, 9, 2, 241, 243, 5, 18, 10, 2, 242, 240, 3, 2, 2, 2, 242, 241, + 3, 2, 2, 2, 243, 33, 3, 2, 2, 2, 244, 245, 7, 40, 2, 2, 245, 246, 5, 108, + 55, 2, 246, 35, 3, 2, 2, 2, 247, 248, 7, 42, 2, 2, 248, 251, 5, 38, 20, + 2, 249, 250, 7, 10, 2, 2, 250, 252, 5, 38, 20, 2, 251, 249, 3, 2, 2, 2, + 251, 252, 3, 2, 2, 2, 252, 37, 3, 2, 2, 2, 253, 256, 7, 65, 2, 2, 254, + 256, 5, 60, 31, 2, 255, 253, 3, 2, 2, 2, 255, 254, 3, 2, 2, 2, 256, 39, + 3, 2, 2, 2, 257, 258, 7, 41, 2, 2, 258, 263, 5, 42, 22, 2, 259, 260, 7, + 10, 2, 2, 260, 262, 5, 42, 22, 2, 261, 259, 3, 2, 2, 2, 262, 265, 3, 2, + 2, 2, 263, 261, 3, 2, 2, 2, 263, 264, 3, 2, 2, 2, 264, 41, 3, 2, 2, 2, + 265, 263, 3, 2, 2, 2, 266, 268, 5, 108, 55, 2, 267, 269, 7, 45, 2, 2, 268, + 267, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, 43, 3, 2, 2, 2, 270, 271, 7, + 44, 2, 2, 271, 289, 5, 56, 29, 2, 272, 273, 7, 44, 2, 2, 273, 289, 5, 50, + 26, 2, 274, 275, 7, 44, 2, 2, 275, 276, 5, 48, 25, 2, 276, 277, 5, 50, + 26, 2, 277, 289, 3, 2, 2, 2, 278, 279, 7, 44, 2, 2, 279, 280, 5, 48, 25, + 2, 280, 281, 5, 54, 28, 2, 281, 289, 3, 2, 2, 2, 282, 283, 7, 44, 2, 2, + 283, 284, 5, 48, 25, 2, 284, 285, 5, 56, 29, 2, 285, 289, 3, 2, 2, 2, 286, + 287, 7, 44, 2, 2, 287, 289, 5, 48, 25, 2, 288, 270, 3, 2, 2, 2, 288, 272, + 3, 2, 2, 2, 288, 274, 3, 2, 2, 2, 288, 278, 3, 2, 2, 2, 288, 282, 3, 2, + 2, 2, 288, 286, 3, 2, 2, 2, 289, 45, 3, 2, 2, 2, 290, 291, 7, 63, 2, 2, + 291, 292, 7, 33, 2, 2, 292, 293, 5, 108, 55, 2, 293, 47, 3, 2, 2, 2, 294, + 299, 5, 46, 24, 2, 295, 296, 7, 10, 2, 2, 296, 298, 5, 46, 24, 2, 297, + 295, 3, 2, 2, 2, 298, 301, 3, 2, 2, 2, 299, 297, 3, 2, 2, 2, 299, 300, + 3, 2, 2, 2, 300, 49, 3, 2, 2, 2, 301, 299, 3, 2, 2, 2, 302, 303, 7, 56, + 2, 2, 303, 308, 5, 52, 27, 2, 304, 305, 7, 10, 2, 2, 305, 307, 5, 52, 27, + 2, 306, 304, 3, 2, 2, 2, 307, 310, 3, 2, 2, 2, 308, 306, 3, 2, 2, 2, 308, + 309, 3, 2, 2, 2, 309, 51, 3, 2, 2, 2, 310, 308, 3, 2, 2, 2, 311, 312, 7, + 63, 2, 2, 312, 313, 7, 33, 2, 2, 313, 314, 5, 98, 50, 2, 314, 53, 3, 2, + 2, 2, 315, 316, 7, 50, 2, 2, 316, 324, 5, 46, 24, 2, 317, 318, 7, 50, 2, + 2, 318, 321, 7, 63, 2, 2, 319, 320, 7, 51, 2, 2, 320, 322, 7, 63, 2, 2, + 321, 319, 3, 2, 2, 2, 321, 322, 3, 2, 2, 2, 322, 324, 3, 2, 2, 2, 323, + 315, 3, 2, 2, 2, 323, 317, 3, 2, 2, 2, 324, 55, 3, 2, 2, 2, 325, 326, 7, + 52, 2, 2, 326, 327, 7, 53, 2, 2, 327, 328, 7, 50, 2, 2, 328, 329, 7, 63, + 2, 2, 329, 57, 3, 2, 2, 2, 330, 331, 7, 43, 2, 2, 331, 332, 7, 63, 2, 2, + 332, 333, 7, 33, 2, 2, 333, 346, 5, 108, 55, 2, 334, 335, 7, 43, 2, 2, + 335, 336, 7, 63, 2, 2, 336, 337, 7, 33, 2, 2, 337, 338, 7, 13, 2, 2, 338, + 339, 5, 18, 10, 2, 339, 340, 7, 14, 2, 2, 340, 346, 3, 2, 2, 2, 341, 342, + 7, 43, 2, 2, 342, 343, 7, 63, 2, 2, 343, 344, 7, 33, 2, 2, 344, 346, 5, + 110, 56, 2, 345, 330, 3, 2, 2, 2, 345, 334, 3, 2, 2, 2, 345, 341, 3, 2, + 2, 2, 346, 59, 3, 2, 2, 2, 347, 348, 7, 62, 2, 2, 348, 349, 7, 63, 2, 2, + 349, 61, 3, 2, 2, 2, 350, 351, 7, 63, 2, 2, 351, 63, 3, 2, 2, 2, 352, 356, + 5, 74, 38, 2, 353, 356, 5, 62, 32, 2, 354, 356, 5, 60, 31, 2, 355, 352, + 3, 2, 2, 2, 355, 353, 3, 2, 2, 2, 355, 354, 3, 2, 2, 2, 356, 357, 3, 2, + 2, 2, 357, 361, 7, 32, 2, 2, 358, 362, 5, 74, 38, 2, 359, 362, 5, 62, 32, + 2, 360, 362, 5, 60, 31, 2, 361, 358, 3, 2, 2, 2, 361, 359, 3, 2, 2, 2, + 361, 360, 3, 2, 2, 2, 362, 65, 3, 2, 2, 2, 363, 365, 7, 11, 2, 2, 364, + 366, 5, 80, 41, 2, 365, 364, 3, 2, 2, 2, 365, 366, 3, 2, 2, 2, 366, 367, + 3, 2, 2, 2, 367, 368, 7, 12, 2, 2, 368, 67, 3, 2, 2, 2, 369, 378, 7, 15, + 2, 2, 370, 375, 5, 82, 42, 2, 371, 372, 7, 10, 2, 2, 372, 374, 5, 82, 42, + 2, 373, 371, 3, 2, 2, 2, 374, 377, 3, 2, 2, 2, 375, 373, 3, 2, 2, 2, 375, + 376, 3, 2, 2, 2, 376, 379, 3, 2, 2, 2, 377, 375, 3, 2, 2, 2, 378, 370, + 3, 2, 2, 2, 378, 379, 3, 2, 2, 2, 379, 381, 3, 2, 2, 2, 380, 382, 7, 10, + 2, 2, 381, 380, 3, 2, 2, 2, 381, 382, 3, 2, 2, 2, 382, 383, 3, 2, 2, 2, + 383, 384, 7, 16, 2, 2, 384, 69, 3, 2, 2, 2, 385, 386, 7, 48, 2, 2, 386, + 71, 3, 2, 2, 2, 387, 388, 7, 64, 2, 2, 388, 73, 3, 2, 2, 2, 389, 390, 7, + 65, 2, 2, 390, 75, 3, 2, 2, 2, 391, 392, 7, 66, 2, 2, 392, 77, 3, 2, 2, + 2, 393, 394, 9, 2, 2, 2, 394, 79, 3, 2, 2, 2, 395, 404, 5, 108, 55, 2, + 396, 398, 7, 10, 2, 2, 397, 396, 3, 2, 2, 2, 398, 399, 3, 2, 2, 2, 399, + 397, 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 401, 3, 2, 2, 2, 401, 403, + 5, 108, 55, 2, 402, 397, 3, 2, 2, 2, 403, 406, 3, 2, 2, 2, 404, 402, 3, + 2, 2, 2, 404, 405, 3, 2, 2, 2, 405, 81, 3, 2, 2, 2, 406, 404, 3, 2, 2, + 2, 407, 408, 5, 88, 45, 2, 408, 409, 7, 7, 2, 2, 409, 410, 5, 108, 55, + 2, 410, 417, 3, 2, 2, 2, 411, 412, 5, 86, 44, 2, 412, 413, 7, 7, 2, 2, + 413, 414, 5, 108, 55, 2, 414, 417, 3, 2, 2, 2, 415, 417, 5, 84, 43, 2, + 416, 407, 3, 2, 2, 2, 416, 411, 3, 2, 2, 2, 416, 415, 3, 2, 2, 2, 417, + 83, 3, 2, 2, 2, 418, 419, 5, 62, 32, 2, 419, 85, 3, 2, 2, 2, 420, 421, + 7, 11, 2, 2, 421, 422, 5, 108, 55, 2, 422, 423, 7, 12, 2, 2, 423, 87, 3, + 2, 2, 2, 424, 428, 7, 63, 2, 2, 425, 428, 5, 72, 37, 2, 426, 428, 5, 60, + 31, 2, 427, 424, 3, 2, 2, 2, 427, 425, 3, 2, 2, 2, 427, 426, 3, 2, 2, 2, + 428, 89, 3, 2, 2, 2, 429, 430, 7, 13, 2, 2, 430, 431, 5, 108, 55, 2, 431, + 432, 7, 14, 2, 2, 432, 91, 3, 2, 2, 2, 433, 434, 5, 94, 48, 2, 434, 435, + 7, 63, 2, 2, 435, 93, 3, 2, 2, 2, 436, 438, 7, 67, 2, 2, 437, 436, 3, 2, + 2, 2, 438, 441, 3, 2, 2, 2, 439, 437, 3, 2, 2, 2, 439, 440, 3, 2, 2, 2, + 440, 95, 3, 2, 2, 2, 441, 439, 3, 2, 2, 2, 442, 443, 9, 3, 2, 2, 443, 97, + 3, 2, 2, 2, 444, 445, 5, 94, 48, 2, 445, 446, 5, 96, 49, 2, 446, 447, 5, + 106, 54, 2, 447, 99, 3, 2, 2, 2, 448, 452, 7, 63, 2, 2, 449, 452, 5, 98, + 50, 2, 450, 452, 5, 60, 31, 2, 451, 448, 3, 2, 2, 2, 451, 449, 3, 2, 2, + 2, 451, 450, 3, 2, 2, 2, 452, 101, 3, 2, 2, 2, 453, 454, 7, 9, 2, 2, 454, + 458, 5, 88, 45, 2, 455, 457, 5, 86, 44, 2, 456, 455, 3, 2, 2, 2, 457, 460, + 3, 2, 2, 2, 458, 456, 3, 2, 2, 2, 458, 459, 3, 2, 2, 2, 459, 462, 3, 2, + 2, 2, 460, 458, 3, 2, 2, 2, 461, 453, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, + 463, 461, 3, 2, 2, 2, 463, 464, 3, 2, 2, 2, 464, 493, 3, 2, 2, 2, 465, + 476, 5, 86, 44, 2, 466, 467, 7, 9, 2, 2, 467, 471, 5, 88, 45, 2, 468, 470, + 5, 86, 44, 2, 469, 468, 3, 2, 2, 2, 470, 473, 3, 2, 2, 2, 471, 469, 3, + 2, 2, 2, 471, 472, 3, 2, 2, 2, 472, 475, 3, 2, 2, 2, 473, 471, 3, 2, 2, + 2, 474, 466, 3, 2, 2, 2, 475, 478, 3, 2, 2, 2, 476, 474, 3, 2, 2, 2, 476, + 477, 3, 2, 2, 2, 477, 489, 3, 2, 2, 2, 478, 476, 3, 2, 2, 2, 479, 484, + 5, 86, 44, 2, 480, 481, 7, 9, 2, 2, 481, 483, 5, 88, 45, 2, 482, 480, 3, + 2, 2, 2, 483, 486, 3, 2, 2, 2, 484, 482, 3, 2, 2, 2, 484, 485, 3, 2, 2, + 2, 485, 488, 3, 2, 2, 2, 486, 484, 3, 2, 2, 2, 487, 479, 3, 2, 2, 2, 488, + 491, 3, 2, 2, 2, 489, 487, 3, 2, 2, 2, 489, 490, 3, 2, 2, 2, 490, 493, + 3, 2, 2, 2, 491, 489, 3, 2, 2, 2, 492, 461, 3, 2, 2, 2, 492, 465, 3, 2, + 2, 2, 493, 103, 3, 2, 2, 2, 494, 495, 5, 100, 51, 2, 495, 496, 5, 102, + 52, 2, 496, 105, 3, 2, 2, 2, 497, 506, 7, 13, 2, 2, 498, 503, 5, 108, 55, + 2, 499, 500, 7, 10, 2, 2, 500, 502, 5, 108, 55, 2, 501, 499, 3, 2, 2, 2, + 502, 505, 3, 2, 2, 2, 503, 501, 3, 2, 2, 2, 503, 504, 3, 2, 2, 2, 504, + 507, 3, 2, 2, 2, 505, 503, 3, 2, 2, 2, 506, 498, 3, 2, 2, 2, 506, 507, + 3, 2, 2, 2, 507, 508, 3, 2, 2, 2, 508, 509, 7, 14, 2, 2, 509, 107, 3, 2, + 2, 2, 510, 511, 8, 55, 1, 2, 511, 512, 5, 130, 66, 2, 512, 513, 5, 108, + 55, 26, 513, 528, 3, 2, 2, 2, 514, 528, 5, 98, 50, 2, 515, 528, 5, 90, + 46, 2, 516, 528, 5, 64, 33, 2, 517, 528, 5, 72, 37, 2, 518, 528, 5, 74, + 38, 2, 519, 528, 5, 76, 39, 2, 520, 528, 5, 70, 36, 2, 521, 528, 5, 66, + 34, 2, 522, 528, 5, 68, 35, 2, 523, 528, 5, 62, 32, 2, 524, 528, 5, 104, + 53, 2, 525, 528, 5, 78, 40, 2, 526, 528, 5, 60, 31, 2, 527, 510, 3, 2, + 2, 2, 527, 514, 3, 2, 2, 2, 527, 515, 3, 2, 2, 2, 527, 516, 3, 2, 2, 2, + 527, 517, 3, 2, 2, 2, 527, 518, 3, 2, 2, 2, 527, 519, 3, 2, 2, 2, 527, + 520, 3, 2, 2, 2, 527, 521, 3, 2, 2, 2, 527, 522, 3, 2, 2, 2, 527, 523, + 3, 2, 2, 2, 527, 524, 3, 2, 2, 2, 527, 525, 3, 2, 2, 2, 527, 526, 3, 2, + 2, 2, 528, 578, 3, 2, 2, 2, 529, 530, 12, 25, 2, 2, 530, 531, 5, 126, 64, + 2, 531, 532, 5, 108, 55, 26, 532, 577, 3, 2, 2, 2, 533, 534, 12, 24, 2, + 2, 534, 535, 5, 128, 65, 2, 535, 536, 5, 108, 55, 25, 536, 577, 3, 2, 2, + 2, 537, 538, 12, 21, 2, 2, 538, 541, 5, 112, 57, 2, 539, 542, 5, 114, 58, + 2, 540, 542, 5, 118, 60, 2, 541, 539, 3, 2, 2, 2, 541, 540, 3, 2, 2, 2, + 542, 543, 3, 2, 2, 2, 543, 544, 5, 108, 55, 22, 544, 577, 3, 2, 2, 2, 545, + 546, 12, 20, 2, 2, 546, 547, 5, 114, 58, 2, 547, 548, 5, 108, 55, 21, 548, + 577, 3, 2, 2, 2, 549, 550, 12, 19, 2, 2, 550, 551, 5, 116, 59, 2, 551, + 552, 5, 108, 55, 20, 552, 577, 3, 2, 2, 2, 553, 554, 12, 18, 2, 2, 554, + 555, 5, 118, 60, 2, 555, 556, 5, 108, 55, 19, 556, 577, 3, 2, 2, 2, 557, + 558, 12, 17, 2, 2, 558, 559, 5, 120, 61, 2, 559, 560, 5, 108, 55, 18, 560, + 577, 3, 2, 2, 2, 561, 562, 12, 16, 2, 2, 562, 563, 5, 122, 62, 2, 563, + 564, 5, 108, 55, 17, 564, 577, 3, 2, 2, 2, 565, 566, 12, 15, 2, 2, 566, + 567, 5, 124, 63, 2, 567, 568, 5, 108, 55, 16, 568, 577, 3, 2, 2, 2, 569, + 570, 12, 14, 2, 2, 570, 572, 7, 34, 2, 2, 571, 573, 5, 108, 55, 2, 572, + 571, 3, 2, 2, 2, 572, 573, 3, 2, 2, 2, 573, 574, 3, 2, 2, 2, 574, 575, + 7, 7, 2, 2, 575, 577, 5, 108, 55, 15, 576, 529, 3, 2, 2, 2, 576, 533, 3, + 2, 2, 2, 576, 537, 3, 2, 2, 2, 576, 545, 3, 2, 2, 2, 576, 549, 3, 2, 2, + 2, 576, 553, 3, 2, 2, 2, 576, 557, 3, 2, 2, 2, 576, 561, 3, 2, 2, 2, 576, + 565, 3, 2, 2, 2, 576, 569, 3, 2, 2, 2, 577, 580, 3, 2, 2, 2, 578, 576, + 3, 2, 2, 2, 578, 579, 3, 2, 2, 2, 579, 109, 3, 2, 2, 2, 580, 578, 3, 2, + 2, 2, 581, 582, 5, 108, 55, 2, 582, 584, 7, 34, 2, 2, 583, 585, 5, 108, + 55, 2, 584, 583, 3, 2, 2, 2, 584, 585, 3, 2, 2, 2, 585, 586, 3, 2, 2, 2, + 586, 587, 7, 7, 2, 2, 587, 588, 7, 13, 2, 2, 588, 589, 5, 18, 10, 2, 589, + 590, 7, 14, 2, 2, 590, 610, 3, 2, 2, 2, 591, 592, 5, 108, 55, 2, 592, 593, + 7, 34, 2, 2, 593, 594, 7, 13, 2, 2, 594, 595, 5, 18, 10, 2, 595, 596, 7, + 14, 2, 2, 596, 597, 7, 7, 2, 2, 597, 598, 5, 108, 55, 2, 598, 610, 3, 2, + 2, 2, 599, 600, 5, 108, 55, 2, 600, 601, 7, 34, 2, 2, 601, 602, 7, 13, + 2, 2, 602, 603, 5, 18, 10, 2, 603, 604, 7, 14, 2, 2, 604, 605, 7, 7, 2, + 2, 605, 606, 7, 13, 2, 2, 606, 607, 5, 18, 10, 2, 607, 608, 7, 14, 2, 2, + 608, 610, 3, 2, 2, 2, 609, 581, 3, 2, 2, 2, 609, 591, 3, 2, 2, 2, 609, + 599, 3, 2, 2, 2, 610, 111, 3, 2, 2, 2, 611, 612, 9, 4, 2, 2, 612, 113, + 3, 2, 2, 2, 613, 617, 7, 59, 2, 2, 614, 615, 7, 58, 2, 2, 615, 617, 7, + 59, 2, 2, 616, 613, 3, 2, 2, 2, 616, 614, 3, 2, 2, 2, 617, 115, 3, 2, 2, + 2, 618, 622, 7, 57, 2, 2, 619, 620, 7, 58, 2, 2, 620, 622, 7, 57, 2, 2, + 621, 618, 3, 2, 2, 2, 621, 619, 3, 2, 2, 2, 622, 117, 3, 2, 2, 2, 623, + 624, 9, 5, 2, 2, 624, 119, 3, 2, 2, 2, 625, 626, 9, 6, 2, 2, 626, 121, + 3, 2, 2, 2, 627, 628, 7, 30, 2, 2, 628, 123, 3, 2, 2, 2, 629, 630, 7, 31, + 2, 2, 630, 125, 3, 2, 2, 2, 631, 632, 9, 7, 2, 2, 632, 127, 3, 2, 2, 2, + 633, 634, 9, 8, 2, 2, 634, 129, 3, 2, 2, 2, 635, 636, 9, 9, 2, 2, 636, + 131, 3, 2, 2, 2, 59, 135, 150, 157, 161, 165, 170, 178, 184, 191, 199, + 206, 211, 224, 230, 234, 238, 242, 251, 255, 263, 268, 288, 299, 308, 321, + 323, 345, 355, 361, 365, 375, 378, 381, 399, 404, 416, 427, 439, 451, 458, + 463, 471, 476, 484, 489, 492, 503, 506, 527, 541, 572, 576, 578, 584, 609, + 616, 621, } -var deserializer = antlr.NewATNDeserializer(nil) -var deserializedATN = deserializer.DeserializeFromUInt16(parserATN) - var literalNames = []string{ "", "", "", "", "", "':'", "';'", "'.'", "','", "'['", "']'", "'('", "')'", "'{'", "'}'", "'>'", "'<'", "'=='", "'>='", "'<='", "'!='", "'*'", "'/'", @@ -336,24 +338,29 @@ var ruleNames = []string{ "propertyName", "expressionGroup", "namespaceIdentifier", "namespace", "functionIdentifier", "functionCallExpression", "member", "memberPath", "memberExpression", "arguments", "expression", "forTernaryExpression", - "arrayOperator", "inOperator", "equalityOperator", "regexpOperator", "logicalAndOperator", - "logicalOrOperator", "multiplicativeOperator", "additiveOperator", "unaryOperator", -} -var decisionToDFA = make([]*antlr.DFA, len(deserializedATN.DecisionToState)) - -func init() { - for index, ds := range deserializedATN.DecisionToState { - decisionToDFA[index] = antlr.NewDFA(ds, index) - } + "arrayOperator", "inOperator", "likeOperator", "equalityOperator", "regexpOperator", + "logicalAndOperator", "logicalOrOperator", "multiplicativeOperator", "additiveOperator", + "unaryOperator", } type FqlParser struct { *antlr.BaseParser } +// NewFqlParser produces a new parser instance for the optional input antlr.TokenStream. +// +// The *FqlParser instance produced may be reused by calling the SetInputStream method. +// The initial parser configuration is expensive to construct, and the object is not thread-safe; +// however, if used within a Golang sync.Pool, the construction cost amortizes well and the +// objects can be used in a thread-safe manner. func NewFqlParser(input antlr.TokenStream) *FqlParser { this := new(FqlParser) - + deserializer := antlr.NewATNDeserializer(nil) + deserializedATN := deserializer.DeserializeFromUInt16(parserATN) + decisionToDFA := make([]*antlr.DFA, len(deserializedATN.DecisionToState)) + for index, ds := range deserializedATN.DecisionToState { + decisionToDFA[index] = antlr.NewDFA(ds, index) + } this.BaseParser = antlr.NewBaseParser(input) this.Interpreter = antlr.NewParserATNSimulator(this, deserializedATN, decisionToDFA, antlr.NewPredictionContextCache()) @@ -494,13 +501,14 @@ const ( FqlParserRULE_forTernaryExpression = 54 FqlParserRULE_arrayOperator = 55 FqlParserRULE_inOperator = 56 - FqlParserRULE_equalityOperator = 57 - FqlParserRULE_regexpOperator = 58 - FqlParserRULE_logicalAndOperator = 59 - FqlParserRULE_logicalOrOperator = 60 - FqlParserRULE_multiplicativeOperator = 61 - FqlParserRULE_additiveOperator = 62 - FqlParserRULE_unaryOperator = 63 + FqlParserRULE_likeOperator = 57 + FqlParserRULE_equalityOperator = 58 + FqlParserRULE_regexpOperator = 59 + FqlParserRULE_logicalAndOperator = 60 + FqlParserRULE_logicalOrOperator = 61 + FqlParserRULE_multiplicativeOperator = 62 + FqlParserRULE_additiveOperator = 63 + FqlParserRULE_unaryOperator = 64 ) // IProgramContext is an interface to support dynamic dispatch. @@ -627,24 +635,24 @@ func (p *FqlParser) Program() (localctx IProgramContext) { var _alt int p.EnterOuterAlt(localctx, 1) - p.SetState(131) + p.SetState(133) p.GetErrorHandler().Sync(p) _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 0, p.GetParserRuleContext()) for _alt != 2 && _alt != antlr.ATNInvalidAltNumber { if _alt == 1 { { - p.SetState(128) + p.SetState(130) p.Head() } } - p.SetState(133) + p.SetState(135) p.GetErrorHandler().Sync(p) _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 0, p.GetParserRuleContext()) } { - p.SetState(134) + p.SetState(136) p.Body() } @@ -751,7 +759,7 @@ func (p *FqlParser) Head() (localctx IHeadContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(136) + p.SetState(138) p.UseExpression() } @@ -858,7 +866,7 @@ func (p *FqlParser) UseExpression() (localctx IUseExpressionContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(138) + p.SetState(140) p.Use() } @@ -969,11 +977,11 @@ func (p *FqlParser) Use() (localctx IUseContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(140) + p.SetState(142) p.Match(FqlParserUse) } { - p.SetState(141) + p.SetState(143) p.NamespaceIdentifier() } @@ -1104,24 +1112,24 @@ func (p *FqlParser) Body() (localctx IBodyContext) { var _alt int p.EnterOuterAlt(localctx, 1) - p.SetState(146) + p.SetState(148) p.GetErrorHandler().Sync(p) _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 1, p.GetParserRuleContext()) for _alt != 2 && _alt != antlr.ATNInvalidAltNumber { if _alt == 1 { { - p.SetState(143) + p.SetState(145) p.BodyStatement() } } - p.SetState(148) + p.SetState(150) p.GetErrorHandler().Sync(p) _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 1, p.GetParserRuleContext()) } { - p.SetState(149) + p.SetState(151) p.BodyExpression() } @@ -1236,20 +1244,20 @@ func (p *FqlParser) BodyStatement() (localctx IBodyStatementContext) { } }() - p.SetState(153) + p.SetState(155) p.GetErrorHandler().Sync(p) switch p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 2, p.GetParserRuleContext()) { case 1: p.EnterOuterAlt(localctx, 1) { - p.SetState(151) + p.SetState(153) p.FunctionCallExpression() } case 2: p.EnterOuterAlt(localctx, 2) { - p.SetState(152) + p.SetState(154) p.VariableDeclaration() } @@ -1366,21 +1374,21 @@ func (p *FqlParser) BodyExpression() (localctx IBodyExpressionContext) { } }() - p.SetState(157) + p.SetState(159) p.GetErrorHandler().Sync(p) switch p.GetTokenStream().LA(1) { case FqlParserReturn: p.EnterOuterAlt(localctx, 1) { - p.SetState(155) + p.SetState(157) p.ReturnExpression() } case FqlParserFor: p.EnterOuterAlt(localctx, 2) { - p.SetState(156) + p.SetState(158) p.ForExpression() } @@ -1526,68 +1534,68 @@ func (p *FqlParser) ReturnExpression() (localctx IReturnExpressionContext) { } }() - p.SetState(174) + p.SetState(176) p.GetErrorHandler().Sync(p) switch p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 6, p.GetParserRuleContext()) { case 1: p.EnterOuterAlt(localctx, 1) { - p.SetState(159) + p.SetState(161) p.Match(FqlParserReturn) } - p.SetState(161) + p.SetState(163) p.GetErrorHandler().Sync(p) if p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 4, p.GetParserRuleContext()) == 1 { { - p.SetState(160) + p.SetState(162) p.Match(FqlParserDistinct) } } { - p.SetState(163) + p.SetState(165) p.expression(0) } case 2: p.EnterOuterAlt(localctx, 2) { - p.SetState(164) + p.SetState(166) p.Match(FqlParserReturn) } - p.SetState(166) + p.SetState(168) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == FqlParserDistinct { { - p.SetState(165) + p.SetState(167) p.Match(FqlParserDistinct) } } { - p.SetState(168) + p.SetState(170) p.Match(FqlParserOpenParen) } { - p.SetState(169) + p.SetState(171) p.ForExpression() } { - p.SetState(170) + p.SetState(172) p.Match(FqlParserCloseParen) } case 3: p.EnterOuterAlt(localctx, 3) { - p.SetState(172) + p.SetState(174) p.Match(FqlParserReturn) } { - p.SetState(173) + p.SetState(175) p.ForTernaryExpression() } @@ -1780,110 +1788,110 @@ func (p *FqlParser) ForExpression() (localctx IForExpressionContext) { var _alt int - p.SetState(207) + p.SetState(209) p.GetErrorHandler().Sync(p) switch p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 11, p.GetParserRuleContext()) { case 1: p.EnterOuterAlt(localctx, 1) { - p.SetState(176) + p.SetState(178) p.Match(FqlParserFor) } { - p.SetState(177) + p.SetState(179) p.ForExpressionValueVariable() } - p.SetState(180) + p.SetState(182) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == FqlParserComma { { - p.SetState(178) + p.SetState(180) p.Match(FqlParserComma) } { - p.SetState(179) + p.SetState(181) p.ForExpressionKeyVariable() } } { - p.SetState(182) + p.SetState(184) p.Match(FqlParserIn) } { - p.SetState(183) + p.SetState(185) p.ForExpressionSource() } - p.SetState(187) + p.SetState(189) p.GetErrorHandler().Sync(p) _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 8, p.GetParserRuleContext()) for _alt != 2 && _alt != antlr.ATNInvalidAltNumber { if _alt == 1 { { - p.SetState(184) + p.SetState(186) p.ForExpressionBody() } } - p.SetState(189) + p.SetState(191) p.GetErrorHandler().Sync(p) _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 8, p.GetParserRuleContext()) } { - p.SetState(190) + p.SetState(192) p.ForExpressionReturn() } case 2: p.EnterOuterAlt(localctx, 2) { - p.SetState(192) + p.SetState(194) p.Match(FqlParserFor) } { - p.SetState(193) + p.SetState(195) p.ForExpressionValueVariable() } - p.SetState(195) + p.SetState(197) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == FqlParserDo { { - p.SetState(194) + p.SetState(196) p.Match(FqlParserDo) } } { - p.SetState(197) + p.SetState(199) p.Match(FqlParserWhile) } { - p.SetState(198) + p.SetState(200) p.expression(0) } - p.SetState(202) + p.SetState(204) p.GetErrorHandler().Sync(p) _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 10, p.GetParserRuleContext()) for _alt != 2 && _alt != antlr.ATNInvalidAltNumber { if _alt == 1 { { - p.SetState(199) + p.SetState(201) p.ForExpressionBody() } } - p.SetState(204) + p.SetState(206) p.GetErrorHandler().Sync(p) _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 10, p.GetParserRuleContext()) } { - p.SetState(205) + p.SetState(207) p.ForExpressionReturn() } @@ -1986,7 +1994,7 @@ func (p *FqlParser) ForExpressionValueVariable() (localctx IForExpressionValueVa p.EnterOuterAlt(localctx, 1) { - p.SetState(209) + p.SetState(211) p.Match(FqlParserIdentifier) } @@ -2087,7 +2095,7 @@ func (p *FqlParser) ForExpressionKeyVariable() (localctx IForExpressionKeyVariab p.EnterOuterAlt(localctx, 1) { - p.SetState(211) + p.SetState(213) p.Match(FqlParserIdentifier) } @@ -2252,55 +2260,55 @@ func (p *FqlParser) ForExpressionSource() (localctx IForExpressionSourceContext) } }() - p.SetState(220) + p.SetState(222) p.GetErrorHandler().Sync(p) switch p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 12, p.GetParserRuleContext()) { case 1: p.EnterOuterAlt(localctx, 1) { - p.SetState(213) + p.SetState(215) p.FunctionCallExpression() } case 2: p.EnterOuterAlt(localctx, 2) { - p.SetState(214) + p.SetState(216) p.ArrayLiteral() } case 3: p.EnterOuterAlt(localctx, 3) { - p.SetState(215) + p.SetState(217) p.ObjectLiteral() } case 4: p.EnterOuterAlt(localctx, 4) { - p.SetState(216) + p.SetState(218) p.Variable() } case 5: p.EnterOuterAlt(localctx, 5) { - p.SetState(217) + p.SetState(219) p.MemberExpression() } case 6: p.EnterOuterAlt(localctx, 6) { - p.SetState(218) + p.SetState(220) p.RangeOperator() } case 7: p.EnterOuterAlt(localctx, 7) { - p.SetState(219) + p.SetState(221) p.Param() } @@ -2437,35 +2445,35 @@ func (p *FqlParser) ForExpressionClause() (localctx IForExpressionClauseContext) } }() - p.SetState(226) + p.SetState(228) p.GetErrorHandler().Sync(p) switch p.GetTokenStream().LA(1) { case FqlParserLimit: p.EnterOuterAlt(localctx, 1) { - p.SetState(222) + p.SetState(224) p.LimitClause() } case FqlParserSort: p.EnterOuterAlt(localctx, 2) { - p.SetState(223) + p.SetState(225) p.SortClause() } case FqlParserFilter: p.EnterOuterAlt(localctx, 3) { - p.SetState(224) + p.SetState(226) p.FilterClause() } case FqlParserCollect: p.EnterOuterAlt(localctx, 4) { - p.SetState(225) + p.SetState(227) p.CollectClause() } @@ -2584,20 +2592,20 @@ func (p *FqlParser) ForExpressionStatement() (localctx IForExpressionStatementCo } }() - p.SetState(230) + p.SetState(232) p.GetErrorHandler().Sync(p) switch p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 14, p.GetParserRuleContext()) { case 1: p.EnterOuterAlt(localctx, 1) { - p.SetState(228) + p.SetState(230) p.VariableDeclaration() } case 2: p.EnterOuterAlt(localctx, 2) { - p.SetState(229) + p.SetState(231) p.FunctionCallExpression() } @@ -2714,20 +2722,20 @@ func (p *FqlParser) ForExpressionBody() (localctx IForExpressionBodyContext) { } }() - p.SetState(234) + p.SetState(236) p.GetErrorHandler().Sync(p) switch p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 15, p.GetParserRuleContext()) { case 1: p.EnterOuterAlt(localctx, 1) { - p.SetState(232) + p.SetState(234) p.ForExpressionStatement() } case 2: p.EnterOuterAlt(localctx, 2) { - p.SetState(233) + p.SetState(235) p.ForExpressionClause() } @@ -2844,21 +2852,21 @@ func (p *FqlParser) ForExpressionReturn() (localctx IForExpressionReturnContext) } }() - p.SetState(238) + p.SetState(240) p.GetErrorHandler().Sync(p) switch p.GetTokenStream().LA(1) { case FqlParserReturn: p.EnterOuterAlt(localctx, 1) { - p.SetState(236) + p.SetState(238) p.ReturnExpression() } case FqlParserFor: p.EnterOuterAlt(localctx, 2) { - p.SetState(237) + p.SetState(239) p.ForExpression() } @@ -2973,11 +2981,11 @@ func (p *FqlParser) FilterClause() (localctx IFilterClauseContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(240) + p.SetState(242) p.Match(FqlParserFilter) } { - p.SetState(241) + p.SetState(243) p.expression(0) } @@ -3106,24 +3114,24 @@ func (p *FqlParser) LimitClause() (localctx ILimitClauseContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(243) + p.SetState(245) p.Match(FqlParserLimit) } { - p.SetState(244) + p.SetState(246) p.LimitClauseValue() } - p.SetState(247) + p.SetState(249) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == FqlParserComma { { - p.SetState(245) + p.SetState(247) p.Match(FqlParserComma) } { - p.SetState(246) + p.SetState(248) p.LimitClauseValue() } @@ -3234,21 +3242,21 @@ func (p *FqlParser) LimitClauseValue() (localctx ILimitClauseValueContext) { } }() - p.SetState(251) + p.SetState(253) p.GetErrorHandler().Sync(p) switch p.GetTokenStream().LA(1) { case FqlParserIntegerLiteral: p.EnterOuterAlt(localctx, 1) { - p.SetState(249) + p.SetState(251) p.Match(FqlParserIntegerLiteral) } case FqlParserParam: p.EnterOuterAlt(localctx, 2) { - p.SetState(250) + p.SetState(252) p.Param() } @@ -3385,28 +3393,28 @@ func (p *FqlParser) SortClause() (localctx ISortClauseContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(253) + p.SetState(255) p.Match(FqlParserSort) } { - p.SetState(254) + p.SetState(256) p.SortClauseExpression() } - p.SetState(259) + p.SetState(261) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for _la == FqlParserComma { { - p.SetState(255) + p.SetState(257) p.Match(FqlParserComma) } { - p.SetState(256) + p.SetState(258) p.SortClauseExpression() } - p.SetState(261) + p.SetState(263) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } @@ -3518,15 +3526,15 @@ func (p *FqlParser) SortClauseExpression() (localctx ISortClauseExpressionContex p.EnterOuterAlt(localctx, 1) { - p.SetState(262) + p.SetState(264) p.expression(0) } - p.SetState(264) + p.SetState(266) p.GetErrorHandler().Sync(p) if p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 20, p.GetParserRuleContext()) == 1 { { - p.SetState(263) + p.SetState(265) p.Match(FqlParserSortDirection) } @@ -3667,84 +3675,84 @@ func (p *FqlParser) CollectClause() (localctx ICollectClauseContext) { } }() - p.SetState(284) + p.SetState(286) p.GetErrorHandler().Sync(p) switch p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 21, p.GetParserRuleContext()) { case 1: p.EnterOuterAlt(localctx, 1) - { - p.SetState(266) - p.Match(FqlParserCollect) - } - { - p.SetState(267) - p.CollectCounter() - } - - case 2: - p.EnterOuterAlt(localctx, 2) { p.SetState(268) p.Match(FqlParserCollect) } { p.SetState(269) - p.CollectAggregator() + p.CollectCounter() } - case 3: - p.EnterOuterAlt(localctx, 3) + case 2: + p.EnterOuterAlt(localctx, 2) { p.SetState(270) p.Match(FqlParserCollect) } { p.SetState(271) + p.CollectAggregator() + } + + case 3: + p.EnterOuterAlt(localctx, 3) + { + p.SetState(272) + p.Match(FqlParserCollect) + } + { + p.SetState(273) p.CollectGrouping() } { - p.SetState(272) + p.SetState(274) p.CollectAggregator() } case 4: p.EnterOuterAlt(localctx, 4) { - p.SetState(274) + p.SetState(276) p.Match(FqlParserCollect) } { - p.SetState(275) + p.SetState(277) p.CollectGrouping() } { - p.SetState(276) + p.SetState(278) p.CollectGroupVariable() } case 5: p.EnterOuterAlt(localctx, 5) { - p.SetState(278) + p.SetState(280) p.Match(FqlParserCollect) } { - p.SetState(279) + p.SetState(281) p.CollectGrouping() } { - p.SetState(280) + p.SetState(282) p.CollectCounter() } case 6: p.EnterOuterAlt(localctx, 6) { - p.SetState(282) + p.SetState(284) p.Match(FqlParserCollect) } { - p.SetState(283) + p.SetState(285) p.CollectGrouping() } @@ -3861,15 +3869,15 @@ func (p *FqlParser) CollectSelector() (localctx ICollectSelectorContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(286) + p.SetState(288) p.Match(FqlParserIdentifier) } { - p.SetState(287) + p.SetState(289) p.Match(FqlParserAssign) } { - p.SetState(288) + p.SetState(290) p.expression(0) } @@ -3998,24 +4006,24 @@ func (p *FqlParser) CollectGrouping() (localctx ICollectGroupingContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(290) + p.SetState(292) p.CollectSelector() } - p.SetState(295) + p.SetState(297) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for _la == FqlParserComma { { - p.SetState(291) + p.SetState(293) p.Match(FqlParserComma) } { - p.SetState(292) + p.SetState(294) p.CollectSelector() } - p.SetState(297) + p.SetState(299) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } @@ -4149,28 +4157,28 @@ func (p *FqlParser) CollectAggregator() (localctx ICollectAggregatorContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(298) + p.SetState(300) p.Match(FqlParserAggregate) } { - p.SetState(299) + p.SetState(301) p.CollectAggregateSelector() } - p.SetState(304) + p.SetState(306) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) for _la == FqlParserComma { { - p.SetState(300) + p.SetState(302) p.Match(FqlParserComma) } { - p.SetState(301) + p.SetState(303) p.CollectAggregateSelector() } - p.SetState(306) + p.SetState(308) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) } @@ -4286,15 +4294,15 @@ func (p *FqlParser) CollectAggregateSelector() (localctx ICollectAggregateSelect p.EnterOuterAlt(localctx, 1) { - p.SetState(307) + p.SetState(309) p.Match(FqlParserIdentifier) } { - p.SetState(308) + p.SetState(310) p.Match(FqlParserAssign) } { - p.SetState(309) + p.SetState(311) p.FunctionCallExpression() } @@ -4415,40 +4423,40 @@ func (p *FqlParser) CollectGroupVariable() (localctx ICollectGroupVariableContex } }() - p.SetState(319) + p.SetState(321) p.GetErrorHandler().Sync(p) switch p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 25, p.GetParserRuleContext()) { case 1: p.EnterOuterAlt(localctx, 1) - { - p.SetState(311) - p.Match(FqlParserInto) - } - { - p.SetState(312) - p.CollectSelector() - } - - case 2: - p.EnterOuterAlt(localctx, 2) { p.SetState(313) p.Match(FqlParserInto) } { p.SetState(314) + p.CollectSelector() + } + + case 2: + p.EnterOuterAlt(localctx, 2) + { + p.SetState(315) + p.Match(FqlParserInto) + } + { + p.SetState(316) p.Match(FqlParserIdentifier) } - p.SetState(317) + p.SetState(319) p.GetErrorHandler().Sync(p) if p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 24, p.GetParserRuleContext()) == 1 { { - p.SetState(315) + p.SetState(317) p.Match(FqlParserKeep) } { - p.SetState(316) + p.SetState(318) p.Match(FqlParserIdentifier) } @@ -4565,19 +4573,19 @@ func (p *FqlParser) CollectCounter() (localctx ICollectCounterContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(321) + p.SetState(323) p.Match(FqlParserWith) } { - p.SetState(322) + p.SetState(324) p.Match(FqlParserCount) } { - p.SetState(323) + p.SetState(325) p.Match(FqlParserInto) } { - p.SetState(324) + p.SetState(326) p.Match(FqlParserIdentifier) } @@ -4722,71 +4730,71 @@ func (p *FqlParser) VariableDeclaration() (localctx IVariableDeclarationContext) } }() - p.SetState(341) + p.SetState(343) p.GetErrorHandler().Sync(p) switch p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 26, p.GetParserRuleContext()) { case 1: p.EnterOuterAlt(localctx, 1) { - p.SetState(326) + p.SetState(328) p.Match(FqlParserLet) } { - p.SetState(327) + p.SetState(329) p.Match(FqlParserIdentifier) } { - p.SetState(328) + p.SetState(330) p.Match(FqlParserAssign) } { - p.SetState(329) + p.SetState(331) p.expression(0) } case 2: p.EnterOuterAlt(localctx, 2) { - p.SetState(330) + p.SetState(332) p.Match(FqlParserLet) } { - p.SetState(331) + p.SetState(333) p.Match(FqlParserIdentifier) } { - p.SetState(332) + p.SetState(334) p.Match(FqlParserAssign) } { - p.SetState(333) + p.SetState(335) p.Match(FqlParserOpenParen) } { - p.SetState(334) + p.SetState(336) p.ForExpression() } { - p.SetState(335) + p.SetState(337) p.Match(FqlParserCloseParen) } case 3: p.EnterOuterAlt(localctx, 3) { - p.SetState(337) + p.SetState(339) p.Match(FqlParserLet) } { - p.SetState(338) + p.SetState(340) p.Match(FqlParserIdentifier) } { - p.SetState(339) + p.SetState(341) p.Match(FqlParserAssign) } { - p.SetState(340) + p.SetState(342) p.ForTernaryExpression() } @@ -4893,11 +4901,11 @@ func (p *FqlParser) Param() (localctx IParamContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(343) + p.SetState(345) p.Match(FqlParserParam) } { - p.SetState(344) + p.SetState(346) p.Match(FqlParserIdentifier) } @@ -4998,7 +5006,7 @@ func (p *FqlParser) Variable() (localctx IVariableContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(346) + p.SetState(348) p.Match(FqlParserIdentifier) } @@ -5167,25 +5175,25 @@ func (p *FqlParser) RangeOperator() (localctx IRangeOperatorContext) { }() p.EnterOuterAlt(localctx, 1) - p.SetState(351) + p.SetState(353) p.GetErrorHandler().Sync(p) switch p.GetTokenStream().LA(1) { case FqlParserIntegerLiteral: { - p.SetState(348) + p.SetState(350) p.IntegerLiteral() } case FqlParserIdentifier: { - p.SetState(349) + p.SetState(351) p.Variable() } case FqlParserParam: { - p.SetState(350) + p.SetState(352) p.Param() } @@ -5193,28 +5201,28 @@ func (p *FqlParser) RangeOperator() (localctx IRangeOperatorContext) { panic(antlr.NewNoViableAltException(p, nil, nil, nil, nil, nil)) } { - p.SetState(353) + p.SetState(355) p.Match(FqlParserRange) } - p.SetState(357) + p.SetState(359) p.GetErrorHandler().Sync(p) switch p.GetTokenStream().LA(1) { case FqlParserIntegerLiteral: { - p.SetState(354) + p.SetState(356) p.IntegerLiteral() } case FqlParserIdentifier: { - p.SetState(355) + p.SetState(357) p.Variable() } case FqlParserParam: { - p.SetState(356) + p.SetState(358) p.Param() } @@ -5334,22 +5342,22 @@ func (p *FqlParser) ArrayLiteral() (localctx IArrayLiteralContext) { p.EnterOuterAlt(localctx, 1) { - p.SetState(359) + p.SetState(361) p.Match(FqlParserOpenBracket) } - p.SetState(361) + p.SetState(363) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if (((_la)&-(0x1f+1)) == 0 && ((1< 2 { + if values.ToBoolean(args[2]) { + str = strings.ToLower(str) + pattern = strings.ToLower(pattern) } } - for i := 1; i < len(str)+1; i++ { - for j := 1; j < len(pattern)+1; j++ { - switch { - case pattern[j-1] == '%': - lookup[i][j] = lookup[i][j-1] || lookup[i-1][j] - case pattern[j-1] == '_' || str[i-1] == pattern[j-1]: - lookup[i][j] = lookup[i-1][j-1] - case len(args) > 2: - isEq := unicode.ToLower(str[i-1]) == unicode.ToLower(pattern[j-1]) - if args[2] == values.True && isEq { - lookup[i][j] = lookup[i-1][j-1] - } - default: - lookup[i][j] = false - } - } + g, err := glob.Compile(pattern) + + if err != nil { + return nil, err } - matched := lookup[len(str)][len(pattern)] - - return values.NewBoolean(matched), nil + return values.NewBoolean(g.Match(str)), nil }