@ ProgramNode (location: (1,0)-(105,3))
├── locals: []
└── statements:
    @ StatementsNode (location: (1,0)-(105,3))
    └── body: (length: 36)
        ├── @ DefNode (location: (1,0)-(2,3))
        │   ├── name: :!
        │   ├── name_loc: (1,4)-(1,5) = "!"
        │   ├── receiver: ∅
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (1,0)-(1,3) = "def"
        │   ├── operator_loc: ∅
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (2,0)-(2,3) = "end"
        ├── @ DefNode (location: (4,0)-(5,3))
        │   ├── name: :!=
        │   ├── name_loc: (4,4)-(4,6) = "!="
        │   ├── receiver: ∅
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (4,0)-(4,3) = "def"
        │   ├── operator_loc: ∅
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (5,0)-(5,3) = "end"
        ├── @ DefNode (location: (7,0)-(8,3))
        │   ├── name: :!~
        │   ├── name_loc: (7,4)-(7,6) = "!~"
        │   ├── receiver: ∅
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (7,0)-(7,3) = "def"
        │   ├── operator_loc: ∅
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (8,0)-(8,3) = "end"
        ├── @ DefNode (location: (10,0)-(11,3))
        │   ├── name: :%
        │   ├── name_loc: (10,4)-(10,5) = "%"
        │   ├── receiver: ∅
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (10,0)-(10,3) = "def"
        │   ├── operator_loc: ∅
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (11,0)-(11,3) = "end"
        ├── @ DefNode (location: (13,0)-(14,3))
        │   ├── name: :+
        │   ├── name_loc: (13,9)-(13,10) = "+"
        │   ├── receiver:
        │   │   @ SelfNode (location: (13,4)-(13,8))
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (13,0)-(13,3) = "def"
        │   ├── operator_loc: (13,8)-(13,9) = "."
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (14,0)-(14,3) = "end"
        ├── @ DefNode (location: (16,0)-(17,3))
        │   ├── name: :&
        │   ├── name_loc: (16,4)-(16,5) = "&"
        │   ├── receiver: ∅
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (16,0)-(16,3) = "def"
        │   ├── operator_loc: ∅
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (17,0)-(17,3) = "end"
        ├── @ DefNode (location: (19,0)-(20,3))
        │   ├── name: :*
        │   ├── name_loc: (19,4)-(19,5) = "*"
        │   ├── receiver: ∅
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (19,0)-(19,3) = "def"
        │   ├── operator_loc: ∅
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (20,0)-(20,3) = "end"
        ├── @ DefNode (location: (22,0)-(23,3))
        │   ├── name: :**
        │   ├── name_loc: (22,4)-(22,6) = "**"
        │   ├── receiver: ∅
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (22,0)-(22,3) = "def"
        │   ├── operator_loc: ∅
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (23,0)-(23,3) = "end"
        ├── @ StringNode (location: (25,0)-(25,6))
        │   ├── flags: ∅
        │   ├── opening_loc: (25,0)-(25,2) = "%|"
        │   ├── content_loc: (25,2)-(25,5) = "abc"
        │   ├── closing_loc: (25,5)-(25,6) = "|"
        │   └── unescaped: "abc"
        ├── @ DefNode (location: (27,0)-(28,3))
        │   ├── name: :+
        │   ├── name_loc: (27,4)-(27,5) = "+"
        │   ├── receiver: ∅
        │   ├── parameters:
        │   │   @ ParametersNode (location: (27,6)-(27,9))
        │   │   ├── requireds: (length: 0)
        │   │   ├── optionals: (length: 0)
        │   │   ├── rest: ∅
        │   │   ├── posts: (length: 0)
        │   │   ├── keywords: (length: 0)
        │   │   ├── keyword_rest:
        │   │   │   @ KeywordRestParameterNode (location: (27,6)-(27,9))
        │   │   │   ├── name: :b
        │   │   │   ├── name_loc: (27,8)-(27,9) = "b"
        │   │   │   └── operator_loc: (27,6)-(27,8) = "**"
        │   │   └── block: ∅
        │   ├── body: ∅
        │   ├── locals: [:b]
        │   ├── locals_body_index: 1
        │   ├── def_keyword_loc: (27,0)-(27,3) = "def"
        │   ├── operator_loc: ∅
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (28,0)-(28,3) = "end"
        ├── @ DefNode (location: (30,0)-(31,3))
        │   ├── name: :+
        │   ├── name_loc: (30,4)-(30,5) = "+"
        │   ├── receiver: ∅
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (30,0)-(30,3) = "def"
        │   ├── operator_loc: ∅
        │   ├── lparen_loc: (30,5)-(30,6) = "("
        │   ├── rparen_loc: (30,6)-(30,7) = ")"
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (31,0)-(31,3) = "end"
        ├── @ DefNode (location: (33,0)-(34,3))
        │   ├── name: :+
        │   ├── name_loc: (33,4)-(33,5) = "+"
        │   ├── receiver: ∅
        │   ├── parameters:
        │   │   @ ParametersNode (location: (33,6)-(33,7))
        │   │   ├── requireds: (length: 1)
        │   │   │   └── @ RequiredParameterNode (location: (33,6)-(33,7))
        │   │   │       └── name: :b
        │   │   ├── optionals: (length: 0)
        │   │   ├── rest: ∅
        │   │   ├── posts: (length: 0)
        │   │   ├── keywords: (length: 0)
        │   │   ├── keyword_rest: ∅
        │   │   └── block: ∅
        │   ├── body: ∅
        │   ├── locals: [:b]
        │   ├── locals_body_index: 1
        │   ├── def_keyword_loc: (33,0)-(33,3) = "def"
        │   ├── operator_loc: ∅
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (34,0)-(34,3) = "end"
        ├── @ DefNode (location: (36,0)-(37,3))
        │   ├── name: :+
        │   ├── name_loc: (36,9)-(36,10) = "+"
        │   ├── receiver:
        │   │   @ SelfNode (location: (36,4)-(36,8))
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (36,0)-(36,3) = "def"
        │   ├── operator_loc: (36,8)-(36,9) = "."
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (37,0)-(37,3) = "end"
        ├── @ DefNode (location: (39,0)-(40,3))
        │   ├── name: :+
        │   ├── name_loc: (39,4)-(39,5) = "+"
        │   ├── receiver: ∅
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (39,0)-(39,3) = "def"
        │   ├── operator_loc: ∅
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (40,0)-(40,3) = "end"
        ├── @ DefNode (location: (42,0)-(43,3))
        │   ├── name: :+@
        │   ├── name_loc: (42,4)-(42,6) = "+@"
        │   ├── receiver: ∅
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (42,0)-(42,3) = "def"
        │   ├── operator_loc: ∅
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (43,0)-(43,3) = "end"
        ├── @ DefNode (location: (45,0)-(46,3))
        │   ├── name: :-
        │   ├── name_loc: (45,4)-(45,5) = "-"
        │   ├── receiver: ∅
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (45,0)-(45,3) = "def"
        │   ├── operator_loc: ∅
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (46,0)-(46,3) = "end"
        ├── @ DefNode (location: (48,0)-(48,11))
        │   ├── name: :-
        │   ├── name_loc: (48,6)-(48,7) = "-"
        │   ├── receiver:
        │   │   @ CallNode (location: (48,4)-(48,5))
        │   │   ├── flags: variable_call
        │   │   ├── receiver: ∅
        │   │   ├── call_operator_loc: ∅
        │   │   ├── name: :a
        │   │   ├── message_loc: (48,4)-(48,5) = "a"
        │   │   ├── opening_loc: ∅
        │   │   ├── arguments: ∅
        │   │   ├── closing_loc: ∅
        │   │   └── block: ∅
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (48,0)-(48,3) = "def"
        │   ├── operator_loc: (48,5)-(48,6) = "."
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (48,8)-(48,11) = "end"
        ├── @ DefNode (location: (50,0)-(51,3))
        │   ├── name: :-@
        │   ├── name_loc: (50,4)-(50,6) = "-@"
        │   ├── receiver: ∅
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (50,0)-(50,3) = "def"
        │   ├── operator_loc: ∅
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (51,0)-(51,3) = "end"
        ├── @ DefNode (location: (53,0)-(54,3))
        │   ├── name: :/
        │   ├── name_loc: (53,4)-(53,5) = "/"
        │   ├── receiver: ∅
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (53,0)-(53,3) = "def"
        │   ├── operator_loc: ∅
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (54,0)-(54,3) = "end"
        ├── @ DefNode (location: (56,0)-(57,3))
        │   ├── name: :<
        │   ├── name_loc: (56,4)-(56,5) = "<"
        │   ├── receiver: ∅
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (56,0)-(56,3) = "def"
        │   ├── operator_loc: ∅
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (57,0)-(57,3) = "end"
        ├── @ DefNode (location: (59,0)-(60,3))
        │   ├── name: :<<
        │   ├── name_loc: (59,4)-(59,6) = "<<"
        │   ├── receiver: ∅
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (59,0)-(59,3) = "def"
        │   ├── operator_loc: ∅
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (60,0)-(60,3) = "end"
        ├── @ DefNode (location: (62,0)-(63,3))
        │   ├── name: :<=
        │   ├── name_loc: (62,4)-(62,6) = "<="
        │   ├── receiver: ∅
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (62,0)-(62,3) = "def"
        │   ├── operator_loc: ∅
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (63,0)-(63,3) = "end"
        ├── @ DefNode (location: (65,0)-(66,3))
        │   ├── name: :<=>
        │   ├── name_loc: (65,4)-(65,7) = "<=>"
        │   ├── receiver: ∅
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (65,0)-(65,3) = "def"
        │   ├── operator_loc: ∅
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (66,0)-(66,3) = "end"
        ├── @ DefNode (location: (68,0)-(69,3))
        │   ├── name: :==
        │   ├── name_loc: (68,4)-(68,6) = "=="
        │   ├── receiver: ∅
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (68,0)-(68,3) = "def"
        │   ├── operator_loc: ∅
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (69,0)-(69,3) = "end"
        ├── @ DefNode (location: (71,0)-(72,3))
        │   ├── name: :===
        │   ├── name_loc: (71,4)-(71,7) = "==="
        │   ├── receiver: ∅
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (71,0)-(71,3) = "def"
        │   ├── operator_loc: ∅
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (72,0)-(72,3) = "end"
        ├── @ DefNode (location: (74,0)-(75,3))
        │   ├── name: :=~
        │   ├── name_loc: (74,4)-(74,6) = "=~"
        │   ├── receiver: ∅
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (74,0)-(74,3) = "def"
        │   ├── operator_loc: ∅
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (75,0)-(75,3) = "end"
        ├── @ DefNode (location: (77,0)-(78,3))
        │   ├── name: :>
        │   ├── name_loc: (77,4)-(77,5) = ">"
        │   ├── receiver: ∅
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (77,0)-(77,3) = "def"
        │   ├── operator_loc: ∅
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (78,0)-(78,3) = "end"
        ├── @ DefNode (location: (80,0)-(81,3))
        │   ├── name: :>=
        │   ├── name_loc: (80,4)-(80,6) = ">="
        │   ├── receiver: ∅
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (80,0)-(80,3) = "def"
        │   ├── operator_loc: ∅
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (81,0)-(81,3) = "end"
        ├── @ DefNode (location: (83,0)-(84,3))
        │   ├── name: :>>
        │   ├── name_loc: (83,4)-(83,6) = ">>"
        │   ├── receiver: ∅
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (83,0)-(83,3) = "def"
        │   ├── operator_loc: ∅
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (84,0)-(84,3) = "end"
        ├── @ DefNode (location: (86,0)-(87,3))
        │   ├── name: :[]
        │   ├── name_loc: (86,4)-(86,6) = "[]"
        │   ├── receiver: ∅
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (86,0)-(86,3) = "def"
        │   ├── operator_loc: ∅
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (87,0)-(87,3) = "end"
        ├── @ DefNode (location: (89,0)-(90,3))
        │   ├── name: :[]=
        │   ├── name_loc: (89,4)-(89,7) = "[]="
        │   ├── receiver: ∅
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (89,0)-(89,3) = "def"
        │   ├── operator_loc: ∅
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (90,0)-(90,3) = "end"
        ├── @ DefNode (location: (92,0)-(93,3))
        │   ├── name: :^
        │   ├── name_loc: (92,4)-(92,5) = "^"
        │   ├── receiver: ∅
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (92,0)-(92,3) = "def"
        │   ├── operator_loc: ∅
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (93,0)-(93,3) = "end"
        ├── @ DefNode (location: (95,0)-(96,3))
        │   ├── name: :`
        │   ├── name_loc: (95,4)-(95,5) = "`"
        │   ├── receiver: ∅
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (95,0)-(95,3) = "def"
        │   ├── operator_loc: ∅
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (96,0)-(96,3) = "end"
        ├── @ DefNode (location: (98,0)-(99,3))
        │   ├── name: :`
        │   ├── name_loc: (98,9)-(98,10) = "`"
        │   ├── receiver:
        │   │   @ SelfNode (location: (98,4)-(98,8))
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (98,0)-(98,3) = "def"
        │   ├── operator_loc: (98,8)-(98,9) = "."
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (99,0)-(99,3) = "end"
        ├── @ DefNode (location: (101,0)-(102,3))
        │   ├── name: :|
        │   ├── name_loc: (101,4)-(101,5) = "|"
        │   ├── receiver: ∅
        │   ├── parameters: ∅
        │   ├── body: ∅
        │   ├── locals: []
        │   ├── locals_body_index: 0
        │   ├── def_keyword_loc: (101,0)-(101,3) = "def"
        │   ├── operator_loc: ∅
        │   ├── lparen_loc: ∅
        │   ├── rparen_loc: ∅
        │   ├── equal_loc: ∅
        │   └── end_keyword_loc: (102,0)-(102,3) = "end"
        └── @ DefNode (location: (104,0)-(105,3))
            ├── name: :~
            ├── name_loc: (104,4)-(104,5) = "~"
            ├── receiver: ∅
            ├── parameters: ∅
            ├── body: ∅
            ├── locals: []
            ├── locals_body_index: 0
            ├── def_keyword_loc: (104,0)-(104,3) = "def"
            ├── operator_loc: ∅
            ├── lparen_loc: ∅
            ├── rparen_loc: ∅
            ├── equal_loc: ∅
            └── end_keyword_loc: (105,0)-(105,3) = "end"
