From e4321b5e9023da7605a8aaf819af47f053c866b8 Mon Sep 17 00:00:00 2001 From: Vadym Slizov Date: Mon, 28 Dec 2020 00:02:14 +0200 Subject: [PATCH] refactoring: create "ExprBrackets" node --- internal/php5/parser_test.go | 54 +++++++++---------- internal/php5/php5.go | Bin 265640 -> 265714 bytes internal/php5/php5.y | 86 +++++++++++++++--------------- internal/php7/parser_test.go | 40 +++++++------- internal/php7/php7.go | Bin 220446 -> 220503 bytes internal/php7/php7.y | 38 ++++++------- pkg/ast/ast.go | 1 + pkg/ast/node.go | 15 ++++++ pkg/ast/traverser/dfs.go | 12 +++++ pkg/ast/visitor/dumper.go | 13 +++++ pkg/ast/visitor/formatter.go | 6 +++ pkg/ast/visitor/formatter_test.go | 25 +++++++++ pkg/ast/visitor/null.go | 4 ++ pkg/ast/visitor/printer.go | 6 +++ pkg/ast/visitor/printer_test.go | 19 +++++++ 15 files changed, 210 insertions(+), 109 deletions(-) diff --git a/internal/php5/parser_test.go b/internal/php5/parser_test.go index 889fb3c..928496a 100644 --- a/internal/php5/parser_test.go +++ b/internal/php5/parser_test.go @@ -11513,14 +11513,14 @@ func TestStmtContinue(t *testing.T) { }, }, }, - Expr: &ast.ParserBrackets{ + Expr: &ast.ExprBrackets{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 23, EndPos: 26, }, - OpenBracketTkn: &token.Token{ + OpenParenthesisTkn: &token.Token{ ID: token.ID(40), Value: []byte("("), Position: &position.Position{ @@ -11530,7 +11530,7 @@ func TestStmtContinue(t *testing.T) { EndPos: 24, }, }, - Child: &ast.ScalarLnumber{ + Expr: &ast.ScalarLnumber{ Position: &position.Position{ StartLine: 1, EndLine: 1, @@ -11549,7 +11549,7 @@ func TestStmtContinue(t *testing.T) { }, Value: []byte("3"), }, - CloseBracketTkn: &token.Token{ + CloseParenthesisTkn: &token.Token{ ID: token.ID(41), Value: []byte(")"), Position: &position.Position{ @@ -12598,14 +12598,14 @@ func TestStmtEcho_Parenthesis(t *testing.T) { }, }, Exprs: []ast.Vertex{ - &ast.ParserBrackets{ + &ast.ExprBrackets{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 7, EndPos: 11, }, - OpenBracketTkn: &token.Token{ + OpenParenthesisTkn: &token.Token{ ID: token.ID(40), Value: []byte("("), Position: &position.Position{ @@ -12615,7 +12615,7 @@ func TestStmtEcho_Parenthesis(t *testing.T) { EndPos: 8, }, }, - Child: &ast.ExprVariable{ + Expr: &ast.ExprVariable{ Position: &position.Position{ StartLine: 1, EndLine: 1, @@ -12642,7 +12642,7 @@ func TestStmtEcho_Parenthesis(t *testing.T) { Value: []byte("$a"), }, }, - CloseBracketTkn: &token.Token{ + CloseParenthesisTkn: &token.Token{ ID: token.ID(41), Value: []byte(")"), Position: &position.Position{ @@ -12694,14 +12694,14 @@ func TestStmtExpression(t *testing.T) { StartPos: 3, EndPos: 9, }, - Expr: &ast.ParserBrackets{ + Expr: &ast.ExprBrackets{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 3, EndPos: 8, }, - OpenBracketTkn: &token.Token{ + OpenParenthesisTkn: &token.Token{ ID: token.ID(40), Value: []byte("("), Position: &position.Position{ @@ -12733,14 +12733,14 @@ func TestStmtExpression(t *testing.T) { }, }, }, - Child: &ast.ParserBrackets{ + Expr: &ast.ExprBrackets{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 4, EndPos: 7, }, - OpenBracketTkn: &token.Token{ + OpenParenthesisTkn: &token.Token{ ID: token.ID(40), Value: []byte("("), Position: &position.Position{ @@ -12750,7 +12750,7 @@ func TestStmtExpression(t *testing.T) { EndPos: 5, }, }, - Child: &ast.ScalarLnumber{ + Expr: &ast.ScalarLnumber{ Position: &position.Position{ StartLine: 1, EndLine: 1, @@ -12769,7 +12769,7 @@ func TestStmtExpression(t *testing.T) { }, Value: []byte("1"), }, - CloseBracketTkn: &token.Token{ + CloseParenthesisTkn: &token.Token{ ID: token.ID(41), Value: []byte(")"), Position: &position.Position{ @@ -12780,7 +12780,7 @@ func TestStmtExpression(t *testing.T) { }, }, }, - CloseBracketTkn: &token.Token{ + CloseParenthesisTkn: &token.Token{ ID: token.ID(41), Value: []byte(")"), Position: &position.Position{ @@ -29993,14 +29993,14 @@ func TestStmtBreak(t *testing.T) { }, }, }, - Expr: &ast.ParserBrackets{ + Expr: &ast.ExprBrackets{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 20, EndPos: 23, }, - OpenBracketTkn: &token.Token{ + OpenParenthesisTkn: &token.Token{ ID: token.ID(40), Value: []byte("("), Position: &position.Position{ @@ -30010,7 +30010,7 @@ func TestStmtBreak(t *testing.T) { EndPos: 21, }, }, - Child: &ast.ScalarLnumber{ + Expr: &ast.ScalarLnumber{ Position: &position.Position{ StartLine: 1, EndLine: 1, @@ -30029,7 +30029,7 @@ func TestStmtBreak(t *testing.T) { }, Value: []byte("3"), }, - CloseBracketTkn: &token.Token{ + CloseParenthesisTkn: &token.Token{ ID: token.ID(41), Value: []byte(")"), Position: &position.Position{ @@ -31402,14 +31402,14 @@ func TestExprClone_Brackets(t *testing.T) { }, }, }, - Expr: &ast.ParserBrackets{ + Expr: &ast.ExprBrackets{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 8, EndPos: 12, }, - OpenBracketTkn: &token.Token{ + OpenParenthesisTkn: &token.Token{ ID: token.ID(40), Value: []byte("("), Position: &position.Position{ @@ -31419,7 +31419,7 @@ func TestExprClone_Brackets(t *testing.T) { EndPos: 9, }, }, - Child: &ast.ExprVariable{ + Expr: &ast.ExprVariable{ Position: &position.Position{ StartLine: 1, EndLine: 1, @@ -31446,7 +31446,7 @@ func TestExprClone_Brackets(t *testing.T) { Value: []byte("$a"), }, }, - CloseBracketTkn: &token.Token{ + CloseParenthesisTkn: &token.Token{ ID: token.ID(41), Value: []byte(")"), Position: &position.Position{ @@ -38335,14 +38335,14 @@ func TestExprPrint(t *testing.T) { }, }, }, - Expr: &ast.ParserBrackets{ + Expr: &ast.ExprBrackets{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 8, EndPos: 12, }, - OpenBracketTkn: &token.Token{ + OpenParenthesisTkn: &token.Token{ ID: token.ID(40), Value: []byte("("), Position: &position.Position{ @@ -38352,7 +38352,7 @@ func TestExprPrint(t *testing.T) { EndPos: 9, }, }, - Child: &ast.ExprVariable{ + Expr: &ast.ExprVariable{ Position: &position.Position{ StartLine: 1, EndLine: 1, @@ -38379,7 +38379,7 @@ func TestExprPrint(t *testing.T) { Value: []byte("$a"), }, }, - CloseBracketTkn: &token.Token{ + CloseParenthesisTkn: &token.Token{ ID: token.ID(41), Value: []byte(")"), Position: &position.Position{ diff --git a/internal/php5/php5.go b/internal/php5/php5.go index 4e5baf8f419e80c834553b73dc282d4902ff0ba6..ce0b005c6530a61e131770ea1a267e42ecea3cf3 100644 GIT binary patch delta 1118 zcmZ26Tj0}dfrc%N?m0ZJ6$M33MTyDTsU^kJ8(Em8rvEBol$)M#j*)$OgB>Hg5V8VI zJrHmDMO8+X=@)Vs`A~H`Rxn9VSJh&Yn||RLBky*-T*irvs4A#nK1T*K@Ai&-Mtvq! zqaCXmMW%o3W0ar1zX<5`--V2F*qn|~5mLmci)KUxlPK7T?LZ^M(aeWAT?d<~-~fp) z#TpY(X{xq3QK z0mpRaD#noM@(N5G)Aw-$qr&{Ecn((_lVdU{cBcblS8)2eOlH3A7d|rT9GO1Bo0)Yw^EP0*YIqAuc<-6i zrafckpT3TRNo4wk4~$&X8w{EFrYp2C@=eeA%`7nOF3^yKT%e}D-^`NJ92t41J7h7j zZU3~5={`T2cR)e^{uq-6wjj_s&SZ|J92nM9MVQ66&pgg_D;$f%Os5wZF|$mcvyfSK zy2E}Z?&n`ECMmpRxD))%YMB3v{aP}oIranP*Dm~A9+P)az+Nys&%j|6N2g1JZx$a@|jDwxtb5Y?{ zBMU?!T{1%+(4VB*OM*fdBYdV^M`p-uL*D}ujD8xbL*dggZw zdJ!asEBX8k90cjaj9CI!Y5fdJzQWhmi-1+~1X#Wt%TV$aaBPAp-1Yz|kVrj$@q_+& z;4@$n0T)qfNH~3e0e!UaDAc~*3A&~=P`LLQVyEQxG9#Tl;yq19&`PONtmn(C7-l?q z#4L(*PtOb!%prT4ba#T)$tnemsPer8yX^TnjRVv>UTEqeQ^A~6d9 diff --git a/internal/php5/php5.y b/internal/php5/php5.y index a9d05ee..245e18a 100644 --- a/internal/php5/php5.y +++ b/internal/php5/php5.y @@ -787,9 +787,9 @@ unticked_statement: $$ = &ast.StmtIf{ Position: pos, IfTkn: $1, - OpenParenthesisTkn: $2.(*ast.ParserBrackets).OpenBracketTkn, - Cond: $2.(*ast.ParserBrackets).Child, - CloseParenthesisTkn: $2.(*ast.ParserBrackets).CloseBracketTkn, + OpenParenthesisTkn: $2.(*ast.ExprBrackets).OpenParenthesisTkn, + Cond: $2.(*ast.ExprBrackets).Expr, + CloseParenthesisTkn: $2.(*ast.ExprBrackets).CloseParenthesisTkn, Stmt: $3, ElseIf: $4, Else: $5, @@ -800,9 +800,9 @@ unticked_statement: $$ = &ast.StmtIf{ Position: yylex.(*Parser).builder.NewTokensPosition($1, $8), IfTkn: $1, - OpenParenthesisTkn: $2.(*ast.ParserBrackets).OpenBracketTkn, - Cond: $2.(*ast.ParserBrackets).Child, - CloseParenthesisTkn: $2.(*ast.ParserBrackets).CloseBracketTkn, + OpenParenthesisTkn: $2.(*ast.ExprBrackets).OpenParenthesisTkn, + Cond: $2.(*ast.ExprBrackets).Expr, + CloseParenthesisTkn: $2.(*ast.ExprBrackets).CloseParenthesisTkn, ColonTkn: $3, Stmt: &ast.StmtStmtList{ Position: yylex.(*Parser).builder.NewNodeListPosition($4), @@ -817,9 +817,9 @@ unticked_statement: | T_WHILE parenthesis_expr while_statement { $3.(*ast.StmtWhile).WhileTkn = $1 - $3.(*ast.StmtWhile).OpenParenthesisTkn = $2.(*ast.ParserBrackets).OpenBracketTkn - $3.(*ast.StmtWhile).Cond = $2.(*ast.ParserBrackets).Child - $3.(*ast.StmtWhile).CloseParenthesisTkn = $2.(*ast.ParserBrackets).CloseBracketTkn + $3.(*ast.StmtWhile).OpenParenthesisTkn = $2.(*ast.ExprBrackets).OpenParenthesisTkn + $3.(*ast.StmtWhile).Cond = $2.(*ast.ExprBrackets).Expr + $3.(*ast.StmtWhile).CloseParenthesisTkn = $2.(*ast.ExprBrackets).CloseParenthesisTkn $3.(*ast.StmtWhile).Position = yylex.(*Parser).builder.NewTokenNodePosition($1, $3) $$ = $3 @@ -831,9 +831,9 @@ unticked_statement: DoTkn: $1, Stmt: $2, WhileTkn: $3, - OpenParenthesisTkn: $4.(*ast.ParserBrackets).OpenBracketTkn, - Cond: $4.(*ast.ParserBrackets).Child, - CloseParenthesisTkn: $4.(*ast.ParserBrackets).CloseBracketTkn, + OpenParenthesisTkn: $4.(*ast.ExprBrackets).OpenParenthesisTkn, + Cond: $4.(*ast.ExprBrackets).Expr, + CloseParenthesisTkn: $4.(*ast.ExprBrackets).CloseParenthesisTkn, SemiColonTkn: $5, } } @@ -857,9 +857,9 @@ unticked_statement: | T_SWITCH parenthesis_expr switch_case_list { $3.(*ast.StmtSwitch).SwitchTkn = $1 - $3.(*ast.StmtSwitch).OpenParenthesisTkn = $2.(*ast.ParserBrackets).OpenBracketTkn - $3.(*ast.StmtSwitch).Cond = $2.(*ast.ParserBrackets).Child - $3.(*ast.StmtSwitch).CloseParenthesisTkn = $2.(*ast.ParserBrackets).CloseBracketTkn + $3.(*ast.StmtSwitch).OpenParenthesisTkn = $2.(*ast.ExprBrackets).OpenParenthesisTkn + $3.(*ast.StmtSwitch).Cond = $2.(*ast.ExprBrackets).Expr + $3.(*ast.StmtSwitch).CloseParenthesisTkn = $2.(*ast.ExprBrackets).CloseParenthesisTkn $3.(*ast.StmtSwitch).Position = yylex.(*Parser).builder.NewTokenNodePosition($1, $3) $$ = $3 @@ -1717,9 +1717,9 @@ elseif_list: $$ = append($1, &ast.StmtElseIf{ Position: yylex.(*Parser).builder.NewTokenNodePosition($2, $4), ElseIfTkn: $2, - OpenParenthesisTkn: $3.(*ast.ParserBrackets).OpenBracketTkn, - Cond: $3.(*ast.ParserBrackets).Child, - CloseParenthesisTkn: $3.(*ast.ParserBrackets).CloseBracketTkn, + OpenParenthesisTkn: $3.(*ast.ExprBrackets).OpenParenthesisTkn, + Cond: $3.(*ast.ExprBrackets).Expr, + CloseParenthesisTkn: $3.(*ast.ExprBrackets).CloseParenthesisTkn, Stmt: $4, }) } @@ -1736,9 +1736,9 @@ new_elseif_list: $$ = append($1, &ast.StmtElseIf{ Position: yylex.(*Parser).builder.NewTokenNodeListPosition($2, $5), ElseIfTkn: $2, - OpenParenthesisTkn: $3.(*ast.ParserBrackets).OpenBracketTkn, - Cond: $3.(*ast.ParserBrackets).Child, - CloseParenthesisTkn: $3.(*ast.ParserBrackets).CloseBracketTkn, + OpenParenthesisTkn: $3.(*ast.ExprBrackets).OpenParenthesisTkn, + Cond: $3.(*ast.ExprBrackets).Expr, + CloseParenthesisTkn: $3.(*ast.ExprBrackets).CloseParenthesisTkn, ColonTkn: $4, Stmt: &ast.StmtStmtList{ Position: yylex.(*Parser).builder.NewNodeListPosition($5), @@ -3214,11 +3214,11 @@ expr_without_variable: } | '(' new_expr ')' instance_call { - $$ = &ast.ParserBrackets{ + $$ = &ast.ExprBrackets{ Position: yylex.(*Parser).builder.NewTokensPosition($1, $3), - OpenBracketTkn: $1, - Child: $2, - CloseBracketTkn: $3, + OpenParenthesisTkn: $1, + Expr: $2, + CloseParenthesisTkn: $3, } for _, n := range($4) { @@ -3336,9 +3336,9 @@ expr_without_variable: exit.Position = yylex.(*Parser).builder.NewTokenPosition($1) } else { exit.Position = yylex.(*Parser).builder.NewTokenNodePosition($1, $2) - exit.OpenParenthesisTkn = $2.(*ast.ParserBrackets).OpenBracketTkn - exit.Expr = $2.(*ast.ParserBrackets).Child - exit.CloseParenthesisTkn = $2.(*ast.ParserBrackets).CloseBracketTkn + exit.OpenParenthesisTkn = $2.(*ast.ExprBrackets).OpenParenthesisTkn + exit.Expr = $2.(*ast.ExprBrackets).Expr + exit.CloseParenthesisTkn = $2.(*ast.ExprBrackets).CloseParenthesisTkn } $$ = exit @@ -3916,10 +3916,10 @@ exit_expr: } | '(' ')' { - $$ = &ast.ParserBrackets{ + $$ = &ast.ExprBrackets{ Position: yylex.(*Parser).builder.NewTokensPosition($1, $2), - OpenBracketTkn: $1, - CloseBracketTkn: $2, + OpenParenthesisTkn: $1, + CloseParenthesisTkn: $2, } } | parenthesis_expr @@ -4464,11 +4464,11 @@ static_operation: } | '(' static_scalar_value ')' { - $$ = &ast.ParserBrackets{ + $$ = &ast.ExprBrackets{ Position: yylex.(*Parser).builder.NewTokensPosition($1, $3), - OpenBracketTkn: $1, - Child: $2, - CloseBracketTkn: $3, + OpenParenthesisTkn: $1, + Expr: $2, + CloseParenthesisTkn: $3, } } ; @@ -4662,20 +4662,20 @@ expr: parenthesis_expr: '(' expr ')' { - $$ = &ast.ParserBrackets{ + $$ = &ast.ExprBrackets{ Position: yylex.(*Parser).builder.NewTokensPosition($1, $3), - OpenBracketTkn: $1, - Child: $2, - CloseBracketTkn: $3, + OpenParenthesisTkn: $1, + Expr: $2, + CloseParenthesisTkn: $3, } } | '(' yield_expr ')' { - $$ = &ast.ParserBrackets{ + $$ = &ast.ExprBrackets{ Position: yylex.(*Parser).builder.NewTokensPosition($1, $3), - OpenBracketTkn: $1, - Child: $2, - CloseBracketTkn: $3, + OpenParenthesisTkn: $1, + Expr: $2, + CloseParenthesisTkn: $3, } } ; diff --git a/internal/php7/parser_test.go b/internal/php7/parser_test.go index b2bf948..4957b16 100644 --- a/internal/php7/parser_test.go +++ b/internal/php7/parser_test.go @@ -13048,14 +13048,14 @@ func TestStmtContinue(t *testing.T) { }, }, }, - Expr: &ast.ParserBrackets{ + Expr: &ast.ExprBrackets{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 23, EndPos: 26, }, - OpenBracketTkn: &token.Token{ + OpenParenthesisTkn: &token.Token{ ID: token.ID(40), Value: []byte("("), Position: &position.Position{ @@ -13065,7 +13065,7 @@ func TestStmtContinue(t *testing.T) { EndPos: 24, }, }, - Child: &ast.ScalarLnumber{ + Expr: &ast.ScalarLnumber{ Position: &position.Position{ StartLine: 1, EndLine: 1, @@ -13084,7 +13084,7 @@ func TestStmtContinue(t *testing.T) { }, Value: []byte("3"), }, - CloseBracketTkn: &token.Token{ + CloseParenthesisTkn: &token.Token{ ID: token.ID(41), Value: []byte(")"), Position: &position.Position{ @@ -14133,14 +14133,14 @@ func TestStmtEcho_Parenthesis(t *testing.T) { }, }, Exprs: []ast.Vertex{ - &ast.ParserBrackets{ + &ast.ExprBrackets{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 7, EndPos: 11, }, - OpenBracketTkn: &token.Token{ + OpenParenthesisTkn: &token.Token{ ID: token.ID(40), Value: []byte("("), Position: &position.Position{ @@ -14150,7 +14150,7 @@ func TestStmtEcho_Parenthesis(t *testing.T) { EndPos: 8, }, }, - Child: &ast.ExprVariable{ + Expr: &ast.ExprVariable{ Position: &position.Position{ StartLine: 1, EndLine: 1, @@ -14177,7 +14177,7 @@ func TestStmtEcho_Parenthesis(t *testing.T) { Value: []byte("$a"), }, }, - CloseBracketTkn: &token.Token{ + CloseParenthesisTkn: &token.Token{ ID: token.ID(41), Value: []byte(")"), Position: &position.Position{ @@ -33925,14 +33925,14 @@ func TestStmtBreak(t *testing.T) { }, }, }, - Expr: &ast.ParserBrackets{ + Expr: &ast.ExprBrackets{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 20, EndPos: 23, }, - OpenBracketTkn: &token.Token{ + OpenParenthesisTkn: &token.Token{ ID: token.ID(40), Value: []byte("("), Position: &position.Position{ @@ -33942,7 +33942,7 @@ func TestStmtBreak(t *testing.T) { EndPos: 21, }, }, - Child: &ast.ScalarLnumber{ + Expr: &ast.ScalarLnumber{ Position: &position.Position{ StartLine: 1, EndLine: 1, @@ -33961,7 +33961,7 @@ func TestStmtBreak(t *testing.T) { }, Value: []byte("3"), }, - CloseBracketTkn: &token.Token{ + CloseParenthesisTkn: &token.Token{ ID: token.ID(41), Value: []byte(")"), Position: &position.Position{ @@ -35900,14 +35900,14 @@ func TestExprClone_Brackets(t *testing.T) { }, }, }, - Expr: &ast.ParserBrackets{ + Expr: &ast.ExprBrackets{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 8, EndPos: 12, }, - OpenBracketTkn: &token.Token{ + OpenParenthesisTkn: &token.Token{ ID: token.ID(40), Value: []byte("("), Position: &position.Position{ @@ -35917,7 +35917,7 @@ func TestExprClone_Brackets(t *testing.T) { EndPos: 9, }, }, - Child: &ast.ExprVariable{ + Expr: &ast.ExprVariable{ Position: &position.Position{ StartLine: 1, EndLine: 1, @@ -35944,7 +35944,7 @@ func TestExprClone_Brackets(t *testing.T) { Value: []byte("$a"), }, }, - CloseBracketTkn: &token.Token{ + CloseParenthesisTkn: &token.Token{ ID: token.ID(41), Value: []byte(")"), Position: &position.Position{ @@ -43295,14 +43295,14 @@ func TestExprPrint(t *testing.T) { }, }, }, - Expr: &ast.ParserBrackets{ + Expr: &ast.ExprBrackets{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 8, EndPos: 12, }, - OpenBracketTkn: &token.Token{ + OpenParenthesisTkn: &token.Token{ ID: token.ID(40), Value: []byte("("), Position: &position.Position{ @@ -43312,7 +43312,7 @@ func TestExprPrint(t *testing.T) { EndPos: 9, }, }, - Child: &ast.ExprVariable{ + Expr: &ast.ExprVariable{ Position: &position.Position{ StartLine: 1, EndLine: 1, @@ -43339,7 +43339,7 @@ func TestExprPrint(t *testing.T) { Value: []byte("$a"), }, }, - CloseBracketTkn: &token.Token{ + CloseParenthesisTkn: &token.Token{ ID: token.ID(41), Value: []byte(")"), Position: &position.Position{ diff --git a/internal/php7/php7.go b/internal/php7/php7.go index 72e8ddc19ce3bc761f1a6662688f62ada9d60d6c..5e50fcea36c20a722094407fb3ee0e93ff883c89 100644 GIT binary patch delta 335 zcmbQYi}(62-i8*&Ell6%Oq;^QIz7>jS$6vQCyc7oKNvDuPLKS@s4+cY8x!C3x^QNJ z=>`9pgr+YDXO^6<|DH*5`{%h#*ZE{!D+-F7iV~BvQ%j09_52G`^8yl!Qu9hOQj0T- zr$1f8q%DoA1jOUw1cKCx%#!H`IvEwF`>kc-<3Uz6y|I{4bo%B?Oyb)ot!4VJMY`j9 aZ!%q0B2}Bz_SnBn;f$nf+xVX;Hx>XcZGR#F delta 248 zcmcb{8^Sf}eBVN{-ODbF0WopB!1 zb-w8n_As(>Iu#`*XQ!4FYffKyj!9(t-!)9iU