git.delta.rocks / jrsonnet / refs/commits / 3248f25fe079

difftreelog

refactor support new jrsonnet features in rowan parser

Yaroslav Bolyukin2023-09-11parent: #a7bbbb4.patch.diff
in: master

43 files changed

modifiedcrates/jrsonnet-rowan-parser/jsonnet.ungramdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/jsonnet.ungram
+++ b/crates/jrsonnet-rowan-parser/jsonnet.ungram
@@ -5,32 +5,47 @@
 
 SourceFile = Expr
 
-ExprBinary =
-    lhs:LhsExpr
-    BinaryOperator
-    rhs:Expr
-ExprUnary =
-    UnaryOperator
-    rhs:Expr
-ExprSlice =
-    Expr
-    SliceDesc
-ExprIndex =
-    Expr
+SuffixIndex =
+    '?'?
     '.'
     index:Name
-ExprIndexExpr =
-    base:LhsExpr
+SuffixIndexExpr =
+    ('?' '.')?
     '['
     index:Expr
     ']'
-ExprApply =
-    Expr
+SuffixSlice =
+    SliceDesc
+SuffixApply =
     ArgsDesc
     'tailstrict'?
+Suffix =
+    SuffixIndex
+|   SuffixIndexExpr
+|   SuffixSlice
+|   SuffixApply
+
+StmtLocal =
+    'local'
+    (Bind (',' Bind)* ','?)
+    ';'
+StmtAssert =
+    Assertion
+    ';'
+Stmt =
+    StmtLocal
+|   StmtAssert
+
+ExprBinary =
+    lhs:Expr
+    BinaryOperator
+    rhs:Expr
+ExprUnary =
+    UnaryOperator
+    rhs:Expr
 ExprObjExtend =
-    LhsExpr
     Expr
+    Expr
 ExprParened =
     '('
     Expr
@@ -79,29 +94,18 @@
     ParamsDesc
     ')'
     Expr
-ExprAssert =
-    Assertion
-    ';'
-    Expr
 ExprError =
     'error'
     Expr
 
-StmtLocal =
-    'local'
-    (Bind (',' Bind)* ','?)
-    ';'
-
 Expr =
-    StmtLocal*
+    Stmt*
     ExprBase
+    Suffix*
+
 ExprBase =
     ExprBinary
 |   ExprUnary
-|   ExprSlice
-|   ExprIndex
-|   ExprIndexExpr
-|   ExprApply
 |   ExprObjExtend
 |   ExprParened
 |   ExprString
@@ -114,11 +118,10 @@
 |   ExprVar
 |   ExprIfThenElse
 |   ExprFunction
-|   ExprAssert
 |   ExprError
 
 BinaryOperator =
-    '||' | '&&'
+    '||' | '??' | '&&'
 |   '|' | '^' | '&'
 |   '==' | '!=' | '<' | '>' | '<=' | '>=' | 'in'
 |   '<<' | '>>'
@@ -242,7 +245,7 @@
 
 ForSpec =
     'for'
-    bind:Name
+    bind:Destruct
     'in'
     Expr
 IfSpec =
@@ -278,7 +281,7 @@
 
 Assertion =
     'assert'
-    condition:LhsExpr
+    condition:Expr
     (
         ':'
         message:Expr
@@ -336,7 +339,6 @@
 // Aliases used to resolve node type conflicts
 TrueExpr=Expr
 FalseExpr=Expr
-LhsExpr=Expr
 
 // Trivia - tokens which will be implicitly skipped for parser
 Trivia =
modifiedcrates/jrsonnet-rowan-parser/src/generated/nodes.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/generated/nodes.rs
+++ b/crates/jrsonnet-rowan-parser/src/generated/nodes.rs
@@ -23,61 +23,70 @@
 	pub(crate) syntax: SyntaxNode,
 }
 impl Expr {
-	pub fn stmt_locals(&self) -> AstChildren<StmtLocal> {
+	pub fn stmts(&self) -> AstChildren<Stmt> {
 		support::children(&self.syntax)
 	}
 	pub fn expr_base(&self) -> Option<ExprBase> {
 		support::child(&self.syntax)
 	}
+	pub fn suffixs(&self) -> AstChildren<Suffix> {
+		support::children(&self.syntax)
+	}
 }
 
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct ExprBinary {
+pub struct SuffixIndex {
 	pub(crate) syntax: SyntaxNode,
 }
-impl ExprBinary {
-	pub fn lhs(&self) -> Option<LhsExpr> {
-		support::child(&self.syntax)
+impl SuffixIndex {
+	pub fn question_mark_token(&self) -> Option<SyntaxToken> {
+		support::token(&self.syntax, T![?])
 	}
-	pub fn binary_operator(&self) -> Option<BinaryOperator> {
-		support::token_child(&self.syntax)
+	pub fn dot_token(&self) -> Option<SyntaxToken> {
+		support::token(&self.syntax, T![.])
 	}
-	pub fn rhs(&self) -> Option<Expr> {
+	pub fn index(&self) -> Option<Name> {
 		support::child(&self.syntax)
 	}
 }
 
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct LhsExpr {
+pub struct Name {
 	pub(crate) syntax: SyntaxNode,
 }
-impl LhsExpr {
-	pub fn expr(&self) -> Option<Expr> {
-		support::child(&self.syntax)
+impl Name {
+	pub fn ident_lit(&self) -> Option<SyntaxToken> {
+		support::token(&self.syntax, IDENT)
 	}
 }
 
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct ExprUnary {
+pub struct SuffixIndexExpr {
 	pub(crate) syntax: SyntaxNode,
 }
-impl ExprUnary {
-	pub fn unary_operator(&self) -> Option<UnaryOperator> {
-		support::token_child(&self.syntax)
+impl SuffixIndexExpr {
+	pub fn question_mark_token(&self) -> Option<SyntaxToken> {
+		support::token(&self.syntax, T![?])
 	}
-	pub fn rhs(&self) -> Option<Expr> {
+	pub fn dot_token(&self) -> Option<SyntaxToken> {
+		support::token(&self.syntax, T![.])
+	}
+	pub fn l_brack_token(&self) -> Option<SyntaxToken> {
+		support::token(&self.syntax, T!['['])
+	}
+	pub fn index(&self) -> Option<Expr> {
 		support::child(&self.syntax)
 	}
+	pub fn r_brack_token(&self) -> Option<SyntaxToken> {
+		support::token(&self.syntax, T![']'])
+	}
 }
 
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct ExprSlice {
+pub struct SuffixSlice {
 	pub(crate) syntax: SyntaxNode,
 }
-impl ExprSlice {
-	pub fn expr(&self) -> Option<Expr> {
-		support::child(&self.syntax)
-	}
+impl SuffixSlice {
 	pub fn slice_desc(&self) -> Option<SliceDesc> {
 		support::child(&self.syntax)
 	}
@@ -109,79 +118,108 @@
 }
 
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct ExprIndex {
+pub struct SuffixApply {
 	pub(crate) syntax: SyntaxNode,
 }
-impl ExprIndex {
-	pub fn expr(&self) -> Option<Expr> {
+impl SuffixApply {
+	pub fn args_desc(&self) -> Option<ArgsDesc> {
 		support::child(&self.syntax)
 	}
-	pub fn dot_token(&self) -> Option<SyntaxToken> {
-		support::token(&self.syntax, T![.])
+	pub fn tailstrict_kw_token(&self) -> Option<SyntaxToken> {
+		support::token(&self.syntax, T![tailstrict])
+	}
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub struct ArgsDesc {
+	pub(crate) syntax: SyntaxNode,
+}
+impl ArgsDesc {
+	pub fn l_paren_token(&self) -> Option<SyntaxToken> {
+		support::token(&self.syntax, T!['('])
+	}
+	pub fn args(&self) -> AstChildren<Arg> {
+		support::children(&self.syntax)
 	}
-	pub fn index(&self) -> Option<Name> {
-		support::child(&self.syntax)
+	pub fn r_paren_token(&self) -> Option<SyntaxToken> {
+		support::token(&self.syntax, T![')'])
 	}
 }
 
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct Name {
+pub struct StmtLocal {
 	pub(crate) syntax: SyntaxNode,
 }
-impl Name {
-	pub fn ident_lit(&self) -> Option<SyntaxToken> {
-		support::token(&self.syntax, IDENT)
+impl StmtLocal {
+	pub fn local_kw_token(&self) -> Option<SyntaxToken> {
+		support::token(&self.syntax, T![local])
+	}
+	pub fn binds(&self) -> AstChildren<Bind> {
+		support::children(&self.syntax)
+	}
+	pub fn semi_token(&self) -> Option<SyntaxToken> {
+		support::token(&self.syntax, T![;])
 	}
 }
 
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct ExprIndexExpr {
+pub struct StmtAssert {
 	pub(crate) syntax: SyntaxNode,
 }
-impl ExprIndexExpr {
-	pub fn base(&self) -> Option<LhsExpr> {
+impl StmtAssert {
+	pub fn assertion(&self) -> Option<Assertion> {
 		support::child(&self.syntax)
 	}
-	pub fn l_brack_token(&self) -> Option<SyntaxToken> {
-		support::token(&self.syntax, T!['['])
+	pub fn semi_token(&self) -> Option<SyntaxToken> {
+		support::token(&self.syntax, T![;])
 	}
-	pub fn index(&self) -> Option<Expr> {
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub struct Assertion {
+	pub(crate) syntax: SyntaxNode,
+}
+impl Assertion {
+	pub fn assert_kw_token(&self) -> Option<SyntaxToken> {
+		support::token(&self.syntax, T![assert])
+	}
+	pub fn condition(&self) -> Option<Expr> {
 		support::child(&self.syntax)
 	}
-	pub fn r_brack_token(&self) -> Option<SyntaxToken> {
-		support::token(&self.syntax, T![']'])
+	pub fn colon_token(&self) -> Option<SyntaxToken> {
+		support::token(&self.syntax, T![:])
+	}
+	pub fn message(&self) -> Option<Expr> {
+		support::child(&self.syntax)
 	}
 }
 
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct ExprApply {
+pub struct ExprBinary {
 	pub(crate) syntax: SyntaxNode,
 }
-impl ExprApply {
-	pub fn expr(&self) -> Option<Expr> {
+impl ExprBinary {
+	pub fn lhs(&self) -> Option<Expr> {
 		support::child(&self.syntax)
 	}
-	pub fn args_desc(&self) -> Option<ArgsDesc> {
-		support::child(&self.syntax)
+	pub fn binary_operator(&self) -> Option<BinaryOperator> {
+		support::token_child(&self.syntax)
 	}
-	pub fn tailstrict_kw_token(&self) -> Option<SyntaxToken> {
-		support::token(&self.syntax, T![tailstrict])
+	pub fn rhs(&self) -> Option<Expr> {
+		support::child(&self.syntax)
 	}
 }
 
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct ArgsDesc {
+pub struct ExprUnary {
 	pub(crate) syntax: SyntaxNode,
 }
-impl ArgsDesc {
-	pub fn l_paren_token(&self) -> Option<SyntaxToken> {
-		support::token(&self.syntax, T!['('])
-	}
-	pub fn args(&self) -> AstChildren<Arg> {
-		support::children(&self.syntax)
+impl ExprUnary {
+	pub fn unary_operator(&self) -> Option<UnaryOperator> {
+		support::token_child(&self.syntax)
 	}
-	pub fn r_paren_token(&self) -> Option<SyntaxToken> {
-		support::token(&self.syntax, T![')'])
+	pub fn rhs(&self) -> Option<Expr> {
+		support::child(&self.syntax)
 	}
 }
 
@@ -190,9 +228,6 @@
 	pub(crate) syntax: SyntaxNode,
 }
 impl ExprObjExtend {
-	pub fn lhs_expr(&self) -> Option<LhsExpr> {
-		support::child(&self.syntax)
-	}
 	pub fn expr(&self) -> Option<Expr> {
 		support::child(&self.syntax)
 	}
@@ -395,45 +430,10 @@
 	}
 	pub fn r_paren_token(&self) -> Option<SyntaxToken> {
 		support::token(&self.syntax, T![')'])
-	}
-}
-
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct ExprAssert {
-	pub(crate) syntax: SyntaxNode,
-}
-impl ExprAssert {
-	pub fn assertion(&self) -> Option<Assertion> {
-		support::child(&self.syntax)
-	}
-	pub fn semi_token(&self) -> Option<SyntaxToken> {
-		support::token(&self.syntax, T![;])
-	}
-	pub fn expr(&self) -> Option<Expr> {
-		support::child(&self.syntax)
 	}
 }
 
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct Assertion {
-	pub(crate) syntax: SyntaxNode,
-}
-impl Assertion {
-	pub fn assert_kw_token(&self) -> Option<SyntaxToken> {
-		support::token(&self.syntax, T![assert])
-	}
-	pub fn condition(&self) -> Option<LhsExpr> {
-		support::child(&self.syntax)
-	}
-	pub fn colon_token(&self) -> Option<SyntaxToken> {
-		support::token(&self.syntax, T![:])
-	}
-	pub fn message(&self) -> Option<Expr> {
-		support::child(&self.syntax)
-	}
-}
-
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub struct ExprError {
 	pub(crate) syntax: SyntaxNode,
 }
@@ -447,22 +447,6 @@
 }
 
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct StmtLocal {
-	pub(crate) syntax: SyntaxNode,
-}
-impl StmtLocal {
-	pub fn local_kw_token(&self) -> Option<SyntaxToken> {
-		support::token(&self.syntax, T![local])
-	}
-	pub fn binds(&self) -> AstChildren<Bind> {
-		support::children(&self.syntax)
-	}
-	pub fn semi_token(&self) -> Option<SyntaxToken> {
-		support::token(&self.syntax, T![;])
-	}
-}
-
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub struct SliceDescEnd {
 	pub(crate) syntax: SyntaxNode,
 }
@@ -641,7 +625,7 @@
 	pub fn for_kw_token(&self) -> Option<SyntaxToken> {
 		support::token(&self.syntax, T![for])
 	}
-	pub fn bind(&self) -> Option<Name> {
+	pub fn bind(&self) -> Option<Destruct> {
 		support::child(&self.syntax)
 	}
 	pub fn in_kw_token(&self) -> Option<SyntaxToken> {
@@ -820,6 +804,26 @@
 }
 
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub enum Suffix {
+	SuffixIndex(SuffixIndex),
+	SuffixIndexExpr(SuffixIndexExpr),
+	SuffixSlice(SuffixSlice),
+	SuffixApply(SuffixApply),
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub enum Bind {
+	BindDestruct(BindDestruct),
+	BindFunction(BindFunction),
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub enum Stmt {
+	StmtLocal(StmtLocal),
+	StmtAssert(StmtAssert),
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub enum ObjBody {
 	ObjBodyComp(ObjBodyComp),
 	ObjBodyMemberList(ObjBodyMemberList),
@@ -829,22 +833,12 @@
 pub enum CompSpec {
 	ForSpec(ForSpec),
 	IfSpec(IfSpec),
-}
-
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub enum Bind {
-	BindDestruct(BindDestruct),
-	BindFunction(BindFunction),
 }
 
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub enum ExprBase {
 	ExprBinary(ExprBinary),
 	ExprUnary(ExprUnary),
-	ExprSlice(ExprSlice),
-	ExprIndex(ExprIndex),
-	ExprIndexExpr(ExprIndexExpr),
-	ExprApply(ExprApply),
 	ExprObjExtend(ExprObjExtend),
 	ExprParened(ExprParened),
 	ExprString(ExprString),
@@ -857,7 +851,6 @@
 	ExprVar(ExprVar),
 	ExprIfThenElse(ExprIfThenElse),
 	ExprFunction(ExprFunction),
-	ExprAssert(ExprAssert),
 	ExprError(ExprError),
 }
 
@@ -905,6 +898,7 @@
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
 pub enum BinaryOperatorKind {
 	Or,
+	NullCoaelse,
 	And,
 	BitOr,
 	BitXor,
@@ -1078,9 +1072,9 @@
 		&self.syntax
 	}
 }
-impl AstNode for ExprBinary {
+impl AstNode for SuffixIndex {
 	fn can_cast(kind: SyntaxKind) -> bool {
-		kind == EXPR_BINARY
+		kind == SUFFIX_INDEX
 	}
 	fn cast(syntax: SyntaxNode) -> Option<Self> {
 		if Self::can_cast(syntax.kind()) {
@@ -1093,9 +1087,9 @@
 		&self.syntax
 	}
 }
-impl AstNode for LhsExpr {
+impl AstNode for Name {
 	fn can_cast(kind: SyntaxKind) -> bool {
-		kind == LHS_EXPR
+		kind == NAME
 	}
 	fn cast(syntax: SyntaxNode) -> Option<Self> {
 		if Self::can_cast(syntax.kind()) {
@@ -1108,9 +1102,9 @@
 		&self.syntax
 	}
 }
-impl AstNode for ExprUnary {
+impl AstNode for SuffixIndexExpr {
 	fn can_cast(kind: SyntaxKind) -> bool {
-		kind == EXPR_UNARY
+		kind == SUFFIX_INDEX_EXPR
 	}
 	fn cast(syntax: SyntaxNode) -> Option<Self> {
 		if Self::can_cast(syntax.kind()) {
@@ -1123,9 +1117,9 @@
 		&self.syntax
 	}
 }
-impl AstNode for ExprSlice {
+impl AstNode for SuffixSlice {
 	fn can_cast(kind: SyntaxKind) -> bool {
-		kind == EXPR_SLICE
+		kind == SUFFIX_SLICE
 	}
 	fn cast(syntax: SyntaxNode) -> Option<Self> {
 		if Self::can_cast(syntax.kind()) {
@@ -1153,9 +1147,9 @@
 		&self.syntax
 	}
 }
-impl AstNode for ExprIndex {
+impl AstNode for SuffixApply {
 	fn can_cast(kind: SyntaxKind) -> bool {
-		kind == EXPR_INDEX
+		kind == SUFFIX_APPLY
 	}
 	fn cast(syntax: SyntaxNode) -> Option<Self> {
 		if Self::can_cast(syntax.kind()) {
@@ -1168,9 +1162,9 @@
 		&self.syntax
 	}
 }
-impl AstNode for Name {
+impl AstNode for ArgsDesc {
 	fn can_cast(kind: SyntaxKind) -> bool {
-		kind == NAME
+		kind == ARGS_DESC
 	}
 	fn cast(syntax: SyntaxNode) -> Option<Self> {
 		if Self::can_cast(syntax.kind()) {
@@ -1183,9 +1177,9 @@
 		&self.syntax
 	}
 }
-impl AstNode for ExprIndexExpr {
+impl AstNode for StmtLocal {
 	fn can_cast(kind: SyntaxKind) -> bool {
-		kind == EXPR_INDEX_EXPR
+		kind == STMT_LOCAL
 	}
 	fn cast(syntax: SyntaxNode) -> Option<Self> {
 		if Self::can_cast(syntax.kind()) {
@@ -1198,9 +1192,39 @@
 		&self.syntax
 	}
 }
-impl AstNode for ExprApply {
+impl AstNode for StmtAssert {
+	fn can_cast(kind: SyntaxKind) -> bool {
+		kind == STMT_ASSERT
+	}
+	fn cast(syntax: SyntaxNode) -> Option<Self> {
+		if Self::can_cast(syntax.kind()) {
+			Some(Self { syntax })
+		} else {
+			None
+		}
+	}
+	fn syntax(&self) -> &SyntaxNode {
+		&self.syntax
+	}
+}
+impl AstNode for Assertion {
+	fn can_cast(kind: SyntaxKind) -> bool {
+		kind == ASSERTION
+	}
+	fn cast(syntax: SyntaxNode) -> Option<Self> {
+		if Self::can_cast(syntax.kind()) {
+			Some(Self { syntax })
+		} else {
+			None
+		}
+	}
+	fn syntax(&self) -> &SyntaxNode {
+		&self.syntax
+	}
+}
+impl AstNode for ExprBinary {
 	fn can_cast(kind: SyntaxKind) -> bool {
-		kind == EXPR_APPLY
+		kind == EXPR_BINARY
 	}
 	fn cast(syntax: SyntaxNode) -> Option<Self> {
 		if Self::can_cast(syntax.kind()) {
@@ -1213,9 +1237,9 @@
 		&self.syntax
 	}
 }
-impl AstNode for ArgsDesc {
+impl AstNode for ExprUnary {
 	fn can_cast(kind: SyntaxKind) -> bool {
-		kind == ARGS_DESC
+		kind == EXPR_UNARY
 	}
 	fn cast(syntax: SyntaxNode) -> Option<Self> {
 		if Self::can_cast(syntax.kind()) {
@@ -1441,21 +1465,6 @@
 impl AstNode for ParamsDesc {
 	fn can_cast(kind: SyntaxKind) -> bool {
 		kind == PARAMS_DESC
-	}
-	fn cast(syntax: SyntaxNode) -> Option<Self> {
-		if Self::can_cast(syntax.kind()) {
-			Some(Self { syntax })
-		} else {
-			None
-		}
-	}
-	fn syntax(&self) -> &SyntaxNode {
-		&self.syntax
-	}
-}
-impl AstNode for ExprAssert {
-	fn can_cast(kind: SyntaxKind) -> bool {
-		kind == EXPR_ASSERT
 	}
 	fn cast(syntax: SyntaxNode) -> Option<Self> {
 		if Self::can_cast(syntax.kind()) {
@@ -1468,21 +1477,6 @@
 		&self.syntax
 	}
 }
-impl AstNode for Assertion {
-	fn can_cast(kind: SyntaxKind) -> bool {
-		kind == ASSERTION
-	}
-	fn cast(syntax: SyntaxNode) -> Option<Self> {
-		if Self::can_cast(syntax.kind()) {
-			Some(Self { syntax })
-		} else {
-			None
-		}
-	}
-	fn syntax(&self) -> &SyntaxNode {
-		&self.syntax
-	}
-}
 impl AstNode for ExprError {
 	fn can_cast(kind: SyntaxKind) -> bool {
 		kind == EXPR_ERROR
@@ -1498,21 +1492,6 @@
 		&self.syntax
 	}
 }
-impl AstNode for StmtLocal {
-	fn can_cast(kind: SyntaxKind) -> bool {
-		kind == STMT_LOCAL
-	}
-	fn cast(syntax: SyntaxNode) -> Option<Self> {
-		if Self::can_cast(syntax.kind()) {
-			Some(Self { syntax })
-		} else {
-			None
-		}
-	}
-	fn syntax(&self) -> &SyntaxNode {
-		&self.syntax
-	}
-}
 impl AstNode for SliceDescEnd {
 	fn can_cast(kind: SyntaxKind) -> bool {
 		kind == SLICE_DESC_END
@@ -1873,6 +1852,116 @@
 		&self.syntax
 	}
 }
+impl From<SuffixIndex> for Suffix {
+	fn from(node: SuffixIndex) -> Suffix {
+		Suffix::SuffixIndex(node)
+	}
+}
+impl From<SuffixIndexExpr> for Suffix {
+	fn from(node: SuffixIndexExpr) -> Suffix {
+		Suffix::SuffixIndexExpr(node)
+	}
+}
+impl From<SuffixSlice> for Suffix {
+	fn from(node: SuffixSlice) -> Suffix {
+		Suffix::SuffixSlice(node)
+	}
+}
+impl From<SuffixApply> for Suffix {
+	fn from(node: SuffixApply) -> Suffix {
+		Suffix::SuffixApply(node)
+	}
+}
+impl AstNode for Suffix {
+	fn can_cast(kind: SyntaxKind) -> bool {
+		match kind {
+			SUFFIX_INDEX | SUFFIX_INDEX_EXPR | SUFFIX_SLICE | SUFFIX_APPLY => true,
+			_ => false,
+		}
+	}
+	fn cast(syntax: SyntaxNode) -> Option<Self> {
+		let res = match syntax.kind() {
+			SUFFIX_INDEX => Suffix::SuffixIndex(SuffixIndex { syntax }),
+			SUFFIX_INDEX_EXPR => Suffix::SuffixIndexExpr(SuffixIndexExpr { syntax }),
+			SUFFIX_SLICE => Suffix::SuffixSlice(SuffixSlice { syntax }),
+			SUFFIX_APPLY => Suffix::SuffixApply(SuffixApply { syntax }),
+			_ => return None,
+		};
+		Some(res)
+	}
+	fn syntax(&self) -> &SyntaxNode {
+		match self {
+			Suffix::SuffixIndex(it) => &it.syntax,
+			Suffix::SuffixIndexExpr(it) => &it.syntax,
+			Suffix::SuffixSlice(it) => &it.syntax,
+			Suffix::SuffixApply(it) => &it.syntax,
+		}
+	}
+}
+impl From<BindDestruct> for Bind {
+	fn from(node: BindDestruct) -> Bind {
+		Bind::BindDestruct(node)
+	}
+}
+impl From<BindFunction> for Bind {
+	fn from(node: BindFunction) -> Bind {
+		Bind::BindFunction(node)
+	}
+}
+impl AstNode for Bind {
+	fn can_cast(kind: SyntaxKind) -> bool {
+		match kind {
+			BIND_DESTRUCT | BIND_FUNCTION => true,
+			_ => false,
+		}
+	}
+	fn cast(syntax: SyntaxNode) -> Option<Self> {
+		let res = match syntax.kind() {
+			BIND_DESTRUCT => Bind::BindDestruct(BindDestruct { syntax }),
+			BIND_FUNCTION => Bind::BindFunction(BindFunction { syntax }),
+			_ => return None,
+		};
+		Some(res)
+	}
+	fn syntax(&self) -> &SyntaxNode {
+		match self {
+			Bind::BindDestruct(it) => &it.syntax,
+			Bind::BindFunction(it) => &it.syntax,
+		}
+	}
+}
+impl From<StmtLocal> for Stmt {
+	fn from(node: StmtLocal) -> Stmt {
+		Stmt::StmtLocal(node)
+	}
+}
+impl From<StmtAssert> for Stmt {
+	fn from(node: StmtAssert) -> Stmt {
+		Stmt::StmtAssert(node)
+	}
+}
+impl AstNode for Stmt {
+	fn can_cast(kind: SyntaxKind) -> bool {
+		match kind {
+			STMT_LOCAL | STMT_ASSERT => true,
+			_ => false,
+		}
+	}
+	fn cast(syntax: SyntaxNode) -> Option<Self> {
+		let res = match syntax.kind() {
+			STMT_LOCAL => Stmt::StmtLocal(StmtLocal { syntax }),
+			STMT_ASSERT => Stmt::StmtAssert(StmtAssert { syntax }),
+			_ => return None,
+		};
+		Some(res)
+	}
+	fn syntax(&self) -> &SyntaxNode {
+		match self {
+			Stmt::StmtLocal(it) => &it.syntax,
+			Stmt::StmtAssert(it) => &it.syntax,
+		}
+	}
+}
 impl From<ObjBodyComp> for ObjBody {
 	fn from(node: ObjBodyComp) -> ObjBody {
 		ObjBody::ObjBodyComp(node)
@@ -1935,40 +2024,8 @@
 			CompSpec::ForSpec(it) => &it.syntax,
 			CompSpec::IfSpec(it) => &it.syntax,
 		}
-	}
-}
-impl From<BindDestruct> for Bind {
-	fn from(node: BindDestruct) -> Bind {
-		Bind::BindDestruct(node)
-	}
-}
-impl From<BindFunction> for Bind {
-	fn from(node: BindFunction) -> Bind {
-		Bind::BindFunction(node)
 	}
 }
-impl AstNode for Bind {
-	fn can_cast(kind: SyntaxKind) -> bool {
-		match kind {
-			BIND_DESTRUCT | BIND_FUNCTION => true,
-			_ => false,
-		}
-	}
-	fn cast(syntax: SyntaxNode) -> Option<Self> {
-		let res = match syntax.kind() {
-			BIND_DESTRUCT => Bind::BindDestruct(BindDestruct { syntax }),
-			BIND_FUNCTION => Bind::BindFunction(BindFunction { syntax }),
-			_ => return None,
-		};
-		Some(res)
-	}
-	fn syntax(&self) -> &SyntaxNode {
-		match self {
-			Bind::BindDestruct(it) => &it.syntax,
-			Bind::BindFunction(it) => &it.syntax,
-		}
-	}
-}
 impl From<ExprBinary> for ExprBase {
 	fn from(node: ExprBinary) -> ExprBase {
 		ExprBase::ExprBinary(node)
@@ -1977,28 +2034,8 @@
 impl From<ExprUnary> for ExprBase {
 	fn from(node: ExprUnary) -> ExprBase {
 		ExprBase::ExprUnary(node)
-	}
-}
-impl From<ExprSlice> for ExprBase {
-	fn from(node: ExprSlice) -> ExprBase {
-		ExprBase::ExprSlice(node)
 	}
 }
-impl From<ExprIndex> for ExprBase {
-	fn from(node: ExprIndex) -> ExprBase {
-		ExprBase::ExprIndex(node)
-	}
-}
-impl From<ExprIndexExpr> for ExprBase {
-	fn from(node: ExprIndexExpr) -> ExprBase {
-		ExprBase::ExprIndexExpr(node)
-	}
-}
-impl From<ExprApply> for ExprBase {
-	fn from(node: ExprApply) -> ExprBase {
-		ExprBase::ExprApply(node)
-	}
-}
 impl From<ExprObjExtend> for ExprBase {
 	fn from(node: ExprObjExtend) -> ExprBase {
 		ExprBase::ExprObjExtend(node)
@@ -2057,11 +2094,6 @@
 impl From<ExprFunction> for ExprBase {
 	fn from(node: ExprFunction) -> ExprBase {
 		ExprBase::ExprFunction(node)
-	}
-}
-impl From<ExprAssert> for ExprBase {
-	fn from(node: ExprAssert) -> ExprBase {
-		ExprBase::ExprAssert(node)
 	}
 }
 impl From<ExprError> for ExprBase {
@@ -2072,10 +2104,9 @@
 impl AstNode for ExprBase {
 	fn can_cast(kind: SyntaxKind) -> bool {
 		match kind {
-			EXPR_BINARY | EXPR_UNARY | EXPR_SLICE | EXPR_INDEX | EXPR_INDEX_EXPR | EXPR_APPLY
-			| EXPR_OBJ_EXTEND | EXPR_PARENED | EXPR_STRING | EXPR_NUMBER | EXPR_LITERAL
-			| EXPR_ARRAY | EXPR_OBJECT | EXPR_ARRAY_COMP | EXPR_IMPORT | EXPR_VAR
-			| EXPR_IF_THEN_ELSE | EXPR_FUNCTION | EXPR_ASSERT | EXPR_ERROR => true,
+			EXPR_BINARY | EXPR_UNARY | EXPR_OBJ_EXTEND | EXPR_PARENED | EXPR_STRING
+			| EXPR_NUMBER | EXPR_LITERAL | EXPR_ARRAY | EXPR_OBJECT | EXPR_ARRAY_COMP
+			| EXPR_IMPORT | EXPR_VAR | EXPR_IF_THEN_ELSE | EXPR_FUNCTION | EXPR_ERROR => true,
 			_ => false,
 		}
 	}
@@ -2083,10 +2114,6 @@
 		let res = match syntax.kind() {
 			EXPR_BINARY => ExprBase::ExprBinary(ExprBinary { syntax }),
 			EXPR_UNARY => ExprBase::ExprUnary(ExprUnary { syntax }),
-			EXPR_SLICE => ExprBase::ExprSlice(ExprSlice { syntax }),
-			EXPR_INDEX => ExprBase::ExprIndex(ExprIndex { syntax }),
-			EXPR_INDEX_EXPR => ExprBase::ExprIndexExpr(ExprIndexExpr { syntax }),
-			EXPR_APPLY => ExprBase::ExprApply(ExprApply { syntax }),
 			EXPR_OBJ_EXTEND => ExprBase::ExprObjExtend(ExprObjExtend { syntax }),
 			EXPR_PARENED => ExprBase::ExprParened(ExprParened { syntax }),
 			EXPR_STRING => ExprBase::ExprString(ExprString { syntax }),
@@ -2099,7 +2126,6 @@
 			EXPR_VAR => ExprBase::ExprVar(ExprVar { syntax }),
 			EXPR_IF_THEN_ELSE => ExprBase::ExprIfThenElse(ExprIfThenElse { syntax }),
 			EXPR_FUNCTION => ExprBase::ExprFunction(ExprFunction { syntax }),
-			EXPR_ASSERT => ExprBase::ExprAssert(ExprAssert { syntax }),
 			EXPR_ERROR => ExprBase::ExprError(ExprError { syntax }),
 			_ => return None,
 		};
@@ -2109,10 +2135,6 @@
 		match self {
 			ExprBase::ExprBinary(it) => &it.syntax,
 			ExprBase::ExprUnary(it) => &it.syntax,
-			ExprBase::ExprSlice(it) => &it.syntax,
-			ExprBase::ExprIndex(it) => &it.syntax,
-			ExprBase::ExprIndexExpr(it) => &it.syntax,
-			ExprBase::ExprApply(it) => &it.syntax,
 			ExprBase::ExprObjExtend(it) => &it.syntax,
 			ExprBase::ExprParened(it) => &it.syntax,
 			ExprBase::ExprString(it) => &it.syntax,
@@ -2125,7 +2147,6 @@
 			ExprBase::ExprVar(it) => &it.syntax,
 			ExprBase::ExprIfThenElse(it) => &it.syntax,
 			ExprBase::ExprFunction(it) => &it.syntax,
-			ExprBase::ExprAssert(it) => &it.syntax,
 			ExprBase::ExprError(it) => &it.syntax,
 		}
 	}
@@ -2344,14 +2365,16 @@
 impl BinaryOperatorKind {
 	fn can_cast(kind: SyntaxKind) -> bool {
 		match kind {
-			OR | AND | BIT_OR | BIT_XOR | BIT_AND | EQ | NE | LT | GT | LE | GE | IN_KW | LHS
-			| RHS | PLUS | MINUS | MUL | DIV | MODULO | META_OBJECT_APPLY | ERROR_NO_OPERATOR => true,
+			OR | NULL_COAELSE | AND | BIT_OR | BIT_XOR | BIT_AND | EQ | NE | LT | GT | LE | GE
+			| IN_KW | LHS | RHS | PLUS | MINUS | MUL | DIV | MODULO | META_OBJECT_APPLY
+			| ERROR_NO_OPERATOR => true,
 			_ => false,
 		}
 	}
 	pub fn cast(kind: SyntaxKind) -> Option<Self> {
 		let res = match kind {
 			OR => Self::Or,
+			NULL_COAELSE => Self::NullCoaelse,
 			AND => Self::And,
 			BIT_OR => Self::BitOr,
 			BIT_XOR => Self::BitXor,
@@ -2742,21 +2765,31 @@
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
 }
-impl std::fmt::Display for ObjBody {
+impl std::fmt::Display for Suffix {
+	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+		std::fmt::Display::fmt(self.syntax(), f)
+	}
+}
+impl std::fmt::Display for Bind {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
 }
-impl std::fmt::Display for CompSpec {
+impl std::fmt::Display for Stmt {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
 }
-impl std::fmt::Display for Bind {
+impl std::fmt::Display for ObjBody {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
 }
+impl std::fmt::Display for CompSpec {
+	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+		std::fmt::Display::fmt(self.syntax(), f)
+	}
+}
 impl std::fmt::Display for ExprBase {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
@@ -2797,22 +2830,22 @@
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
 }
-impl std::fmt::Display for ExprBinary {
+impl std::fmt::Display for SuffixIndex {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
 }
-impl std::fmt::Display for LhsExpr {
+impl std::fmt::Display for Name {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
 }
-impl std::fmt::Display for ExprUnary {
+impl std::fmt::Display for SuffixIndexExpr {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
 }
-impl std::fmt::Display for ExprSlice {
+impl std::fmt::Display for SuffixSlice {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
@@ -2822,31 +2855,41 @@
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
 }
-impl std::fmt::Display for ExprIndex {
+impl std::fmt::Display for SuffixApply {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
 }
-impl std::fmt::Display for Name {
+impl std::fmt::Display for ArgsDesc {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
 }
-impl std::fmt::Display for ExprIndexExpr {
+impl std::fmt::Display for StmtLocal {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
 }
-impl std::fmt::Display for ExprApply {
+impl std::fmt::Display for StmtAssert {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
 }
-impl std::fmt::Display for ArgsDesc {
+impl std::fmt::Display for Assertion {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
 }
+impl std::fmt::Display for ExprBinary {
+	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+		std::fmt::Display::fmt(self.syntax(), f)
+	}
+}
+impl std::fmt::Display for ExprUnary {
+	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+		std::fmt::Display::fmt(self.syntax(), f)
+	}
+}
 impl std::fmt::Display for ExprObjExtend {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
@@ -2918,26 +2961,11 @@
 	}
 }
 impl std::fmt::Display for ParamsDesc {
-	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-		std::fmt::Display::fmt(self.syntax(), f)
-	}
-}
-impl std::fmt::Display for ExprAssert {
-	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-		std::fmt::Display::fmt(self.syntax(), f)
-	}
-}
-impl std::fmt::Display for Assertion {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
 }
 impl std::fmt::Display for ExprError {
-	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-		std::fmt::Display::fmt(self.syntax(), f)
-	}
-}
-impl std::fmt::Display for StmtLocal {
 	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 		std::fmt::Display::fmt(self.syntax(), f)
 	}
modifiedcrates/jrsonnet-rowan-parser/src/generated/syntax_kinds.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/generated/syntax_kinds.rs
+++ b/crates/jrsonnet-rowan-parser/src/generated/syntax_kinds.rs
@@ -19,6 +19,8 @@
 	EOF,
 	#[token("||")]
 	OR,
+	#[token("??")]
+	NULL_COAELSE,
 	#[token("&&")]
 	AND,
 	#[token("|")]
@@ -137,6 +139,8 @@
 	ERROR_COMMENT_UNTERMINATED,
 	#[token("tailstrict")]
 	TAILSTRICT_KW,
+	#[token("local")]
+	LOCAL_KW,
 	#[token("importstr")]
 	IMPORTSTR_KW,
 	#[token("importbin")]
@@ -153,8 +157,6 @@
 	FUNCTION_KW,
 	#[token("error")]
 	ERROR_KW,
-	#[token("local")]
-	LOCAL_KW,
 	#[token("in")]
 	IN_KW,
 	META_OBJECT_APPLY,
@@ -181,16 +183,18 @@
 	LEXING_ERROR,
 	SOURCE_FILE,
 	EXPR,
-	EXPR_BINARY,
-	LHS_EXPR,
-	EXPR_UNARY,
-	EXPR_SLICE,
-	SLICE_DESC,
-	EXPR_INDEX,
+	SUFFIX_INDEX,
 	NAME,
-	EXPR_INDEX_EXPR,
-	EXPR_APPLY,
+	SUFFIX_INDEX_EXPR,
+	SUFFIX_SLICE,
+	SLICE_DESC,
+	SUFFIX_APPLY,
 	ARGS_DESC,
+	STMT_LOCAL,
+	STMT_ASSERT,
+	ASSERTION,
+	EXPR_BINARY,
+	EXPR_UNARY,
 	EXPR_OBJ_EXTEND,
 	EXPR_PARENED,
 	EXPR_LITERAL,
@@ -206,10 +210,7 @@
 	FALSE_EXPR,
 	EXPR_FUNCTION,
 	PARAMS_DESC,
-	EXPR_ASSERT,
-	ASSERTION,
 	EXPR_ERROR,
-	STMT_LOCAL,
 	SLICE_DESC_END,
 	SLICE_DESC_STEP,
 	ARG,
@@ -234,9 +235,11 @@
 	DESTRUCT_OBJECT_FIELD,
 	DESTRUCT_REST,
 	DESTRUCT_ARRAY_ELEMENT,
+	SUFFIX,
+	BIND,
+	STMT,
 	OBJ_BODY,
 	COMP_SPEC,
-	BIND,
 	EXPR_BASE,
 	MEMBER_COMP,
 	MEMBER,
@@ -259,21 +262,21 @@
 impl SyntaxKind {
 	pub fn is_keyword(self) -> bool {
 		match self {
-			OR | AND | BIT_OR | BIT_XOR | BIT_AND | EQ | NE | LT | GT | LE | GE | LHS | RHS
-			| PLUS | MINUS | MUL | DIV | MODULO | NOT | BIT_NOT | L_BRACK | R_BRACK | L_PAREN
-			| R_PAREN | L_BRACE | R_BRACE | COLON | COLONCOLON | COLONCOLONCOLON | SEMI | DOT
-			| DOTDOTDOT | COMMA | DOLLAR | ASSIGN | QUESTION_MARK | TAILSTRICT_KW
-			| IMPORTSTR_KW | IMPORTBIN_KW | IMPORT_KW | IF_KW | THEN_KW | ELSE_KW | FUNCTION_KW
-			| ERROR_KW | LOCAL_KW | IN_KW | NULL_KW | TRUE_KW | FALSE_KW | SELF_KW | SUPER_KW
-			| FOR_KW | ASSERT_KW => true,
+			OR | NULL_COAELSE | AND | BIT_OR | BIT_XOR | BIT_AND | EQ | NE | LT | GT | LE | GE
+			| LHS | RHS | PLUS | MINUS | MUL | DIV | MODULO | NOT | BIT_NOT | L_BRACK | R_BRACK
+			| L_PAREN | R_PAREN | L_BRACE | R_BRACE | COLON | COLONCOLON | COLONCOLONCOLON
+			| SEMI | DOT | DOTDOTDOT | COMMA | DOLLAR | ASSIGN | QUESTION_MARK | TAILSTRICT_KW
+			| LOCAL_KW | IMPORTSTR_KW | IMPORTBIN_KW | IMPORT_KW | IF_KW | THEN_KW | ELSE_KW
+			| FUNCTION_KW | ERROR_KW | IN_KW | NULL_KW | TRUE_KW | FALSE_KW | SELF_KW
+			| SUPER_KW | FOR_KW | ASSERT_KW => true,
 			_ => false,
 		}
 	}
 	pub fn is_enum(self) -> bool {
 		match self {
-			OBJ_BODY | COMP_SPEC | BIND | EXPR_BASE | MEMBER_COMP | MEMBER | FIELD_NAME
-			| DESTRUCT | DESTRUCT_ARRAY_PART | BINARY_OPERATOR | UNARY_OPERATOR | LITERAL
-			| TEXT | NUMBER | IMPORT_KIND | VISIBILITY | TRIVIA | CUSTOM_ERROR => true,
+			SUFFIX | BIND | STMT | OBJ_BODY | COMP_SPEC | EXPR_BASE | MEMBER_COMP | MEMBER
+			| FIELD_NAME | DESTRUCT | DESTRUCT_ARRAY_PART | BINARY_OPERATOR | UNARY_OPERATOR
+			| LITERAL | TEXT | NUMBER | IMPORT_KIND | VISIBILITY | TRIVIA | CUSTOM_ERROR => true,
 			_ => false,
 		}
 	}
@@ -286,5 +289,5 @@
 	}
 }
 #[macro_export]
-macro_rules ! T { [||] => { $ crate :: SyntaxKind :: OR } ; [&&] => { $ crate :: SyntaxKind :: AND } ; [|] => { $ crate :: SyntaxKind :: BIT_OR } ; [^] => { $ crate :: SyntaxKind :: BIT_XOR } ; [&] => { $ crate :: SyntaxKind :: BIT_AND } ; [==] => { $ crate :: SyntaxKind :: EQ } ; [!=] => { $ crate :: SyntaxKind :: NE } ; [<] => { $ crate :: SyntaxKind :: LT } ; [>] => { $ crate :: SyntaxKind :: GT } ; [<=] => { $ crate :: SyntaxKind :: LE } ; [>=] => { $ crate :: SyntaxKind :: GE } ; [<<] => { $ crate :: SyntaxKind :: LHS } ; [>>] => { $ crate :: SyntaxKind :: RHS } ; [+] => { $ crate :: SyntaxKind :: PLUS } ; [-] => { $ crate :: SyntaxKind :: MINUS } ; [*] => { $ crate :: SyntaxKind :: MUL } ; [/] => { $ crate :: SyntaxKind :: DIV } ; [%] => { $ crate :: SyntaxKind :: MODULO } ; [!] => { $ crate :: SyntaxKind :: NOT } ; [~] => { $ crate :: SyntaxKind :: BIT_NOT } ; ['['] => { $ crate :: SyntaxKind :: L_BRACK } ; [']'] => { $ crate :: SyntaxKind :: R_BRACK } ; ['('] => { $ crate :: SyntaxKind :: L_PAREN } ; [')'] => { $ crate :: SyntaxKind :: R_PAREN } ; ['{'] => { $ crate :: SyntaxKind :: L_BRACE } ; ['}'] => { $ crate :: SyntaxKind :: R_BRACE } ; [:] => { $ crate :: SyntaxKind :: COLON } ; [::] => { $ crate :: SyntaxKind :: COLONCOLON } ; [:::] => { $ crate :: SyntaxKind :: COLONCOLONCOLON } ; [;] => { $ crate :: SyntaxKind :: SEMI } ; [.] => { $ crate :: SyntaxKind :: DOT } ; [...] => { $ crate :: SyntaxKind :: DOTDOTDOT } ; [,] => { $ crate :: SyntaxKind :: COMMA } ; ['$'] => { $ crate :: SyntaxKind :: DOLLAR } ; [=] => { $ crate :: SyntaxKind :: ASSIGN } ; [?] => { $ crate :: SyntaxKind :: QUESTION_MARK } ; [tailstrict] => { $ crate :: SyntaxKind :: TAILSTRICT_KW } ; [importstr] => { $ crate :: SyntaxKind :: IMPORTSTR_KW } ; [importbin] => { $ crate :: SyntaxKind :: IMPORTBIN_KW } ; [import] => { $ crate :: SyntaxKind :: IMPORT_KW } ; [if] => { $ crate :: SyntaxKind :: IF_KW } ; [then] => { $ crate :: SyntaxKind :: THEN_KW } ; [else] => { $ crate :: SyntaxKind :: ELSE_KW } ; [function] => { $ crate :: SyntaxKind :: FUNCTION_KW } ; [error] => { $ crate :: SyntaxKind :: ERROR_KW } ; [local] => { $ crate :: SyntaxKind :: LOCAL_KW } ; [in] => { $ crate :: SyntaxKind :: IN_KW } ; [null] => { $ crate :: SyntaxKind :: NULL_KW } ; [true] => { $ crate :: SyntaxKind :: TRUE_KW } ; [false] => { $ crate :: SyntaxKind :: FALSE_KW } ; [self] => { $ crate :: SyntaxKind :: SELF_KW } ; [super] => { $ crate :: SyntaxKind :: SUPER_KW } ; [for] => { $ crate :: SyntaxKind :: FOR_KW } ; [assert] => { $ crate :: SyntaxKind :: ASSERT_KW } }
+macro_rules ! T { [||] => { $ crate :: SyntaxKind :: OR } ; [??] => { $ crate :: SyntaxKind :: NULL_COAELSE } ; [&&] => { $ crate :: SyntaxKind :: AND } ; [|] => { $ crate :: SyntaxKind :: BIT_OR } ; [^] => { $ crate :: SyntaxKind :: BIT_XOR } ; [&] => { $ crate :: SyntaxKind :: BIT_AND } ; [==] => { $ crate :: SyntaxKind :: EQ } ; [!=] => { $ crate :: SyntaxKind :: NE } ; [<] => { $ crate :: SyntaxKind :: LT } ; [>] => { $ crate :: SyntaxKind :: GT } ; [<=] => { $ crate :: SyntaxKind :: LE } ; [>=] => { $ crate :: SyntaxKind :: GE } ; [<<] => { $ crate :: SyntaxKind :: LHS } ; [>>] => { $ crate :: SyntaxKind :: RHS } ; [+] => { $ crate :: SyntaxKind :: PLUS } ; [-] => { $ crate :: SyntaxKind :: MINUS } ; [*] => { $ crate :: SyntaxKind :: MUL } ; [/] => { $ crate :: SyntaxKind :: DIV } ; [%] => { $ crate :: SyntaxKind :: MODULO } ; [!] => { $ crate :: SyntaxKind :: NOT } ; [~] => { $ crate :: SyntaxKind :: BIT_NOT } ; ['['] => { $ crate :: SyntaxKind :: L_BRACK } ; [']'] => { $ crate :: SyntaxKind :: R_BRACK } ; ['('] => { $ crate :: SyntaxKind :: L_PAREN } ; [')'] => { $ crate :: SyntaxKind :: R_PAREN } ; ['{'] => { $ crate :: SyntaxKind :: L_BRACE } ; ['}'] => { $ crate :: SyntaxKind :: R_BRACE } ; [:] => { $ crate :: SyntaxKind :: COLON } ; [::] => { $ crate :: SyntaxKind :: COLONCOLON } ; [:::] => { $ crate :: SyntaxKind :: COLONCOLONCOLON } ; [;] => { $ crate :: SyntaxKind :: SEMI } ; [.] => { $ crate :: SyntaxKind :: DOT } ; [...] => { $ crate :: SyntaxKind :: DOTDOTDOT } ; [,] => { $ crate :: SyntaxKind :: COMMA } ; ['$'] => { $ crate :: SyntaxKind :: DOLLAR } ; [=] => { $ crate :: SyntaxKind :: ASSIGN } ; [?] => { $ crate :: SyntaxKind :: QUESTION_MARK } ; [tailstrict] => { $ crate :: SyntaxKind :: TAILSTRICT_KW } ; [local] => { $ crate :: SyntaxKind :: LOCAL_KW } ; [importstr] => { $ crate :: SyntaxKind :: IMPORTSTR_KW } ; [importbin] => { $ crate :: SyntaxKind :: IMPORTBIN_KW } ; [import] => { $ crate :: SyntaxKind :: IMPORT_KW } ; [if] => { $ crate :: SyntaxKind :: IF_KW } ; [then] => { $ crate :: SyntaxKind :: THEN_KW } ; [else] => { $ crate :: SyntaxKind :: ELSE_KW } ; [function] => { $ crate :: SyntaxKind :: FUNCTION_KW } ; [error] => { $ crate :: SyntaxKind :: ERROR_KW } ; [in] => { $ crate :: SyntaxKind :: IN_KW } ; [null] => { $ crate :: SyntaxKind :: NULL_KW } ; [true] => { $ crate :: SyntaxKind :: TRUE_KW } ; [false] => { $ crate :: SyntaxKind :: FALSE_KW } ; [self] => { $ crate :: SyntaxKind :: SELF_KW } ; [super] => { $ crate :: SyntaxKind :: SUPER_KW } ; [for] => { $ crate :: SyntaxKind :: FOR_KW } ; [assert] => { $ crate :: SyntaxKind :: ASSERT_KW } }
 pub use T;
modifiedcrates/jrsonnet-rowan-parser/src/lib.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/lib.rs
+++ b/crates/jrsonnet-rowan-parser/src/lib.rs
@@ -23,6 +23,11 @@
 pub use language::*;
 pub use token_set::SyntaxKindSet;
 
+use self::{
+	ast::support,
+	generated::nodes::{Expr, ExprBinary, ExprObjExtend},
+};
+
 pub fn parse(input: &str) -> (SourceFile, Vec<LocatedSyntaxError>) {
 	let lexemes = lex(input);
 	let kinds = lexemes
@@ -42,3 +47,25 @@
 		parse.errors,
 	)
 }
+impl ExprBinary {
+	pub fn lhs_work(&self) -> Option<Expr> {
+		support::child(self.syntax())
+	}
+	pub fn rhs_work(&self) -> Option<Expr> {
+		let mut children = support::children(self.syntax());
+		// skip lhs
+		children.next()?;
+		children.next()
+	}
+}
+impl ExprObjExtend {
+	pub fn lhs_work(&self) -> Option<Expr> {
+		support::child(self.syntax())
+	}
+	pub fn rhs_work(&self) -> Option<Expr> {
+		let mut children = support::children(self.syntax());
+		// skip lhs
+		children.next()?;
+		children.next()
+	}
+}
modifiedcrates/jrsonnet-rowan-parser/src/parser.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/parser.rs
+++ b/crates/jrsonnet-rowan-parser/src/parser.rs
@@ -293,30 +293,38 @@
 }
 
 fn expr(p: &mut Parser) -> CompletedMarker {
-	while p.at(T![local]) {
+	let m = p.start();
+	while p.at(T![local]) || p.at(T![assert]) {
 		let m = p.start();
 
-		p.bump();
-		loop {
-			if p.at(T![;]) {
-				p.bump();
+		if p.at(T![local]) {
+			p.bump();
+			loop {
+				if p.at(T![;]) {
+					p.bump();
+					break;
+				}
+				bind(p);
+
+				if p.at(T![,]) {
+					p.bump();
+					continue;
+				}
+				p.expect(T![;]);
 				break;
 			}
-			bind(p);
-
-			if p.at(T![,]) {
-				p.bump();
-				continue;
-			}
+			m.complete(p, STMT_LOCAL);
+		} else {
+			assertion(p);
 			p.expect(T![;]);
-			break;
+			m.complete(p, STMT_ASSERT);
 		}
-		m.complete(p, STMT_LOCAL);
 	}
 	match expr_binding_power(p, 0) {
 		Ok(m) => m,
 		Err(m) => m,
-	}
+	};
+	m.complete(p, EXPR)
 }
 fn expr_binding_power(
 	p: &mut Parser,
@@ -337,8 +345,10 @@
 			p.bump();
 		}
 
-		let m = lhs.wrap(p, LHS_EXPR).precede(p);
-		let parsed_rhs = expr_binding_power(p, right_binding_power).is_ok();
+		let m = lhs.wrap(p, EXPR).precede(p);
+		let parsed_rhs = expr_binding_power(p, right_binding_power)
+			.map(|v| v.precede(p).complete(p, EXPR))
+			.is_ok();
 		lhs = m.complete(
 			p,
 			if op == BinaryOperatorKind::MetaObjectApply {
@@ -361,7 +371,7 @@
 	if p.at(T![for]) {
 		let m = p.start();
 		p.bump();
-		name(p);
+		destruct(p);
 		p.expect(T![in]);
 		expr(p);
 		m.complete(p, FOR_SPEC)
@@ -420,7 +430,7 @@
 fn assertion(p: &mut Parser) {
 	let m = p.start();
 	p.bump_assert(T![assert]);
-	expr(p).wrap(p, LHS_EXPR);
+	expr(p);
 	if p.at(T![:]) {
 		p.bump();
 		expr(p);
@@ -504,7 +514,7 @@
 		for errored in compspecs {
 			errored.wrap_error(
 				p,
-				"compspec may only be used if there is only one array element",
+				"compspec may only be used if there is only one object element",
 			);
 		}
 		m.complete(p, OBJ_BODY_MEMBER_LIST);
@@ -612,8 +622,8 @@
 			p.expect(T![']']);
 			break;
 		}
-		elems += 1;
 		expr(p);
+		elems += 1;
 		while p.at_ts(COMPSPEC) {
 			compspecs.push(compspec(p));
 		}
@@ -679,32 +689,47 @@
 	true
 }
 
-fn lhs(p: &mut Parser) -> Result<CompletedMarker, CompletedMarker> {
-	let mut lhs = lhs_basic(p)?;
-
+fn suffix(p: &mut Parser) {
 	loop {
-		if p.at(T![.]) {
-			let m = lhs.precede(p);
+		let start = p.start();
+		let _marker: CompletedMarker = if p.at(T![?]) {
 			p.bump();
+			p.expect(T![.]);
+			if p.at(IDENT) {
+				name(p);
+				start.complete(p, SUFFIX_INDEX)
+			} else if p.at(T!['[']) {
+				p.bump();
+				expr(p);
+				p.expect(T![']']);
+				start.complete(p, SUFFIX_INDEX_EXPR)
+			} else {
+				start.complete_missing(p, ExpectedSyntax::Named("index"))
+			}
+		} else if p.at(T![.]) {
+			p.bump();
 			name(p);
-			lhs = m.complete(p, EXPR_INDEX);
+			start.complete(p, SUFFIX_INDEX)
 		} else if p.at(T!['[']) {
 			if slice_desc_or_index(p) {
-				lhs = lhs.precede(p).complete(p, EXPR_SLICE);
+				start.complete(p, SUFFIX_SLICE)
 			} else {
-				lhs = lhs
-					.wrap(p, LHS_EXPR)
-					.precede(p)
-					.complete(p, EXPR_INDEX_EXPR);
+				start.complete(p, SUFFIX_INDEX_EXPR)
 			}
 		} else if p.at(T!['(']) {
-			let m = lhs.precede(p);
 			args_desc(p);
-			lhs = m.complete(p, EXPR_APPLY);
+			start.complete(p, SUFFIX_APPLY)
 		} else {
+			start.forget(p);
 			break;
-		}
+		};
 	}
+}
+
+fn lhs(p: &mut Parser) -> Result<CompletedMarker, CompletedMarker> {
+	let lhs = lhs_basic(p)?;
+
+	suffix(p);
 
 	Ok(lhs)
 }
@@ -885,12 +910,6 @@
 		p.bump();
 		expr(p);
 		m.complete(p, EXPR_ERROR)
-	} else if p.at(T![assert]) {
-		let m = p.start();
-		assertion(p);
-		p.expect(T![;]);
-		expr(p);
-		m.complete(p, EXPR_ASSERT)
 	} else if p.at(T![import]) || p.at(T![importstr]) || p.at(T![importbin]) {
 		let m = p.start();
 		p.bump();
modifiedcrates/jrsonnet-rowan-parser/src/precedence.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/precedence.rs
+++ b/crates/jrsonnet-rowan-parser/src/precedence.rs
@@ -13,6 +13,7 @@
 			Self::BitXor => (8, 9),
 			Self::BitOr => (6, 7),
 			Self::And => (4, 5),
+			Self::NullCoaelse => (2, 3),
 			Self::Or => (2, 3),
 			Self::ErrorNoOperator => (0, 1),
 		}
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__arr_compspec.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__arr_compspec.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__arr_compspec.snap
@@ -3,32 +3,39 @@
 expression: "[a for a in [1, 2, 3]]\n"
 ---
 SOURCE_FILE@0..23
-  EXPR_ARRAY_COMP@0..22
-    L_BRACK@0..1 "["
-    EXPR_VAR@1..2
-      NAME@1..2
-        IDENT@1..2 "a"
-    WHITESPACE@2..3 " "
-    FOR_SPEC@3..21
-      FOR_KW@3..6 "for"
-      WHITESPACE@6..7 " "
-      NAME@7..8
-        IDENT@7..8 "a"
-      WHITESPACE@8..9 " "
-      IN_KW@9..11 "in"
-      WHITESPACE@11..12 " "
-      EXPR_ARRAY@12..21
-        L_BRACK@12..13 "["
-        EXPR_NUMBER@13..14
-          FLOAT@13..14 "1"
-        COMMA@14..15 ","
-        WHITESPACE@15..16 " "
-        EXPR_NUMBER@16..17
-          FLOAT@16..17 "2"
-        COMMA@17..18 ","
-        WHITESPACE@18..19 " "
-        EXPR_NUMBER@19..20
-          FLOAT@19..20 "3"
-        R_BRACK@20..21 "]"
-    R_BRACK@21..22 "]"
+  EXPR@0..22
+    EXPR_ARRAY_COMP@0..22
+      L_BRACK@0..1 "["
+      EXPR@1..2
+        EXPR_VAR@1..2
+          NAME@1..2
+            IDENT@1..2 "a"
+      WHITESPACE@2..3 " "
+      FOR_SPEC@3..21
+        FOR_KW@3..6 "for"
+        WHITESPACE@6..7 " "
+        DESTRUCT_FULL@7..8
+          NAME@7..8
+            IDENT@7..8 "a"
+        WHITESPACE@8..9 " "
+        IN_KW@9..11 "in"
+        WHITESPACE@11..12 " "
+        EXPR@12..21
+          EXPR_ARRAY@12..21
+            L_BRACK@12..13 "["
+            EXPR@13..14
+              EXPR_NUMBER@13..14
+                FLOAT@13..14 "1"
+            COMMA@14..15 ","
+            WHITESPACE@15..16 " "
+            EXPR@16..17
+              EXPR_NUMBER@16..17
+                FLOAT@16..17 "2"
+            COMMA@17..18 ","
+            WHITESPACE@18..19 " "
+            EXPR@19..20
+              EXPR_NUMBER@19..20
+                FLOAT@19..20 "3"
+            R_BRACK@20..21 "]"
+      R_BRACK@21..22 "]"
   WHITESPACE@22..23 "\n"
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__arr_compspec_comma.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__arr_compspec_comma.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__arr_compspec_comma.snap
@@ -3,33 +3,40 @@
 expression: "[a, for a in [1, 2, 3]]\n"
 ---
 SOURCE_FILE@0..24
-  EXPR_ARRAY_COMP@0..23
-    L_BRACK@0..1 "["
-    EXPR_VAR@1..2
-      NAME@1..2
-        IDENT@1..2 "a"
-    COMMA@2..3 ","
-    WHITESPACE@3..4 " "
-    FOR_SPEC@4..22
-      FOR_KW@4..7 "for"
-      WHITESPACE@7..8 " "
-      NAME@8..9
-        IDENT@8..9 "a"
-      WHITESPACE@9..10 " "
-      IN_KW@10..12 "in"
-      WHITESPACE@12..13 " "
-      EXPR_ARRAY@13..22
-        L_BRACK@13..14 "["
-        EXPR_NUMBER@14..15
-          FLOAT@14..15 "1"
-        COMMA@15..16 ","
-        WHITESPACE@16..17 " "
-        EXPR_NUMBER@17..18
-          FLOAT@17..18 "2"
-        COMMA@18..19 ","
-        WHITESPACE@19..20 " "
-        EXPR_NUMBER@20..21
-          FLOAT@20..21 "3"
-        R_BRACK@21..22 "]"
-    R_BRACK@22..23 "]"
+  EXPR@0..23
+    EXPR_ARRAY_COMP@0..23
+      L_BRACK@0..1 "["
+      EXPR@1..2
+        EXPR_VAR@1..2
+          NAME@1..2
+            IDENT@1..2 "a"
+      COMMA@2..3 ","
+      WHITESPACE@3..4 " "
+      FOR_SPEC@4..22
+        FOR_KW@4..7 "for"
+        WHITESPACE@7..8 " "
+        DESTRUCT_FULL@8..9
+          NAME@8..9
+            IDENT@8..9 "a"
+        WHITESPACE@9..10 " "
+        IN_KW@10..12 "in"
+        WHITESPACE@12..13 " "
+        EXPR@13..22
+          EXPR_ARRAY@13..22
+            L_BRACK@13..14 "["
+            EXPR@14..15
+              EXPR_NUMBER@14..15
+                FLOAT@14..15 "1"
+            COMMA@15..16 ","
+            WHITESPACE@16..17 " "
+            EXPR@17..18
+              EXPR_NUMBER@17..18
+                FLOAT@17..18 "2"
+            COMMA@18..19 ","
+            WHITESPACE@19..20 " "
+            EXPR@20..21
+              EXPR_NUMBER@20..21
+                FLOAT@20..21 "3"
+            R_BRACK@21..22 "]"
+      R_BRACK@22..23 "]"
   WHITESPACE@23..24 "\n"
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__arr_compspec_incompatible_with_multiple_elems.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__arr_compspec_incompatible_with_multiple_elems.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__arr_compspec_incompatible_with_multiple_elems.snap
@@ -3,40 +3,48 @@
 expression: "[a for a in [1, 2, 3], b]\n"
 ---
 SOURCE_FILE@0..26
-  EXPR_ARRAY@0..25
-    L_BRACK@0..1 "["
-    EXPR_VAR@1..2
-      NAME@1..2
-        IDENT@1..2 "a"
-    WHITESPACE@2..3 " "
-    ERROR_CUSTOM@3..21
-      FOR_SPEC@3..21
-        FOR_KW@3..6 "for"
-        WHITESPACE@6..7 " "
-        NAME@7..8
-          IDENT@7..8 "a"
-        WHITESPACE@8..9 " "
-        IN_KW@9..11 "in"
-        WHITESPACE@11..12 " "
-        EXPR_ARRAY@12..21
-          L_BRACK@12..13 "["
-          EXPR_NUMBER@13..14
-            FLOAT@13..14 "1"
-          COMMA@14..15 ","
-          WHITESPACE@15..16 " "
-          EXPR_NUMBER@16..17
-            FLOAT@16..17 "2"
-          COMMA@17..18 ","
-          WHITESPACE@18..19 " "
-          EXPR_NUMBER@19..20
-            FLOAT@19..20 "3"
-          R_BRACK@20..21 "]"
-    COMMA@21..22 ","
-    WHITESPACE@22..23 " "
-    EXPR_VAR@23..24
-      NAME@23..24
-        IDENT@23..24 "b"
-    R_BRACK@24..25 "]"
+  EXPR@0..25
+    EXPR_ARRAY@0..25
+      L_BRACK@0..1 "["
+      EXPR@1..2
+        EXPR_VAR@1..2
+          NAME@1..2
+            IDENT@1..2 "a"
+      WHITESPACE@2..3 " "
+      ERROR_CUSTOM@3..21
+        FOR_SPEC@3..21
+          FOR_KW@3..6 "for"
+          WHITESPACE@6..7 " "
+          DESTRUCT_FULL@7..8
+            NAME@7..8
+              IDENT@7..8 "a"
+          WHITESPACE@8..9 " "
+          IN_KW@9..11 "in"
+          WHITESPACE@11..12 " "
+          EXPR@12..21
+            EXPR_ARRAY@12..21
+              L_BRACK@12..13 "["
+              EXPR@13..14
+                EXPR_NUMBER@13..14
+                  FLOAT@13..14 "1"
+              COMMA@14..15 ","
+              WHITESPACE@15..16 " "
+              EXPR@16..17
+                EXPR_NUMBER@16..17
+                  FLOAT@16..17 "2"
+              COMMA@17..18 ","
+              WHITESPACE@18..19 " "
+              EXPR@19..20
+                EXPR_NUMBER@19..20
+                  FLOAT@19..20 "3"
+              R_BRACK@20..21 "]"
+      COMMA@21..22 ","
+      WHITESPACE@22..23 " "
+      EXPR@23..24
+        EXPR_VAR@23..24
+          NAME@23..24
+            IDENT@23..24 "b"
+      R_BRACK@24..25 "]"
   WHITESPACE@25..26 "\n"
 ===
 LocatedSyntaxError { error: Custom { error: "compspec may only be used if there is only one array element" }, range: 3..21 }
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__arr_compspec_incompatible_with_multiple_elems_w.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__arr_compspec_incompatible_with_multiple_elems_w.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__arr_compspec_incompatible_with_multiple_elems_w.snap
@@ -3,46 +3,55 @@
 expression: "[a, b, for a in [1, 2, 3], c]\n"
 ---
 SOURCE_FILE@0..30
-  EXPR_ARRAY@0..29
-    L_BRACK@0..1 "["
-    EXPR_VAR@1..2
-      NAME@1..2
-        IDENT@1..2 "a"
-    COMMA@2..3 ","
-    WHITESPACE@3..4 " "
-    EXPR_VAR@4..5
-      NAME@4..5
-        IDENT@4..5 "b"
-    COMMA@5..6 ","
-    WHITESPACE@6..7 " "
-    ERROR_CUSTOM@7..25
-      FOR_SPEC@7..25
-        FOR_KW@7..10 "for"
-        WHITESPACE@10..11 " "
-        NAME@11..12
-          IDENT@11..12 "a"
-        WHITESPACE@12..13 " "
-        IN_KW@13..15 "in"
-        WHITESPACE@15..16 " "
-        EXPR_ARRAY@16..25
-          L_BRACK@16..17 "["
-          EXPR_NUMBER@17..18
-            FLOAT@17..18 "1"
-          COMMA@18..19 ","
-          WHITESPACE@19..20 " "
-          EXPR_NUMBER@20..21
-            FLOAT@20..21 "2"
-          COMMA@21..22 ","
-          WHITESPACE@22..23 " "
-          EXPR_NUMBER@23..24
-            FLOAT@23..24 "3"
-          R_BRACK@24..25 "]"
-    COMMA@25..26 ","
-    WHITESPACE@26..27 " "
-    EXPR_VAR@27..28
-      NAME@27..28
-        IDENT@27..28 "c"
-    R_BRACK@28..29 "]"
+  EXPR@0..29
+    EXPR_ARRAY@0..29
+      L_BRACK@0..1 "["
+      EXPR@1..2
+        EXPR_VAR@1..2
+          NAME@1..2
+            IDENT@1..2 "a"
+      COMMA@2..3 ","
+      WHITESPACE@3..4 " "
+      EXPR@4..5
+        EXPR_VAR@4..5
+          NAME@4..5
+            IDENT@4..5 "b"
+      COMMA@5..6 ","
+      WHITESPACE@6..7 " "
+      ERROR_CUSTOM@7..25
+        FOR_SPEC@7..25
+          FOR_KW@7..10 "for"
+          WHITESPACE@10..11 " "
+          DESTRUCT_FULL@11..12
+            NAME@11..12
+              IDENT@11..12 "a"
+          WHITESPACE@12..13 " "
+          IN_KW@13..15 "in"
+          WHITESPACE@15..16 " "
+          EXPR@16..25
+            EXPR_ARRAY@16..25
+              L_BRACK@16..17 "["
+              EXPR@17..18
+                EXPR_NUMBER@17..18
+                  FLOAT@17..18 "1"
+              COMMA@18..19 ","
+              WHITESPACE@19..20 " "
+              EXPR@20..21
+                EXPR_NUMBER@20..21
+                  FLOAT@20..21 "2"
+              COMMA@21..22 ","
+              WHITESPACE@22..23 " "
+              EXPR@23..24
+                EXPR_NUMBER@23..24
+                  FLOAT@23..24 "3"
+              R_BRACK@24..25 "]"
+      COMMA@25..26 ","
+      WHITESPACE@26..27 " "
+      EXPR@27..28
+        EXPR_VAR@27..28
+          NAME@27..28
+            IDENT@27..28 "c"
+      R_BRACK@28..29 "]"
   WHITESPACE@29..30 "\n"
 ===
 LocatedSyntaxError { error: Custom { error: "compspec may only be used if there is only one array element" }, range: 7..25 }
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__arr_compspec_no_elems.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__arr_compspec_no_elems.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__arr_compspec_no_elems.snap
@@ -3,31 +3,38 @@
 expression: "[for a in [1, 2, 3]]\n"
 ---
 SOURCE_FILE@0..21
-  EXPR_ARRAY_COMP@0..20
-    L_BRACK@0..1 "["
-    ERROR_MISSING_TOKEN@1..1
-    FOR_SPEC@1..19
-      FOR_KW@1..4 "for"
-      WHITESPACE@4..5 " "
-      NAME@5..6
-        IDENT@5..6 "a"
-      WHITESPACE@6..7 " "
-      IN_KW@7..9 "in"
-      WHITESPACE@9..10 " "
-      EXPR_ARRAY@10..19
-        L_BRACK@10..11 "["
-        EXPR_NUMBER@11..12
-          FLOAT@11..12 "1"
-        COMMA@12..13 ","
-        WHITESPACE@13..14 " "
-        EXPR_NUMBER@14..15
-          FLOAT@14..15 "2"
-        COMMA@15..16 ","
-        WHITESPACE@16..17 " "
-        EXPR_NUMBER@17..18
-          FLOAT@17..18 "3"
-        R_BRACK@18..19 "]"
-    R_BRACK@19..20 "]"
+  EXPR@0..20
+    EXPR_ARRAY_COMP@0..20
+      L_BRACK@0..1 "["
+      EXPR@1..1
+        ERROR_MISSING_TOKEN@1..1
+      FOR_SPEC@1..19
+        FOR_KW@1..4 "for"
+        WHITESPACE@4..5 " "
+        DESTRUCT_FULL@5..6
+          NAME@5..6
+            IDENT@5..6 "a"
+        WHITESPACE@6..7 " "
+        IN_KW@7..9 "in"
+        WHITESPACE@9..10 " "
+        EXPR@10..19
+          EXPR_ARRAY@10..19
+            L_BRACK@10..11 "["
+            EXPR@11..12
+              EXPR_NUMBER@11..12
+                FLOAT@11..12 "1"
+            COMMA@12..13 ","
+            WHITESPACE@13..14 " "
+            EXPR@14..15
+              EXPR_NUMBER@14..15
+                FLOAT@14..15 "2"
+            COMMA@15..16 ","
+            WHITESPACE@16..17 " "
+            EXPR@17..18
+              EXPR_NUMBER@17..18
+                FLOAT@17..18 "3"
+            R_BRACK@18..19 "]"
+      R_BRACK@19..20 "]"
   WHITESPACE@20..21 "\n"
 ===
 LocatedSyntaxError { error: Missing { expected: Named("expression") }, range: 1..1 }
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__continue_after_total_failure.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__continue_after_total_failure.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__continue_after_total_failure.snap
@@ -3,26 +3,29 @@
 expression: "local intr = $intrinsic(test);\n\nlocal a = 1, b = 2, c = a + b;\n\n[c]\n"
 ---
 SOURCE_FILE@0..68
-  STMT_LOCAL@0..23
-    LOCAL_KW@0..5 "local"
-    WHITESPACE@5..6 " "
-    BIND_DESTRUCT@6..14
-      DESTRUCT_FULL@6..10
-        NAME@6..10
-          IDENT@6..10 "intr"
-      WHITESPACE@10..11 " "
-      ASSIGN@11..12 "="
-      WHITESPACE@12..13 " "
-      EXPR_LITERAL@13..14
-        DOLLAR@13..14 "$"
-    ERROR_UNEXPECTED_TOKEN@14..23
-      IDENT@14..23 "intrinsic"
-  EXPR_PARENED@23..29
-    L_PAREN@23..24 "("
-    EXPR_VAR@24..28
-      NAME@24..28
-        IDENT@24..28 "test"
-    R_PAREN@28..29 ")"
+  EXPR@0..29
+    STMT_LOCAL@0..23
+      LOCAL_KW@0..5 "local"
+      WHITESPACE@5..6 " "
+      BIND_DESTRUCT@6..14
+        DESTRUCT_FULL@6..10
+          NAME@6..10
+            IDENT@6..10 "intr"
+        WHITESPACE@10..11 " "
+        ASSIGN@11..12 "="
+        WHITESPACE@12..13 " "
+        EXPR@13..14
+          EXPR_LITERAL@13..14
+            DOLLAR@13..14 "$"
+      ERROR_UNEXPECTED_TOKEN@14..23
+        IDENT@14..23 "intrinsic"
+    EXPR_PARENED@23..29
+      L_PAREN@23..24 "("
+      EXPR@24..28
+        EXPR_VAR@24..28
+          NAME@24..28
+            IDENT@24..28 "test"
+      R_PAREN@28..29 ")"
   ERROR_CUSTOM@29..67
     SEMI@29..30 ";"
     WHITESPACE@30..32 "\n\n"
@@ -58,14 +61,14 @@
     R_BRACK@66..67 "]"
   WHITESPACE@67..68 "\n"
 ===
-LocatedSyntaxError { error: Unexpected { expected: Unnamed(SyntaxKindSet([L_BRACK, L_PAREN, L_BRACE, SEMI, DOT, COMMA])), found: IDENT }, range: 14..23 }
+LocatedSyntaxError { error: Unexpected { expected: Unnamed(SyntaxKindSet([L_BRACK, L_PAREN, L_BRACE, SEMI, DOT, COMMA, QUESTION_MARK])), found: IDENT }, range: 14..23 }
 LocatedSyntaxError { error: Custom { error: "unexpected tokens after end" }, range: 29..67 }
 ===
   x syntax error
    ,-[1:1]
  1 | ,-> local intr = $intrinsic(test);
    : ||              ^^^^|^^^^
-   : ||                  `-- expected L_BRACK, L_PAREN, L_BRACE, SEMI, DOT or COMMA, found IDENT
+   : ||                  `-- expected L_BRACK, L_PAREN, L_BRACE, SEMI, DOT, COMMA or QUESTION_MARK, found IDENT
  2 | |
  3 | |   local a = 1, b = 2, c = a + b;
  4 | |
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__destruct.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__destruct.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__destruct.snap
@@ -3,252 +3,263 @@
 expression: "local [a, b, c] = arr;\nlocal [a, ...] = arr_rest;\nlocal [..., a] = rest_arr;\nlocal [...] = rest_in_arr;\nlocal [a, ...n] = arr_rest_n;\nlocal [...n, a] = rest_arr_n;\nlocal [...n] = rest_in_arr_n;\n\nlocal {a, b, c} = obj;\nlocal {a, b, c, ...} = obj_rest;\nlocal {a, b, c, ...n} = obj_rest_n;\n\nnull\n"
 ---
 SOURCE_FILE@0..293
-  STMT_LOCAL@0..22
-    LOCAL_KW@0..5 "local"
-    WHITESPACE@5..6 " "
-    BIND_DESTRUCT@6..21
-      DESTRUCT_ARRAY@6..15
-        L_BRACK@6..7 "["
-        DESTRUCT_FULL@7..8
-          NAME@7..8
-            IDENT@7..8 "a"
-        COMMA@8..9 ","
-        WHITESPACE@9..10 " "
-        DESTRUCT_FULL@10..11
-          NAME@10..11
-            IDENT@10..11 "b"
-        COMMA@11..12 ","
-        WHITESPACE@12..13 " "
-        DESTRUCT_FULL@13..14
-          NAME@13..14
-            IDENT@13..14 "c"
-        R_BRACK@14..15 "]"
-      WHITESPACE@15..16 " "
-      ASSIGN@16..17 "="
-      WHITESPACE@17..18 " "
-      EXPR_VAR@18..21
-        NAME@18..21
-          IDENT@18..21 "arr"
-    SEMI@21..22 ";"
-  WHITESPACE@22..23 "\n"
-  STMT_LOCAL@23..49
-    LOCAL_KW@23..28 "local"
-    WHITESPACE@28..29 " "
-    BIND_DESTRUCT@29..48
-      DESTRUCT_ARRAY@29..37
-        L_BRACK@29..30 "["
-        DESTRUCT_FULL@30..31
-          NAME@30..31
-            IDENT@30..31 "a"
-        COMMA@31..32 ","
-        WHITESPACE@32..33 " "
-        DESTRUCT_REST@33..36
-          DOTDOTDOT@33..36 "..."
-        R_BRACK@36..37 "]"
-      WHITESPACE@37..38 " "
-      ASSIGN@38..39 "="
-      WHITESPACE@39..40 " "
-      EXPR_VAR@40..48
-        NAME@40..48
-          IDENT@40..48 "arr_rest"
-    SEMI@48..49 ";"
-  WHITESPACE@49..50 "\n"
-  STMT_LOCAL@50..76
-    LOCAL_KW@50..55 "local"
-    WHITESPACE@55..56 " "
-    BIND_DESTRUCT@56..75
-      DESTRUCT_ARRAY@56..64
-        L_BRACK@56..57 "["
-        DESTRUCT_REST@57..60
-          DOTDOTDOT@57..60 "..."
-        COMMA@60..61 ","
-        WHITESPACE@61..62 " "
-        DESTRUCT_FULL@62..63
-          NAME@62..63
-            IDENT@62..63 "a"
-        R_BRACK@63..64 "]"
-      WHITESPACE@64..65 " "
-      ASSIGN@65..66 "="
-      WHITESPACE@66..67 " "
-      EXPR_VAR@67..75
-        NAME@67..75
-          IDENT@67..75 "rest_arr"
-    SEMI@75..76 ";"
-  WHITESPACE@76..77 "\n"
-  STMT_LOCAL@77..103
-    LOCAL_KW@77..82 "local"
-    WHITESPACE@82..83 " "
-    BIND_DESTRUCT@83..102
-      DESTRUCT_ARRAY@83..88
-        L_BRACK@83..84 "["
-        DESTRUCT_REST@84..87
-          DOTDOTDOT@84..87 "..."
-        R_BRACK@87..88 "]"
-      WHITESPACE@88..89 " "
-      ASSIGN@89..90 "="
-      WHITESPACE@90..91 " "
-      EXPR_VAR@91..102
-        NAME@91..102
-          IDENT@91..102 "rest_in_arr"
-    SEMI@102..103 ";"
-  WHITESPACE@103..104 "\n"
-  STMT_LOCAL@104..133
-    LOCAL_KW@104..109 "local"
-    WHITESPACE@109..110 " "
-    BIND_DESTRUCT@110..132
-      DESTRUCT_ARRAY@110..119
-        L_BRACK@110..111 "["
-        DESTRUCT_FULL@111..112
-          NAME@111..112
-            IDENT@111..112 "a"
-        COMMA@112..113 ","
-        WHITESPACE@113..114 " "
-        DESTRUCT_REST@114..118
-          DOTDOTDOT@114..117 "..."
-          IDENT@117..118 "n"
-        R_BRACK@118..119 "]"
-      WHITESPACE@119..120 " "
-      ASSIGN@120..121 "="
-      WHITESPACE@121..122 " "
-      EXPR_VAR@122..132
-        NAME@122..132
-          IDENT@122..132 "arr_rest_n"
-    SEMI@132..133 ";"
-  WHITESPACE@133..134 "\n"
-  STMT_LOCAL@134..163
-    LOCAL_KW@134..139 "local"
-    WHITESPACE@139..140 " "
-    BIND_DESTRUCT@140..162
-      DESTRUCT_ARRAY@140..149
-        L_BRACK@140..141 "["
-        DESTRUCT_REST@141..145
-          DOTDOTDOT@141..144 "..."
-          IDENT@144..145 "n"
-        COMMA@145..146 ","
-        WHITESPACE@146..147 " "
-        DESTRUCT_FULL@147..148
-          NAME@147..148
-            IDENT@147..148 "a"
-        R_BRACK@148..149 "]"
-      WHITESPACE@149..150 " "
-      ASSIGN@150..151 "="
-      WHITESPACE@151..152 " "
-      EXPR_VAR@152..162
-        NAME@152..162
-          IDENT@152..162 "rest_arr_n"
-    SEMI@162..163 ";"
-  WHITESPACE@163..164 "\n"
-  STMT_LOCAL@164..193
-    LOCAL_KW@164..169 "local"
-    WHITESPACE@169..170 " "
-    BIND_DESTRUCT@170..192
-      DESTRUCT_ARRAY@170..176
-        L_BRACK@170..171 "["
-        DESTRUCT_REST@171..175
-          DOTDOTDOT@171..174 "..."
-          IDENT@174..175 "n"
-        R_BRACK@175..176 "]"
-      WHITESPACE@176..177 " "
-      ASSIGN@177..178 "="
-      WHITESPACE@178..179 " "
-      EXPR_VAR@179..192
-        NAME@179..192
-          IDENT@179..192 "rest_in_arr_n"
-    SEMI@192..193 ";"
-  WHITESPACE@193..195 "\n\n"
-  STMT_LOCAL@195..217
-    LOCAL_KW@195..200 "local"
-    WHITESPACE@200..201 " "
-    BIND_DESTRUCT@201..216
-      DESTRUCT_OBJECT@201..210
-        L_BRACE@201..202 "{"
-        DESTRUCT_OBJECT_FIELD@202..203
-          NAME@202..203
-            IDENT@202..203 "a"
-        COMMA@203..204 ","
-        WHITESPACE@204..205 " "
-        DESTRUCT_OBJECT_FIELD@205..206
-          NAME@205..206
-            IDENT@205..206 "b"
-        COMMA@206..207 ","
-        WHITESPACE@207..208 " "
-        DESTRUCT_OBJECT_FIELD@208..209
-          NAME@208..209
-            IDENT@208..209 "c"
-        R_BRACE@209..210 "}"
-      WHITESPACE@210..211 " "
-      ASSIGN@211..212 "="
-      WHITESPACE@212..213 " "
-      EXPR_VAR@213..216
-        NAME@213..216
-          IDENT@213..216 "obj"
-    SEMI@216..217 ";"
-  WHITESPACE@217..218 "\n"
-  STMT_LOCAL@218..250
-    LOCAL_KW@218..223 "local"
-    WHITESPACE@223..224 " "
-    BIND_DESTRUCT@224..249
-      DESTRUCT_OBJECT@224..238
-        L_BRACE@224..225 "{"
-        DESTRUCT_OBJECT_FIELD@225..226
-          NAME@225..226
-            IDENT@225..226 "a"
-        COMMA@226..227 ","
-        WHITESPACE@227..228 " "
-        DESTRUCT_OBJECT_FIELD@228..229
-          NAME@228..229
-            IDENT@228..229 "b"
-        COMMA@229..230 ","
-        WHITESPACE@230..231 " "
-        DESTRUCT_OBJECT_FIELD@231..232
-          NAME@231..232
-            IDENT@231..232 "c"
-        COMMA@232..233 ","
-        WHITESPACE@233..234 " "
-        DESTRUCT_REST@234..237
-          DOTDOTDOT@234..237 "..."
-        R_BRACE@237..238 "}"
-      WHITESPACE@238..239 " "
-      ASSIGN@239..240 "="
-      WHITESPACE@240..241 " "
-      EXPR_VAR@241..249
-        NAME@241..249
-          IDENT@241..249 "obj_rest"
-    SEMI@249..250 ";"
-  WHITESPACE@250..251 "\n"
-  STMT_LOCAL@251..286
-    LOCAL_KW@251..256 "local"
-    WHITESPACE@256..257 " "
-    BIND_DESTRUCT@257..285
-      DESTRUCT_OBJECT@257..272
-        L_BRACE@257..258 "{"
-        DESTRUCT_OBJECT_FIELD@258..259
-          NAME@258..259
-            IDENT@258..259 "a"
-        COMMA@259..260 ","
-        WHITESPACE@260..261 " "
-        DESTRUCT_OBJECT_FIELD@261..262
-          NAME@261..262
-            IDENT@261..262 "b"
-        COMMA@262..263 ","
-        WHITESPACE@263..264 " "
-        DESTRUCT_OBJECT_FIELD@264..265
-          NAME@264..265
-            IDENT@264..265 "c"
-        COMMA@265..266 ","
-        WHITESPACE@266..267 " "
-        DESTRUCT_REST@267..271
-          DOTDOTDOT@267..270 "..."
-          IDENT@270..271 "n"
-        R_BRACE@271..272 "}"
-      WHITESPACE@272..273 " "
-      ASSIGN@273..274 "="
-      WHITESPACE@274..275 " "
-      EXPR_VAR@275..285
-        NAME@275..285
-          IDENT@275..285 "obj_rest_n"
-    SEMI@285..286 ";"
-  WHITESPACE@286..288 "\n\n"
-  EXPR_LITERAL@288..292
-    NULL_KW@288..292 "null"
+  EXPR@0..292
+    STMT_LOCAL@0..22
+      LOCAL_KW@0..5 "local"
+      WHITESPACE@5..6 " "
+      BIND_DESTRUCT@6..21
+        DESTRUCT_ARRAY@6..15
+          L_BRACK@6..7 "["
+          DESTRUCT_FULL@7..8
+            NAME@7..8
+              IDENT@7..8 "a"
+          COMMA@8..9 ","
+          WHITESPACE@9..10 " "
+          DESTRUCT_FULL@10..11
+            NAME@10..11
+              IDENT@10..11 "b"
+          COMMA@11..12 ","
+          WHITESPACE@12..13 " "
+          DESTRUCT_FULL@13..14
+            NAME@13..14
+              IDENT@13..14 "c"
+          R_BRACK@14..15 "]"
+        WHITESPACE@15..16 " "
+        ASSIGN@16..17 "="
+        WHITESPACE@17..18 " "
+        EXPR@18..21
+          EXPR_VAR@18..21
+            NAME@18..21
+              IDENT@18..21 "arr"
+      SEMI@21..22 ";"
+    WHITESPACE@22..23 "\n"
+    STMT_LOCAL@23..49
+      LOCAL_KW@23..28 "local"
+      WHITESPACE@28..29 " "
+      BIND_DESTRUCT@29..48
+        DESTRUCT_ARRAY@29..37
+          L_BRACK@29..30 "["
+          DESTRUCT_FULL@30..31
+            NAME@30..31
+              IDENT@30..31 "a"
+          COMMA@31..32 ","
+          WHITESPACE@32..33 " "
+          DESTRUCT_REST@33..36
+            DOTDOTDOT@33..36 "..."
+          R_BRACK@36..37 "]"
+        WHITESPACE@37..38 " "
+        ASSIGN@38..39 "="
+        WHITESPACE@39..40 " "
+        EXPR@40..48
+          EXPR_VAR@40..48
+            NAME@40..48
+              IDENT@40..48 "arr_rest"
+      SEMI@48..49 ";"
+    WHITESPACE@49..50 "\n"
+    STMT_LOCAL@50..76
+      LOCAL_KW@50..55 "local"
+      WHITESPACE@55..56 " "
+      BIND_DESTRUCT@56..75
+        DESTRUCT_ARRAY@56..64
+          L_BRACK@56..57 "["
+          DESTRUCT_REST@57..60
+            DOTDOTDOT@57..60 "..."
+          COMMA@60..61 ","
+          WHITESPACE@61..62 " "
+          DESTRUCT_FULL@62..63
+            NAME@62..63
+              IDENT@62..63 "a"
+          R_BRACK@63..64 "]"
+        WHITESPACE@64..65 " "
+        ASSIGN@65..66 "="
+        WHITESPACE@66..67 " "
+        EXPR@67..75
+          EXPR_VAR@67..75
+            NAME@67..75
+              IDENT@67..75 "rest_arr"
+      SEMI@75..76 ";"
+    WHITESPACE@76..77 "\n"
+    STMT_LOCAL@77..103
+      LOCAL_KW@77..82 "local"
+      WHITESPACE@82..83 " "
+      BIND_DESTRUCT@83..102
+        DESTRUCT_ARRAY@83..88
+          L_BRACK@83..84 "["
+          DESTRUCT_REST@84..87
+            DOTDOTDOT@84..87 "..."
+          R_BRACK@87..88 "]"
+        WHITESPACE@88..89 " "
+        ASSIGN@89..90 "="
+        WHITESPACE@90..91 " "
+        EXPR@91..102
+          EXPR_VAR@91..102
+            NAME@91..102
+              IDENT@91..102 "rest_in_arr"
+      SEMI@102..103 ";"
+    WHITESPACE@103..104 "\n"
+    STMT_LOCAL@104..133
+      LOCAL_KW@104..109 "local"
+      WHITESPACE@109..110 " "
+      BIND_DESTRUCT@110..132
+        DESTRUCT_ARRAY@110..119
+          L_BRACK@110..111 "["
+          DESTRUCT_FULL@111..112
+            NAME@111..112
+              IDENT@111..112 "a"
+          COMMA@112..113 ","
+          WHITESPACE@113..114 " "
+          DESTRUCT_REST@114..118
+            DOTDOTDOT@114..117 "..."
+            IDENT@117..118 "n"
+          R_BRACK@118..119 "]"
+        WHITESPACE@119..120 " "
+        ASSIGN@120..121 "="
+        WHITESPACE@121..122 " "
+        EXPR@122..132
+          EXPR_VAR@122..132
+            NAME@122..132
+              IDENT@122..132 "arr_rest_n"
+      SEMI@132..133 ";"
+    WHITESPACE@133..134 "\n"
+    STMT_LOCAL@134..163
+      LOCAL_KW@134..139 "local"
+      WHITESPACE@139..140 " "
+      BIND_DESTRUCT@140..162
+        DESTRUCT_ARRAY@140..149
+          L_BRACK@140..141 "["
+          DESTRUCT_REST@141..145
+            DOTDOTDOT@141..144 "..."
+            IDENT@144..145 "n"
+          COMMA@145..146 ","
+          WHITESPACE@146..147 " "
+          DESTRUCT_FULL@147..148
+            NAME@147..148
+              IDENT@147..148 "a"
+          R_BRACK@148..149 "]"
+        WHITESPACE@149..150 " "
+        ASSIGN@150..151 "="
+        WHITESPACE@151..152 " "
+        EXPR@152..162
+          EXPR_VAR@152..162
+            NAME@152..162
+              IDENT@152..162 "rest_arr_n"
+      SEMI@162..163 ";"
+    WHITESPACE@163..164 "\n"
+    STMT_LOCAL@164..193
+      LOCAL_KW@164..169 "local"
+      WHITESPACE@169..170 " "
+      BIND_DESTRUCT@170..192
+        DESTRUCT_ARRAY@170..176
+          L_BRACK@170..171 "["
+          DESTRUCT_REST@171..175
+            DOTDOTDOT@171..174 "..."
+            IDENT@174..175 "n"
+          R_BRACK@175..176 "]"
+        WHITESPACE@176..177 " "
+        ASSIGN@177..178 "="
+        WHITESPACE@178..179 " "
+        EXPR@179..192
+          EXPR_VAR@179..192
+            NAME@179..192
+              IDENT@179..192 "rest_in_arr_n"
+      SEMI@192..193 ";"
+    WHITESPACE@193..195 "\n\n"
+    STMT_LOCAL@195..217
+      LOCAL_KW@195..200 "local"
+      WHITESPACE@200..201 " "
+      BIND_DESTRUCT@201..216
+        DESTRUCT_OBJECT@201..210
+          L_BRACE@201..202 "{"
+          DESTRUCT_OBJECT_FIELD@202..203
+            NAME@202..203
+              IDENT@202..203 "a"
+          COMMA@203..204 ","
+          WHITESPACE@204..205 " "
+          DESTRUCT_OBJECT_FIELD@205..206
+            NAME@205..206
+              IDENT@205..206 "b"
+          COMMA@206..207 ","
+          WHITESPACE@207..208 " "
+          DESTRUCT_OBJECT_FIELD@208..209
+            NAME@208..209
+              IDENT@208..209 "c"
+          R_BRACE@209..210 "}"
+        WHITESPACE@210..211 " "
+        ASSIGN@211..212 "="
+        WHITESPACE@212..213 " "
+        EXPR@213..216
+          EXPR_VAR@213..216
+            NAME@213..216
+              IDENT@213..216 "obj"
+      SEMI@216..217 ";"
+    WHITESPACE@217..218 "\n"
+    STMT_LOCAL@218..250
+      LOCAL_KW@218..223 "local"
+      WHITESPACE@223..224 " "
+      BIND_DESTRUCT@224..249
+        DESTRUCT_OBJECT@224..238
+          L_BRACE@224..225 "{"
+          DESTRUCT_OBJECT_FIELD@225..226
+            NAME@225..226
+              IDENT@225..226 "a"
+          COMMA@226..227 ","
+          WHITESPACE@227..228 " "
+          DESTRUCT_OBJECT_FIELD@228..229
+            NAME@228..229
+              IDENT@228..229 "b"
+          COMMA@229..230 ","
+          WHITESPACE@230..231 " "
+          DESTRUCT_OBJECT_FIELD@231..232
+            NAME@231..232
+              IDENT@231..232 "c"
+          COMMA@232..233 ","
+          WHITESPACE@233..234 " "
+          DESTRUCT_REST@234..237
+            DOTDOTDOT@234..237 "..."
+          R_BRACE@237..238 "}"
+        WHITESPACE@238..239 " "
+        ASSIGN@239..240 "="
+        WHITESPACE@240..241 " "
+        EXPR@241..249
+          EXPR_VAR@241..249
+            NAME@241..249
+              IDENT@241..249 "obj_rest"
+      SEMI@249..250 ";"
+    WHITESPACE@250..251 "\n"
+    STMT_LOCAL@251..286
+      LOCAL_KW@251..256 "local"
+      WHITESPACE@256..257 " "
+      BIND_DESTRUCT@257..285
+        DESTRUCT_OBJECT@257..272
+          L_BRACE@257..258 "{"
+          DESTRUCT_OBJECT_FIELD@258..259
+            NAME@258..259
+              IDENT@258..259 "a"
+          COMMA@259..260 ","
+          WHITESPACE@260..261 " "
+          DESTRUCT_OBJECT_FIELD@261..262
+            NAME@261..262
+              IDENT@261..262 "b"
+          COMMA@262..263 ","
+          WHITESPACE@263..264 " "
+          DESTRUCT_OBJECT_FIELD@264..265
+            NAME@264..265
+              IDENT@264..265 "c"
+          COMMA@265..266 ","
+          WHITESPACE@266..267 " "
+          DESTRUCT_REST@267..271
+            DOTDOTDOT@267..270 "..."
+            IDENT@270..271 "n"
+          R_BRACE@271..272 "}"
+        WHITESPACE@272..273 " "
+        ASSIGN@273..274 "="
+        WHITESPACE@274..275 " "
+        EXPR@275..285
+          EXPR_VAR@275..285
+            NAME@275..285
+              IDENT@275..285 "obj_rest_n"
+      SEMI@285..286 ";"
+    WHITESPACE@286..288 "\n\n"
+    EXPR_LITERAL@288..292
+      NULL_KW@288..292 "null"
   WHITESPACE@292..293 "\n"
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__empty.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__empty.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__empty.snap
@@ -4,7 +4,8 @@
 ---
 SOURCE_FILE@0..1
   WHITESPACE@0..1 " "
-  ERROR_MISSING_TOKEN@1..1
+  EXPR@1..1
+    ERROR_MISSING_TOKEN@1..1
 ===
 LocatedSyntaxError { error: Missing { expected: Named("expression") }, range: 1..1 }
 ===
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__function.snapdiffbeforeafterboth
3expression: "function(a, b = 1) a + b\n"3expression: "function(a, b = 1) a + b\n"
4---4---
5SOURCE_FILE@0..255SOURCE_FILE@0..25
6 EXPR_FUNCTION@0..246 EXPR@0..24
7 EXPR_FUNCTION@0..24
7 FUNCTION_KW@0..8 "function"8 FUNCTION_KW@0..8 "function"
8 PARAMS_DESC@8..189 PARAMS_DESC@8..18
9 L_PAREN@8..9 "("10 L_PAREN@8..9 "("
10 PARAM@9..1011 PARAM@9..10
11 DESTRUCT_FULL@9..1012 DESTRUCT_FULL@9..10
12 NAME@9..1013 NAME@9..10
13 IDENT@9..10 "a"14 IDENT@9..10 "a"
14 COMMA@10..11 ","15 COMMA@10..11 ","
15 WHITESPACE@11..12 " "16 WHITESPACE@11..12 " "
16 PARAM@12..1717 PARAM@12..17
17 DESTRUCT_FULL@12..1318 DESTRUCT_FULL@12..13
18 NAME@12..1319 NAME@12..13
19 IDENT@12..13 "b"20 IDENT@12..13 "b"
20 WHITESPACE@13..14 " "21 WHITESPACE@13..14 " "
21 ASSIGN@14..15 "="22 ASSIGN@14..15 "="
22 WHITESPACE@15..16 " "23 WHITESPACE@15..16 " "
23 EXPR_NUMBER@16..1724 EXPR@16..17
25 EXPR_NUMBER@16..17
24 FLOAT@16..17 "1"26 FLOAT@16..17 "1"
25 R_PAREN@17..18 ")"27 R_PAREN@17..18 ")"
26 WHITESPACE@18..19 " "28 WHITESPACE@18..19 " "
27 EXPR_BINARY@19..2429 EXPR@19..24
30 EXPR_BINARY@19..24
28 LHS_EXPR@19..2031 EXPR@19..20
29 EXPR_VAR@19..2032 EXPR_VAR@19..20
30 NAME@19..2033 NAME@19..20
31 IDENT@19..20 "a"34 IDENT@19..20 "a"
32 WHITESPACE@20..21 " "35 WHITESPACE@20..21 " "
33 PLUS@21..22 "+"36 PLUS@21..22 "+"
34 WHITESPACE@22..23 " "37 WHITESPACE@22..23 " "
35 EXPR_VAR@23..2438 EXPR@23..24
39 EXPR_VAR@23..24
36 NAME@23..2440 NAME@23..24
37 IDENT@23..24 "b"41 IDENT@23..24 "b"
38 WHITESPACE@24..25 "\n"42 WHITESPACE@24..25 "\n"
39
4043
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__function_error_body.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__function_error_body.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__function_error_body.snap
@@ -3,23 +3,25 @@
 expression: "function(a, b)\n"
 ---
 SOURCE_FILE@0..15
-  EXPR_FUNCTION@0..15
-    FUNCTION_KW@0..8 "function"
-    PARAMS_DESC@8..14
-      L_PAREN@8..9 "("
-      PARAM@9..10
-        DESTRUCT_FULL@9..10
-          NAME@9..10
-            IDENT@9..10 "a"
-      COMMA@10..11 ","
-      WHITESPACE@11..12 " "
-      PARAM@12..13
-        DESTRUCT_FULL@12..13
-          NAME@12..13
-            IDENT@12..13 "b"
-      R_PAREN@13..14 ")"
-    WHITESPACE@14..15 "\n"
-    ERROR_MISSING_TOKEN@15..15
+  EXPR@0..15
+    EXPR_FUNCTION@0..15
+      FUNCTION_KW@0..8 "function"
+      PARAMS_DESC@8..14
+        L_PAREN@8..9 "("
+        PARAM@9..10
+          DESTRUCT_FULL@9..10
+            NAME@9..10
+              IDENT@9..10 "a"
+        COMMA@10..11 ","
+        WHITESPACE@11..12 " "
+        PARAM@12..13
+          DESTRUCT_FULL@12..13
+            NAME@12..13
+              IDENT@12..13 "b"
+        R_PAREN@13..14 ")"
+      WHITESPACE@14..15 "\n"
+      EXPR@15..15
+        ERROR_MISSING_TOKEN@15..15
 ===
 LocatedSyntaxError { error: Missing { expected: Named("expression") }, range: 15..15 }
 ===
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__function_error_no_value.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__function_error_no_value.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__function_error_no_value.snap
@@ -3,37 +3,41 @@
 expression: "function(a, b = ) a + b\n"
 ---
 SOURCE_FILE@0..24
-  EXPR_FUNCTION@0..23
-    FUNCTION_KW@0..8 "function"
-    PARAMS_DESC@8..17
-      L_PAREN@8..9 "("
-      PARAM@9..10
-        DESTRUCT_FULL@9..10
-          NAME@9..10
-            IDENT@9..10 "a"
-      COMMA@10..11 ","
-      WHITESPACE@11..12 " "
-      PARAM@12..16
-        DESTRUCT_FULL@12..13
-          NAME@12..13
-            IDENT@12..13 "b"
-        WHITESPACE@13..14 " "
-        ASSIGN@14..15 "="
-        WHITESPACE@15..16 " "
-        ERROR_MISSING_TOKEN@16..16
-      R_PAREN@16..17 ")"
-    WHITESPACE@17..18 " "
-    EXPR_BINARY@18..23
-      LHS_EXPR@18..19
-        EXPR_VAR@18..19
-          NAME@18..19
-            IDENT@18..19 "a"
-      WHITESPACE@19..20 " "
-      PLUS@20..21 "+"
-      WHITESPACE@21..22 " "
-      EXPR_VAR@22..23
-        NAME@22..23
-          IDENT@22..23 "b"
+  EXPR@0..23
+    EXPR_FUNCTION@0..23
+      FUNCTION_KW@0..8 "function"
+      PARAMS_DESC@8..17
+        L_PAREN@8..9 "("
+        PARAM@9..10
+          DESTRUCT_FULL@9..10
+            NAME@9..10
+              IDENT@9..10 "a"
+        COMMA@10..11 ","
+        WHITESPACE@11..12 " "
+        PARAM@12..16
+          DESTRUCT_FULL@12..13
+            NAME@12..13
+              IDENT@12..13 "b"
+          WHITESPACE@13..14 " "
+          ASSIGN@14..15 "="
+          WHITESPACE@15..16 " "
+          EXPR@16..16
+            ERROR_MISSING_TOKEN@16..16
+        R_PAREN@16..17 ")"
+      WHITESPACE@17..18 " "
+      EXPR@18..23
+        EXPR_BINARY@18..23
+          EXPR@18..19
+            EXPR_VAR@18..19
+              NAME@18..19
+                IDENT@18..19 "a"
+          WHITESPACE@19..20 " "
+          PLUS@20..21 "+"
+          WHITESPACE@21..22 " "
+          EXPR@22..23
+            EXPR_VAR@22..23
+              NAME@22..23
+                IDENT@22..23 "b"
   WHITESPACE@23..24 "\n"
 ===
 LocatedSyntaxError { error: Missing { expected: Named("expression") }, range: 16..16 }
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__function_error_rparen.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__function_error_rparen.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__function_error_rparen.snap
@@ -3,23 +3,25 @@
 expression: "function(a, b\n"
 ---
 SOURCE_FILE@0..14
-  EXPR_FUNCTION@0..14
-    FUNCTION_KW@0..8 "function"
-    PARAMS_DESC@8..14
-      L_PAREN@8..9 "("
-      PARAM@9..10
-        DESTRUCT_FULL@9..10
-          NAME@9..10
-            IDENT@9..10 "a"
-      COMMA@10..11 ","
-      WHITESPACE@11..12 " "
-      PARAM@12..13
-        DESTRUCT_FULL@12..13
-          NAME@12..13
-            IDENT@12..13 "b"
-      WHITESPACE@13..14 "\n"
-      ERROR_MISSING_TOKEN@14..14
-    ERROR_MISSING_TOKEN@14..14
+  EXPR@0..14
+    EXPR_FUNCTION@0..14
+      FUNCTION_KW@0..8 "function"
+      PARAMS_DESC@8..14
+        L_PAREN@8..9 "("
+        PARAM@9..10
+          DESTRUCT_FULL@9..10
+            NAME@9..10
+              IDENT@9..10 "a"
+        COMMA@10..11 ","
+        WHITESPACE@11..12 " "
+        PARAM@12..13
+          DESTRUCT_FULL@12..13
+            NAME@12..13
+              IDENT@12..13 "b"
+        WHITESPACE@13..14 "\n"
+        ERROR_MISSING_TOKEN@14..14
+      EXPR@14..14
+        ERROR_MISSING_TOKEN@14..14
 ===
 LocatedSyntaxError { error: Missing { expected: Unnamed(SyntaxKindSet([R_PAREN, COMMA, ASSIGN])) }, range: 14..14 }
 LocatedSyntaxError { error: Missing { expected: Named("expression") }, range: 14..14 }
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__local_method.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__local_method.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__local_method.snap
@@ -3,50 +3,53 @@
 expression: "local\n\ta(x) = x,\n\ta = function(x) x,\n; c\n"
 ---
 SOURCE_FILE@0..41
-  STMT_LOCAL@0..38
-    LOCAL_KW@0..5 "local"
-    WHITESPACE@5..7 "\n\t"
-    BIND_FUNCTION@7..15
-      NAME@7..8
-        IDENT@7..8 "a"
-      PARAMS_DESC@8..11
-        L_PAREN@8..9 "("
-        PARAM@9..10
-          DESTRUCT_FULL@9..10
-            NAME@9..10
-              IDENT@9..10 "x"
-        R_PAREN@10..11 ")"
-      WHITESPACE@11..12 " "
-      ASSIGN@12..13 "="
-      WHITESPACE@13..14 " "
-      EXPR_VAR@14..15
-        NAME@14..15
-          IDENT@14..15 "x"
-    COMMA@15..16 ","
-    WHITESPACE@16..18 "\n\t"
-    BIND_FUNCTION@18..35
-      NAME@18..19
-        IDENT@18..19 "a"
-      WHITESPACE@19..20 " "
-      ASSIGN@20..21 "="
-      WHITESPACE@21..22 " "
-      FUNCTION_KW@22..30 "function"
-      PARAMS_DESC@30..33
-        L_PAREN@30..31 "("
-        PARAM@31..32
-          DESTRUCT_FULL@31..32
-            NAME@31..32
-              IDENT@31..32 "x"
-        R_PAREN@32..33 ")"
-      WHITESPACE@33..34 " "
-      EXPR_VAR@34..35
-        NAME@34..35
-          IDENT@34..35 "x"
-    COMMA@35..36 ","
-    WHITESPACE@36..37 "\n"
-    SEMI@37..38 ";"
-  WHITESPACE@38..39 " "
-  EXPR_VAR@39..40
-    NAME@39..40
-      IDENT@39..40 "c"
+  EXPR@0..40
+    STMT_LOCAL@0..38
+      LOCAL_KW@0..5 "local"
+      WHITESPACE@5..7 "\n\t"
+      BIND_FUNCTION@7..15
+        NAME@7..8
+          IDENT@7..8 "a"
+        PARAMS_DESC@8..11
+          L_PAREN@8..9 "("
+          PARAM@9..10
+            DESTRUCT_FULL@9..10
+              NAME@9..10
+                IDENT@9..10 "x"
+          R_PAREN@10..11 ")"
+        WHITESPACE@11..12 " "
+        ASSIGN@12..13 "="
+        WHITESPACE@13..14 " "
+        EXPR@14..15
+          EXPR_VAR@14..15
+            NAME@14..15
+              IDENT@14..15 "x"
+      COMMA@15..16 ","
+      WHITESPACE@16..18 "\n\t"
+      BIND_FUNCTION@18..35
+        NAME@18..19
+          IDENT@18..19 "a"
+        WHITESPACE@19..20 " "
+        ASSIGN@20..21 "="
+        WHITESPACE@21..22 " "
+        FUNCTION_KW@22..30 "function"
+        PARAMS_DESC@30..33
+          L_PAREN@30..31 "("
+          PARAM@31..32
+            DESTRUCT_FULL@31..32
+              NAME@31..32
+                IDENT@31..32 "x"
+          R_PAREN@32..33 ")"
+        WHITESPACE@33..34 " "
+        EXPR@34..35
+          EXPR_VAR@34..35
+            NAME@34..35
+              IDENT@34..35 "x"
+      COMMA@35..36 ","
+      WHITESPACE@36..37 "\n"
+      SEMI@37..38 ";"
+    WHITESPACE@38..39 " "
+    EXPR_VAR@39..40
+      NAME@39..40
+        IDENT@39..40 "c"
   WHITESPACE@40..41 "\n"
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__local_no_value_recovery.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__local_no_value_recovery.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__local_no_value_recovery.snap
@@ -3,37 +3,40 @@
 expression: "local a =\nlocal b = 3;\n1\n"
 ---
 SOURCE_FILE@0..25
-  STMT_LOCAL@0..25
-    LOCAL_KW@0..5 "local"
-    WHITESPACE@5..6 " "
-    BIND_DESTRUCT@6..24
-      DESTRUCT_FULL@6..7
-        NAME@6..7
-          IDENT@6..7 "a"
-      WHITESPACE@7..8 " "
-      ASSIGN@8..9 "="
-      WHITESPACE@9..10 "\n"
-      STMT_LOCAL@10..22
-        LOCAL_KW@10..15 "local"
-        WHITESPACE@15..16 " "
-        BIND_DESTRUCT@16..21
-          DESTRUCT_FULL@16..17
-            NAME@16..17
-              IDENT@16..17 "b"
-          WHITESPACE@17..18 " "
-          ASSIGN@18..19 "="
-          WHITESPACE@19..20 " "
-          EXPR_NUMBER@20..21
-            FLOAT@20..21 "3"
-        SEMI@21..22 ";"
-      WHITESPACE@22..23 "\n"
-      EXPR_NUMBER@23..24
-        FLOAT@23..24 "1"
-    WHITESPACE@24..25 "\n"
+  EXPR@0..25
+    STMT_LOCAL@0..25
+      LOCAL_KW@0..5 "local"
+      WHITESPACE@5..6 " "
+      BIND_DESTRUCT@6..24
+        DESTRUCT_FULL@6..7
+          NAME@6..7
+            IDENT@6..7 "a"
+        WHITESPACE@7..8 " "
+        ASSIGN@8..9 "="
+        WHITESPACE@9..10 "\n"
+        EXPR@10..24
+          STMT_LOCAL@10..22
+            LOCAL_KW@10..15 "local"
+            WHITESPACE@15..16 " "
+            BIND_DESTRUCT@16..21
+              DESTRUCT_FULL@16..17
+                NAME@16..17
+                  IDENT@16..17 "b"
+              WHITESPACE@17..18 " "
+              ASSIGN@18..19 "="
+              WHITESPACE@19..20 " "
+              EXPR@20..21
+                EXPR_NUMBER@20..21
+                  FLOAT@20..21 "3"
+            SEMI@21..22 ";"
+          WHITESPACE@22..23 "\n"
+          EXPR_NUMBER@23..24
+            FLOAT@23..24 "1"
+      WHITESPACE@24..25 "\n"
+      ERROR_MISSING_TOKEN@25..25
     ERROR_MISSING_TOKEN@25..25
-  ERROR_MISSING_TOKEN@25..25
 ===
-LocatedSyntaxError { error: Missing { expected: Unnamed(SyntaxKindSet([L_BRACK, L_PAREN, L_BRACE, SEMI, DOT, COMMA])) }, range: 25..25 }
+LocatedSyntaxError { error: Missing { expected: Unnamed(SyntaxKindSet([L_BRACK, L_PAREN, L_BRACE, SEMI, DOT, COMMA, QUESTION_MARK])) }, range: 25..25 }
 LocatedSyntaxError { error: Missing { expected: Named("expression") }, range: 25..25 }
 ===
   x syntax error
@@ -42,5 +45,5 @@
  3 | 1
    :   ^^
    :   |`-- missing expression
-   :   `-- missing L_BRACK, L_PAREN, L_BRACE, SEMI, DOT or COMMA
+   :   `-- missing L_BRACK, L_PAREN, L_BRACE, SEMI, DOT, COMMA or QUESTION_MARK
    `----
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__local_novalue.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__local_novalue.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__local_novalue.snap
@@ -3,19 +3,21 @@
 expression: "local a =\n"
 ---
 SOURCE_FILE@0..10
-  STMT_LOCAL@0..10
-    LOCAL_KW@0..5 "local"
-    WHITESPACE@5..6 " "
-    BIND_DESTRUCT@6..10
-      DESTRUCT_FULL@6..7
-        NAME@6..7
-          IDENT@6..7 "a"
-      WHITESPACE@7..8 " "
-      ASSIGN@8..9 "="
-      WHITESPACE@9..10 "\n"
+  EXPR@0..10
+    STMT_LOCAL@0..10
+      LOCAL_KW@0..5 "local"
+      WHITESPACE@5..6 " "
+      BIND_DESTRUCT@6..10
+        DESTRUCT_FULL@6..7
+          NAME@6..7
+            IDENT@6..7 "a"
+        WHITESPACE@7..8 " "
+        ASSIGN@8..9 "="
+        WHITESPACE@9..10 "\n"
+        EXPR@10..10
+          ERROR_MISSING_TOKEN@10..10
       ERROR_MISSING_TOKEN@10..10
     ERROR_MISSING_TOKEN@10..10
-  ERROR_MISSING_TOKEN@10..10
 ===
 LocatedSyntaxError { error: Missing { expected: Named("expression") }, range: 10..10 }
 LocatedSyntaxError { error: Missing { expected: Unnamed(SyntaxKindSet([SEMI, COMMA])) }, range: 10..10 }
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__named_before_positional.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__named_before_positional.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__named_before_positional.snap
@@ -3,57 +3,65 @@
 expression: "a(1, 2, b=4, 3, 5, k = 12, 6)\n"
 ---
 SOURCE_FILE@0..30
-  EXPR_APPLY@0..29
+  EXPR@0..29
     EXPR_VAR@0..1
       NAME@0..1
         IDENT@0..1 "a"
-    ARGS_DESC@1..29
-      L_PAREN@1..2 "("
-      ARG@2..3
-        EXPR_NUMBER@2..3
-          FLOAT@2..3 "1"
-      COMMA@3..4 ","
-      WHITESPACE@4..5 " "
-      ARG@5..6
-        EXPR_NUMBER@5..6
-          FLOAT@5..6 "2"
-      COMMA@6..7 ","
-      WHITESPACE@7..8 " "
-      ARG@8..11
-        NAME@8..9
-          IDENT@8..9 "b"
-        ASSIGN@9..10 "="
-        EXPR_NUMBER@10..11
-          FLOAT@10..11 "4"
-      COMMA@11..12 ","
-      WHITESPACE@12..13 " "
-      ERROR_CUSTOM@13..14
-        ARG@13..14
-          EXPR_NUMBER@13..14
-            FLOAT@13..14 "3"
-      COMMA@14..15 ","
-      WHITESPACE@15..16 " "
-      ERROR_CUSTOM@16..17
-        ARG@16..17
-          EXPR_NUMBER@16..17
-            FLOAT@16..17 "5"
-      COMMA@17..18 ","
-      WHITESPACE@18..19 " "
-      ARG@19..25
-        NAME@19..20
-          IDENT@19..20 "k"
-        WHITESPACE@20..21 " "
-        ASSIGN@21..22 "="
-        WHITESPACE@22..23 " "
-        EXPR_NUMBER@23..25
-          FLOAT@23..25 "12"
-      COMMA@25..26 ","
-      WHITESPACE@26..27 " "
-      ERROR_CUSTOM@27..28
-        ARG@27..28
-          EXPR_NUMBER@27..28
-            FLOAT@27..28 "6"
-      R_PAREN@28..29 ")"
+    SUFFIX_APPLY@1..29
+      ARGS_DESC@1..29
+        L_PAREN@1..2 "("
+        ARG@2..3
+          EXPR@2..3
+            EXPR_NUMBER@2..3
+              FLOAT@2..3 "1"
+        COMMA@3..4 ","
+        WHITESPACE@4..5 " "
+        ARG@5..6
+          EXPR@5..6
+            EXPR_NUMBER@5..6
+              FLOAT@5..6 "2"
+        COMMA@6..7 ","
+        WHITESPACE@7..8 " "
+        ARG@8..11
+          NAME@8..9
+            IDENT@8..9 "b"
+          ASSIGN@9..10 "="
+          EXPR@10..11
+            EXPR_NUMBER@10..11
+              FLOAT@10..11 "4"
+        COMMA@11..12 ","
+        WHITESPACE@12..13 " "
+        ERROR_CUSTOM@13..14
+          ARG@13..14
+            EXPR@13..14
+              EXPR_NUMBER@13..14
+                FLOAT@13..14 "3"
+        COMMA@14..15 ","
+        WHITESPACE@15..16 " "
+        ERROR_CUSTOM@16..17
+          ARG@16..17
+            EXPR@16..17
+              EXPR_NUMBER@16..17
+                FLOAT@16..17 "5"
+        COMMA@17..18 ","
+        WHITESPACE@18..19 " "
+        ARG@19..25
+          NAME@19..20
+            IDENT@19..20 "k"
+          WHITESPACE@20..21 " "
+          ASSIGN@21..22 "="
+          WHITESPACE@22..23 " "
+          EXPR@23..25
+            EXPR_NUMBER@23..25
+              FLOAT@23..25 "12"
+        COMMA@25..26 ","
+        WHITESPACE@26..27 " "
+        ERROR_CUSTOM@27..28
+          ARG@27..28
+            EXPR@27..28
+              EXPR_NUMBER@27..28
+                FLOAT@27..28 "6"
+        R_PAREN@28..29 ")"
   WHITESPACE@29..30 "\n"
 ===
 LocatedSyntaxError { error: Custom { error: "can't use positional arguments after named" }, range: 13..14 }
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__no_lhs.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__no_lhs.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__no_lhs.snap
@@ -3,7 +3,8 @@
 expression: "+ 2\n"
 ---
 SOURCE_FILE@0..4
-  ERROR_MISSING_TOKEN@0..0
+  EXPR@0..0
+    ERROR_MISSING_TOKEN@0..0
   ERROR_CUSTOM@0..3
     PLUS@0..1 "+"
     WHITESPACE@1..2 " "
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__no_operator.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__no_operator.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__no_operator.snap
@@ -3,8 +3,9 @@
 expression: "2 2\n"
 ---
 SOURCE_FILE@0..4
-  EXPR_NUMBER@0..1
-    FLOAT@0..1 "2"
+  EXPR@0..1
+    EXPR_NUMBER@0..1
+      FLOAT@0..1 "2"
   WHITESPACE@1..2 " "
   ERROR_CUSTOM@2..3
     FLOAT@2..3 "2"
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__no_rhs.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__no_rhs.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__no_rhs.snap
@@ -3,15 +3,16 @@
 expression: "a +\n"
 ---
 SOURCE_FILE@0..4
-  EXPR_BINARY@0..4
-    LHS_EXPR@0..1
-      EXPR_VAR@0..1
-        NAME@0..1
-          IDENT@0..1 "a"
-    WHITESPACE@1..2 " "
-    PLUS@2..3 "+"
-    WHITESPACE@3..4 "\n"
-    ERROR_MISSING_TOKEN@4..4
+  EXPR@0..4
+    EXPR_BINARY@0..4
+      EXPR@0..1
+        EXPR_VAR@0..1
+          NAME@0..1
+            IDENT@0..1 "a"
+      WHITESPACE@1..2 " "
+      PLUS@2..3 "+"
+      WHITESPACE@3..4 "\n"
+      ERROR_MISSING_TOKEN@4..4
 ===
 LocatedSyntaxError { error: Missing { expected: Named("expression") }, range: 4..4 }
 ===
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec.snap
@@ -3,37 +3,44 @@
 expression: "{a:1 for a in [1, 2, 3]}\n"
 ---
 SOURCE_FILE@0..25
-  EXPR_OBJECT@0..24
-    OBJ_BODY_COMP@0..24
-      L_BRACE@0..1 "{"
-      MEMBER_FIELD_NORMAL@1..4
-        FIELD_NAME_FIXED@1..2
-          NAME@1..2
-            IDENT@1..2 "a"
-        COLON@2..3 ":"
-        EXPR_NUMBER@3..4
-          FLOAT@3..4 "1"
-      WHITESPACE@4..5 " "
-      FOR_SPEC@5..23
-        FOR_KW@5..8 "for"
-        WHITESPACE@8..9 " "
-        NAME@9..10
-          IDENT@9..10 "a"
-        WHITESPACE@10..11 " "
-        IN_KW@11..13 "in"
-        WHITESPACE@13..14 " "
-        EXPR_ARRAY@14..23
-          L_BRACK@14..15 "["
-          EXPR_NUMBER@15..16
-            FLOAT@15..16 "1"
-          COMMA@16..17 ","
-          WHITESPACE@17..18 " "
-          EXPR_NUMBER@18..19
-            FLOAT@18..19 "2"
-          COMMA@19..20 ","
-          WHITESPACE@20..21 " "
-          EXPR_NUMBER@21..22
-            FLOAT@21..22 "3"
-          R_BRACK@22..23 "]"
-      R_BRACE@23..24 "}"
+  EXPR@0..24
+    EXPR_OBJECT@0..24
+      OBJ_BODY_COMP@0..24
+        L_BRACE@0..1 "{"
+        MEMBER_FIELD_NORMAL@1..4
+          FIELD_NAME_FIXED@1..2
+            NAME@1..2
+              IDENT@1..2 "a"
+          COLON@2..3 ":"
+          EXPR@3..4
+            EXPR_NUMBER@3..4
+              FLOAT@3..4 "1"
+        WHITESPACE@4..5 " "
+        FOR_SPEC@5..23
+          FOR_KW@5..8 "for"
+          WHITESPACE@8..9 " "
+          DESTRUCT_FULL@9..10
+            NAME@9..10
+              IDENT@9..10 "a"
+          WHITESPACE@10..11 " "
+          IN_KW@11..13 "in"
+          WHITESPACE@13..14 " "
+          EXPR@14..23
+            EXPR_ARRAY@14..23
+              L_BRACK@14..15 "["
+              EXPR@15..16
+                EXPR_NUMBER@15..16
+                  FLOAT@15..16 "1"
+              COMMA@16..17 ","
+              WHITESPACE@17..18 " "
+              EXPR@18..19
+                EXPR_NUMBER@18..19
+                  FLOAT@18..19 "2"
+              COMMA@19..20 ","
+              WHITESPACE@20..21 " "
+              EXPR@21..22
+                EXPR_NUMBER@21..22
+                  FLOAT@21..22 "3"
+              R_BRACK@22..23 "]"
+        R_BRACE@23..24 "}"
   WHITESPACE@24..25 "\n"
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_comma.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_comma.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_comma.snap
@@ -3,38 +3,45 @@
 expression: "{a:1, for a in [1, 2, 3]}\n"
 ---
 SOURCE_FILE@0..26
-  EXPR_OBJECT@0..25
-    OBJ_BODY_COMP@0..25
-      L_BRACE@0..1 "{"
-      MEMBER_FIELD_NORMAL@1..4
-        FIELD_NAME_FIXED@1..2
-          NAME@1..2
-            IDENT@1..2 "a"
-        COLON@2..3 ":"
-        EXPR_NUMBER@3..4
-          FLOAT@3..4 "1"
-      COMMA@4..5 ","
-      WHITESPACE@5..6 " "
-      FOR_SPEC@6..24
-        FOR_KW@6..9 "for"
-        WHITESPACE@9..10 " "
-        NAME@10..11
-          IDENT@10..11 "a"
-        WHITESPACE@11..12 " "
-        IN_KW@12..14 "in"
-        WHITESPACE@14..15 " "
-        EXPR_ARRAY@15..24
-          L_BRACK@15..16 "["
-          EXPR_NUMBER@16..17
-            FLOAT@16..17 "1"
-          COMMA@17..18 ","
-          WHITESPACE@18..19 " "
-          EXPR_NUMBER@19..20
-            FLOAT@19..20 "2"
-          COMMA@20..21 ","
-          WHITESPACE@21..22 " "
-          EXPR_NUMBER@22..23
-            FLOAT@22..23 "3"
-          R_BRACK@23..24 "]"
-      R_BRACE@24..25 "}"
+  EXPR@0..25
+    EXPR_OBJECT@0..25
+      OBJ_BODY_COMP@0..25
+        L_BRACE@0..1 "{"
+        MEMBER_FIELD_NORMAL@1..4
+          FIELD_NAME_FIXED@1..2
+            NAME@1..2
+              IDENT@1..2 "a"
+          COLON@2..3 ":"
+          EXPR@3..4
+            EXPR_NUMBER@3..4
+              FLOAT@3..4 "1"
+        COMMA@4..5 ","
+        WHITESPACE@5..6 " "
+        FOR_SPEC@6..24
+          FOR_KW@6..9 "for"
+          WHITESPACE@9..10 " "
+          DESTRUCT_FULL@10..11
+            NAME@10..11
+              IDENT@10..11 "a"
+          WHITESPACE@11..12 " "
+          IN_KW@12..14 "in"
+          WHITESPACE@14..15 " "
+          EXPR@15..24
+            EXPR_ARRAY@15..24
+              L_BRACK@15..16 "["
+              EXPR@16..17
+                EXPR_NUMBER@16..17
+                  FLOAT@16..17 "1"
+              COMMA@17..18 ","
+              WHITESPACE@18..19 " "
+              EXPR@19..20
+                EXPR_NUMBER@19..20
+                  FLOAT@19..20 "2"
+              COMMA@20..21 ","
+              WHITESPACE@21..22 " "
+              EXPR@22..23
+                EXPR_NUMBER@22..23
+                  FLOAT@22..23 "3"
+              R_BRACK@23..24 "]"
+        R_BRACE@24..25 "}"
   WHITESPACE@25..26 "\n"
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_incompatible_with_asserts.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_incompatible_with_asserts.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_incompatible_with_asserts.snap
@@ -3,48 +3,55 @@
 expression: "{assert 1, a: 1 for a in [1,2,3]}\n"
 ---
 SOURCE_FILE@0..34
-  EXPR_OBJECT@0..33
-    OBJ_BODY_COMP@0..33
-      L_BRACE@0..1 "{"
-      ERROR_CUSTOM@1..9
-        MEMBER_ASSERT_STMT@1..9
-          ASSERTION@1..9
-            ASSERT_KW@1..7 "assert"
-            WHITESPACE@7..8 " "
-            LHS_EXPR@8..9
-              EXPR_NUMBER@8..9
-                FLOAT@8..9 "1"
-      COMMA@9..10 ","
-      WHITESPACE@10..11 " "
-      MEMBER_FIELD_NORMAL@11..15
-        FIELD_NAME_FIXED@11..12
-          NAME@11..12
-            IDENT@11..12 "a"
-        COLON@12..13 ":"
-        WHITESPACE@13..14 " "
-        EXPR_NUMBER@14..15
-          FLOAT@14..15 "1"
-      WHITESPACE@15..16 " "
-      FOR_SPEC@16..32
-        FOR_KW@16..19 "for"
-        WHITESPACE@19..20 " "
-        NAME@20..21
-          IDENT@20..21 "a"
-        WHITESPACE@21..22 " "
-        IN_KW@22..24 "in"
-        WHITESPACE@24..25 " "
-        EXPR_ARRAY@25..32
-          L_BRACK@25..26 "["
-          EXPR_NUMBER@26..27
-            FLOAT@26..27 "1"
-          COMMA@27..28 ","
-          EXPR_NUMBER@28..29
-            FLOAT@28..29 "2"
-          COMMA@29..30 ","
-          EXPR_NUMBER@30..31
-            FLOAT@30..31 "3"
-          R_BRACK@31..32 "]"
-      R_BRACE@32..33 "}"
+  EXPR@0..33
+    EXPR_OBJECT@0..33
+      OBJ_BODY_COMP@0..33
+        L_BRACE@0..1 "{"
+        ERROR_CUSTOM@1..9
+          MEMBER_ASSERT_STMT@1..9
+            ASSERTION@1..9
+              ASSERT_KW@1..7 "assert"
+              WHITESPACE@7..8 " "
+              EXPR@8..9
+                EXPR_NUMBER@8..9
+                  FLOAT@8..9 "1"
+        COMMA@9..10 ","
+        WHITESPACE@10..11 " "
+        MEMBER_FIELD_NORMAL@11..15
+          FIELD_NAME_FIXED@11..12
+            NAME@11..12
+              IDENT@11..12 "a"
+          COLON@12..13 ":"
+          WHITESPACE@13..14 " "
+          EXPR@14..15
+            EXPR_NUMBER@14..15
+              FLOAT@14..15 "1"
+        WHITESPACE@15..16 " "
+        FOR_SPEC@16..32
+          FOR_KW@16..19 "for"
+          WHITESPACE@19..20 " "
+          DESTRUCT_FULL@20..21
+            NAME@20..21
+              IDENT@20..21 "a"
+          WHITESPACE@21..22 " "
+          IN_KW@22..24 "in"
+          WHITESPACE@24..25 " "
+          EXPR@25..32
+            EXPR_ARRAY@25..32
+              L_BRACK@25..26 "["
+              EXPR@26..27
+                EXPR_NUMBER@26..27
+                  FLOAT@26..27 "1"
+              COMMA@27..28 ","
+              EXPR@28..29
+                EXPR_NUMBER@28..29
+                  FLOAT@28..29 "2"
+              COMMA@29..30 ","
+              EXPR@30..31
+                EXPR_NUMBER@30..31
+                  FLOAT@30..31 "3"
+              R_BRACK@31..32 "]"
+        R_BRACE@32..33 "}"
   WHITESPACE@33..34 "\n"
 ===
 LocatedSyntaxError { error: Custom { error: "asserts can't be used in object comprehensions" }, range: 1..9 }
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_incompatible_with_multiple_elems.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_incompatible_with_multiple_elems.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_incompatible_with_multiple_elems.snap
@@ -3,56 +3,64 @@
 expression: "{a:1 for a in [1, 2, 3], b:1}\n"
 ---
 SOURCE_FILE@0..30
-  EXPR_OBJECT@0..29
-    OBJ_BODY_MEMBER_LIST@0..29
-      L_BRACE@0..1 "{"
-      MEMBER_FIELD_NORMAL@1..4
-        FIELD_NAME_FIXED@1..2
-          NAME@1..2
-            IDENT@1..2 "a"
-        COLON@2..3 ":"
-        EXPR_NUMBER@3..4
-          FLOAT@3..4 "1"
-      WHITESPACE@4..5 " "
-      ERROR_CUSTOM@5..23
-        FOR_SPEC@5..23
-          FOR_KW@5..8 "for"
-          WHITESPACE@8..9 " "
-          NAME@9..10
-            IDENT@9..10 "a"
-          WHITESPACE@10..11 " "
-          IN_KW@11..13 "in"
-          WHITESPACE@13..14 " "
-          EXPR_ARRAY@14..23
-            L_BRACK@14..15 "["
-            EXPR_NUMBER@15..16
-              FLOAT@15..16 "1"
-            COMMA@16..17 ","
-            WHITESPACE@17..18 " "
-            EXPR_NUMBER@18..19
-              FLOAT@18..19 "2"
-            COMMA@19..20 ","
-            WHITESPACE@20..21 " "
-            EXPR_NUMBER@21..22
-              FLOAT@21..22 "3"
-            R_BRACK@22..23 "]"
-      COMMA@23..24 ","
-      WHITESPACE@24..25 " "
-      MEMBER_FIELD_NORMAL@25..28
-        FIELD_NAME_FIXED@25..26
-          NAME@25..26
-            IDENT@25..26 "b"
-        COLON@26..27 ":"
-        EXPR_NUMBER@27..28
-          FLOAT@27..28 "1"
-      R_BRACE@28..29 "}"
+  EXPR@0..29
+    EXPR_OBJECT@0..29
+      OBJ_BODY_MEMBER_LIST@0..29
+        L_BRACE@0..1 "{"
+        MEMBER_FIELD_NORMAL@1..4
+          FIELD_NAME_FIXED@1..2
+            NAME@1..2
+              IDENT@1..2 "a"
+          COLON@2..3 ":"
+          EXPR@3..4
+            EXPR_NUMBER@3..4
+              FLOAT@3..4 "1"
+        WHITESPACE@4..5 " "
+        ERROR_CUSTOM@5..23
+          FOR_SPEC@5..23
+            FOR_KW@5..8 "for"
+            WHITESPACE@8..9 " "
+            DESTRUCT_FULL@9..10
+              NAME@9..10
+                IDENT@9..10 "a"
+            WHITESPACE@10..11 " "
+            IN_KW@11..13 "in"
+            WHITESPACE@13..14 " "
+            EXPR@14..23
+              EXPR_ARRAY@14..23
+                L_BRACK@14..15 "["
+                EXPR@15..16
+                  EXPR_NUMBER@15..16
+                    FLOAT@15..16 "1"
+                COMMA@16..17 ","
+                WHITESPACE@17..18 " "
+                EXPR@18..19
+                  EXPR_NUMBER@18..19
+                    FLOAT@18..19 "2"
+                COMMA@19..20 ","
+                WHITESPACE@20..21 " "
+                EXPR@21..22
+                  EXPR_NUMBER@21..22
+                    FLOAT@21..22 "3"
+                R_BRACK@22..23 "]"
+        COMMA@23..24 ","
+        WHITESPACE@24..25 " "
+        MEMBER_FIELD_NORMAL@25..28
+          FIELD_NAME_FIXED@25..26
+            NAME@25..26
+              IDENT@25..26 "b"
+          COLON@26..27 ":"
+          EXPR@27..28
+            EXPR_NUMBER@27..28
+              FLOAT@27..28 "1"
+        R_BRACE@28..29 "}"
   WHITESPACE@29..30 "\n"
 ===
-LocatedSyntaxError { error: Custom { error: "compspec may only be used if there is only one array element" }, range: 5..23 }
+LocatedSyntaxError { error: Custom { error: "compspec may only be used if there is only one object element" }, range: 5..23 }
 ===
   x syntax error
    ,----
  1 | {a:1 for a in [1, 2, 3], b:1}
    :      ^^^^^^^^^|^^^^^^^^
-   :               `-- compspec may only be used if there is only one array element
+   :               `-- compspec may only be used if there is only one object element
    `----
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_incompatible_with_multiple_elems_w.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_incompatible_with_multiple_elems_w.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_incompatible_with_multiple_elems_w.snap
@@ -3,66 +3,75 @@
 expression: "{a:1, b:1, for a in [1, 2, 3], c:1}\n"
 ---
 SOURCE_FILE@0..36
-  EXPR_OBJECT@0..35
-    OBJ_BODY_MEMBER_LIST@0..35
-      L_BRACE@0..1 "{"
-      MEMBER_FIELD_NORMAL@1..4
-        FIELD_NAME_FIXED@1..2
-          NAME@1..2
-            IDENT@1..2 "a"
-        COLON@2..3 ":"
-        EXPR_NUMBER@3..4
-          FLOAT@3..4 "1"
-      COMMA@4..5 ","
-      WHITESPACE@5..6 " "
-      MEMBER_FIELD_NORMAL@6..9
-        FIELD_NAME_FIXED@6..7
-          NAME@6..7
-            IDENT@6..7 "b"
-        COLON@7..8 ":"
-        EXPR_NUMBER@8..9
-          FLOAT@8..9 "1"
-      COMMA@9..10 ","
-      WHITESPACE@10..11 " "
-      ERROR_CUSTOM@11..29
-        FOR_SPEC@11..29
-          FOR_KW@11..14 "for"
-          WHITESPACE@14..15 " "
-          NAME@15..16
-            IDENT@15..16 "a"
-          WHITESPACE@16..17 " "
-          IN_KW@17..19 "in"
-          WHITESPACE@19..20 " "
-          EXPR_ARRAY@20..29
-            L_BRACK@20..21 "["
-            EXPR_NUMBER@21..22
-              FLOAT@21..22 "1"
-            COMMA@22..23 ","
-            WHITESPACE@23..24 " "
-            EXPR_NUMBER@24..25
-              FLOAT@24..25 "2"
-            COMMA@25..26 ","
-            WHITESPACE@26..27 " "
-            EXPR_NUMBER@27..28
-              FLOAT@27..28 "3"
-            R_BRACK@28..29 "]"
-      COMMA@29..30 ","
-      WHITESPACE@30..31 " "
-      MEMBER_FIELD_NORMAL@31..34
-        FIELD_NAME_FIXED@31..32
-          NAME@31..32
-            IDENT@31..32 "c"
-        COLON@32..33 ":"
-        EXPR_NUMBER@33..34
-          FLOAT@33..34 "1"
-      R_BRACE@34..35 "}"
+  EXPR@0..35
+    EXPR_OBJECT@0..35
+      OBJ_BODY_MEMBER_LIST@0..35
+        L_BRACE@0..1 "{"
+        MEMBER_FIELD_NORMAL@1..4
+          FIELD_NAME_FIXED@1..2
+            NAME@1..2
+              IDENT@1..2 "a"
+          COLON@2..3 ":"
+          EXPR@3..4
+            EXPR_NUMBER@3..4
+              FLOAT@3..4 "1"
+        COMMA@4..5 ","
+        WHITESPACE@5..6 " "
+        MEMBER_FIELD_NORMAL@6..9
+          FIELD_NAME_FIXED@6..7
+            NAME@6..7
+              IDENT@6..7 "b"
+          COLON@7..8 ":"
+          EXPR@8..9
+            EXPR_NUMBER@8..9
+              FLOAT@8..9 "1"
+        COMMA@9..10 ","
+        WHITESPACE@10..11 " "
+        ERROR_CUSTOM@11..29
+          FOR_SPEC@11..29
+            FOR_KW@11..14 "for"
+            WHITESPACE@14..15 " "
+            DESTRUCT_FULL@15..16
+              NAME@15..16
+                IDENT@15..16 "a"
+            WHITESPACE@16..17 " "
+            IN_KW@17..19 "in"
+            WHITESPACE@19..20 " "
+            EXPR@20..29
+              EXPR_ARRAY@20..29
+                L_BRACK@20..21 "["
+                EXPR@21..22
+                  EXPR_NUMBER@21..22
+                    FLOAT@21..22 "1"
+                COMMA@22..23 ","
+                WHITESPACE@23..24 " "
+                EXPR@24..25
+                  EXPR_NUMBER@24..25
+                    FLOAT@24..25 "2"
+                COMMA@25..26 ","
+                WHITESPACE@26..27 " "
+                EXPR@27..28
+                  EXPR_NUMBER@27..28
+                    FLOAT@27..28 "3"
+                R_BRACK@28..29 "]"
+        COMMA@29..30 ","
+        WHITESPACE@30..31 " "
+        MEMBER_FIELD_NORMAL@31..34
+          FIELD_NAME_FIXED@31..32
+            NAME@31..32
+              IDENT@31..32 "c"
+          COLON@32..33 ":"
+          EXPR@33..34
+            EXPR_NUMBER@33..34
+              FLOAT@33..34 "1"
+        R_BRACE@34..35 "}"
   WHITESPACE@35..36 "\n"
 ===
-LocatedSyntaxError { error: Custom { error: "compspec may only be used if there is only one array element" }, range: 11..29 }
+LocatedSyntaxError { error: Custom { error: "compspec may only be used if there is only one object element" }, range: 11..29 }
 ===
   x syntax error
    ,----
  1 | {a:1, b:1, for a in [1, 2, 3], c:1}
    :            ^^^^^^^^^|^^^^^^^^
-   :                     `-- compspec may only be used if there is only one array element
+   :                     `-- compspec may only be used if there is only one object element
    `----
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_no_elems.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_no_elems.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_no_elems.snap
@@ -3,32 +3,38 @@
 expression: "{for a in [1, 2, 3]}\n"
 ---
 SOURCE_FILE@0..21
-  EXPR_OBJECT@0..20
-    OBJ_BODY_COMP@0..20
-      L_BRACE@0..1 "{"
-      ERROR_MISSING_TOKEN@1..1
-      FOR_SPEC@1..19
-        FOR_KW@1..4 "for"
-        WHITESPACE@4..5 " "
-        NAME@5..6
-          IDENT@5..6 "a"
-        WHITESPACE@6..7 " "
-        IN_KW@7..9 "in"
-        WHITESPACE@9..10 " "
-        EXPR_ARRAY@10..19
-          L_BRACK@10..11 "["
-          EXPR_NUMBER@11..12
-            FLOAT@11..12 "1"
-          COMMA@12..13 ","
-          WHITESPACE@13..14 " "
-          EXPR_NUMBER@14..15
-            FLOAT@14..15 "2"
-          COMMA@15..16 ","
-          WHITESPACE@16..17 " "
-          EXPR_NUMBER@17..18
-            FLOAT@17..18 "3"
-          R_BRACK@18..19 "]"
-      R_BRACE@19..20 "}"
+  EXPR@0..20
+    EXPR_OBJECT@0..20
+      OBJ_BODY_COMP@0..20
+        L_BRACE@0..1 "{"
+        ERROR_MISSING_TOKEN@1..1
+        FOR_SPEC@1..19
+          FOR_KW@1..4 "for"
+          WHITESPACE@4..5 " "
+          DESTRUCT_FULL@5..6
+            NAME@5..6
+              IDENT@5..6 "a"
+          WHITESPACE@6..7 " "
+          IN_KW@7..9 "in"
+          WHITESPACE@9..10 " "
+          EXPR@10..19
+            EXPR_ARRAY@10..19
+              L_BRACK@10..11 "["
+              EXPR@11..12
+                EXPR_NUMBER@11..12
+                  FLOAT@11..12 "1"
+              COMMA@12..13 ","
+              WHITESPACE@13..14 " "
+              EXPR@14..15
+                EXPR_NUMBER@14..15
+                  FLOAT@14..15 "2"
+              COMMA@15..16 ","
+              WHITESPACE@16..17 " "
+              EXPR@17..18
+                EXPR_NUMBER@17..18
+                  FLOAT@17..18 "3"
+              R_BRACK@18..19 "]"
+        R_BRACE@19..20 "}"
   WHITESPACE@20..21 "\n"
 ===
 LocatedSyntaxError { error: Missing { expected: Named("field definition") }, range: 1..1 }
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_method.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_method.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_method.snap
@@ -3,47 +3,50 @@
 expression: "{\n\ta(x): x,\n\ta: function(x) x,\n}\n"
 ---
 SOURCE_FILE@0..33
-  EXPR_OBJECT@0..32
-    OBJ_BODY_MEMBER_LIST@0..32
-      L_BRACE@0..1 "{"
-      WHITESPACE@1..3 "\n\t"
-      MEMBER_FIELD_METHOD@3..10
-        FIELD_NAME_FIXED@3..4
-          NAME@3..4
-            IDENT@3..4 "a"
-        PARAMS_DESC@4..7
-          L_PAREN@4..5 "("
-          PARAM@5..6
-            DESTRUCT_FULL@5..6
-              NAME@5..6
-                IDENT@5..6 "x"
-          R_PAREN@6..7 ")"
-        COLON@7..8 ":"
-        WHITESPACE@8..9 " "
-        EXPR_VAR@9..10
-          NAME@9..10
-            IDENT@9..10 "x"
-      COMMA@10..11 ","
-      WHITESPACE@11..13 "\n\t"
-      MEMBER_FIELD_METHOD@13..29
-        FIELD_NAME_FIXED@13..14
-          NAME@13..14
-            IDENT@13..14 "a"
-        COLON@14..15 ":"
-        WHITESPACE@15..16 " "
-        FUNCTION_KW@16..24 "function"
-        PARAMS_DESC@24..27
-          L_PAREN@24..25 "("
-          PARAM@25..26
-            DESTRUCT_FULL@25..26
-              NAME@25..26
-                IDENT@25..26 "x"
-          R_PAREN@26..27 ")"
-        WHITESPACE@27..28 " "
-        EXPR_VAR@28..29
-          NAME@28..29
-            IDENT@28..29 "x"
-      COMMA@29..30 ","
-      WHITESPACE@30..31 "\n"
-      R_BRACE@31..32 "}"
+  EXPR@0..32
+    EXPR_OBJECT@0..32
+      OBJ_BODY_MEMBER_LIST@0..32
+        L_BRACE@0..1 "{"
+        WHITESPACE@1..3 "\n\t"
+        MEMBER_FIELD_METHOD@3..10
+          FIELD_NAME_FIXED@3..4
+            NAME@3..4
+              IDENT@3..4 "a"
+          PARAMS_DESC@4..7
+            L_PAREN@4..5 "("
+            PARAM@5..6
+              DESTRUCT_FULL@5..6
+                NAME@5..6
+                  IDENT@5..6 "x"
+            R_PAREN@6..7 ")"
+          COLON@7..8 ":"
+          WHITESPACE@8..9 " "
+          EXPR@9..10
+            EXPR_VAR@9..10
+              NAME@9..10
+                IDENT@9..10 "x"
+        COMMA@10..11 ","
+        WHITESPACE@11..13 "\n\t"
+        MEMBER_FIELD_METHOD@13..29
+          FIELD_NAME_FIXED@13..14
+            NAME@13..14
+              IDENT@13..14 "a"
+          COLON@14..15 ":"
+          WHITESPACE@15..16 " "
+          FUNCTION_KW@16..24 "function"
+          PARAMS_DESC@24..27
+            L_PAREN@24..25 "("
+            PARAM@25..26
+              DESTRUCT_FULL@25..26
+                NAME@25..26
+                  IDENT@25..26 "x"
+            R_PAREN@26..27 ")"
+          WHITESPACE@27..28 " "
+          EXPR@28..29
+            EXPR_VAR@28..29
+              NAME@28..29
+                IDENT@28..29 "x"
+        COMMA@29..30 ","
+        WHITESPACE@30..31 "\n"
+        R_BRACE@31..32 "}"
   WHITESPACE@32..33 "\n"
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__plain_call.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__plain_call.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__plain_call.snap
@@ -3,51 +3,56 @@
 expression: "std.substr(a, 0, std.length(b)) == b\n"
 ---
 SOURCE_FILE@0..37
-  EXPR_BINARY@0..36
-    LHS_EXPR@0..31
-      EXPR_APPLY@0..31
-        EXPR_INDEX@0..10
-          EXPR_VAR@0..3
-            NAME@0..3
-              IDENT@0..3 "std"
-          DOT@3..4 "."
-          NAME@4..10
-            IDENT@4..10 "substr"
+  EXPR@0..36
+    EXPR_BINARY@0..36
+      EXPR@0..3
+        EXPR_VAR@0..3
+          NAME@0..3
+            IDENT@0..3 "std"
+      SUFFIX_INDEX@3..10
+        DOT@3..4 "."
+        NAME@4..10
+          IDENT@4..10 "substr"
+      SUFFIX_APPLY@10..31
         ARGS_DESC@10..31
           L_PAREN@10..11 "("
           ARG@11..12
-            EXPR_VAR@11..12
-              NAME@11..12
-                IDENT@11..12 "a"
+            EXPR@11..12
+              EXPR_VAR@11..12
+                NAME@11..12
+                  IDENT@11..12 "a"
           COMMA@12..13 ","
           WHITESPACE@13..14 " "
           ARG@14..15
-            EXPR_NUMBER@14..15
-              FLOAT@14..15 "0"
+            EXPR@14..15
+              EXPR_NUMBER@14..15
+                FLOAT@14..15 "0"
           COMMA@15..16 ","
           WHITESPACE@16..17 " "
           ARG@17..30
-            EXPR_APPLY@17..30
-              EXPR_INDEX@17..27
-                EXPR_VAR@17..20
-                  NAME@17..20
-                    IDENT@17..20 "std"
+            EXPR@17..30
+              EXPR_VAR@17..20
+                NAME@17..20
+                  IDENT@17..20 "std"
+              SUFFIX_INDEX@20..27
                 DOT@20..21 "."
                 NAME@21..27
                   IDENT@21..27 "length"
-              ARGS_DESC@27..30
-                L_PAREN@27..28 "("
-                ARG@28..29
-                  EXPR_VAR@28..29
-                    NAME@28..29
-                      IDENT@28..29 "b"
-                R_PAREN@29..30 ")"
+              SUFFIX_APPLY@27..30
+                ARGS_DESC@27..30
+                  L_PAREN@27..28 "("
+                  ARG@28..29
+                    EXPR@28..29
+                      EXPR_VAR@28..29
+                        NAME@28..29
+                          IDENT@28..29 "b"
+                  R_PAREN@29..30 ")"
           R_PAREN@30..31 ")"
-    WHITESPACE@31..32 " "
-    EQ@32..34 "=="
-    WHITESPACE@34..35 " "
-    EXPR_VAR@35..36
-      NAME@35..36
-        IDENT@35..36 "b"
+      WHITESPACE@31..32 " "
+      EQ@32..34 "=="
+      WHITESPACE@34..35 " "
+      EXPR@35..36
+        EXPR_VAR@35..36
+          NAME@35..36
+            IDENT@35..36 "b"
   WHITESPACE@36..37 "\n"
-
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__stdlib.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__stdlib.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__stdlib.snap
@@ -1,6750 +1,5686 @@
 ---
 source: crates/jrsonnet-rowan-parser/src/tests.rs
-expression: "{\n  local std = self,\n  local id = std.id,\n\n  thisFile:: error 'std.thisFile is deprecated, to enable its support in jrsonnet - recompile it with \"legacy-this-file\" support.\\nThis will slow down stdlib caching a bit, though',\n\n  toString(a):: '' + a,\n\n  lstripChars(str, chars)::\n    if std.length(str) > 0 && std.member(chars, str[0]) then\n      std.lstripChars(str[1:], chars)\n    else\n      str,\n\n  rstripChars(str, chars)::\n    local len = std.length(str);\n    if len > 0 && std.member(chars, str[len - 1]) then\n      std.rstripChars(str[:len - 1], chars)\n    else\n      str,\n\n  stripChars(str, chars)::\n    std.lstripChars(std.rstripChars(str, chars), chars),\n\n  stringChars(str)::\n    std.makeArray(std.length(str), function(i) str[i]),\n\n  splitLimitR(str, c, maxsplits)::\n    if maxsplits == -1 then\n      std.splitLimit(str, c, -1)\n    else\n      local revStr(str) = std.join('', std.reverse(std.stringChars(str)));\n      std.map(function(e) revStr(e), std.reverse(std.splitLimit(revStr(str), revStr(c), maxsplits))),\n\n  split(str, c):: std.splitLimit(str, c, -1),\n\n  mapWithIndex(func, arr)::\n    if !std.isFunction(func) then\n      error ('std.mapWithIndex first param must be function, got ' + std.type(func))\n    else if !std.isArray(arr) && !std.isString(arr) then\n      error ('std.mapWithIndex second param must be array, got ' + std.type(arr))\n    else\n      std.makeArray(std.length(arr), function(i) func(i, arr[i])),\n\n  mapWithKey(func, obj)::\n    if !std.isFunction(func) then\n      error ('std.mapWithKey first param must be function, got ' + std.type(func))\n    else if !std.isObject(obj) then\n      error ('std.mapWithKey second param must be object, got ' + std.type(obj))\n    else\n      { [k]: func(k, obj[k]) for k in std.objectFields(obj) },\n\n  lines(arr)::\n    std.join('\\n', arr + ['']),\n\n  deepJoin(arr)::\n    if std.isString(arr) then\n      arr\n    else if std.isArray(arr) then\n      std.join('', [std.deepJoin(x) for x in arr])\n    else\n      error 'Expected string or array, got %s' % std.type(arr),\n\n  filterMap(filter_func, map_func, arr)::\n    if !std.isFunction(filter_func) then\n      error ('std.filterMap first param must be function, got ' + std.type(filter_func))\n    else if !std.isFunction(map_func) then\n      error ('std.filterMap second param must be function, got ' + std.type(map_func))\n    else if !std.isArray(arr) then\n      error ('std.filterMap third param must be array, got ' + std.type(arr))\n    else\n      std.map(map_func, std.filter(filter_func, arr)),\n\n  assertEqual(a, b)::\n    if a == b then\n      true\n    else\n      error 'Assertion failed. ' + a + ' != ' + b,\n\n  clamp(x, minVal, maxVal)::\n    if x < minVal then minVal\n    else if x > maxVal then maxVal\n    else x,\n\n  flattenArrays(arrs)::\n    std.foldl(function(a, b) a + b, arrs, []),\n\n  manifestIni(ini)::\n    local body_lines(body) =\n      std.join([], [\n        local value_or_values = body[k];\n        if std.isArray(value_or_values) then\n          ['%s = %s' % [k, value] for value in value_or_values]\n        else\n          ['%s = %s' % [k, value_or_values]]\n\n        for k in std.objectFields(body)\n      ]);\n\n    local section_lines(sname, sbody) = ['[%s]' % [sname]] + body_lines(sbody),\n          main_body = if std.objectHas(ini, 'main') then body_lines(ini.main) else [],\n          all_sections = [\n      section_lines(k, ini.sections[k])\n      for k in std.objectFields(ini.sections)\n    ];\n    std.join('\\n', main_body + std.flattenArrays(all_sections) + ['']),\n\n  manifestToml(value):: std.manifestTomlEx(value, '  '),\n\n  escapeStringPython(str)::\n    std.escapeStringJson(str),\n\n  escapeStringBash(str_)::\n    local str = std.toString(str_);\n    local trans(ch) =\n      if ch == \"'\" then\n        \"'\\\"'\\\"'\"\n      else\n        ch;\n    \"'%s'\" % std.join('', [trans(ch) for ch in std.stringChars(str)]),\n\n  escapeStringDollars(str_)::\n    local str = std.toString(str_);\n    local trans(ch) =\n      if ch == '$' then\n        '$$'\n      else\n        ch;\n    std.foldl(function(a, b) a + trans(b), std.stringChars(str), ''),\n\n  local xml_escapes = {\n    '<': '&lt;',\n    '>': '&gt;',\n    '&': '&amp;',\n    '\"': '&quot;',\n    \"'\": '&apos;',\n  },\n\n  escapeStringXML(str_)::\n    local str = std.toString(str_);\n    std.join('', [std.get(xml_escapes, ch, ch) for ch in std.stringChars(str)]),\n\n  manifestJson(value):: std.manifestJsonEx(value, '    ') tailstrict,\n\n  manifestJsonMinified(value):: std.manifestJsonEx(value, '', '', ':'),\n\n  manifestYamlStream(value, indent_array_in_object=false, c_document_end=true, quote_keys=true)::\n    if !std.isArray(value) then\n      error 'manifestYamlStream only takes arrays, got ' + std.type(value)\n    else\n      '---\\n' + std.join(\n        '\\n---\\n', [std.manifestYamlDoc(e, indent_array_in_object, quote_keys) for e in value]\n      ) + if c_document_end then '\\n...\\n' else '\\n',\n\n  manifestPython(v)::\n    if std.isObject(v) then\n      local fields = [\n        '%s: %s' % [std.escapeStringPython(k), std.manifestPython(v[k])]\n        for k in std.objectFields(v)\n      ];\n      '{%s}' % [std.join(', ', fields)]\n    else if std.isArray(v) then\n      '[%s]' % [std.join(', ', [std.manifestPython(v2) for v2 in v])]\n    else if std.isString(v) then\n      '%s' % [std.escapeStringPython(v)]\n    else if std.isFunction(v) then\n      error 'cannot manifest function'\n    else if std.isNumber(v) then\n      std.toString(v)\n    else if v == true then\n      'True'\n    else if v == false then\n      'False'\n    else if v == null then\n      'None',\n\n  manifestPythonVars(conf)::\n    local vars = ['%s = %s' % [k, std.manifestPython(conf[k])] for k in std.objectFields(conf)];\n    std.join('\\n', vars + ['']),\n\n  manifestXmlJsonml(value)::\n    if !std.isArray(value) then\n      error 'Expected a JSONML value (an array), got %s' % std.type(value)\n    else\n      local aux(v) =\n        if std.isString(v) then\n          v\n        else\n          local tag = v[0];\n          local has_attrs = std.length(v) > 1 && std.isObject(v[1]);\n          local attrs = if has_attrs then v[1] else {};\n          local children = if has_attrs then v[2:] else v[1:];\n          local attrs_str =\n            std.join('', [' %s=\"%s\"' % [k, attrs[k]] for k in std.objectFields(attrs)]);\n          std.deepJoin(['<', tag, attrs_str, '>', [aux(x) for x in children], '</', tag, '>']);\n\n      aux(value),\n\n  setUnion(a, b, keyF=id)::\n    // NOTE: order matters, values in `a` win\n    local aux(a, b, i, j, acc) =\n      if i >= std.length(a) then\n        acc + b[j:]\n      else if j >= std.length(b) then\n        acc + a[i:]\n      else\n        local ak = keyF(a[i]);\n        local bk = keyF(b[j]);\n        if ak == bk then\n          aux(a, b, i + 1, j + 1, acc + [a[i]]) tailstrict\n        else if ak < bk then\n          aux(a, b, i + 1, j, acc + [a[i]]) tailstrict\n        else\n          aux(a, b, i, j + 1, acc + [b[j]]) tailstrict;\n    aux(a, b, 0, 0, []),\n\n  setDiff(a, b, keyF=id)::\n    local aux(a, b, i, j, acc) =\n      if i >= std.length(a) then\n        acc\n      else if j >= std.length(b) then\n        acc + a[i:]\n      else\n        if keyF(a[i]) == keyF(b[j]) then\n          aux(a, b, i + 1, j + 1, acc) tailstrict\n        else if keyF(a[i]) < keyF(b[j]) then\n          aux(a, b, i + 1, j, acc + [a[i]]) tailstrict\n        else\n          aux(a, b, i, j + 1, acc) tailstrict;\n    aux(a, b, 0, 0, []) tailstrict,\n\n  mergePatch(target, patch)::\n    if std.isObject(patch) then\n      local target_object =\n        if std.isObject(target) then target else {};\n\n      local target_fields =\n        if std.isObject(target_object) then std.objectFields(target_object) else [];\n\n      local null_fields = [k for k in std.objectFields(patch) if patch[k] == null];\n      local both_fields = std.setUnion(target_fields, std.objectFields(patch));\n\n      {\n        [k]:\n          if !std.objectHas(patch, k) then\n            target_object[k]\n          else if !std.objectHas(target_object, k) then\n            std.mergePatch(null, patch[k]) tailstrict\n          else\n            std.mergePatch(target_object[k], patch[k]) tailstrict\n        for k in std.setDiff(both_fields, null_fields)\n      }\n    else\n      patch,\n\n  get(o, f, default=null, inc_hidden=true)::\n    if std.objectHasEx(o, f, inc_hidden) then o[f] else default,\n\n  objectFields(o)::\n    std.objectFieldsEx(o, false),\n\n  objectFieldsAll(o)::\n    std.objectFieldsEx(o, true),\n\n  objectHas(o, f)::\n    std.objectHasEx(o, f, false),\n\n  objectHasAll(o, f)::\n    std.objectHasEx(o, f, true),\n\n  objectValues(o)::\n    [o[k] for k in std.objectFields(o)],\n\n  objectValuesAll(o)::\n    [o[k] for k in std.objectFieldsAll(o)],\n\n  resolvePath(f, r)::\n    local arr = std.split(f, '/');\n    std.join('/', std.makeArray(std.length(arr) - 1, function(i) arr[i]) + [r]),\n\n  prune(a)::\n    local isContent(b) =\n      if b == null then\n        false\n      else if std.isArray(b) then\n        std.length(b) > 0\n      else if std.isObject(b) then\n        std.length(b) > 0\n      else\n        true;\n    if std.isArray(a) then\n      [std.prune(x) for x in a if isContent($.prune(x))]\n    else if std.isObject(a) then {\n      [x]: $.prune(a[x])\n      for x in std.objectFields(a)\n      if isContent(std.prune(a[x]))\n    } else\n      a,\n\n  find(value, arr)::\n    if !std.isArray(arr) then\n      error 'find second parameter should be an array, got ' + std.type(arr)\n    else\n      std.filter(function(i) arr[i] == value, std.range(0, std.length(arr) - 1)),\n\n  // Compat\n  __compare_array(arr1, arr2)::\n    assert std.isArray(arr1) && std.isArray(arr2);\n    std.__compare(arr1, arr2),\n  __array_less(arr1, arr2):: std.__compare_array(arr1, arr2) == -1,\n  __array_greater(arr1, arr2):: std.__compare_array(arr1, arr2) == 1,\n  __array_less_or_equal(arr1, arr2):: std.__compare_array(arr1, arr2) <= 0,\n  __array_greater_or_equal(arr1, arr2):: std.__compare_array(arr1, arr2) >= 0,\n}\n"
+expression: "{\n  local std = self,\n  local id = std.id,\n\n  thisFile:: error 'std.thisFile is deprecated, to enable its support in jrsonnet - recompile it with \"legacy-this-file\" support.\\nThis will slow down stdlib caching a bit, though',\n\n  lstripChars(str, chars)::\n    if std.length(str) > 0 && std.member(chars, str[0]) then\n      std.lstripChars(str[1:], chars)\n    else\n      str,\n\n  rstripChars(str, chars)::\n    local len = std.length(str);\n    if len > 0 && std.member(chars, str[len - 1]) then\n      std.rstripChars(str[:len - 1], chars)\n    else\n      str,\n\n  stripChars(str, chars)::\n    std.lstripChars(std.rstripChars(str, chars), chars),\n\n  splitLimitR(str, c, maxsplits)::\n    if maxsplits == -1 then\n      std.splitLimit(str, c, -1)\n    else\n      local revStr(str) = std.join('', std.reverse(std.stringChars(str)));\n      std.map(function(e) revStr(e), std.reverse(std.splitLimit(revStr(str), revStr(c), maxsplits))),\n\n  split(str, c):: std.splitLimit(str, c, -1),\n\n  mapWithIndex(func, arr)::\n    if !std.isFunction(func) then\n      error ('std.mapWithIndex first param must be function, got ' + std.type(func))\n    else if !std.isArray(arr) && !std.isString(arr) then\n      error ('std.mapWithIndex second param must be array, got ' + std.type(arr))\n    else\n      std.makeArray(std.length(arr), function(i) func(i, arr[i])),\n\n  mapWithKey(func, obj)::\n    if !std.isFunction(func) then\n      error ('std.mapWithKey first param must be function, got ' + std.type(func))\n    else if !std.isObject(obj) then\n      error ('std.mapWithKey second param must be object, got ' + std.type(obj))\n    else\n      { [k]: func(k, obj[k]) for k in std.objectFields(obj) },\n\n  lines(arr)::\n    std.join('\\n', arr + ['']),\n\n  deepJoin(arr)::\n    if std.isString(arr) then\n      arr\n    else if std.isArray(arr) then\n      std.join('', [std.deepJoin(x) for x in arr])\n    else\n      error 'Expected string or array, got %s' % std.type(arr),\n\n  assertEqual(a, b)::\n    if a == b then\n      true\n    else\n      error 'Assertion failed. ' + a + ' != ' + b,\n\n  clamp(x, minVal, maxVal)::\n    if x < minVal then minVal\n    else if x > maxVal then maxVal\n    else x,\n\n  manifestIni(ini)::\n    local body_lines(body) =\n      std.join([], [\n        local value_or_values = body[k];\n        if std.isArray(value_or_values) then\n          ['%s = %s' % [k, value] for value in value_or_values]\n        else\n          ['%s = %s' % [k, value_or_values]]\n\n        for k in std.objectFields(body)\n      ]);\n\n    local section_lines(sname, sbody) = ['[%s]' % [sname]] + body_lines(sbody),\n          main_body = if std.objectHas(ini, 'main') then body_lines(ini.main) else [],\n          all_sections = [\n      section_lines(k, ini.sections[k])\n      for k in std.objectFields(ini.sections)\n    ];\n    std.join('\\n', main_body + std.flattenArrays(all_sections) + ['']),\n\n  manifestToml(value):: std.manifestTomlEx(value, '  '),\n\n  escapeStringPython(str)::\n    std.escapeStringJson(str),\n\n  escapeStringBash(str_)::\n    local str = std.toString(str_);\n    local trans(ch) =\n      if ch == \"'\" then\n        \"'\\\"'\\\"'\"\n      else\n        ch;\n    \"'%s'\" % std.join('', [trans(ch) for ch in std.stringChars(str)]),\n\n  escapeStringDollars(str_)::\n    local str = std.toString(str_);\n    local trans(ch) =\n      if ch == '$' then\n        '$$'\n      else\n        ch;\n    std.foldl(function(a, b) a + trans(b), std.stringChars(str), ''),\n\n  local xml_escapes = {\n    '<': '&lt;',\n    '>': '&gt;',\n    '&': '&amp;',\n    '\"': '&quot;',\n    \"'\": '&apos;',\n  },\n\n  escapeStringXML(str_)::\n    local str = std.toString(str_);\n    std.join('', [std.get(xml_escapes, ch, ch) for ch in std.stringChars(str)]),\n\n  manifestJson(value):: std.manifestJsonEx(value, '    ') tailstrict,\n\n  manifestJsonMinified(value):: std.manifestJsonEx(value, '', '', ':'),\n\n  manifestYamlStream(value, indent_array_in_object=false, c_document_end=true, quote_keys=true)::\n    if !std.isArray(value) then\n      error 'manifestYamlStream only takes arrays, got ' + std.type(value)\n    else\n      '---\\n' + std.join(\n        '\\n---\\n', [std.manifestYamlDoc(e, indent_array_in_object, quote_keys) for e in value]\n      ) + if c_document_end then '\\n...\\n' else '\\n',\n\n  manifestPython(v)::\n    if std.isObject(v) then\n      local fields = [\n        '%s: %s' % [std.escapeStringPython(k), std.manifestPython(v[k])]\n        for k in std.objectFields(v)\n      ];\n      '{%s}' % [std.join(', ', fields)]\n    else if std.isArray(v) then\n      '[%s]' % [std.join(', ', [std.manifestPython(v2) for v2 in v])]\n    else if std.isString(v) then\n      '%s' % [std.escapeStringPython(v)]\n    else if std.isFunction(v) then\n      error 'cannot manifest function'\n    else if std.isNumber(v) then\n      std.toString(v)\n    else if v == true then\n      'True'\n    else if v == false then\n      'False'\n    else if v == null then\n      'None',\n\n  manifestPythonVars(conf)::\n    local vars = ['%s = %s' % [k, std.manifestPython(conf[k])] for k in std.objectFields(conf)];\n    std.join('\\n', vars + ['']),\n\n  manifestXmlJsonml(value)::\n    if !std.isArray(value) then\n      error 'Expected a JSONML value (an array), got %s' % std.type(value)\n    else\n      local aux(v) =\n        if std.isString(v) then\n          v\n        else\n          local tag = v[0];\n          local has_attrs = std.length(v) > 1 && std.isObject(v[1]);\n          local attrs = if has_attrs then v[1] else {};\n          local children = if has_attrs then v[2:] else v[1:];\n          local attrs_str =\n            std.join('', [' %s=\"%s\"' % [k, attrs[k]] for k in std.objectFields(attrs)]);\n          std.deepJoin(['<', tag, attrs_str, '>', [aux(x) for x in children], '</', tag, '>']);\n\n      aux(value),\n\n  mergePatch(target, patch)::\n    if std.isObject(patch) then\n      local target_object =\n        if std.isObject(target) then target else {};\n\n      local target_fields =\n        if std.isObject(target_object) then std.objectFields(target_object) else [];\n\n      local null_fields = [k for k in std.objectFields(patch) if patch[k] == null];\n      local both_fields = std.setUnion(target_fields, std.objectFields(patch));\n\n      {\n        [k]:\n          if !std.objectHas(patch, k) then\n            target_object[k]\n          else if !std.objectHas(target_object, k) then\n            std.mergePatch(null, patch[k]) tailstrict\n          else\n            std.mergePatch(target_object[k], patch[k]) tailstrict\n        for k in std.setDiff(both_fields, null_fields)\n      }\n    else\n      patch,\n\n  get(o, f, default=null, inc_hidden=true)::\n    if std.objectHasEx(o, f, inc_hidden) then o[f] else default,\n\n  resolvePath(f, r)::\n    local arr = std.split(f, '/');\n    std.join('/', std.makeArray(std.length(arr) - 1, function(i) arr[i]) + [r]),\n\n  prune(a)::\n    local isContent(b) =\n      if b == null then\n        false\n      else if std.isArray(b) then\n        std.length(b) > 0\n      else if std.isObject(b) then\n        std.length(b) > 0\n      else\n        true;\n    if std.isArray(a) then\n      [std.prune(x) for x in a if isContent($.prune(x))]\n    else if std.isObject(a) then {\n      [x]: $.prune(a[x])\n      for x in std.objectFields(a)\n      if isContent(std.prune(a[x]))\n    } else\n      a,\n\n  find(value, arr)::\n    if !std.isArray(arr) then\n      error 'find second parameter should be an array, got ' + std.type(arr)\n    else\n      std.filter(function(i) arr[i] == value, std.range(0, std.length(arr) - 1)),\n\n  // Compat\n  __compare_array(arr1, arr2)::\n    assert std.isArray(arr1) && std.isArray(arr2);\n    std.__compare(arr1, arr2),\n  __array_less(arr1, arr2):: std.__compare_array(arr1, arr2) == -1,\n  __array_greater(arr1, arr2):: std.__compare_array(arr1, arr2) == 1,\n  __array_less_or_equal(arr1, arr2):: std.__compare_array(arr1, arr2) <= 0,\n  __array_greater_or_equal(arr1, arr2):: std.__compare_array(arr1, arr2) >= 0,\n}\n"
 ---
-SOURCE_FILE@0..9860
-  EXPR_OBJECT@0..9859
-    OBJ_BODY_MEMBER_LIST@0..9859
-      L_BRACE@0..1 "{"
-      WHITESPACE@1..4 "\n  "
-      MEMBER_BIND_STMT@4..20
-        OBJ_LOCAL@4..20
-          LOCAL_KW@4..9 "local"
-          WHITESPACE@9..10 " "
-          BIND_DESTRUCT@10..20
-            DESTRUCT_FULL@10..13
-              NAME@10..13
-                IDENT@10..13 "std"
-            WHITESPACE@13..14 " "
-            ASSIGN@14..15 "="
-            WHITESPACE@15..16 " "
-            EXPR_LITERAL@16..20
-              SELF_KW@16..20 "self"
-      COMMA@20..21 ","
-      WHITESPACE@21..24 "\n  "
-      MEMBER_BIND_STMT@24..41
-        OBJ_LOCAL@24..41
-          LOCAL_KW@24..29 "local"
-          WHITESPACE@29..30 " "
-          BIND_DESTRUCT@30..41
-            DESTRUCT_FULL@30..32
-              NAME@30..32
-                IDENT@30..32 "id"
-            WHITESPACE@32..33 " "
-            ASSIGN@33..34 "="
-            WHITESPACE@34..35 " "
-            EXPR_INDEX@35..41
-              EXPR_VAR@35..38
-                NAME@35..38
-                  IDENT@35..38 "std"
-              DOT@38..39 "."
-              NAME@39..41
-                IDENT@39..41 "id"
-      COMMA@41..42 ","
-      WHITESPACE@42..46 "\n\n  "
-      MEMBER_FIELD_NORMAL@46..224
-        FIELD_NAME_FIXED@46..54
-          NAME@46..54
-            IDENT@46..54 "thisFile"
-        COLONCOLON@54..56 "::"
-        WHITESPACE@56..57 " "
-        EXPR_ERROR@57..224
-          ERROR_KW@57..62 "error"
-          WHITESPACE@62..63 " "
-          EXPR_STRING@63..224
-            STRING_SINGLE@63..224 "'std.thisFile is depr ..."
-      COMMA@224..225 ","
-      WHITESPACE@225..229 "\n\n  "
-      MEMBER_FIELD_METHOD@229..249
-        FIELD_NAME_FIXED@229..237
-          NAME@229..237
-            IDENT@229..237 "toString"
-        PARAMS_DESC@237..240
-          L_PAREN@237..238 "("
-          PARAM@238..239
-            DESTRUCT_FULL@238..239
-              NAME@238..239
-                IDENT@238..239 "a"
-          R_PAREN@239..240 ")"
-        COLONCOLON@240..242 "::"
-        WHITESPACE@242..243 " "
-        EXPR_BINARY@243..249
-          LHS_EXPR@243..245
-            EXPR_STRING@243..245
-              STRING_SINGLE@243..245 "''"
-          WHITESPACE@245..246 " "
-          PLUS@246..247 "+"
-          WHITESPACE@247..248 " "
-          EXPR_VAR@248..249
-            NAME@248..249
-              IDENT@248..249 "a"
-      COMMA@249..250 ","
-      WHITESPACE@250..254 "\n\n  "
-      MEMBER_FIELD_METHOD@254..397
-        FIELD_NAME_FIXED@254..265
-          NAME@254..265
-            IDENT@254..265 "lstripChars"
-        PARAMS_DESC@265..277
-          L_PAREN@265..266 "("
-          PARAM@266..269
-            DESTRUCT_FULL@266..269
-              NAME@266..269
-                IDENT@266..269 "str"
-          COMMA@269..270 ","
-          WHITESPACE@270..271 " "
-          PARAM@271..276
-            DESTRUCT_FULL@271..276
-              NAME@271..276
-                IDENT@271..276 "chars"
-          R_PAREN@276..277 ")"
-        COLONCOLON@277..279 "::"
-        WHITESPACE@279..284 "\n    "
-        EXPR_IF_THEN_ELSE@284..397
-          IF_KW@284..286 "if"
-          WHITESPACE@286..287 " "
-          EXPR_BINARY@287..335
-            LHS_EXPR@287..306
-              EXPR_BINARY@287..306
-                LHS_EXPR@287..302
-                  EXPR_APPLY@287..302
-                    EXPR_INDEX@287..297
-                      EXPR_VAR@287..290
-                        NAME@287..290
-                          IDENT@287..290 "std"
-                      DOT@290..291 "."
-                      NAME@291..297
-                        IDENT@291..297 "length"
-                    ARGS_DESC@297..302
-                      L_PAREN@297..298 "("
-                      ARG@298..301
-                        EXPR_VAR@298..301
-                          NAME@298..301
-                            IDENT@298..301 "str"
-                      R_PAREN@301..302 ")"
-                WHITESPACE@302..303 " "
-                GT@303..304 ">"
-                WHITESPACE@304..305 " "
-                EXPR_NUMBER@305..306
-                  FLOAT@305..306 "0"
-            WHITESPACE@306..307 " "
-            AND@307..309 "&&"
-            WHITESPACE@309..310 " "
-            EXPR_APPLY@310..335
-              EXPR_INDEX@310..320
-                EXPR_VAR@310..313
-                  NAME@310..313
-                    IDENT@310..313 "std"
-                DOT@313..314 "."
-                NAME@314..320
-                  IDENT@314..320 "member"
-              ARGS_DESC@320..335
-                L_PAREN@320..321 "("
-                ARG@321..326
-                  EXPR_VAR@321..326
-                    NAME@321..326
-                      IDENT@321..326 "chars"
-                COMMA@326..327 ","
-                WHITESPACE@327..328 " "
-                ARG@328..334
-                  EXPR_INDEX_EXPR@328..334
-                    LHS_EXPR@328..331
-                      EXPR_VAR@328..331
-                        NAME@328..331
-                          IDENT@328..331 "str"
-                    L_BRACK@331..332 "["
-                    EXPR_NUMBER@332..333
-                      FLOAT@332..333 "0"
-                    R_BRACK@333..334 "]"
-                R_PAREN@334..335 ")"
-          WHITESPACE@335..336 " "
-          THEN_KW@336..340 "then"
-          WHITESPACE@340..347 "\n      "
-          TRUE_EXPR@347..378
-            EXPR_APPLY@347..378
-              EXPR_INDEX@347..362
-                EXPR_VAR@347..350
-                  NAME@347..350
-                    IDENT@347..350 "std"
-                DOT@350..351 "."
-                NAME@351..362
-                  IDENT@351..362 "lstripChars"
-              ARGS_DESC@362..378
-                L_PAREN@362..363 "("
-                ARG@363..370
-                  EXPR_SLICE@363..370
-                    EXPR_VAR@363..366
-                      NAME@363..366
-                        IDENT@363..366 "str"
-                    SLICE_DESC@366..370
-                      L_BRACK@366..367 "["
-                      EXPR_NUMBER@367..368
-                        FLOAT@367..368 "1"
-                      COLON@368..369 ":"
-                      R_BRACK@369..370 "]"
-                COMMA@370..371 ","
-                WHITESPACE@371..372 " "
-                ARG@372..377
-                  EXPR_VAR@372..377
-                    NAME@372..377
-                      IDENT@372..377 "chars"
-                R_PAREN@377..378 ")"
-          WHITESPACE@378..383 "\n    "
-          ELSE_KW@383..387 "else"
-          WHITESPACE@387..394 "\n      "
-          FALSE_EXPR@394..397
-            EXPR_VAR@394..397
-              NAME@394..397
-                IDENT@394..397 "str"
-      COMMA@397..398 ","
-      WHITESPACE@398..402 "\n\n  "
-      MEMBER_FIELD_METHOD@402..578
-        FIELD_NAME_FIXED@402..413
-          NAME@402..413
-            IDENT@402..413 "rstripChars"
-        PARAMS_DESC@413..425
-          L_PAREN@413..414 "("
-          PARAM@414..417
-            DESTRUCT_FULL@414..417
-              NAME@414..417
-                IDENT@414..417 "str"
-          COMMA@417..418 ","
-          WHITESPACE@418..419 " "
-          PARAM@419..424
-            DESTRUCT_FULL@419..424
-              NAME@419..424
-                IDENT@419..424 "chars"
-          R_PAREN@424..425 ")"
-        COLONCOLON@425..427 "::"
-        WHITESPACE@427..432 "\n    "
-        STMT_LOCAL@432..460
-          LOCAL_KW@432..437 "local"
-          WHITESPACE@437..438 " "
-          BIND_DESTRUCT@438..459
-            DESTRUCT_FULL@438..441
-              NAME@438..441
-                IDENT@438..441 "len"
-            WHITESPACE@441..442 " "
-            ASSIGN@442..443 "="
-            WHITESPACE@443..444 " "
-            EXPR_APPLY@444..459
-              EXPR_INDEX@444..454
-                EXPR_VAR@444..447
-                  NAME@444..447
-                    IDENT@444..447 "std"
-                DOT@447..448 "."
-                NAME@448..454
-                  IDENT@448..454 "length"
-              ARGS_DESC@454..459
-                L_PAREN@454..455 "("
-                ARG@455..458
-                  EXPR_VAR@455..458
-                    NAME@455..458
-                      IDENT@455..458 "str"
-                R_PAREN@458..459 ")"
-          SEMI@459..460 ";"
-        WHITESPACE@460..465 "\n    "
-        EXPR_IF_THEN_ELSE@465..578
-          IF_KW@465..467 "if"
-          WHITESPACE@467..468 " "
-          EXPR_BINARY@468..510
-            LHS_EXPR@468..475
-              EXPR_BINARY@468..475
-                LHS_EXPR@468..471
-                  EXPR_VAR@468..471
-                    NAME@468..471
-                      IDENT@468..471 "len"
-                WHITESPACE@471..472 " "
-                GT@472..473 ">"
-                WHITESPACE@473..474 " "
-                EXPR_NUMBER@474..475
-                  FLOAT@474..475 "0"
-            WHITESPACE@475..476 " "
-            AND@476..478 "&&"
-            WHITESPACE@478..479 " "
-            EXPR_APPLY@479..510
-              EXPR_INDEX@479..489
-                EXPR_VAR@479..482
-                  NAME@479..482
-                    IDENT@479..482 "std"
-                DOT@482..483 "."
-                NAME@483..489
-                  IDENT@483..489 "member"
-              ARGS_DESC@489..510
-                L_PAREN@489..490 "("
-                ARG@490..495
-                  EXPR_VAR@490..495
-                    NAME@490..495
-                      IDENT@490..495 "chars"
-                COMMA@495..496 ","
-                WHITESPACE@496..497 " "
-                ARG@497..509
-                  EXPR_INDEX_EXPR@497..509
-                    LHS_EXPR@497..500
-                      EXPR_VAR@497..500
-                        NAME@497..500
-                          IDENT@497..500 "str"
-                    L_BRACK@500..501 "["
-                    EXPR_BINARY@501..508
-                      LHS_EXPR@501..504
-                        EXPR_VAR@501..504
-                          NAME@501..504
-                            IDENT@501..504 "len"
-                      WHITESPACE@504..505 " "
-                      MINUS@505..506 "-"
-                      WHITESPACE@506..507 " "
-                      EXPR_NUMBER@507..508
-                        FLOAT@507..508 "1"
-                    R_BRACK@508..509 "]"
-                R_PAREN@509..510 ")"
-          WHITESPACE@510..511 " "
-          THEN_KW@511..515 "then"
-          WHITESPACE@515..522 "\n      "
-          TRUE_EXPR@522..559
-            EXPR_APPLY@522..559
-              EXPR_INDEX@522..537
-                EXPR_VAR@522..525
-                  NAME@522..525
-                    IDENT@522..525 "std"
-                DOT@525..526 "."
-                NAME@526..537
-                  IDENT@526..537 "rstripChars"
-              ARGS_DESC@537..559
-                L_PAREN@537..538 "("
-                ARG@538..551
-                  EXPR_SLICE@538..551
-                    EXPR_VAR@538..541
-                      NAME@538..541
-                        IDENT@538..541 "str"
-                    SLICE_DESC@541..551
-                      L_BRACK@541..542 "["
-                      COLON@542..543 ":"
-                      SLICE_DESC_END@543..550
-                        EXPR_BINARY@543..550
-                          LHS_EXPR@543..546
-                            EXPR_VAR@543..546
-                              NAME@543..546
-                                IDENT@543..546 "len"
-                          WHITESPACE@546..547 " "
-                          MINUS@547..548 "-"
-                          WHITESPACE@548..549 " "
-                          EXPR_NUMBER@549..550
-                            FLOAT@549..550 "1"
-                      R_BRACK@550..551 "]"
-                COMMA@551..552 ","
-                WHITESPACE@552..553 " "
-                ARG@553..558
-                  EXPR_VAR@553..558
-                    NAME@553..558
-                      IDENT@553..558 "chars"
-                R_PAREN@558..559 ")"
-          WHITESPACE@559..564 "\n    "
-          ELSE_KW@564..568 "else"
-          WHITESPACE@568..575 "\n      "
-          FALSE_EXPR@575..578
-            EXPR_VAR@575..578
-              NAME@575..578
-                IDENT@575..578 "str"
-      COMMA@578..579 ","
-      WHITESPACE@579..583 "\n\n  "
-      MEMBER_FIELD_METHOD@583..663
-        FIELD_NAME_FIXED@583..593
-          NAME@583..593
-            IDENT@583..593 "stripChars"
-        PARAMS_DESC@593..605
-          L_PAREN@593..594 "("
-          PARAM@594..597
-            DESTRUCT_FULL@594..597
-              NAME@594..597
-                IDENT@594..597 "str"
-          COMMA@597..598 ","
-          WHITESPACE@598..599 " "
-          PARAM@599..604
-            DESTRUCT_FULL@599..604
-              NAME@599..604
-                IDENT@599..604 "chars"
-          R_PAREN@604..605 ")"
-        COLONCOLON@605..607 "::"
-        WHITESPACE@607..612 "\n    "
-        EXPR_APPLY@612..663
-          EXPR_INDEX@612..627
-            EXPR_VAR@612..615
-              NAME@612..615
-                IDENT@612..615 "std"
-            DOT@615..616 "."
-            NAME@616..627
-              IDENT@616..627 "lstripChars"
-          ARGS_DESC@627..663
-            L_PAREN@627..628 "("
-            ARG@628..655
-              EXPR_APPLY@628..655
-                EXPR_INDEX@628..643
-                  EXPR_VAR@628..631
-                    NAME@628..631
-                      IDENT@628..631 "std"
-                  DOT@631..632 "."
-                  NAME@632..643
-                    IDENT@632..643 "rstripChars"
-                ARGS_DESC@643..655
-                  L_PAREN@643..644 "("
-                  ARG@644..647
-                    EXPR_VAR@644..647
-                      NAME@644..647
-                        IDENT@644..647 "str"
-                  COMMA@647..648 ","
-                  WHITESPACE@648..649 " "
-                  ARG@649..654
-                    EXPR_VAR@649..654
-                      NAME@649..654
-                        IDENT@649..654 "chars"
-                  R_PAREN@654..655 ")"
-            COMMA@655..656 ","
-            WHITESPACE@656..657 " "
-            ARG@657..662
-              EXPR_VAR@657..662
-                NAME@657..662
-                  IDENT@657..662 "chars"
-            R_PAREN@662..663 ")"
-      COMMA@663..664 ","
-      WHITESPACE@664..668 "\n\n  "
-      MEMBER_FIELD_METHOD@668..741
-        FIELD_NAME_FIXED@668..679
-          NAME@668..679
-            IDENT@668..679 "stringChars"
-        PARAMS_DESC@679..684
-          L_PAREN@679..680 "("
-          PARAM@680..683
-            DESTRUCT_FULL@680..683
-              NAME@680..683
-                IDENT@680..683 "str"
-          R_PAREN@683..684 ")"
-        COLONCOLON@684..686 "::"
-        WHITESPACE@686..691 "\n    "
-        EXPR_APPLY@691..741
-          EXPR_INDEX@691..704
-            EXPR_VAR@691..694
-              NAME@691..694
-                IDENT@691..694 "std"
-            DOT@694..695 "."
-            NAME@695..704
-              IDENT@695..704 "makeArray"
-          ARGS_DESC@704..741
-            L_PAREN@704..705 "("
-            ARG@705..720
-              EXPR_APPLY@705..720
-                EXPR_INDEX@705..715
-                  EXPR_VAR@705..708
-                    NAME@705..708
-                      IDENT@705..708 "std"
-                  DOT@708..709 "."
-                  NAME@709..715
-                    IDENT@709..715 "length"
-                ARGS_DESC@715..720
-                  L_PAREN@715..716 "("
-                  ARG@716..719
-                    EXPR_VAR@716..719
-                      NAME@716..719
-                        IDENT@716..719 "str"
-                  R_PAREN@719..720 ")"
-            COMMA@720..721 ","
-            WHITESPACE@721..722 " "
-            ARG@722..740
-              EXPR_FUNCTION@722..740
-                FUNCTION_KW@722..730 "function"
-                PARAMS_DESC@730..733
-                  L_PAREN@730..731 "("
-                  PARAM@731..732
-                    DESTRUCT_FULL@731..732
-                      NAME@731..732
-                        IDENT@731..732 "i"
-                  R_PAREN@732..733 ")"
-                WHITESPACE@733..734 " "
-                EXPR_INDEX_EXPR@734..740
-                  LHS_EXPR@734..737
-                    EXPR_VAR@734..737
-                      NAME@734..737
-                        IDENT@734..737 "str"
-                  L_BRACK@737..738 "["
-                  EXPR_VAR@738..739
-                    NAME@738..739
-                      IDENT@738..739 "i"
-                  R_BRACK@739..740 "]"
-            R_PAREN@740..741 ")"
-      COMMA@741..742 ","
-      WHITESPACE@742..746 "\n\n  "
-      MEMBER_FIELD_METHOD@746..1024
-        FIELD_NAME_FIXED@746..757
-          NAME@746..757
-            IDENT@746..757 "splitLimitR"
-        PARAMS_DESC@757..776
-          L_PAREN@757..758 "("
-          PARAM@758..761
-            DESTRUCT_FULL@758..761
-              NAME@758..761
-                IDENT@758..761 "str"
-          COMMA@761..762 ","
-          WHITESPACE@762..763 " "
-          PARAM@763..764
-            DESTRUCT_FULL@763..764
-              NAME@763..764
-                IDENT@763..764 "c"
-          COMMA@764..765 ","
-          WHITESPACE@765..766 " "
-          PARAM@766..775
-            DESTRUCT_FULL@766..775
-              NAME@766..775
-                IDENT@766..775 "maxsplits"
-          R_PAREN@775..776 ")"
-        COLONCOLON@776..778 "::"
-        WHITESPACE@778..783 "\n    "
-        EXPR_IF_THEN_ELSE@783..1024
-          IF_KW@783..785 "if"
-          WHITESPACE@785..786 " "
-          EXPR_BINARY@786..801
-            LHS_EXPR@786..795
-              EXPR_VAR@786..795
-                NAME@786..795
-                  IDENT@786..795 "maxsplits"
-            WHITESPACE@795..796 " "
-            EQ@796..798 "=="
-            WHITESPACE@798..799 " "
-            EXPR_UNARY@799..801
-              MINUS@799..800 "-"
-              EXPR_NUMBER@800..801
-                FLOAT@800..801 "1"
-          WHITESPACE@801..802 " "
-          THEN_KW@802..806 "then"
-          WHITESPACE@806..813 "\n      "
-          TRUE_EXPR@813..839
-            EXPR_APPLY@813..839
-              EXPR_INDEX@813..827
-                EXPR_VAR@813..816
-                  NAME@813..816
-                    IDENT@813..816 "std"
-                DOT@816..817 "."
-                NAME@817..827
-                  IDENT@817..827 "splitLimit"
-              ARGS_DESC@827..839
-                L_PAREN@827..828 "("
-                ARG@828..831
-                  EXPR_VAR@828..831
-                    NAME@828..831
-                      IDENT@828..831 "str"
-                COMMA@831..832 ","
-                WHITESPACE@832..833 " "
-                ARG@833..834
-                  EXPR_VAR@833..834
-                    NAME@833..834
-                      IDENT@833..834 "c"
-                COMMA@834..835 ","
-                WHITESPACE@835..836 " "
-                ARG@836..838
-                  EXPR_UNARY@836..838
-                    MINUS@836..837 "-"
-                    EXPR_NUMBER@837..838
-                      FLOAT@837..838 "1"
-                R_PAREN@838..839 ")"
-          WHITESPACE@839..844 "\n    "
-          ELSE_KW@844..848 "else"
-          WHITESPACE@848..855 "\n      "
-          STMT_LOCAL@855..923
-            LOCAL_KW@855..860 "local"
-            WHITESPACE@860..861 " "
-            BIND_FUNCTION@861..922
-              NAME@861..867
-                IDENT@861..867 "revStr"
-              PARAMS_DESC@867..872
-                L_PAREN@867..868 "("
-                PARAM@868..871
-                  DESTRUCT_FULL@868..871
-                    NAME@868..871
-                      IDENT@868..871 "str"
-                R_PAREN@871..872 ")"
-              WHITESPACE@872..873 " "
-              ASSIGN@873..874 "="
-              WHITESPACE@874..875 " "
-              EXPR_APPLY@875..922
-                EXPR_INDEX@875..883
-                  EXPR_VAR@875..878
-                    NAME@875..878
-                      IDENT@875..878 "std"
-                  DOT@878..879 "."
-                  NAME@879..883
-                    IDENT@879..883 "join"
-                ARGS_DESC@883..922
-                  L_PAREN@883..884 "("
-                  ARG@884..886
-                    EXPR_STRING@884..886
-                      STRING_SINGLE@884..886 "''"
-                  COMMA@886..887 ","
-                  WHITESPACE@887..888 " "
-                  ARG@888..921
-                    EXPR_APPLY@888..921
-                      EXPR_INDEX@888..899
-                        EXPR_VAR@888..891
-                          NAME@888..891
-                            IDENT@888..891 "std"
-                        DOT@891..892 "."
-                        NAME@892..899
-                          IDENT@892..899 "reverse"
-                      ARGS_DESC@899..921
-                        L_PAREN@899..900 "("
-                        ARG@900..920
-                          EXPR_APPLY@900..920
-                            EXPR_INDEX@900..915
-                              EXPR_VAR@900..903
-                                NAME@900..903
-                                  IDENT@900..903 "std"
-                              DOT@903..904 "."
-                              NAME@904..915
-                                IDENT@904..915 "stringChars"
-                            ARGS_DESC@915..920
-                              L_PAREN@915..916 "("
-                              ARG@916..919
-                                EXPR_VAR@916..919
-                                  NAME@916..919
-                                    IDENT@916..919 "str"
+SOURCE_FILE@0..7835
+  EXPR@0..7834
+    EXPR_OBJECT@0..7834
+      OBJ_BODY_MEMBER_LIST@0..7834
+        L_BRACE@0..1 "{"
+        WHITESPACE@1..4 "\n  "
+        MEMBER_BIND_STMT@4..20
+          OBJ_LOCAL@4..20
+            LOCAL_KW@4..9 "local"
+            WHITESPACE@9..10 " "
+            BIND_DESTRUCT@10..20
+              DESTRUCT_FULL@10..13
+                NAME@10..13
+                  IDENT@10..13 "std"
+              WHITESPACE@13..14 " "
+              ASSIGN@14..15 "="
+              WHITESPACE@15..16 " "
+              EXPR@16..20
+                EXPR_LITERAL@16..20
+                  SELF_KW@16..20 "self"
+        COMMA@20..21 ","
+        WHITESPACE@21..24 "\n  "
+        MEMBER_BIND_STMT@24..41
+          OBJ_LOCAL@24..41
+            LOCAL_KW@24..29 "local"
+            WHITESPACE@29..30 " "
+            BIND_DESTRUCT@30..41
+              DESTRUCT_FULL@30..32
+                NAME@30..32
+                  IDENT@30..32 "id"
+              WHITESPACE@32..33 " "
+              ASSIGN@33..34 "="
+              WHITESPACE@34..35 " "
+              EXPR@35..41
+                EXPR_VAR@35..38
+                  NAME@35..38
+                    IDENT@35..38 "std"
+                SUFFIX_INDEX@38..41
+                  DOT@38..39 "."
+                  NAME@39..41
+                    IDENT@39..41 "id"
+        COMMA@41..42 ","
+        WHITESPACE@42..46 "\n\n  "
+        MEMBER_FIELD_NORMAL@46..224
+          FIELD_NAME_FIXED@46..54
+            NAME@46..54
+              IDENT@46..54 "thisFile"
+          COLONCOLON@54..56 "::"
+          WHITESPACE@56..57 " "
+          EXPR@57..224
+            EXPR_ERROR@57..224
+              ERROR_KW@57..62 "error"
+              WHITESPACE@62..63 " "
+              EXPR@63..224
+                EXPR_STRING@63..224
+                  STRING_SINGLE@63..224 "'std.thisFile is depr ..."
+        COMMA@224..225 ","
+        WHITESPACE@225..229 "\n\n  "
+        MEMBER_FIELD_METHOD@229..372
+          FIELD_NAME_FIXED@229..240
+            NAME@229..240
+              IDENT@229..240 "lstripChars"
+          PARAMS_DESC@240..252
+            L_PAREN@240..241 "("
+            PARAM@241..244
+              DESTRUCT_FULL@241..244
+                NAME@241..244
+                  IDENT@241..244 "str"
+            COMMA@244..245 ","
+            WHITESPACE@245..246 " "
+            PARAM@246..251
+              DESTRUCT_FULL@246..251
+                NAME@246..251
+                  IDENT@246..251 "chars"
+            R_PAREN@251..252 ")"
+          COLONCOLON@252..254 "::"
+          WHITESPACE@254..259 "\n    "
+          EXPR@259..372
+            EXPR_IF_THEN_ELSE@259..372
+              IF_KW@259..261 "if"
+              WHITESPACE@261..262 " "
+              EXPR@262..310
+                EXPR_BINARY@262..310
+                  EXPR@262..281
+                    EXPR_BINARY@262..281
+                      EXPR@262..265
+                        EXPR_VAR@262..265
+                          NAME@262..265
+                            IDENT@262..265 "std"
+                      SUFFIX_INDEX@265..272
+                        DOT@265..266 "."
+                        NAME@266..272
+                          IDENT@266..272 "length"
+                      SUFFIX_APPLY@272..277
+                        ARGS_DESC@272..277
+                          L_PAREN@272..273 "("
+                          ARG@273..276
+                            EXPR@273..276
+                              EXPR_VAR@273..276
+                                NAME@273..276
+                                  IDENT@273..276 "str"
+                          R_PAREN@276..277 ")"
+                      WHITESPACE@277..278 " "
+                      GT@278..279 ">"
+                      WHITESPACE@279..280 " "
+                      EXPR@280..281
+                        EXPR_NUMBER@280..281
+                          FLOAT@280..281 "0"
+                  WHITESPACE@281..282 " "
+                  AND@282..284 "&&"
+                  WHITESPACE@284..285 " "
+                  EXPR@285..310
+                    EXPR_VAR@285..288
+                      NAME@285..288
+                        IDENT@285..288 "std"
+                    SUFFIX_INDEX@288..295
+                      DOT@288..289 "."
+                      NAME@289..295
+                        IDENT@289..295 "member"
+                    SUFFIX_APPLY@295..310
+                      ARGS_DESC@295..310
+                        L_PAREN@295..296 "("
+                        ARG@296..301
+                          EXPR@296..301
+                            EXPR_VAR@296..301
+                              NAME@296..301
+                                IDENT@296..301 "chars"
+                        COMMA@301..302 ","
+                        WHITESPACE@302..303 " "
+                        ARG@303..309
+                          EXPR@303..309
+                            EXPR_VAR@303..306
+                              NAME@303..306
+                                IDENT@303..306 "str"
+                            SUFFIX_INDEX_EXPR@306..309
+                              L_BRACK@306..307 "["
+                              EXPR@307..308
+                                EXPR_NUMBER@307..308
+                                  FLOAT@307..308 "0"
+                              R_BRACK@308..309 "]"
+                        R_PAREN@309..310 ")"
+              WHITESPACE@310..311 " "
+              THEN_KW@311..315 "then"
+              WHITESPACE@315..322 "\n      "
+              TRUE_EXPR@322..353
+                EXPR@322..353
+                  EXPR_VAR@322..325
+                    NAME@322..325
+                      IDENT@322..325 "std"
+                  SUFFIX_INDEX@325..337
+                    DOT@325..326 "."
+                    NAME@326..337
+                      IDENT@326..337 "lstripChars"
+                  SUFFIX_APPLY@337..353
+                    ARGS_DESC@337..353
+                      L_PAREN@337..338 "("
+                      ARG@338..345
+                        EXPR@338..345
+                          EXPR_VAR@338..341
+                            NAME@338..341
+                              IDENT@338..341 "str"
+                          SUFFIX_SLICE@341..345
+                            SLICE_DESC@341..345
+                              L_BRACK@341..342 "["
+                              EXPR@342..343
+                                EXPR_NUMBER@342..343
+                                  FLOAT@342..343 "1"
+                              COLON@343..344 ":"
+                              R_BRACK@344..345 "]"
+                      COMMA@345..346 ","
+                      WHITESPACE@346..347 " "
+                      ARG@347..352
+                        EXPR@347..352
+                          EXPR_VAR@347..352
+                            NAME@347..352
+                              IDENT@347..352 "chars"
+                      R_PAREN@352..353 ")"
+              WHITESPACE@353..358 "\n    "
+              ELSE_KW@358..362 "else"
+              WHITESPACE@362..369 "\n      "
+              FALSE_EXPR@369..372
+                EXPR@369..372
+                  EXPR_VAR@369..372
+                    NAME@369..372
+                      IDENT@369..372 "str"
+        COMMA@372..373 ","
+        WHITESPACE@373..377 "\n\n  "
+        MEMBER_FIELD_METHOD@377..553
+          FIELD_NAME_FIXED@377..388
+            NAME@377..388
+              IDENT@377..388 "rstripChars"
+          PARAMS_DESC@388..400
+            L_PAREN@388..389 "("
+            PARAM@389..392
+              DESTRUCT_FULL@389..392
+                NAME@389..392
+                  IDENT@389..392 "str"
+            COMMA@392..393 ","
+            WHITESPACE@393..394 " "
+            PARAM@394..399
+              DESTRUCT_FULL@394..399
+                NAME@394..399
+                  IDENT@394..399 "chars"
+            R_PAREN@399..400 ")"
+          COLONCOLON@400..402 "::"
+          WHITESPACE@402..407 "\n    "
+          EXPR@407..553
+            STMT_LOCAL@407..435
+              LOCAL_KW@407..412 "local"
+              WHITESPACE@412..413 " "
+              BIND_DESTRUCT@413..434
+                DESTRUCT_FULL@413..416
+                  NAME@413..416
+                    IDENT@413..416 "len"
+                WHITESPACE@416..417 " "
+                ASSIGN@417..418 "="
+                WHITESPACE@418..419 " "
+                EXPR@419..434
+                  EXPR_VAR@419..422
+                    NAME@419..422
+                      IDENT@419..422 "std"
+                  SUFFIX_INDEX@422..429
+                    DOT@422..423 "."
+                    NAME@423..429
+                      IDENT@423..429 "length"
+                  SUFFIX_APPLY@429..434
+                    ARGS_DESC@429..434
+                      L_PAREN@429..430 "("
+                      ARG@430..433
+                        EXPR@430..433
+                          EXPR_VAR@430..433
+                            NAME@430..433
+                              IDENT@430..433 "str"
+                      R_PAREN@433..434 ")"
+              SEMI@434..435 ";"
+            WHITESPACE@435..440 "\n    "
+            EXPR_IF_THEN_ELSE@440..553
+              IF_KW@440..442 "if"
+              WHITESPACE@442..443 " "
+              EXPR@443..485
+                EXPR_BINARY@443..485
+                  EXPR@443..450
+                    EXPR_BINARY@443..450
+                      EXPR@443..446
+                        EXPR_VAR@443..446
+                          NAME@443..446
+                            IDENT@443..446 "len"
+                      WHITESPACE@446..447 " "
+                      GT@447..448 ">"
+                      WHITESPACE@448..449 " "
+                      EXPR@449..450
+                        EXPR_NUMBER@449..450
+                          FLOAT@449..450 "0"
+                  WHITESPACE@450..451 " "
+                  AND@451..453 "&&"
+                  WHITESPACE@453..454 " "
+                  EXPR@454..485
+                    EXPR_VAR@454..457
+                      NAME@454..457
+                        IDENT@454..457 "std"
+                    SUFFIX_INDEX@457..464
+                      DOT@457..458 "."
+                      NAME@458..464
+                        IDENT@458..464 "member"
+                    SUFFIX_APPLY@464..485
+                      ARGS_DESC@464..485
+                        L_PAREN@464..465 "("
+                        ARG@465..470
+                          EXPR@465..470
+                            EXPR_VAR@465..470
+                              NAME@465..470
+                                IDENT@465..470 "chars"
+                        COMMA@470..471 ","
+                        WHITESPACE@471..472 " "
+                        ARG@472..484
+                          EXPR@472..484
+                            EXPR_VAR@472..475
+                              NAME@472..475
+                                IDENT@472..475 "str"
+                            SUFFIX_INDEX_EXPR@475..484
+                              L_BRACK@475..476 "["
+                              EXPR@476..483
+                                EXPR_BINARY@476..483
+                                  EXPR@476..479
+                                    EXPR_VAR@476..479
+                                      NAME@476..479
+                                        IDENT@476..479 "len"
+                                  WHITESPACE@479..480 " "
+                                  MINUS@480..481 "-"
+                                  WHITESPACE@481..482 " "
+                                  EXPR@482..483
+                                    EXPR_NUMBER@482..483
+                                      FLOAT@482..483 "1"
+                              R_BRACK@483..484 "]"
+                        R_PAREN@484..485 ")"
+              WHITESPACE@485..486 " "
+              THEN_KW@486..490 "then"
+              WHITESPACE@490..497 "\n      "
+              TRUE_EXPR@497..534
+                EXPR@497..534
+                  EXPR_VAR@497..500
+                    NAME@497..500
+                      IDENT@497..500 "std"
+                  SUFFIX_INDEX@500..512
+                    DOT@500..501 "."
+                    NAME@501..512
+                      IDENT@501..512 "rstripChars"
+                  SUFFIX_APPLY@512..534
+                    ARGS_DESC@512..534
+                      L_PAREN@512..513 "("
+                      ARG@513..526
+                        EXPR@513..526
+                          EXPR_VAR@513..516
+                            NAME@513..516
+                              IDENT@513..516 "str"
+                          SUFFIX_SLICE@516..526
+                            SLICE_DESC@516..526
+                              L_BRACK@516..517 "["
+                              COLON@517..518 ":"
+                              SLICE_DESC_END@518..525
+                                EXPR@518..525
+                                  EXPR_BINARY@518..525
+                                    EXPR@518..521
+                                      EXPR_VAR@518..521
+                                        NAME@518..521
+                                          IDENT@518..521 "len"
+                                    WHITESPACE@521..522 " "
+                                    MINUS@522..523 "-"
+                                    WHITESPACE@523..524 " "
+                                    EXPR@524..525
+                                      EXPR_NUMBER@524..525
+                                        FLOAT@524..525 "1"
+                              R_BRACK@525..526 "]"
+                      COMMA@526..527 ","
+                      WHITESPACE@527..528 " "
+                      ARG@528..533
+                        EXPR@528..533
+                          EXPR_VAR@528..533
+                            NAME@528..533
+                              IDENT@528..533 "chars"
+                      R_PAREN@533..534 ")"
+              WHITESPACE@534..539 "\n    "
+              ELSE_KW@539..543 "else"
+              WHITESPACE@543..550 "\n      "
+              FALSE_EXPR@550..553
+                EXPR@550..553
+                  EXPR_VAR@550..553
+                    NAME@550..553
+                      IDENT@550..553 "str"
+        COMMA@553..554 ","
+        WHITESPACE@554..558 "\n\n  "
+        MEMBER_FIELD_METHOD@558..638
+          FIELD_NAME_FIXED@558..568
+            NAME@558..568
+              IDENT@558..568 "stripChars"
+          PARAMS_DESC@568..580
+            L_PAREN@568..569 "("
+            PARAM@569..572
+              DESTRUCT_FULL@569..572
+                NAME@569..572
+                  IDENT@569..572 "str"
+            COMMA@572..573 ","
+            WHITESPACE@573..574 " "
+            PARAM@574..579
+              DESTRUCT_FULL@574..579
+                NAME@574..579
+                  IDENT@574..579 "chars"
+            R_PAREN@579..580 ")"
+          COLONCOLON@580..582 "::"
+          WHITESPACE@582..587 "\n    "
+          EXPR@587..638
+            EXPR_VAR@587..590
+              NAME@587..590
+                IDENT@587..590 "std"
+            SUFFIX_INDEX@590..602
+              DOT@590..591 "."
+              NAME@591..602
+                IDENT@591..602 "lstripChars"
+            SUFFIX_APPLY@602..638
+              ARGS_DESC@602..638
+                L_PAREN@602..603 "("
+                ARG@603..630
+                  EXPR@603..630
+                    EXPR_VAR@603..606
+                      NAME@603..606
+                        IDENT@603..606 "std"
+                    SUFFIX_INDEX@606..618
+                      DOT@606..607 "."
+                      NAME@607..618
+                        IDENT@607..618 "rstripChars"
+                    SUFFIX_APPLY@618..630
+                      ARGS_DESC@618..630
+                        L_PAREN@618..619 "("
+                        ARG@619..622
+                          EXPR@619..622
+                            EXPR_VAR@619..622
+                              NAME@619..622
+                                IDENT@619..622 "str"
+                        COMMA@622..623 ","
+                        WHITESPACE@623..624 " "
+                        ARG@624..629
+                          EXPR@624..629
+                            EXPR_VAR@624..629
+                              NAME@624..629
+                                IDENT@624..629 "chars"
+                        R_PAREN@629..630 ")"
+                COMMA@630..631 ","
+                WHITESPACE@631..632 " "
+                ARG@632..637
+                  EXPR@632..637
+                    EXPR_VAR@632..637
+                      NAME@632..637
+                        IDENT@632..637 "chars"
+                R_PAREN@637..638 ")"
+        COMMA@638..639 ","
+        WHITESPACE@639..643 "\n\n  "
+        MEMBER_FIELD_METHOD@643..921
+          FIELD_NAME_FIXED@643..654
+            NAME@643..654
+              IDENT@643..654 "splitLimitR"
+          PARAMS_DESC@654..673
+            L_PAREN@654..655 "("
+            PARAM@655..658
+              DESTRUCT_FULL@655..658
+                NAME@655..658
+                  IDENT@655..658 "str"
+            COMMA@658..659 ","
+            WHITESPACE@659..660 " "
+            PARAM@660..661
+              DESTRUCT_FULL@660..661
+                NAME@660..661
+                  IDENT@660..661 "c"
+            COMMA@661..662 ","
+            WHITESPACE@662..663 " "
+            PARAM@663..672
+              DESTRUCT_FULL@663..672
+                NAME@663..672
+                  IDENT@663..672 "maxsplits"
+            R_PAREN@672..673 ")"
+          COLONCOLON@673..675 "::"
+          WHITESPACE@675..680 "\n    "
+          EXPR@680..921
+            EXPR_IF_THEN_ELSE@680..921
+              IF_KW@680..682 "if"
+              WHITESPACE@682..683 " "
+              EXPR@683..698
+                EXPR_BINARY@683..698
+                  EXPR@683..692
+                    EXPR_VAR@683..692
+                      NAME@683..692
+                        IDENT@683..692 "maxsplits"
+                  WHITESPACE@692..693 " "
+                  EQ@693..695 "=="
+                  WHITESPACE@695..696 " "
+                  EXPR@696..698
+                    EXPR_UNARY@696..698
+                      MINUS@696..697 "-"
+                      EXPR_NUMBER@697..698
+                        FLOAT@697..698 "1"
+              WHITESPACE@698..699 " "
+              THEN_KW@699..703 "then"
+              WHITESPACE@703..710 "\n      "
+              TRUE_EXPR@710..736
+                EXPR@710..736
+                  EXPR_VAR@710..713
+                    NAME@710..713
+                      IDENT@710..713 "std"
+                  SUFFIX_INDEX@713..724
+                    DOT@713..714 "."
+                    NAME@714..724
+                      IDENT@714..724 "splitLimit"
+                  SUFFIX_APPLY@724..736
+                    ARGS_DESC@724..736
+                      L_PAREN@724..725 "("
+                      ARG@725..728
+                        EXPR@725..728
+                          EXPR_VAR@725..728
+                            NAME@725..728
+                              IDENT@725..728 "str"
+                      COMMA@728..729 ","
+                      WHITESPACE@729..730 " "
+                      ARG@730..731
+                        EXPR@730..731
+                          EXPR_VAR@730..731
+                            NAME@730..731
+                              IDENT@730..731 "c"
+                      COMMA@731..732 ","
+                      WHITESPACE@732..733 " "
+                      ARG@733..735
+                        EXPR@733..735
+                          EXPR_UNARY@733..735
+                            MINUS@733..734 "-"
+                            EXPR_NUMBER@734..735
+                              FLOAT@734..735 "1"
+                      R_PAREN@735..736 ")"
+              WHITESPACE@736..741 "\n    "
+              ELSE_KW@741..745 "else"
+              WHITESPACE@745..752 "\n      "
+              FALSE_EXPR@752..921
+                EXPR@752..921
+                  STMT_LOCAL@752..820
+                    LOCAL_KW@752..757 "local"
+                    WHITESPACE@757..758 " "
+                    BIND_FUNCTION@758..819
+                      NAME@758..764
+                        IDENT@758..764 "revStr"
+                      PARAMS_DESC@764..769
+                        L_PAREN@764..765 "("
+                        PARAM@765..768
+                          DESTRUCT_FULL@765..768
+                            NAME@765..768
+                              IDENT@765..768 "str"
+                        R_PAREN@768..769 ")"
+                      WHITESPACE@769..770 " "
+                      ASSIGN@770..771 "="
+                      WHITESPACE@771..772 " "
+                      EXPR@772..819
+                        EXPR_VAR@772..775
+                          NAME@772..775
+                            IDENT@772..775 "std"
+                        SUFFIX_INDEX@775..780
+                          DOT@775..776 "."
+                          NAME@776..780
+                            IDENT@776..780 "join"
+                        SUFFIX_APPLY@780..819
+                          ARGS_DESC@780..819
+                            L_PAREN@780..781 "("
+                            ARG@781..783
+                              EXPR@781..783
+                                EXPR_STRING@781..783
+                                  STRING_SINGLE@781..783 "''"
+                            COMMA@783..784 ","
+                            WHITESPACE@784..785 " "
+                            ARG@785..818
+                              EXPR@785..818
+                                EXPR_VAR@785..788
+                                  NAME@785..788
+                                    IDENT@785..788 "std"
+                                SUFFIX_INDEX@788..796
+                                  DOT@788..789 "."
+                                  NAME@789..796
+                                    IDENT@789..796 "reverse"
+                                SUFFIX_APPLY@796..818
+                                  ARGS_DESC@796..818
+                                    L_PAREN@796..797 "("
+                                    ARG@797..817
+                                      EXPR@797..817
+                                        EXPR_VAR@797..800
+                                          NAME@797..800
+                                            IDENT@797..800 "std"
+                                        SUFFIX_INDEX@800..812
+                                          DOT@800..801 "."
+                                          NAME@801..812
+                                            IDENT@801..812 "stringChars"
+                                        SUFFIX_APPLY@812..817
+                                          ARGS_DESC@812..817
+                                            L_PAREN@812..813 "("
+                                            ARG@813..816
+                                              EXPR@813..816
+                                                EXPR_VAR@813..816
+                                                  NAME@813..816
+                                                    IDENT@813..816 "str"
+                                            R_PAREN@816..817 ")"
+                                    R_PAREN@817..818 ")"
+                            R_PAREN@818..819 ")"
+                    SEMI@819..820 ";"
+                  WHITESPACE@820..827 "\n      "
+                  EXPR_VAR@827..830
+                    NAME@827..830
+                      IDENT@827..830 "std"
+                  SUFFIX_INDEX@830..834
+                    DOT@830..831 "."
+                    NAME@831..834
+                      IDENT@831..834 "map"
+                  SUFFIX_APPLY@834..921
+                    ARGS_DESC@834..921
+                      L_PAREN@834..835 "("
+                      ARG@835..856
+                        EXPR@835..856
+                          EXPR_FUNCTION@835..856
+                            FUNCTION_KW@835..843 "function"
+                            PARAMS_DESC@843..846
+                              L_PAREN@843..844 "("
+                              PARAM@844..845
+                                DESTRUCT_FULL@844..845
+                                  NAME@844..845
+                                    IDENT@844..845 "e"
+                              R_PAREN@845..846 ")"
+                            WHITESPACE@846..847 " "
+                            EXPR@847..856
+                              EXPR_VAR@847..853
+                                NAME@847..853
+                                  IDENT@847..853 "revStr"
+                              SUFFIX_APPLY@853..856
+                                ARGS_DESC@853..856
+                                  L_PAREN@853..854 "("
+                                  ARG@854..855
+                                    EXPR@854..855
+                                      EXPR_VAR@854..855
+                                        NAME@854..855
+                                          IDENT@854..855 "e"
+                                  R_PAREN@855..856 ")"
+                      COMMA@856..857 ","
+                      WHITESPACE@857..858 " "
+                      ARG@858..920
+                        EXPR@858..920
+                          EXPR_VAR@858..861
+                            NAME@858..861
+                              IDENT@858..861 "std"
+                          SUFFIX_INDEX@861..869
+                            DOT@861..862 "."
+                            NAME@862..869
+                              IDENT@862..869 "reverse"
+                          SUFFIX_APPLY@869..920
+                            ARGS_DESC@869..920
+                              L_PAREN@869..870 "("
+                              ARG@870..919
+                                EXPR@870..919
+                                  EXPR_VAR@870..873
+                                    NAME@870..873
+                                      IDENT@870..873 "std"
+                                  SUFFIX_INDEX@873..884
+                                    DOT@873..874 "."
+                                    NAME@874..884
+                                      IDENT@874..884 "splitLimit"
+                                  SUFFIX_APPLY@884..919
+                                    ARGS_DESC@884..919
+                                      L_PAREN@884..885 "("
+                                      ARG@885..896
+                                        EXPR@885..896
+                                          EXPR_VAR@885..891
+                                            NAME@885..891
+                                              IDENT@885..891 "revStr"
+                                          SUFFIX_APPLY@891..896
+                                            ARGS_DESC@891..896
+                                              L_PAREN@891..892 "("
+                                              ARG@892..895
+                                                EXPR@892..895
+                                                  EXPR_VAR@892..895
+                                                    NAME@892..895
+                                                      IDENT@892..895 "str"
+                                              R_PAREN@895..896 ")"
+                                      COMMA@896..897 ","
+                                      WHITESPACE@897..898 " "
+                                      ARG@898..907
+                                        EXPR@898..907
+                                          EXPR_VAR@898..904
+                                            NAME@898..904
+                                              IDENT@898..904 "revStr"
+                                          SUFFIX_APPLY@904..907
+                                            ARGS_DESC@904..907
+                                              L_PAREN@904..905 "("
+                                              ARG@905..906
+                                                EXPR@905..906
+                                                  EXPR_VAR@905..906
+                                                    NAME@905..906
+                                                      IDENT@905..906 "c"
+                                              R_PAREN@906..907 ")"
+                                      COMMA@907..908 ","
+                                      WHITESPACE@908..909 " "
+                                      ARG@909..918
+                                        EXPR@909..918
+                                          EXPR_VAR@909..918
+                                            NAME@909..918
+                                              IDENT@909..918 "maxsplits"
+                                      R_PAREN@918..919 ")"
                               R_PAREN@919..920 ")"
-                        R_PAREN@920..921 ")"
-                  R_PAREN@921..922 ")"
-            SEMI@922..923 ";"
-          WHITESPACE@923..930 "\n      "
-          FALSE_EXPR@930..1024
-            EXPR_APPLY@930..1024
-              EXPR_INDEX@930..937
-                EXPR_VAR@930..933
-                  NAME@930..933
-                    IDENT@930..933 "std"
-                DOT@933..934 "."
-                NAME@934..937
-                  IDENT@934..937 "map"
-              ARGS_DESC@937..1024
-                L_PAREN@937..938 "("
-                ARG@938..959
-                  EXPR_FUNCTION@938..959
-                    FUNCTION_KW@938..946 "function"
-                    PARAMS_DESC@946..949
-                      L_PAREN@946..947 "("
-                      PARAM@947..948
-                        DESTRUCT_FULL@947..948
-                          NAME@947..948
-                            IDENT@947..948 "e"
-                      R_PAREN@948..949 ")"
-                    WHITESPACE@949..950 " "
-                    EXPR_APPLY@950..959
-                      EXPR_VAR@950..956
-                        NAME@950..956
-                          IDENT@950..956 "revStr"
-                      ARGS_DESC@956..959
-                        L_PAREN@956..957 "("
-                        ARG@957..958
-                          EXPR_VAR@957..958
-                            NAME@957..958
-                              IDENT@957..958 "e"
-                        R_PAREN@958..959 ")"
-                COMMA@959..960 ","
-                WHITESPACE@960..961 " "
-                ARG@961..1023
-                  EXPR_APPLY@961..1023
-                    EXPR_INDEX@961..972
-                      EXPR_VAR@961..964
-                        NAME@961..964
-                          IDENT@961..964 "std"
-                      DOT@964..965 "."
-                      NAME@965..972
-                        IDENT@965..972 "reverse"
-                    ARGS_DESC@972..1023
-                      L_PAREN@972..973 "("
-                      ARG@973..1022
-                        EXPR_APPLY@973..1022
-                          EXPR_INDEX@973..987
-                            EXPR_VAR@973..976
-                              NAME@973..976
-                                IDENT@973..976 "std"
-                            DOT@976..977 "."
-                            NAME@977..987
-                              IDENT@977..987 "splitLimit"
-                          ARGS_DESC@987..1022
-                            L_PAREN@987..988 "("
-                            ARG@988..999
-                              EXPR_APPLY@988..999
-                                EXPR_VAR@988..994
-                                  NAME@988..994
-                                    IDENT@988..994 "revStr"
-                                ARGS_DESC@994..999
-                                  L_PAREN@994..995 "("
-                                  ARG@995..998
-                                    EXPR_VAR@995..998
-                                      NAME@995..998
-                                        IDENT@995..998 "str"
-                                  R_PAREN@998..999 ")"
-                            COMMA@999..1000 ","
-                            WHITESPACE@1000..1001 " "
-                            ARG@1001..1010
-                              EXPR_APPLY@1001..1010
-                                EXPR_VAR@1001..1007
-                                  NAME@1001..1007
-                                    IDENT@1001..1007 "revStr"
-                                ARGS_DESC@1007..1010
-                                  L_PAREN@1007..1008 "("
-                                  ARG@1008..1009
-                                    EXPR_VAR@1008..1009
-                                      NAME@1008..1009
-                                        IDENT@1008..1009 "c"
-                                  R_PAREN@1009..1010 ")"
-                            COMMA@1010..1011 ","
-                            WHITESPACE@1011..1012 " "
-                            ARG@1012..1021
-                              EXPR_VAR@1012..1021
-                                NAME@1012..1021
-                                  IDENT@1012..1021 "maxsplits"
-                            R_PAREN@1021..1022 ")"
-                      R_PAREN@1022..1023 ")"
-                R_PAREN@1023..1024 ")"
-      COMMA@1024..1025 ","
-      WHITESPACE@1025..1029 "\n\n  "
-      MEMBER_FIELD_METHOD@1029..1071
-        FIELD_NAME_FIXED@1029..1034
-          NAME@1029..1034
-            IDENT@1029..1034 "split"
-        PARAMS_DESC@1034..1042
-          L_PAREN@1034..1035 "("
-          PARAM@1035..1038
-            DESTRUCT_FULL@1035..1038
-              NAME@1035..1038
-                IDENT@1035..1038 "str"
-          COMMA@1038..1039 ","
-          WHITESPACE@1039..1040 " "
-          PARAM@1040..1041
-            DESTRUCT_FULL@1040..1041
-              NAME@1040..1041
-                IDENT@1040..1041 "c"
-          R_PAREN@1041..1042 ")"
-        COLONCOLON@1042..1044 "::"
-        WHITESPACE@1044..1045 " "
-        EXPR_APPLY@1045..1071
-          EXPR_INDEX@1045..1059
-            EXPR_VAR@1045..1048
-              NAME@1045..1048
-                IDENT@1045..1048 "std"
-            DOT@1048..1049 "."
-            NAME@1049..1059
-              IDENT@1049..1059 "splitLimit"
-          ARGS_DESC@1059..1071
-            L_PAREN@1059..1060 "("
-            ARG@1060..1063
-              EXPR_VAR@1060..1063
-                NAME@1060..1063
-                  IDENT@1060..1063 "str"
-            COMMA@1063..1064 ","
-            WHITESPACE@1064..1065 " "
-            ARG@1065..1066
-              EXPR_VAR@1065..1066
-                NAME@1065..1066
-                  IDENT@1065..1066 "c"
-            COMMA@1066..1067 ","
-            WHITESPACE@1067..1068 " "
-            ARG@1068..1070
-              EXPR_UNARY@1068..1070
-                MINUS@1068..1069 "-"
-                EXPR_NUMBER@1069..1070
-                  FLOAT@1069..1070 "1"
-            R_PAREN@1070..1071 ")"
-      COMMA@1071..1072 ","
-      WHITESPACE@1072..1076 "\n\n  "
-      MEMBER_FIELD_METHOD@1076..1434
-        FIELD_NAME_FIXED@1076..1088
-          NAME@1076..1088
-            IDENT@1076..1088 "mapWithIndex"
-        PARAMS_DESC@1088..1099
-          L_PAREN@1088..1089 "("
-          PARAM@1089..1093
-            DESTRUCT_FULL@1089..1093
-              NAME@1089..1093
-                IDENT@1089..1093 "func"
-          COMMA@1093..1094 ","
-          WHITESPACE@1094..1095 " "
-          PARAM@1095..1098
-            DESTRUCT_FULL@1095..1098
-              NAME@1095..1098
-                IDENT@1095..1098 "arr"
-          R_PAREN@1098..1099 ")"
-        COLONCOLON@1099..1101 "::"
-        WHITESPACE@1101..1106 "\n    "
-        EXPR_IF_THEN_ELSE@1106..1434
-          IF_KW@1106..1108 "if"
-          WHITESPACE@1108..1109 " "
-          EXPR_UNARY@1109..1130
-            NOT@1109..1110 "!"
-            EXPR_APPLY@1110..1130
-              EXPR_INDEX@1110..1124
-                EXPR_VAR@1110..1113
-                  NAME@1110..1113
-                    IDENT@1110..1113 "std"
-                DOT@1113..1114 "."
-                NAME@1114..1124
-                  IDENT@1114..1124 "isFunction"
-              ARGS_DESC@1124..1130
-                L_PAREN@1124..1125 "("
-                ARG@1125..1129
-                  EXPR_VAR@1125..1129
-                    NAME@1125..1129
-                      IDENT@1125..1129 "func"
-                R_PAREN@1129..1130 ")"
-          WHITESPACE@1130..1131 " "
-          THEN_KW@1131..1135 "then"
-          WHITESPACE@1135..1142 "\n      "
-          TRUE_EXPR@1142..1220
-            EXPR_ERROR@1142..1220
-              ERROR_KW@1142..1147 "error"
-              WHITESPACE@1147..1148 " "
-              EXPR_PARENED@1148..1220
-                L_PAREN@1148..1149 "("
-                EXPR_BINARY@1149..1219
-                  LHS_EXPR@1149..1202
-                    EXPR_STRING@1149..1202
-                      STRING_SINGLE@1149..1202 "'std.mapWithIndex fir ..."
-                  WHITESPACE@1202..1203 " "
-                  PLUS@1203..1204 "+"
-                  WHITESPACE@1204..1205 " "
-                  EXPR_APPLY@1205..1219
-                    EXPR_INDEX@1205..1213
-                      EXPR_VAR@1205..1208
-                        NAME@1205..1208
-                          IDENT@1205..1208 "std"
-                      DOT@1208..1209 "."
-                      NAME@1209..1213
-                        IDENT@1209..1213 "type"
-                    ARGS_DESC@1213..1219
-                      L_PAREN@1213..1214 "("
-                      ARG@1214..1218
-                        EXPR_VAR@1214..1218
-                          NAME@1214..1218
-                            IDENT@1214..1218 "func"
-                      R_PAREN@1218..1219 ")"
-                R_PAREN@1219..1220 ")"
-          WHITESPACE@1220..1225 "\n    "
-          ELSE_KW@1225..1229 "else"
-          WHITESPACE@1229..1230 " "
-          FALSE_EXPR@1230..1434
-            EXPR_IF_THEN_ELSE@1230..1434
-              IF_KW@1230..1232 "if"
-              WHITESPACE@1232..1233 " "
-              EXPR_BINARY@1233..1272
-                LHS_EXPR@1233..1250
-                  EXPR_UNARY@1233..1250
-                    NOT@1233..1234 "!"
-                    EXPR_APPLY@1234..1250
-                      EXPR_INDEX@1234..1245
-                        EXPR_VAR@1234..1237
-                          NAME@1234..1237
-                            IDENT@1234..1237 "std"
-                        DOT@1237..1238 "."
-                        NAME@1238..1245
-                          IDENT@1238..1245 "isArray"
-                      ARGS_DESC@1245..1250
-                        L_PAREN@1245..1246 "("
-                        ARG@1246..1249
-                          EXPR_VAR@1246..1249
-                            NAME@1246..1249
-                              IDENT@1246..1249 "arr"
-                        R_PAREN@1249..1250 ")"
-                WHITESPACE@1250..1251 " "
-                AND@1251..1253 "&&"
-                WHITESPACE@1253..1254 " "
-                EXPR_UNARY@1254..1272
-                  NOT@1254..1255 "!"
-                  EXPR_APPLY@1255..1272
-                    EXPR_INDEX@1255..1267
-                      EXPR_VAR@1255..1258
-                        NAME@1255..1258
-                          IDENT@1255..1258 "std"
-                      DOT@1258..1259 "."
-                      NAME@1259..1267
-                        IDENT@1259..1267 "isString"
-                    ARGS_DESC@1267..1272
-                      L_PAREN@1267..1268 "("
-                      ARG@1268..1271
-                        EXPR_VAR@1268..1271
-                          NAME@1268..1271
-                            IDENT@1268..1271 "arr"
-                      R_PAREN@1271..1272 ")"
-              WHITESPACE@1272..1273 " "
-              THEN_KW@1273..1277 "then"
-              WHITESPACE@1277..1284 "\n      "
-              TRUE_EXPR@1284..1359
-                EXPR_ERROR@1284..1359
-                  ERROR_KW@1284..1289 "error"
-                  WHITESPACE@1289..1290 " "
-                  EXPR_PARENED@1290..1359
-                    L_PAREN@1290..1291 "("
-                    EXPR_BINARY@1291..1358
-                      LHS_EXPR@1291..1342
-                        EXPR_STRING@1291..1342
-                          STRING_SINGLE@1291..1342 "'std.mapWithIndex sec ..."
-                      WHITESPACE@1342..1343 " "
-                      PLUS@1343..1344 "+"
-                      WHITESPACE@1344..1345 " "
-                      EXPR_APPLY@1345..1358
-                        EXPR_INDEX@1345..1353
-                          EXPR_VAR@1345..1348
-                            NAME@1345..1348
-                              IDENT@1345..1348 "std"
-                          DOT@1348..1349 "."
-                          NAME@1349..1353
-                            IDENT@1349..1353 "type"
-                        ARGS_DESC@1353..1358
-                          L_PAREN@1353..1354 "("
-                          ARG@1354..1357
-                            EXPR_VAR@1354..1357
-                              NAME@1354..1357
-                                IDENT@1354..1357 "arr"
-                          R_PAREN@1357..1358 ")"
-                    R_PAREN@1358..1359 ")"
-              WHITESPACE@1359..1364 "\n    "
-              ELSE_KW@1364..1368 "else"
-              WHITESPACE@1368..1375 "\n      "
-              FALSE_EXPR@1375..1434
-                EXPR_APPLY@1375..1434
-                  EXPR_INDEX@1375..1388
-                    EXPR_VAR@1375..1378
-                      NAME@1375..1378
-                        IDENT@1375..1378 "std"
-                    DOT@1378..1379 "."
-                    NAME@1379..1388
-                      IDENT@1379..1388 "makeArray"
-                  ARGS_DESC@1388..1434
-                    L_PAREN@1388..1389 "("
-                    ARG@1389..1404
-                      EXPR_APPLY@1389..1404
-                        EXPR_INDEX@1389..1399
-                          EXPR_VAR@1389..1392
-                            NAME@1389..1392
-                              IDENT@1389..1392 "std"
-                          DOT@1392..1393 "."
-                          NAME@1393..1399
-                            IDENT@1393..1399 "length"
-                        ARGS_DESC@1399..1404
-                          L_PAREN@1399..1400 "("
-                          ARG@1400..1403
-                            EXPR_VAR@1400..1403
-                              NAME@1400..1403
-                                IDENT@1400..1403 "arr"
-                          R_PAREN@1403..1404 ")"
-                    COMMA@1404..1405 ","
+                      R_PAREN@920..921 ")"
+        COMMA@921..922 ","
+        WHITESPACE@922..926 "\n\n  "
+        MEMBER_FIELD_METHOD@926..968
+          FIELD_NAME_FIXED@926..931
+            NAME@926..931
+              IDENT@926..931 "split"
+          PARAMS_DESC@931..939
+            L_PAREN@931..932 "("
+            PARAM@932..935
+              DESTRUCT_FULL@932..935
+                NAME@932..935
+                  IDENT@932..935 "str"
+            COMMA@935..936 ","
+            WHITESPACE@936..937 " "
+            PARAM@937..938
+              DESTRUCT_FULL@937..938
+                NAME@937..938
+                  IDENT@937..938 "c"
+            R_PAREN@938..939 ")"
+          COLONCOLON@939..941 "::"
+          WHITESPACE@941..942 " "
+          EXPR@942..968
+            EXPR_VAR@942..945
+              NAME@942..945
+                IDENT@942..945 "std"
+            SUFFIX_INDEX@945..956
+              DOT@945..946 "."
+              NAME@946..956
+                IDENT@946..956 "splitLimit"
+            SUFFIX_APPLY@956..968
+              ARGS_DESC@956..968
+                L_PAREN@956..957 "("
+                ARG@957..960
+                  EXPR@957..960
+                    EXPR_VAR@957..960
+                      NAME@957..960
+                        IDENT@957..960 "str"
+                COMMA@960..961 ","
+                WHITESPACE@961..962 " "
+                ARG@962..963
+                  EXPR@962..963
+                    EXPR_VAR@962..963
+                      NAME@962..963
+                        IDENT@962..963 "c"
+                COMMA@963..964 ","
+                WHITESPACE@964..965 " "
+                ARG@965..967
+                  EXPR@965..967
+                    EXPR_UNARY@965..967
+                      MINUS@965..966 "-"
+                      EXPR_NUMBER@966..967
+                        FLOAT@966..967 "1"
+                R_PAREN@967..968 ")"
+        COMMA@968..969 ","
+        WHITESPACE@969..973 "\n\n  "
+        MEMBER_FIELD_METHOD@973..1331
+          FIELD_NAME_FIXED@973..985
+            NAME@973..985
+              IDENT@973..985 "mapWithIndex"
+          PARAMS_DESC@985..996
+            L_PAREN@985..986 "("
+            PARAM@986..990
+              DESTRUCT_FULL@986..990
+                NAME@986..990
+                  IDENT@986..990 "func"
+            COMMA@990..991 ","
+            WHITESPACE@991..992 " "
+            PARAM@992..995
+              DESTRUCT_FULL@992..995
+                NAME@992..995
+                  IDENT@992..995 "arr"
+            R_PAREN@995..996 ")"
+          COLONCOLON@996..998 "::"
+          WHITESPACE@998..1003 "\n    "
+          EXPR@1003..1331
+            EXPR_IF_THEN_ELSE@1003..1331
+              IF_KW@1003..1005 "if"
+              WHITESPACE@1005..1006 " "
+              EXPR@1006..1027
+                EXPR_UNARY@1006..1027
+                  NOT@1006..1007 "!"
+                  EXPR_VAR@1007..1010
+                    NAME@1007..1010
+                      IDENT@1007..1010 "std"
+                  SUFFIX_INDEX@1010..1021
+                    DOT@1010..1011 "."
+                    NAME@1011..1021
+                      IDENT@1011..1021 "isFunction"
+                  SUFFIX_APPLY@1021..1027
+                    ARGS_DESC@1021..1027
+                      L_PAREN@1021..1022 "("
+                      ARG@1022..1026
+                        EXPR@1022..1026
+                          EXPR_VAR@1022..1026
+                            NAME@1022..1026
+                              IDENT@1022..1026 "func"
+                      R_PAREN@1026..1027 ")"
+              WHITESPACE@1027..1028 " "
+              THEN_KW@1028..1032 "then"
+              WHITESPACE@1032..1039 "\n      "
+              TRUE_EXPR@1039..1117
+                EXPR@1039..1117
+                  EXPR_ERROR@1039..1117
+                    ERROR_KW@1039..1044 "error"
+                    WHITESPACE@1044..1045 " "
+                    EXPR@1045..1117
+                      EXPR_PARENED@1045..1117
+                        L_PAREN@1045..1046 "("
+                        EXPR@1046..1116
+                          EXPR_BINARY@1046..1116
+                            EXPR@1046..1099
+                              EXPR_STRING@1046..1099
+                                STRING_SINGLE@1046..1099 "'std.mapWithIndex fir ..."
+                            WHITESPACE@1099..1100 " "
+                            PLUS@1100..1101 "+"
+                            WHITESPACE@1101..1102 " "
+                            EXPR@1102..1116
+                              EXPR_VAR@1102..1105
+                                NAME@1102..1105
+                                  IDENT@1102..1105 "std"
+                              SUFFIX_INDEX@1105..1110
+                                DOT@1105..1106 "."
+                                NAME@1106..1110
+                                  IDENT@1106..1110 "type"
+                              SUFFIX_APPLY@1110..1116
+                                ARGS_DESC@1110..1116
+                                  L_PAREN@1110..1111 "("
+                                  ARG@1111..1115
+                                    EXPR@1111..1115
+                                      EXPR_VAR@1111..1115
+                                        NAME@1111..1115
+                                          IDENT@1111..1115 "func"
+                                  R_PAREN@1115..1116 ")"
+                        R_PAREN@1116..1117 ")"
+              WHITESPACE@1117..1122 "\n    "
+              ELSE_KW@1122..1126 "else"
+              WHITESPACE@1126..1127 " "
+              FALSE_EXPR@1127..1331
+                EXPR@1127..1331
+                  EXPR_IF_THEN_ELSE@1127..1331
+                    IF_KW@1127..1129 "if"
+                    WHITESPACE@1129..1130 " "
+                    EXPR@1130..1169
+                      EXPR_BINARY@1130..1169
+                        EXPR@1130..1147
+                          EXPR_UNARY@1130..1147
+                            NOT@1130..1131 "!"
+                            EXPR_VAR@1131..1134
+                              NAME@1131..1134
+                                IDENT@1131..1134 "std"
+                            SUFFIX_INDEX@1134..1142
+                              DOT@1134..1135 "."
+                              NAME@1135..1142
+                                IDENT@1135..1142 "isArray"
+                            SUFFIX_APPLY@1142..1147
+                              ARGS_DESC@1142..1147
+                                L_PAREN@1142..1143 "("
+                                ARG@1143..1146
+                                  EXPR@1143..1146
+                                    EXPR_VAR@1143..1146
+                                      NAME@1143..1146
+                                        IDENT@1143..1146 "arr"
+                                R_PAREN@1146..1147 ")"
+                        WHITESPACE@1147..1148 " "
+                        AND@1148..1150 "&&"
+                        WHITESPACE@1150..1151 " "
+                        EXPR@1151..1169
+                          EXPR_UNARY@1151..1169
+                            NOT@1151..1152 "!"
+                            EXPR_VAR@1152..1155
+                              NAME@1152..1155
+                                IDENT@1152..1155 "std"
+                            SUFFIX_INDEX@1155..1164
+                              DOT@1155..1156 "."
+                              NAME@1156..1164
+                                IDENT@1156..1164 "isString"
+                            SUFFIX_APPLY@1164..1169
+                              ARGS_DESC@1164..1169
+                                L_PAREN@1164..1165 "("
+                                ARG@1165..1168
+                                  EXPR@1165..1168
+                                    EXPR_VAR@1165..1168
+                                      NAME@1165..1168
+                                        IDENT@1165..1168 "arr"
+                                R_PAREN@1168..1169 ")"
+                    WHITESPACE@1169..1170 " "
+                    THEN_KW@1170..1174 "then"
+                    WHITESPACE@1174..1181 "\n      "
+                    TRUE_EXPR@1181..1256
+                      EXPR@1181..1256
+                        EXPR_ERROR@1181..1256
+                          ERROR_KW@1181..1186 "error"
+                          WHITESPACE@1186..1187 " "
+                          EXPR@1187..1256
+                            EXPR_PARENED@1187..1256
+                              L_PAREN@1187..1188 "("
+                              EXPR@1188..1255
+                                EXPR_BINARY@1188..1255
+                                  EXPR@1188..1239
+                                    EXPR_STRING@1188..1239
+                                      STRING_SINGLE@1188..1239 "'std.mapWithIndex sec ..."
+                                  WHITESPACE@1239..1240 " "
+                                  PLUS@1240..1241 "+"
+                                  WHITESPACE@1241..1242 " "
+                                  EXPR@1242..1255
+                                    EXPR_VAR@1242..1245
+                                      NAME@1242..1245
+                                        IDENT@1242..1245 "std"
+                                    SUFFIX_INDEX@1245..1250
+                                      DOT@1245..1246 "."
+                                      NAME@1246..1250
+                                        IDENT@1246..1250 "type"
+                                    SUFFIX_APPLY@1250..1255
+                                      ARGS_DESC@1250..1255
+                                        L_PAREN@1250..1251 "("
+                                        ARG@1251..1254
+                                          EXPR@1251..1254
+                                            EXPR_VAR@1251..1254
+                                              NAME@1251..1254
+                                                IDENT@1251..1254 "arr"
+                                        R_PAREN@1254..1255 ")"
+                              R_PAREN@1255..1256 ")"
+                    WHITESPACE@1256..1261 "\n    "
+                    ELSE_KW@1261..1265 "else"
+                    WHITESPACE@1265..1272 "\n      "
+                    FALSE_EXPR@1272..1331
+                      EXPR@1272..1331
+                        EXPR_VAR@1272..1275
+                          NAME@1272..1275
+                            IDENT@1272..1275 "std"
+                        SUFFIX_INDEX@1275..1285
+                          DOT@1275..1276 "."
+                          NAME@1276..1285
+                            IDENT@1276..1285 "makeArray"
+                        SUFFIX_APPLY@1285..1331
+                          ARGS_DESC@1285..1331
+                            L_PAREN@1285..1286 "("
+                            ARG@1286..1301
+                              EXPR@1286..1301
+                                EXPR_VAR@1286..1289
+                                  NAME@1286..1289
+                                    IDENT@1286..1289 "std"
+                                SUFFIX_INDEX@1289..1296
+                                  DOT@1289..1290 "."
+                                  NAME@1290..1296
+                                    IDENT@1290..1296 "length"
+                                SUFFIX_APPLY@1296..1301
+                                  ARGS_DESC@1296..1301
+                                    L_PAREN@1296..1297 "("
+                                    ARG@1297..1300
+                                      EXPR@1297..1300
+                                        EXPR_VAR@1297..1300
+                                          NAME@1297..1300
+                                            IDENT@1297..1300 "arr"
+                                    R_PAREN@1300..1301 ")"
+                            COMMA@1301..1302 ","
+                            WHITESPACE@1302..1303 " "
+                            ARG@1303..1330
+                              EXPR@1303..1330
+                                EXPR_FUNCTION@1303..1330
+                                  FUNCTION_KW@1303..1311 "function"
+                                  PARAMS_DESC@1311..1314
+                                    L_PAREN@1311..1312 "("
+                                    PARAM@1312..1313
+                                      DESTRUCT_FULL@1312..1313
+                                        NAME@1312..1313
+                                          IDENT@1312..1313 "i"
+                                    R_PAREN@1313..1314 ")"
+                                  WHITESPACE@1314..1315 " "
+                                  EXPR@1315..1330
+                                    EXPR_VAR@1315..1319
+                                      NAME@1315..1319
+                                        IDENT@1315..1319 "func"
+                                    SUFFIX_APPLY@1319..1330
+                                      ARGS_DESC@1319..1330
+                                        L_PAREN@1319..1320 "("
+                                        ARG@1320..1321
+                                          EXPR@1320..1321
+                                            EXPR_VAR@1320..1321
+                                              NAME@1320..1321
+                                                IDENT@1320..1321 "i"
+                                        COMMA@1321..1322 ","
+                                        WHITESPACE@1322..1323 " "
+                                        ARG@1323..1329
+                                          EXPR@1323..1329
+                                            EXPR_VAR@1323..1326
+                                              NAME@1323..1326
+                                                IDENT@1323..1326 "arr"
+                                            SUFFIX_INDEX_EXPR@1326..1329
+                                              L_BRACK@1326..1327 "["
+                                              EXPR@1327..1328
+                                                EXPR_VAR@1327..1328
+                                                  NAME@1327..1328
+                                                    IDENT@1327..1328 "i"
+                                              R_BRACK@1328..1329 "]"
+                                        R_PAREN@1329..1330 ")"
+                            R_PAREN@1330..1331 ")"
+        COMMA@1331..1332 ","
+        WHITESPACE@1332..1336 "\n\n  "
+        MEMBER_FIELD_METHOD@1336..1664
+          FIELD_NAME_FIXED@1336..1346
+            NAME@1336..1346
+              IDENT@1336..1346 "mapWithKey"
+          PARAMS_DESC@1346..1357
+            L_PAREN@1346..1347 "("
+            PARAM@1347..1351
+              DESTRUCT_FULL@1347..1351
+                NAME@1347..1351
+                  IDENT@1347..1351 "func"
+            COMMA@1351..1352 ","
+            WHITESPACE@1352..1353 " "
+            PARAM@1353..1356
+              DESTRUCT_FULL@1353..1356
+                NAME@1353..1356
+                  IDENT@1353..1356 "obj"
+            R_PAREN@1356..1357 ")"
+          COLONCOLON@1357..1359 "::"
+          WHITESPACE@1359..1364 "\n    "
+          EXPR@1364..1664
+            EXPR_IF_THEN_ELSE@1364..1664
+              IF_KW@1364..1366 "if"
+              WHITESPACE@1366..1367 " "
+              EXPR@1367..1388
+                EXPR_UNARY@1367..1388
+                  NOT@1367..1368 "!"
+                  EXPR_VAR@1368..1371
+                    NAME@1368..1371
+                      IDENT@1368..1371 "std"
+                  SUFFIX_INDEX@1371..1382
+                    DOT@1371..1372 "."
+                    NAME@1372..1382
+                      IDENT@1372..1382 "isFunction"
+                  SUFFIX_APPLY@1382..1388
+                    ARGS_DESC@1382..1388
+                      L_PAREN@1382..1383 "("
+                      ARG@1383..1387
+                        EXPR@1383..1387
+                          EXPR_VAR@1383..1387
+                            NAME@1383..1387
+                              IDENT@1383..1387 "func"
+                      R_PAREN@1387..1388 ")"
+              WHITESPACE@1388..1389 " "
+              THEN_KW@1389..1393 "then"
+              WHITESPACE@1393..1400 "\n      "
+              TRUE_EXPR@1400..1476
+                EXPR@1400..1476
+                  EXPR_ERROR@1400..1476
+                    ERROR_KW@1400..1405 "error"
                     WHITESPACE@1405..1406 " "
-                    ARG@1406..1433
-                      EXPR_FUNCTION@1406..1433
-                        FUNCTION_KW@1406..1414 "function"
-                        PARAMS_DESC@1414..1417
-                          L_PAREN@1414..1415 "("
-                          PARAM@1415..1416
-                            DESTRUCT_FULL@1415..1416
-                              NAME@1415..1416
-                                IDENT@1415..1416 "i"
-                          R_PAREN@1416..1417 ")"
-                        WHITESPACE@1417..1418 " "
-                        EXPR_APPLY@1418..1433
-                          EXPR_VAR@1418..1422
-                            NAME@1418..1422
-                              IDENT@1418..1422 "func"
-                          ARGS_DESC@1422..1433
-                            L_PAREN@1422..1423 "("
-                            ARG@1423..1424
-                              EXPR_VAR@1423..1424
-                                NAME@1423..1424
-                                  IDENT@1423..1424 "i"
-                            COMMA@1424..1425 ","
-                            WHITESPACE@1425..1426 " "
-                            ARG@1426..1432
-                              EXPR_INDEX_EXPR@1426..1432
-                                LHS_EXPR@1426..1429
-                                  EXPR_VAR@1426..1429
-                                    NAME@1426..1429
-                                      IDENT@1426..1429 "arr"
-                                L_BRACK@1429..1430 "["
-                                EXPR_VAR@1430..1431
-                                  NAME@1430..1431
-                                    IDENT@1430..1431 "i"
-                                R_BRACK@1431..1432 "]"
-                            R_PAREN@1432..1433 ")"
-                    R_PAREN@1433..1434 ")"
-      COMMA@1434..1435 ","
-      WHITESPACE@1435..1439 "\n\n  "
-      MEMBER_FIELD_METHOD@1439..1767
-        FIELD_NAME_FIXED@1439..1449
-          NAME@1439..1449
-            IDENT@1439..1449 "mapWithKey"
-        PARAMS_DESC@1449..1460
-          L_PAREN@1449..1450 "("
-          PARAM@1450..1454
-            DESTRUCT_FULL@1450..1454
-              NAME@1450..1454
-                IDENT@1450..1454 "func"
-          COMMA@1454..1455 ","
-          WHITESPACE@1455..1456 " "
-          PARAM@1456..1459
-            DESTRUCT_FULL@1456..1459
-              NAME@1456..1459
-                IDENT@1456..1459 "obj"
-          R_PAREN@1459..1460 ")"
-        COLONCOLON@1460..1462 "::"
-        WHITESPACE@1462..1467 "\n    "
-        EXPR_IF_THEN_ELSE@1467..1767
-          IF_KW@1467..1469 "if"
-          WHITESPACE@1469..1470 " "
-          EXPR_UNARY@1470..1491
-            NOT@1470..1471 "!"
-            EXPR_APPLY@1471..1491
-              EXPR_INDEX@1471..1485
-                EXPR_VAR@1471..1474
-                  NAME@1471..1474
-                    IDENT@1471..1474 "std"
-                DOT@1474..1475 "."
-                NAME@1475..1485
-                  IDENT@1475..1485 "isFunction"
-              ARGS_DESC@1485..1491
-                L_PAREN@1485..1486 "("
-                ARG@1486..1490
-                  EXPR_VAR@1486..1490
-                    NAME@1486..1490
-                      IDENT@1486..1490 "func"
-                R_PAREN@1490..1491 ")"
-          WHITESPACE@1491..1492 " "
-          THEN_KW@1492..1496 "then"
-          WHITESPACE@1496..1503 "\n      "
-          TRUE_EXPR@1503..1579
-            EXPR_ERROR@1503..1579
-              ERROR_KW@1503..1508 "error"
-              WHITESPACE@1508..1509 " "
-              EXPR_PARENED@1509..1579
-                L_PAREN@1509..1510 "("
-                EXPR_BINARY@1510..1578
-                  LHS_EXPR@1510..1561
-                    EXPR_STRING@1510..1561
-                      STRING_SINGLE@1510..1561 "'std.mapWithKey first ..."
-                  WHITESPACE@1561..1562 " "
-                  PLUS@1562..1563 "+"
-                  WHITESPACE@1563..1564 " "
-                  EXPR_APPLY@1564..1578
-                    EXPR_INDEX@1564..1572
-                      EXPR_VAR@1564..1567
-                        NAME@1564..1567
-                          IDENT@1564..1567 "std"
-                      DOT@1567..1568 "."
-                      NAME@1568..1572
-                        IDENT@1568..1572 "type"
-                    ARGS_DESC@1572..1578
-                      L_PAREN@1572..1573 "("
-                      ARG@1573..1577
-                        EXPR_VAR@1573..1577
-                          NAME@1573..1577
-                            IDENT@1573..1577 "func"
-                      R_PAREN@1577..1578 ")"
-                R_PAREN@1578..1579 ")"
-          WHITESPACE@1579..1584 "\n    "
-          ELSE_KW@1584..1588 "else"
-          WHITESPACE@1588..1589 " "
-          FALSE_EXPR@1589..1767
-            EXPR_IF_THEN_ELSE@1589..1767
-              IF_KW@1589..1591 "if"
-              WHITESPACE@1591..1592 " "
-              EXPR_UNARY@1592..1610
-                NOT@1592..1593 "!"
-                EXPR_APPLY@1593..1610
-                  EXPR_INDEX@1593..1605
-                    EXPR_VAR@1593..1596
-                      NAME@1593..1596
-                        IDENT@1593..1596 "std"
-                    DOT@1596..1597 "."
-                    NAME@1597..1605
-                      IDENT@1597..1605 "isObject"
-                  ARGS_DESC@1605..1610
-                    L_PAREN@1605..1606 "("
-                    ARG@1606..1609
-                      EXPR_VAR@1606..1609
-                        NAME@1606..1609
-                          IDENT@1606..1609 "obj"
-                    R_PAREN@1609..1610 ")"
-              WHITESPACE@1610..1611 " "
-              THEN_KW@1611..1615 "then"
-              WHITESPACE@1615..1622 "\n      "
-              TRUE_EXPR@1622..1696
-                EXPR_ERROR@1622..1696
-                  ERROR_KW@1622..1627 "error"
-                  WHITESPACE@1627..1628 " "
-                  EXPR_PARENED@1628..1696
-                    L_PAREN@1628..1629 "("
-                    EXPR_BINARY@1629..1695
-                      LHS_EXPR@1629..1679
-                        EXPR_STRING@1629..1679
-                          STRING_SINGLE@1629..1679 "'std.mapWithKey secon ..."
-                      WHITESPACE@1679..1680 " "
-                      PLUS@1680..1681 "+"
-                      WHITESPACE@1681..1682 " "
-                      EXPR_APPLY@1682..1695
-                        EXPR_INDEX@1682..1690
-                          EXPR_VAR@1682..1685
-                            NAME@1682..1685
-                              IDENT@1682..1685 "std"
-                          DOT@1685..1686 "."
-                          NAME@1686..1690
-                            IDENT@1686..1690 "type"
-                        ARGS_DESC@1690..1695
-                          L_PAREN@1690..1691 "("
-                          ARG@1691..1694
-                            EXPR_VAR@1691..1694
-                              NAME@1691..1694
-                                IDENT@1691..1694 "obj"
-                          R_PAREN@1694..1695 ")"
-                    R_PAREN@1695..1696 ")"
-              WHITESPACE@1696..1701 "\n    "
-              ELSE_KW@1701..1705 "else"
-              WHITESPACE@1705..1712 "\n      "
-              FALSE_EXPR@1712..1767
-                EXPR_OBJECT@1712..1767
-                  OBJ_BODY_COMP@1712..1767
-                    L_BRACE@1712..1713 "{"
-                    WHITESPACE@1713..1714 " "
-                    MEMBER_FIELD_NORMAL@1714..1734
-                      FIELD_NAME_DYNAMIC@1714..1717
-                        L_BRACK@1714..1715 "["
-                        EXPR_VAR@1715..1716
-                          NAME@1715..1716
-                            IDENT@1715..1716 "k"
-                        R_BRACK@1716..1717 "]"
-                      COLON@1717..1718 ":"
-                      WHITESPACE@1718..1719 " "
-                      EXPR_APPLY@1719..1734
-                        EXPR_VAR@1719..1723
-                          NAME@1719..1723
-                            IDENT@1719..1723 "func"
-                        ARGS_DESC@1723..1734
-                          L_PAREN@1723..1724 "("
-                          ARG@1724..1725
-                            EXPR_VAR@1724..1725
-                              NAME@1724..1725
-                                IDENT@1724..1725 "k"
-                          COMMA@1725..1726 ","
-                          WHITESPACE@1726..1727 " "
-                          ARG@1727..1733
-                            EXPR_INDEX_EXPR@1727..1733
-                              LHS_EXPR@1727..1730
-                                EXPR_VAR@1727..1730
-                                  NAME@1727..1730
-                                    IDENT@1727..1730 "obj"
-                              L_BRACK@1730..1731 "["
-                              EXPR_VAR@1731..1732
-                                NAME@1731..1732
-                                  IDENT@1731..1732 "k"
-                              R_BRACK@1732..1733 "]"
-                          R_PAREN@1733..1734 ")"
-                    WHITESPACE@1734..1735 " "
-                    FOR_SPEC@1735..1765
-                      FOR_KW@1735..1738 "for"
-                      WHITESPACE@1738..1739 " "
-                      NAME@1739..1740
-                        IDENT@1739..1740 "k"
-                      WHITESPACE@1740..1741 " "
-                      IN_KW@1741..1743 "in"
-                      WHITESPACE@1743..1744 " "
-                      EXPR_APPLY@1744..1765
-                        EXPR_INDEX@1744..1760
-                          EXPR_VAR@1744..1747
-                            NAME@1744..1747
-                              IDENT@1744..1747 "std"
-                          DOT@1747..1748 "."
-                          NAME@1748..1760
-                            IDENT@1748..1760 "objectFields"
-                        ARGS_DESC@1760..1765
-                          L_PAREN@1760..1761 "("
-                          ARG@1761..1764
-                            EXPR_VAR@1761..1764
-                              NAME@1761..1764
-                                IDENT@1761..1764 "obj"
-                          R_PAREN@1764..1765 ")"
-                    WHITESPACE@1765..1766 " "
-                    R_BRACE@1766..1767 "}"
-      COMMA@1767..1768 ","
-      WHITESPACE@1768..1772 "\n\n  "
-      MEMBER_FIELD_METHOD@1772..1815
-        FIELD_NAME_FIXED@1772..1777
-          NAME@1772..1777
-            IDENT@1772..1777 "lines"
-        PARAMS_DESC@1777..1782
-          L_PAREN@1777..1778 "("
-          PARAM@1778..1781
-            DESTRUCT_FULL@1778..1781
-              NAME@1778..1781
-                IDENT@1778..1781 "arr"
-          R_PAREN@1781..1782 ")"
-        COLONCOLON@1782..1784 "::"
-        WHITESPACE@1784..1789 "\n    "
-        EXPR_APPLY@1789..1815
-          EXPR_INDEX@1789..1797
-            EXPR_VAR@1789..1792
-              NAME@1789..1792
-                IDENT@1789..1792 "std"
-            DOT@1792..1793 "."
-            NAME@1793..1797
-              IDENT@1793..1797 "join"
-          ARGS_DESC@1797..1815
-            L_PAREN@1797..1798 "("
-            ARG@1798..1802
-              EXPR_STRING@1798..1802
-                STRING_SINGLE@1798..1802 "'\\n'"
-            COMMA@1802..1803 ","
-            WHITESPACE@1803..1804 " "
-            ARG@1804..1814
-              EXPR_BINARY@1804..1814
-                LHS_EXPR@1804..1807
-                  EXPR_VAR@1804..1807
-                    NAME@1804..1807
-                      IDENT@1804..1807 "arr"
-                WHITESPACE@1807..1808 " "
-                PLUS@1808..1809 "+"
-                WHITESPACE@1809..1810 " "
-                EXPR_ARRAY@1810..1814
-                  L_BRACK@1810..1811 "["
-                  EXPR_STRING@1811..1813
-                    STRING_SINGLE@1811..1813 "''"
-                  R_BRACK@1813..1814 "]"
-            R_PAREN@1814..1815 ")"
-      COMMA@1815..1816 ","
-      WHITESPACE@1816..1820 "\n\n  "
-      MEMBER_FIELD_METHOD@1820..2032
-        FIELD_NAME_FIXED@1820..1828
-          NAME@1820..1828
-            IDENT@1820..1828 "deepJoin"
-        PARAMS_DESC@1828..1833
-          L_PAREN@1828..1829 "("
-          PARAM@1829..1832
-            DESTRUCT_FULL@1829..1832
-              NAME@1829..1832
-                IDENT@1829..1832 "arr"
-          R_PAREN@1832..1833 ")"
-        COLONCOLON@1833..1835 "::"
-        WHITESPACE@1835..1840 "\n    "
-        EXPR_IF_THEN_ELSE@1840..2032
-          IF_KW@1840..1842 "if"
-          WHITESPACE@1842..1843 " "
-          EXPR_APPLY@1843..1860
-            EXPR_INDEX@1843..1855
-              EXPR_VAR@1843..1846
-                NAME@1843..1846
-                  IDENT@1843..1846 "std"
-              DOT@1846..1847 "."
-              NAME@1847..1855
-                IDENT@1847..1855 "isString"
-            ARGS_DESC@1855..1860
-              L_PAREN@1855..1856 "("
-              ARG@1856..1859
-                EXPR_VAR@1856..1859
-                  NAME@1856..1859
-                    IDENT@1856..1859 "arr"
-              R_PAREN@1859..1860 ")"
-          WHITESPACE@1860..1861 " "
-          THEN_KW@1861..1865 "then"
-          WHITESPACE@1865..1872 "\n      "
-          TRUE_EXPR@1872..1875
-            EXPR_VAR@1872..1875
-              NAME@1872..1875
-                IDENT@1872..1875 "arr"
-          WHITESPACE@1875..1880 "\n    "
-          ELSE_KW@1880..1884 "else"
-          WHITESPACE@1884..1885 " "
-          FALSE_EXPR@1885..2032
-            EXPR_IF_THEN_ELSE@1885..2032
-              IF_KW@1885..1887 "if"
-              WHITESPACE@1887..1888 " "
-              EXPR_APPLY@1888..1904
-                EXPR_INDEX@1888..1899
-                  EXPR_VAR@1888..1891
-                    NAME@1888..1891
-                      IDENT@1888..1891 "std"
-                  DOT@1891..1892 "."
-                  NAME@1892..1899
-                    IDENT@1892..1899 "isArray"
-                ARGS_DESC@1899..1904
-                  L_PAREN@1899..1900 "("
-                  ARG@1900..1903
-                    EXPR_VAR@1900..1903
-                      NAME@1900..1903
-                        IDENT@1900..1903 "arr"
-                  R_PAREN@1903..1904 ")"
-              WHITESPACE@1904..1905 " "
-              THEN_KW@1905..1909 "then"
-              WHITESPACE@1909..1916 "\n      "
-              TRUE_EXPR@1916..1960
-                EXPR_APPLY@1916..1960
-                  EXPR_INDEX@1916..1924
-                    EXPR_VAR@1916..1919
-                      NAME@1916..1919
-                        IDENT@1916..1919 "std"
-                    DOT@1919..1920 "."
-                    NAME@1920..1924
-                      IDENT@1920..1924 "join"
-                  ARGS_DESC@1924..1960
-                    L_PAREN@1924..1925 "("
-                    ARG@1925..1927
-                      EXPR_STRING@1925..1927
-                        STRING_SINGLE@1925..1927 "''"
-                    COMMA@1927..1928 ","
-                    WHITESPACE@1928..1929 " "
-                    ARG@1929..1959
-                      EXPR_ARRAY_COMP@1929..1959
-                        L_BRACK@1929..1930 "["
-                        EXPR_APPLY@1930..1945
-                          EXPR_INDEX@1930..1942
-                            EXPR_VAR@1930..1933
-                              NAME@1930..1933
-                                IDENT@1930..1933 "std"
-                            DOT@1933..1934 "."
-                            NAME@1934..1942
-                              IDENT@1934..1942 "deepJoin"
-                          ARGS_DESC@1942..1945
-                            L_PAREN@1942..1943 "("
-                            ARG@1943..1944
-                              EXPR_VAR@1943..1944
-                                NAME@1943..1944
-                                  IDENT@1943..1944 "x"
-                            R_PAREN@1944..1945 ")"
-                        WHITESPACE@1945..1946 " "
-                        FOR_SPEC@1946..1958
-                          FOR_KW@1946..1949 "for"
-                          WHITESPACE@1949..1950 " "
-                          NAME@1950..1951
-                            IDENT@1950..1951 "x"
-                          WHITESPACE@1951..1952 " "
-                          IN_KW@1952..1954 "in"
-                          WHITESPACE@1954..1955 " "
-                          EXPR_VAR@1955..1958
-                            NAME@1955..1958
-                              IDENT@1955..1958 "arr"
-                        R_BRACK@1958..1959 "]"
-                    R_PAREN@1959..1960 ")"
-              WHITESPACE@1960..1965 "\n    "
-              ELSE_KW@1965..1969 "else"
-              WHITESPACE@1969..1976 "\n      "
-              FALSE_EXPR@1976..2032
-                EXPR_ERROR@1976..2032
-                  ERROR_KW@1976..1981 "error"
-                  WHITESPACE@1981..1982 " "
-                  EXPR_BINARY@1982..2032
-                    LHS_EXPR@1982..2016
-                      EXPR_STRING@1982..2016
-                        STRING_SINGLE@1982..2016 "'Expected string or a ..."
-                    WHITESPACE@2016..2017 " "
-                    MODULO@2017..2018 "%"
-                    WHITESPACE@2018..2019 " "
-                    EXPR_APPLY@2019..2032
-                      EXPR_INDEX@2019..2027
-                        EXPR_VAR@2019..2022
-                          NAME@2019..2022
-                            IDENT@2019..2022 "std"
-                        DOT@2022..2023 "."
-                        NAME@2023..2027
-                          IDENT@2023..2027 "type"
-                      ARGS_DESC@2027..2032
-                        L_PAREN@2027..2028 "("
-                        ARG@2028..2031
-                          EXPR_VAR@2028..2031
-                            NAME@2028..2031
-                              IDENT@2028..2031 "arr"
-                        R_PAREN@2031..2032 ")"
-      COMMA@2032..2033 ","
-      WHITESPACE@2033..2037 "\n\n  "
-      MEMBER_FIELD_METHOD@2037..2512
-        FIELD_NAME_FIXED@2037..2046
-          NAME@2037..2046
-            IDENT@2037..2046 "filterMap"
-        PARAMS_DESC@2046..2074
-          L_PAREN@2046..2047 "("
-          PARAM@2047..2058
-            DESTRUCT_FULL@2047..2058
-              NAME@2047..2058
-                IDENT@2047..2058 "filter_func"
-          COMMA@2058..2059 ","
-          WHITESPACE@2059..2060 " "
-          PARAM@2060..2068
-            DESTRUCT_FULL@2060..2068
-              NAME@2060..2068
-                IDENT@2060..2068 "map_func"
-          COMMA@2068..2069 ","
-          WHITESPACE@2069..2070 " "
-          PARAM@2070..2073
-            DESTRUCT_FULL@2070..2073
-              NAME@2070..2073
-                IDENT@2070..2073 "arr"
-          R_PAREN@2073..2074 ")"
-        COLONCOLON@2074..2076 "::"
-        WHITESPACE@2076..2081 "\n    "
-        EXPR_IF_THEN_ELSE@2081..2512
-          IF_KW@2081..2083 "if"
-          WHITESPACE@2083..2084 " "
-          EXPR_UNARY@2084..2112
-            NOT@2084..2085 "!"
-            EXPR_APPLY@2085..2112
-              EXPR_INDEX@2085..2099
-                EXPR_VAR@2085..2088
-                  NAME@2085..2088
-                    IDENT@2085..2088 "std"
-                DOT@2088..2089 "."
-                NAME@2089..2099
-                  IDENT@2089..2099 "isFunction"
-              ARGS_DESC@2099..2112
-                L_PAREN@2099..2100 "("
-                ARG@2100..2111
-                  EXPR_VAR@2100..2111
-                    NAME@2100..2111
-                      IDENT@2100..2111 "filter_func"
-                R_PAREN@2111..2112 ")"
-          WHITESPACE@2112..2113 " "
-          THEN_KW@2113..2117 "then"
-          WHITESPACE@2117..2124 "\n      "
-          TRUE_EXPR@2124..2206
-            EXPR_ERROR@2124..2206
-              ERROR_KW@2124..2129 "error"
-              WHITESPACE@2129..2130 " "
-              EXPR_PARENED@2130..2206
-                L_PAREN@2130..2131 "("
-                EXPR_BINARY@2131..2205
-                  LHS_EXPR@2131..2181
-                    EXPR_STRING@2131..2181
-                      STRING_SINGLE@2131..2181 "'std.filterMap first  ..."
-                  WHITESPACE@2181..2182 " "
-                  PLUS@2182..2183 "+"
-                  WHITESPACE@2183..2184 " "
-                  EXPR_APPLY@2184..2205
-                    EXPR_INDEX@2184..2192
-                      EXPR_VAR@2184..2187
-                        NAME@2184..2187
-                          IDENT@2184..2187 "std"
-                      DOT@2187..2188 "."
-                      NAME@2188..2192
-                        IDENT@2188..2192 "type"
-                    ARGS_DESC@2192..2205
-                      L_PAREN@2192..2193 "("
-                      ARG@2193..2204
-                        EXPR_VAR@2193..2204
-                          NAME@2193..2204
-                            IDENT@2193..2204 "filter_func"
-                      R_PAREN@2204..2205 ")"
-                R_PAREN@2205..2206 ")"
-          WHITESPACE@2206..2211 "\n    "
-          ELSE_KW@2211..2215 "else"
-          WHITESPACE@2215..2216 " "
-          FALSE_EXPR@2216..2512
-            EXPR_IF_THEN_ELSE@2216..2512
-              IF_KW@2216..2218 "if"
-              WHITESPACE@2218..2219 " "
-              EXPR_UNARY@2219..2244
-                NOT@2219..2220 "!"
-                EXPR_APPLY@2220..2244
-                  EXPR_INDEX@2220..2234
-                    EXPR_VAR@2220..2223
-                      NAME@2220..2223
-                        IDENT@2220..2223 "std"
-                    DOT@2223..2224 "."
-                    NAME@2224..2234
-                      IDENT@2224..2234 "isFunction"
-                  ARGS_DESC@2234..2244
-                    L_PAREN@2234..2235 "("
-                    ARG@2235..2243
-                      EXPR_VAR@2235..2243
-                        NAME@2235..2243
-                          IDENT@2235..2243 "map_func"
-                    R_PAREN@2243..2244 ")"
-              WHITESPACE@2244..2245 " "
-              THEN_KW@2245..2249 "then"
-              WHITESPACE@2249..2256 "\n      "
-              TRUE_EXPR@2256..2336
-                EXPR_ERROR@2256..2336
-                  ERROR_KW@2256..2261 "error"
-                  WHITESPACE@2261..2262 " "
-                  EXPR_PARENED@2262..2336
-                    L_PAREN@2262..2263 "("
-                    EXPR_BINARY@2263..2335
-                      LHS_EXPR@2263..2314
-                        EXPR_STRING@2263..2314
-                          STRING_SINGLE@2263..2314 "'std.filterMap second ..."
-                      WHITESPACE@2314..2315 " "
-                      PLUS@2315..2316 "+"
-                      WHITESPACE@2316..2317 " "
-                      EXPR_APPLY@2317..2335
-                        EXPR_INDEX@2317..2325
-                          EXPR_VAR@2317..2320
-                            NAME@2317..2320
-                              IDENT@2317..2320 "std"
-                          DOT@2320..2321 "."
-                          NAME@2321..2325
-                            IDENT@2321..2325 "type"
-                        ARGS_DESC@2325..2335
-                          L_PAREN@2325..2326 "("
-                          ARG@2326..2334
-                            EXPR_VAR@2326..2334
-                              NAME@2326..2334
-                                IDENT@2326..2334 "map_func"
-                          R_PAREN@2334..2335 ")"
-                    R_PAREN@2335..2336 ")"
-              WHITESPACE@2336..2341 "\n    "
-              ELSE_KW@2341..2345 "else"
-              WHITESPACE@2345..2346 " "
-              FALSE_EXPR@2346..2512
-                EXPR_IF_THEN_ELSE@2346..2512
-                  IF_KW@2346..2348 "if"
-                  WHITESPACE@2348..2349 " "
-                  EXPR_UNARY@2349..2366
-                    NOT@2349..2350 "!"
-                    EXPR_APPLY@2350..2366
-                      EXPR_INDEX@2350..2361
-                        EXPR_VAR@2350..2353
-                          NAME@2350..2353
-                            IDENT@2350..2353 "std"
-                        DOT@2353..2354 "."
-                        NAME@2354..2361
-                          IDENT@2354..2361 "isArray"
-                      ARGS_DESC@2361..2366
-                        L_PAREN@2361..2362 "("
-                        ARG@2362..2365
-                          EXPR_VAR@2362..2365
-                            NAME@2362..2365
-                              IDENT@2362..2365 "arr"
-                        R_PAREN@2365..2366 ")"
-                  WHITESPACE@2366..2367 " "
-                  THEN_KW@2367..2371 "then"
-                  WHITESPACE@2371..2378 "\n      "
-                  TRUE_EXPR@2378..2449
-                    EXPR_ERROR@2378..2449
-                      ERROR_KW@2378..2383 "error"
-                      WHITESPACE@2383..2384 " "
-                      EXPR_PARENED@2384..2449
-                        L_PAREN@2384..2385 "("
-                        EXPR_BINARY@2385..2448
-                          LHS_EXPR@2385..2432
-                            EXPR_STRING@2385..2432
-                              STRING_SINGLE@2385..2432 "'std.filterMap third  ..."
-                          WHITESPACE@2432..2433 " "
-                          PLUS@2433..2434 "+"
-                          WHITESPACE@2434..2435 " "
-                          EXPR_APPLY@2435..2448
-                            EXPR_INDEX@2435..2443
-                              EXPR_VAR@2435..2438
-                                NAME@2435..2438
-                                  IDENT@2435..2438 "std"
-                              DOT@2438..2439 "."
-                              NAME@2439..2443
-                                IDENT@2439..2443 "type"
-                            ARGS_DESC@2443..2448
-                              L_PAREN@2443..2444 "("
-                              ARG@2444..2447
-                                EXPR_VAR@2444..2447
-                                  NAME@2444..2447
-                                    IDENT@2444..2447 "arr"
-                              R_PAREN@2447..2448 ")"
-                        R_PAREN@2448..2449 ")"
-                  WHITESPACE@2449..2454 "\n    "
-                  ELSE_KW@2454..2458 "else"
-                  WHITESPACE@2458..2465 "\n      "
-                  FALSE_EXPR@2465..2512
-                    EXPR_APPLY@2465..2512
-                      EXPR_INDEX@2465..2472
-                        EXPR_VAR@2465..2468
-                          NAME@2465..2468
-                            IDENT@2465..2468 "std"
-                        DOT@2468..2469 "."
-                        NAME@2469..2472
-                          IDENT@2469..2472 "map"
-                      ARGS_DESC@2472..2512
-                        L_PAREN@2472..2473 "("
-                        ARG@2473..2481
-                          EXPR_VAR@2473..2481
-                            NAME@2473..2481
-                              IDENT@2473..2481 "map_func"
-                        COMMA@2481..2482 ","
-                        WHITESPACE@2482..2483 " "
-                        ARG@2483..2511
-                          EXPR_APPLY@2483..2511
-                            EXPR_INDEX@2483..2493
-                              EXPR_VAR@2483..2486
-                                NAME@2483..2486
-                                  IDENT@2483..2486 "std"
-                              DOT@2486..2487 "."
-                              NAME@2487..2493
-                                IDENT@2487..2493 "filter"
-                            ARGS_DESC@2493..2511
-                              L_PAREN@2493..2494 "("
-                              ARG@2494..2505
-                                EXPR_VAR@2494..2505
-                                  NAME@2494..2505
-                                    IDENT@2494..2505 "filter_func"
-                              COMMA@2505..2506 ","
-                              WHITESPACE@2506..2507 " "
-                              ARG@2507..2510
-                                EXPR_VAR@2507..2510
-                                  NAME@2507..2510
-                                    IDENT@2507..2510 "arr"
-                              R_PAREN@2510..2511 ")"
-                        R_PAREN@2511..2512 ")"
-      COMMA@2512..2513 ","
-      WHITESPACE@2513..2517 "\n\n  "
-      MEMBER_FIELD_METHOD@2517..2625
-        FIELD_NAME_FIXED@2517..2528
-          NAME@2517..2528
-            IDENT@2517..2528 "assertEqual"
-        PARAMS_DESC@2528..2534
-          L_PAREN@2528..2529 "("
-          PARAM@2529..2530
-            DESTRUCT_FULL@2529..2530
-              NAME@2529..2530
-                IDENT@2529..2530 "a"
-          COMMA@2530..2531 ","
-          WHITESPACE@2531..2532 " "
-          PARAM@2532..2533
-            DESTRUCT_FULL@2532..2533
-              NAME@2532..2533
-                IDENT@2532..2533 "b"
-          R_PAREN@2533..2534 ")"
-        COLONCOLON@2534..2536 "::"
-        WHITESPACE@2536..2541 "\n    "
-        EXPR_IF_THEN_ELSE@2541..2625
-          IF_KW@2541..2543 "if"
-          WHITESPACE@2543..2544 " "
-          EXPR_BINARY@2544..2550
-            LHS_EXPR@2544..2545
-              EXPR_VAR@2544..2545
-                NAME@2544..2545
-                  IDENT@2544..2545 "a"
-            WHITESPACE@2545..2546 " "
-            EQ@2546..2548 "=="
-            WHITESPACE@2548..2549 " "
-            EXPR_VAR@2549..2550
-              NAME@2549..2550
-                IDENT@2549..2550 "b"
-          WHITESPACE@2550..2551 " "
-          THEN_KW@2551..2555 "then"
-          WHITESPACE@2555..2562 "\n      "
-          TRUE_EXPR@2562..2566
-            EXPR_LITERAL@2562..2566
-              TRUE_KW@2562..2566 "true"
-          WHITESPACE@2566..2571 "\n    "
-          ELSE_KW@2571..2575 "else"
-          WHITESPACE@2575..2582 "\n      "
-          FALSE_EXPR@2582..2625
-            EXPR_ERROR@2582..2625
-              ERROR_KW@2582..2587 "error"
-              WHITESPACE@2587..2588 " "
-              EXPR_BINARY@2588..2625
-                LHS_EXPR@2588..2621
-                  EXPR_BINARY@2588..2621
-                    LHS_EXPR@2588..2612
-                      EXPR_BINARY@2588..2612
-                        LHS_EXPR@2588..2608
-                          EXPR_STRING@2588..2608
-                            STRING_SINGLE@2588..2608 "'Assertion failed. '"
-                        WHITESPACE@2608..2609 " "
-                        PLUS@2609..2610 "+"
-                        WHITESPACE@2610..2611 " "
-                        EXPR_VAR@2611..2612
-                          NAME@2611..2612
-                            IDENT@2611..2612 "a"
-                    WHITESPACE@2612..2613 " "
-                    PLUS@2613..2614 "+"
+                    EXPR@1406..1476
+                      EXPR_PARENED@1406..1476
+                        L_PAREN@1406..1407 "("
+                        EXPR@1407..1475
+                          EXPR_BINARY@1407..1475
+                            EXPR@1407..1458
+                              EXPR_STRING@1407..1458
+                                STRING_SINGLE@1407..1458 "'std.mapWithKey first ..."
+                            WHITESPACE@1458..1459 " "
+                            PLUS@1459..1460 "+"
+                            WHITESPACE@1460..1461 " "
+                            EXPR@1461..1475
+                              EXPR_VAR@1461..1464
+                                NAME@1461..1464
+                                  IDENT@1461..1464 "std"
+                              SUFFIX_INDEX@1464..1469
+                                DOT@1464..1465 "."
+                                NAME@1465..1469
+                                  IDENT@1465..1469 "type"
+                              SUFFIX_APPLY@1469..1475
+                                ARGS_DESC@1469..1475
+                                  L_PAREN@1469..1470 "("
+                                  ARG@1470..1474
+                                    EXPR@1470..1474
+                                      EXPR_VAR@1470..1474
+                                        NAME@1470..1474
+                                          IDENT@1470..1474 "func"
+                                  R_PAREN@1474..1475 ")"
+                        R_PAREN@1475..1476 ")"
+              WHITESPACE@1476..1481 "\n    "
+              ELSE_KW@1481..1485 "else"
+              WHITESPACE@1485..1486 " "
+              FALSE_EXPR@1486..1664
+                EXPR@1486..1664
+                  EXPR_IF_THEN_ELSE@1486..1664
+                    IF_KW@1486..1488 "if"
+                    WHITESPACE@1488..1489 " "
+                    EXPR@1489..1507
+                      EXPR_UNARY@1489..1507
+                        NOT@1489..1490 "!"
+                        EXPR_VAR@1490..1493
+                          NAME@1490..1493
+                            IDENT@1490..1493 "std"
+                        SUFFIX_INDEX@1493..1502
+                          DOT@1493..1494 "."
+                          NAME@1494..1502
+                            IDENT@1494..1502 "isObject"
+                        SUFFIX_APPLY@1502..1507
+                          ARGS_DESC@1502..1507
+                            L_PAREN@1502..1503 "("
+                            ARG@1503..1506
+                              EXPR@1503..1506
+                                EXPR_VAR@1503..1506
+                                  NAME@1503..1506
+                                    IDENT@1503..1506 "obj"
+                            R_PAREN@1506..1507 ")"
+                    WHITESPACE@1507..1508 " "
+                    THEN_KW@1508..1512 "then"
+                    WHITESPACE@1512..1519 "\n      "
+                    TRUE_EXPR@1519..1593
+                      EXPR@1519..1593
+                        EXPR_ERROR@1519..1593
+                          ERROR_KW@1519..1524 "error"
+                          WHITESPACE@1524..1525 " "
+                          EXPR@1525..1593
+                            EXPR_PARENED@1525..1593
+                              L_PAREN@1525..1526 "("
+                              EXPR@1526..1592
+                                EXPR_BINARY@1526..1592
+                                  EXPR@1526..1576
+                                    EXPR_STRING@1526..1576
+                                      STRING_SINGLE@1526..1576 "'std.mapWithKey secon ..."
+                                  WHITESPACE@1576..1577 " "
+                                  PLUS@1577..1578 "+"
+                                  WHITESPACE@1578..1579 " "
+                                  EXPR@1579..1592
+                                    EXPR_VAR@1579..1582
+                                      NAME@1579..1582
+                                        IDENT@1579..1582 "std"
+                                    SUFFIX_INDEX@1582..1587
+                                      DOT@1582..1583 "."
+                                      NAME@1583..1587
+                                        IDENT@1583..1587 "type"
+                                    SUFFIX_APPLY@1587..1592
+                                      ARGS_DESC@1587..1592
+                                        L_PAREN@1587..1588 "("
+                                        ARG@1588..1591
+                                          EXPR@1588..1591
+                                            EXPR_VAR@1588..1591
+                                              NAME@1588..1591
+                                                IDENT@1588..1591 "obj"
+                                        R_PAREN@1591..1592 ")"
+                              R_PAREN@1592..1593 ")"
+                    WHITESPACE@1593..1598 "\n    "
+                    ELSE_KW@1598..1602 "else"
+                    WHITESPACE@1602..1609 "\n      "
+                    FALSE_EXPR@1609..1664
+                      EXPR@1609..1664
+                        EXPR_OBJECT@1609..1664
+                          OBJ_BODY_COMP@1609..1664
+                            L_BRACE@1609..1610 "{"
+                            WHITESPACE@1610..1611 " "
+                            MEMBER_FIELD_NORMAL@1611..1631
+                              FIELD_NAME_DYNAMIC@1611..1614
+                                L_BRACK@1611..1612 "["
+                                EXPR@1612..1613
+                                  EXPR_VAR@1612..1613
+                                    NAME@1612..1613
+                                      IDENT@1612..1613 "k"
+                                R_BRACK@1613..1614 "]"
+                              COLON@1614..1615 ":"
+                              WHITESPACE@1615..1616 " "
+                              EXPR@1616..1631
+                                EXPR_VAR@1616..1620
+                                  NAME@1616..1620
+                                    IDENT@1616..1620 "func"
+                                SUFFIX_APPLY@1620..1631
+                                  ARGS_DESC@1620..1631
+                                    L_PAREN@1620..1621 "("
+                                    ARG@1621..1622
+                                      EXPR@1621..1622
+                                        EXPR_VAR@1621..1622
+                                          NAME@1621..1622
+                                            IDENT@1621..1622 "k"
+                                    COMMA@1622..1623 ","
+                                    WHITESPACE@1623..1624 " "
+                                    ARG@1624..1630
+                                      EXPR@1624..1630
+                                        EXPR_VAR@1624..1627
+                                          NAME@1624..1627
+                                            IDENT@1624..1627 "obj"
+                                        SUFFIX_INDEX_EXPR@1627..1630
+                                          L_BRACK@1627..1628 "["
+                                          EXPR@1628..1629
+                                            EXPR_VAR@1628..1629
+                                              NAME@1628..1629
+                                                IDENT@1628..1629 "k"
+                                          R_BRACK@1629..1630 "]"
+                                    R_PAREN@1630..1631 ")"
+                            WHITESPACE@1631..1632 " "
+                            FOR_SPEC@1632..1662
+                              FOR_KW@1632..1635 "for"
+                              WHITESPACE@1635..1636 " "
+                              DESTRUCT_FULL@1636..1637
+                                NAME@1636..1637
+                                  IDENT@1636..1637 "k"
+                              WHITESPACE@1637..1638 " "
+                              IN_KW@1638..1640 "in"
+                              WHITESPACE@1640..1641 " "
+                              EXPR@1641..1662
+                                EXPR_VAR@1641..1644
+                                  NAME@1641..1644
+                                    IDENT@1641..1644 "std"
+                                SUFFIX_INDEX@1644..1657
+                                  DOT@1644..1645 "."
+                                  NAME@1645..1657
+                                    IDENT@1645..1657 "objectFields"
+                                SUFFIX_APPLY@1657..1662
+                                  ARGS_DESC@1657..1662
+                                    L_PAREN@1657..1658 "("
+                                    ARG@1658..1661
+                                      EXPR@1658..1661
+                                        EXPR_VAR@1658..1661
+                                          NAME@1658..1661
+                                            IDENT@1658..1661 "obj"
+                                    R_PAREN@1661..1662 ")"
+                            WHITESPACE@1662..1663 " "
+                            R_BRACE@1663..1664 "}"
+        COMMA@1664..1665 ","
+        WHITESPACE@1665..1669 "\n\n  "
+        MEMBER_FIELD_METHOD@1669..1712
+          FIELD_NAME_FIXED@1669..1674
+            NAME@1669..1674
+              IDENT@1669..1674 "lines"
+          PARAMS_DESC@1674..1679
+            L_PAREN@1674..1675 "("
+            PARAM@1675..1678
+              DESTRUCT_FULL@1675..1678
+                NAME@1675..1678
+                  IDENT@1675..1678 "arr"
+            R_PAREN@1678..1679 ")"
+          COLONCOLON@1679..1681 "::"
+          WHITESPACE@1681..1686 "\n    "
+          EXPR@1686..1712
+            EXPR_VAR@1686..1689
+              NAME@1686..1689
+                IDENT@1686..1689 "std"
+            SUFFIX_INDEX@1689..1694
+              DOT@1689..1690 "."
+              NAME@1690..1694
+                IDENT@1690..1694 "join"
+            SUFFIX_APPLY@1694..1712
+              ARGS_DESC@1694..1712
+                L_PAREN@1694..1695 "("
+                ARG@1695..1699
+                  EXPR@1695..1699
+                    EXPR_STRING@1695..1699
+                      STRING_SINGLE@1695..1699 "'\\n'"
+                COMMA@1699..1700 ","
+                WHITESPACE@1700..1701 " "
+                ARG@1701..1711
+                  EXPR@1701..1711
+                    EXPR_BINARY@1701..1711
+                      EXPR@1701..1704
+                        EXPR_VAR@1701..1704
+                          NAME@1701..1704
+                            IDENT@1701..1704 "arr"
+                      WHITESPACE@1704..1705 " "
+                      PLUS@1705..1706 "+"
+                      WHITESPACE@1706..1707 " "
+                      EXPR@1707..1711
+                        EXPR_ARRAY@1707..1711
+                          L_BRACK@1707..1708 "["
+                          EXPR@1708..1710
+                            EXPR_STRING@1708..1710
+                              STRING_SINGLE@1708..1710 "''"
+                          R_BRACK@1710..1711 "]"
+                R_PAREN@1711..1712 ")"
+        COMMA@1712..1713 ","
+        WHITESPACE@1713..1717 "\n\n  "
+        MEMBER_FIELD_METHOD@1717..1929
+          FIELD_NAME_FIXED@1717..1725
+            NAME@1717..1725
+              IDENT@1717..1725 "deepJoin"
+          PARAMS_DESC@1725..1730
+            L_PAREN@1725..1726 "("
+            PARAM@1726..1729
+              DESTRUCT_FULL@1726..1729
+                NAME@1726..1729
+                  IDENT@1726..1729 "arr"
+            R_PAREN@1729..1730 ")"
+          COLONCOLON@1730..1732 "::"
+          WHITESPACE@1732..1737 "\n    "
+          EXPR@1737..1929
+            EXPR_IF_THEN_ELSE@1737..1929
+              IF_KW@1737..1739 "if"
+              WHITESPACE@1739..1740 " "
+              EXPR@1740..1757
+                EXPR_VAR@1740..1743
+                  NAME@1740..1743
+                    IDENT@1740..1743 "std"
+                SUFFIX_INDEX@1743..1752
+                  DOT@1743..1744 "."
+                  NAME@1744..1752
+                    IDENT@1744..1752 "isString"
+                SUFFIX_APPLY@1752..1757
+                  ARGS_DESC@1752..1757
+                    L_PAREN@1752..1753 "("
+                    ARG@1753..1756
+                      EXPR@1753..1756
+                        EXPR_VAR@1753..1756
+                          NAME@1753..1756
+                            IDENT@1753..1756 "arr"
+                    R_PAREN@1756..1757 ")"
+              WHITESPACE@1757..1758 " "
+              THEN_KW@1758..1762 "then"
+              WHITESPACE@1762..1769 "\n      "
+              TRUE_EXPR@1769..1772
+                EXPR@1769..1772
+                  EXPR_VAR@1769..1772
+                    NAME@1769..1772
+                      IDENT@1769..1772 "arr"
+              WHITESPACE@1772..1777 "\n    "
+              ELSE_KW@1777..1781 "else"
+              WHITESPACE@1781..1782 " "
+              FALSE_EXPR@1782..1929
+                EXPR@1782..1929
+                  EXPR_IF_THEN_ELSE@1782..1929
+                    IF_KW@1782..1784 "if"
+                    WHITESPACE@1784..1785 " "
+                    EXPR@1785..1801
+                      EXPR_VAR@1785..1788
+                        NAME@1785..1788
+                          IDENT@1785..1788 "std"
+                      SUFFIX_INDEX@1788..1796
+                        DOT@1788..1789 "."
+                        NAME@1789..1796
+                          IDENT@1789..1796 "isArray"
+                      SUFFIX_APPLY@1796..1801
+                        ARGS_DESC@1796..1801
+                          L_PAREN@1796..1797 "("
+                          ARG@1797..1800
+                            EXPR@1797..1800
+                              EXPR_VAR@1797..1800
+                                NAME@1797..1800
+                                  IDENT@1797..1800 "arr"
+                          R_PAREN@1800..1801 ")"
+                    WHITESPACE@1801..1802 " "
+                    THEN_KW@1802..1806 "then"
+                    WHITESPACE@1806..1813 "\n      "
+                    TRUE_EXPR@1813..1857
+                      EXPR@1813..1857
+                        EXPR_VAR@1813..1816
+                          NAME@1813..1816
+                            IDENT@1813..1816 "std"
+                        SUFFIX_INDEX@1816..1821
+                          DOT@1816..1817 "."
+                          NAME@1817..1821
+                            IDENT@1817..1821 "join"
+                        SUFFIX_APPLY@1821..1857
+                          ARGS_DESC@1821..1857
+                            L_PAREN@1821..1822 "("
+                            ARG@1822..1824
+                              EXPR@1822..1824
+                                EXPR_STRING@1822..1824
+                                  STRING_SINGLE@1822..1824 "''"
+                            COMMA@1824..1825 ","
+                            WHITESPACE@1825..1826 " "
+                            ARG@1826..1856
+                              EXPR@1826..1856
+                                EXPR_ARRAY_COMP@1826..1856
+                                  L_BRACK@1826..1827 "["
+                                  EXPR@1827..1842
+                                    EXPR_VAR@1827..1830
+                                      NAME@1827..1830
+                                        IDENT@1827..1830 "std"
+                                    SUFFIX_INDEX@1830..1839
+                                      DOT@1830..1831 "."
+                                      NAME@1831..1839
+                                        IDENT@1831..1839 "deepJoin"
+                                    SUFFIX_APPLY@1839..1842
+                                      ARGS_DESC@1839..1842
+                                        L_PAREN@1839..1840 "("
+                                        ARG@1840..1841
+                                          EXPR@1840..1841
+                                            EXPR_VAR@1840..1841
+                                              NAME@1840..1841
+                                                IDENT@1840..1841 "x"
+                                        R_PAREN@1841..1842 ")"
+                                  WHITESPACE@1842..1843 " "
+                                  FOR_SPEC@1843..1855
+                                    FOR_KW@1843..1846 "for"
+                                    WHITESPACE@1846..1847 " "
+                                    DESTRUCT_FULL@1847..1848
+                                      NAME@1847..1848
+                                        IDENT@1847..1848 "x"
+                                    WHITESPACE@1848..1849 " "
+                                    IN_KW@1849..1851 "in"
+                                    WHITESPACE@1851..1852 " "
+                                    EXPR@1852..1855
+                                      EXPR_VAR@1852..1855
+                                        NAME@1852..1855
+                                          IDENT@1852..1855 "arr"
+                                  R_BRACK@1855..1856 "]"
+                            R_PAREN@1856..1857 ")"
+                    WHITESPACE@1857..1862 "\n    "
+                    ELSE_KW@1862..1866 "else"
+                    WHITESPACE@1866..1873 "\n      "
+                    FALSE_EXPR@1873..1929
+                      EXPR@1873..1929
+                        EXPR_ERROR@1873..1929
+                          ERROR_KW@1873..1878 "error"
+                          WHITESPACE@1878..1879 " "
+                          EXPR@1879..1929
+                            EXPR_BINARY@1879..1929
+                              EXPR@1879..1913
+                                EXPR_STRING@1879..1913
+                                  STRING_SINGLE@1879..1913 "'Expected string or a ..."
+                              WHITESPACE@1913..1914 " "
+                              MODULO@1914..1915 "%"
+                              WHITESPACE@1915..1916 " "
+                              EXPR@1916..1929
+                                EXPR_VAR@1916..1919
+                                  NAME@1916..1919
+                                    IDENT@1916..1919 "std"
+                                SUFFIX_INDEX@1919..1924
+                                  DOT@1919..1920 "."
+                                  NAME@1920..1924
+                                    IDENT@1920..1924 "type"
+                                SUFFIX_APPLY@1924..1929
+                                  ARGS_DESC@1924..1929
+                                    L_PAREN@1924..1925 "("
+                                    ARG@1925..1928
+                                      EXPR@1925..1928
+                                        EXPR_VAR@1925..1928
+                                          NAME@1925..1928
+                                            IDENT@1925..1928 "arr"
+                                    R_PAREN@1928..1929 ")"
+        COMMA@1929..1930 ","
+        WHITESPACE@1930..1934 "\n\n  "
+        MEMBER_FIELD_METHOD@1934..2042
+          FIELD_NAME_FIXED@1934..1945
+            NAME@1934..1945
+              IDENT@1934..1945 "assertEqual"
+          PARAMS_DESC@1945..1951
+            L_PAREN@1945..1946 "("
+            PARAM@1946..1947
+              DESTRUCT_FULL@1946..1947
+                NAME@1946..1947
+                  IDENT@1946..1947 "a"
+            COMMA@1947..1948 ","
+            WHITESPACE@1948..1949 " "
+            PARAM@1949..1950
+              DESTRUCT_FULL@1949..1950
+                NAME@1949..1950
+                  IDENT@1949..1950 "b"
+            R_PAREN@1950..1951 ")"
+          COLONCOLON@1951..1953 "::"
+          WHITESPACE@1953..1958 "\n    "
+          EXPR@1958..2042
+            EXPR_IF_THEN_ELSE@1958..2042
+              IF_KW@1958..1960 "if"
+              WHITESPACE@1960..1961 " "
+              EXPR@1961..1967
+                EXPR_BINARY@1961..1967
+                  EXPR@1961..1962
+                    EXPR_VAR@1961..1962
+                      NAME@1961..1962
+                        IDENT@1961..1962 "a"
+                  WHITESPACE@1962..1963 " "
+                  EQ@1963..1965 "=="
+                  WHITESPACE@1965..1966 " "
+                  EXPR@1966..1967
+                    EXPR_VAR@1966..1967
+                      NAME@1966..1967
+                        IDENT@1966..1967 "b"
+              WHITESPACE@1967..1968 " "
+              THEN_KW@1968..1972 "then"
+              WHITESPACE@1972..1979 "\n      "
+              TRUE_EXPR@1979..1983
+                EXPR@1979..1983
+                  EXPR_LITERAL@1979..1983
+                    TRUE_KW@1979..1983 "true"
+              WHITESPACE@1983..1988 "\n    "
+              ELSE_KW@1988..1992 "else"
+              WHITESPACE@1992..1999 "\n      "
+              FALSE_EXPR@1999..2042
+                EXPR@1999..2042
+                  EXPR_ERROR@1999..2042
+                    ERROR_KW@1999..2004 "error"
+                    WHITESPACE@2004..2005 " "
+                    EXPR@2005..2042
+                      EXPR_BINARY@2005..2042
+                        EXPR@2005..2038
+                          EXPR_BINARY@2005..2038
+                            EXPR@2005..2029
+                              EXPR_BINARY@2005..2029
+                                EXPR@2005..2025
+                                  EXPR_STRING@2005..2025
+                                    STRING_SINGLE@2005..2025 "'Assertion failed. '"
+                                WHITESPACE@2025..2026 " "
+                                PLUS@2026..2027 "+"
+                                WHITESPACE@2027..2028 " "
+                                EXPR@2028..2029
+                                  EXPR_VAR@2028..2029
+                                    NAME@2028..2029
+                                      IDENT@2028..2029 "a"
+                            WHITESPACE@2029..2030 " "
+                            PLUS@2030..2031 "+"
+                            WHITESPACE@2031..2032 " "
+                            EXPR@2032..2038
+                              EXPR_STRING@2032..2038
+                                STRING_SINGLE@2032..2038 "' != '"
+                        WHITESPACE@2038..2039 " "
+                        PLUS@2039..2040 "+"
+                        WHITESPACE@2040..2041 " "
+                        EXPR@2041..2042
+                          EXPR_VAR@2041..2042
+                            NAME@2041..2042
+                              IDENT@2041..2042 "b"
+        COMMA@2042..2043 ","
+        WHITESPACE@2043..2047 "\n\n  "
+        MEMBER_FIELD_METHOD@2047..2149
+          FIELD_NAME_FIXED@2047..2052
+            NAME@2047..2052
+              IDENT@2047..2052 "clamp"
+          PARAMS_DESC@2052..2071
+            L_PAREN@2052..2053 "("
+            PARAM@2053..2054
+              DESTRUCT_FULL@2053..2054
+                NAME@2053..2054
+                  IDENT@2053..2054 "x"
+            COMMA@2054..2055 ","
+            WHITESPACE@2055..2056 " "
+            PARAM@2056..2062
+              DESTRUCT_FULL@2056..2062
+                NAME@2056..2062
+                  IDENT@2056..2062 "minVal"
+            COMMA@2062..2063 ","
+            WHITESPACE@2063..2064 " "
+            PARAM@2064..2070
+              DESTRUCT_FULL@2064..2070
+                NAME@2064..2070
+                  IDENT@2064..2070 "maxVal"
+            R_PAREN@2070..2071 ")"
+          COLONCOLON@2071..2073 "::"
+          WHITESPACE@2073..2078 "\n    "
+          EXPR@2078..2149
+            EXPR_IF_THEN_ELSE@2078..2149
+              IF_KW@2078..2080 "if"
+              WHITESPACE@2080..2081 " "
+              EXPR@2081..2091
+                EXPR_BINARY@2081..2091
+                  EXPR@2081..2082
+                    EXPR_VAR@2081..2082
+                      NAME@2081..2082
+                        IDENT@2081..2082 "x"
+                  WHITESPACE@2082..2083 " "
+                  LT@2083..2084 "<"
+                  WHITESPACE@2084..2085 " "
+                  EXPR@2085..2091
+                    EXPR_VAR@2085..2091
+                      NAME@2085..2091
+                        IDENT@2085..2091 "minVal"
+              WHITESPACE@2091..2092 " "
+              THEN_KW@2092..2096 "then"
+              WHITESPACE@2096..2097 " "
+              TRUE_EXPR@2097..2103
+                EXPR@2097..2103
+                  EXPR_VAR@2097..2103
+                    NAME@2097..2103
+                      IDENT@2097..2103 "minVal"
+              WHITESPACE@2103..2108 "\n    "
+              ELSE_KW@2108..2112 "else"
+              WHITESPACE@2112..2113 " "
+              FALSE_EXPR@2113..2149
+                EXPR@2113..2149
+                  EXPR_IF_THEN_ELSE@2113..2149
+                    IF_KW@2113..2115 "if"
+                    WHITESPACE@2115..2116 " "
+                    EXPR@2116..2126
+                      EXPR_BINARY@2116..2126
+                        EXPR@2116..2117
+                          EXPR_VAR@2116..2117
+                            NAME@2116..2117
+                              IDENT@2116..2117 "x"
+                        WHITESPACE@2117..2118 " "
+                        GT@2118..2119 ">"
+                        WHITESPACE@2119..2120 " "
+                        EXPR@2120..2126
+                          EXPR_VAR@2120..2126
+                            NAME@2120..2126
+                              IDENT@2120..2126 "maxVal"
+                    WHITESPACE@2126..2127 " "
+                    THEN_KW@2127..2131 "then"
+                    WHITESPACE@2131..2132 " "
+                    TRUE_EXPR@2132..2138
+                      EXPR@2132..2138
+                        EXPR_VAR@2132..2138
+                          NAME@2132..2138
+                            IDENT@2132..2138 "maxVal"
+                    WHITESPACE@2138..2143 "\n    "
+                    ELSE_KW@2143..2147 "else"
+                    WHITESPACE@2147..2148 " "
+                    FALSE_EXPR@2148..2149
+                      EXPR@2148..2149
+                        EXPR_VAR@2148..2149
+                          NAME@2148..2149
+                            IDENT@2148..2149 "x"
+        COMMA@2149..2150 ","
+        WHITESPACE@2150..2154 "\n\n  "
+        MEMBER_FIELD_METHOD@2154..2840
+          FIELD_NAME_FIXED@2154..2165
+            NAME@2154..2165
+              IDENT@2154..2165 "manifestIni"
+          PARAMS_DESC@2165..2170
+            L_PAREN@2165..2166 "("
+            PARAM@2166..2169
+              DESTRUCT_FULL@2166..2169
+                NAME@2166..2169
+                  IDENT@2166..2169 "ini"
+            R_PAREN@2169..2170 ")"
+          COLONCOLON@2170..2172 "::"
+          WHITESPACE@2172..2177 "\n    "
+          EXPR@2177..2840
+            STMT_LOCAL@2177..2481
+              LOCAL_KW@2177..2182 "local"
+              WHITESPACE@2182..2183 " "
+              BIND_FUNCTION@2183..2480
+                NAME@2183..2193
+                  IDENT@2183..2193 "body_lines"
+                PARAMS_DESC@2193..2199
+                  L_PAREN@2193..2194 "("
+                  PARAM@2194..2198
+                    DESTRUCT_FULL@2194..2198
+                      NAME@2194..2198
+                        IDENT@2194..2198 "body"
+                  R_PAREN@2198..2199 ")"
+                WHITESPACE@2199..2200 " "
+                ASSIGN@2200..2201 "="
+                WHITESPACE@2201..2208 "\n      "
+                EXPR@2208..2480
+                  EXPR_VAR@2208..2211
+                    NAME@2208..2211
+                      IDENT@2208..2211 "std"
+                  SUFFIX_INDEX@2211..2216
+                    DOT@2211..2212 "."
+                    NAME@2212..2216
+                      IDENT@2212..2216 "join"
+                  SUFFIX_APPLY@2216..2480
+                    ARGS_DESC@2216..2480
+                      L_PAREN@2216..2217 "("
+                      ARG@2217..2219
+                        EXPR@2217..2219
+                          EXPR_ARRAY@2217..2219
+                            L_BRACK@2217..2218 "["
+                            R_BRACK@2218..2219 "]"
+                      COMMA@2219..2220 ","
+                      WHITESPACE@2220..2221 " "
+                      ARG@2221..2479
+                        EXPR@2221..2479
+                          EXPR_ARRAY_COMP@2221..2479
+                            L_BRACK@2221..2222 "["
+                            WHITESPACE@2222..2231 "\n        "
+                            EXPR@2231..2430
+                              STMT_LOCAL@2231..2263
+                                LOCAL_KW@2231..2236 "local"
+                                WHITESPACE@2236..2237 " "
+                                BIND_DESTRUCT@2237..2262
+                                  DESTRUCT_FULL@2237..2252
+                                    NAME@2237..2252
+                                      IDENT@2237..2252 "value_or_values"
+                                  WHITESPACE@2252..2253 " "
+                                  ASSIGN@2253..2254 "="
+                                  WHITESPACE@2254..2255 " "
+                                  EXPR@2255..2262
+                                    EXPR_VAR@2255..2259
+                                      NAME@2255..2259
+                                        IDENT@2255..2259 "body"
+                                    SUFFIX_INDEX_EXPR@2259..2262
+                                      L_BRACK@2259..2260 "["
+                                      EXPR@2260..2261
+                                        EXPR_VAR@2260..2261
+                                          NAME@2260..2261
+                                            IDENT@2260..2261 "k"
+                                      R_BRACK@2261..2262 "]"
+                                SEMI@2262..2263 ";"
+                              WHITESPACE@2263..2272 "\n        "
+                              EXPR_IF_THEN_ELSE@2272..2430
+                                IF_KW@2272..2274 "if"
+                                WHITESPACE@2274..2275 " "
+                                EXPR@2275..2303
+                                  EXPR_VAR@2275..2278
+                                    NAME@2275..2278
+                                      IDENT@2275..2278 "std"
+                                  SUFFIX_INDEX@2278..2286
+                                    DOT@2278..2279 "."
+                                    NAME@2279..2286
+                                      IDENT@2279..2286 "isArray"
+                                  SUFFIX_APPLY@2286..2303
+                                    ARGS_DESC@2286..2303
+                                      L_PAREN@2286..2287 "("
+                                      ARG@2287..2302
+                                        EXPR@2287..2302
+                                          EXPR_VAR@2287..2302
+                                            NAME@2287..2302
+                                              IDENT@2287..2302 "value_or_values"
+                                      R_PAREN@2302..2303 ")"
+                                WHITESPACE@2303..2304 " "
+                                THEN_KW@2304..2308 "then"
+                                WHITESPACE@2308..2319 "\n          "
+                                TRUE_EXPR@2319..2372
+                                  EXPR@2319..2372
+                                    EXPR_ARRAY_COMP@2319..2372
+                                      L_BRACK@2319..2320 "["
+                                      EXPR@2320..2342
+                                        EXPR_BINARY@2320..2342
+                                          EXPR@2320..2329
+                                            EXPR_STRING@2320..2329
+                                              STRING_SINGLE@2320..2329 "'%s = %s'"
+                                          WHITESPACE@2329..2330 " "
+                                          MODULO@2330..2331 "%"
+                                          WHITESPACE@2331..2332 " "
+                                          EXPR@2332..2342
+                                            EXPR_ARRAY@2332..2342
+                                              L_BRACK@2332..2333 "["
+                                              EXPR@2333..2334
+                                                EXPR_VAR@2333..2334
+                                                  NAME@2333..2334
+                                                    IDENT@2333..2334 "k"
+                                              COMMA@2334..2335 ","
+                                              WHITESPACE@2335..2336 " "
+                                              EXPR@2336..2341
+                                                EXPR_VAR@2336..2341
+                                                  NAME@2336..2341
+                                                    IDENT@2336..2341 "value"
+                                              R_BRACK@2341..2342 "]"
+                                      WHITESPACE@2342..2343 " "
+                                      FOR_SPEC@2343..2371
+                                        FOR_KW@2343..2346 "for"
+                                        WHITESPACE@2346..2347 " "
+                                        DESTRUCT_FULL@2347..2352
+                                          NAME@2347..2352
+                                            IDENT@2347..2352 "value"
+                                        WHITESPACE@2352..2353 " "
+                                        IN_KW@2353..2355 "in"
+                                        WHITESPACE@2355..2356 " "
+                                        EXPR@2356..2371
+                                          EXPR_VAR@2356..2371
+                                            NAME@2356..2371
+                                              IDENT@2356..2371 "value_or_values"
+                                      R_BRACK@2371..2372 "]"
+                                WHITESPACE@2372..2381 "\n        "
+                                ELSE_KW@2381..2385 "else"
+                                WHITESPACE@2385..2396 "\n          "
+                                FALSE_EXPR@2396..2430
+                                  EXPR@2396..2430
+                                    EXPR_ARRAY@2396..2430
+                                      L_BRACK@2396..2397 "["
+                                      EXPR@2397..2429
+                                        EXPR_BINARY@2397..2429
+                                          EXPR@2397..2406
+                                            EXPR_STRING@2397..2406
+                                              STRING_SINGLE@2397..2406 "'%s = %s'"
+                                          WHITESPACE@2406..2407 " "
+                                          MODULO@2407..2408 "%"
+                                          WHITESPACE@2408..2409 " "
+                                          EXPR@2409..2429
+                                            EXPR_ARRAY@2409..2429
+                                              L_BRACK@2409..2410 "["
+                                              EXPR@2410..2411
+                                                EXPR_VAR@2410..2411
+                                                  NAME@2410..2411
+                                                    IDENT@2410..2411 "k"
+                                              COMMA@2411..2412 ","
+                                              WHITESPACE@2412..2413 " "
+                                              EXPR@2413..2428
+                                                EXPR_VAR@2413..2428
+                                                  NAME@2413..2428
+                                                    IDENT@2413..2428 "value_or_values"
+                                              R_BRACK@2428..2429 "]"
+                                      R_BRACK@2429..2430 "]"
+                            WHITESPACE@2430..2440 "\n\n        "
+                            FOR_SPEC@2440..2471
+                              FOR_KW@2440..2443 "for"
+                              WHITESPACE@2443..2444 " "
+                              DESTRUCT_FULL@2444..2445
+                                NAME@2444..2445
+                                  IDENT@2444..2445 "k"
+                              WHITESPACE@2445..2446 " "
+                              IN_KW@2446..2448 "in"
+                              WHITESPACE@2448..2449 " "
+                              EXPR@2449..2471
+                                EXPR_VAR@2449..2452
+                                  NAME@2449..2452
+                                    IDENT@2449..2452 "std"
+                                SUFFIX_INDEX@2452..2465
+                                  DOT@2452..2453 "."
+                                  NAME@2453..2465
+                                    IDENT@2453..2465 "objectFields"
+                                SUFFIX_APPLY@2465..2471
+                                  ARGS_DESC@2465..2471
+                                    L_PAREN@2465..2466 "("
+                                    ARG@2466..2470
+                                      EXPR@2466..2470
+                                        EXPR_VAR@2466..2470
+                                          NAME@2466..2470
+                                            IDENT@2466..2470 "body"
+                                    R_PAREN@2470..2471 ")"
+                            WHITESPACE@2471..2478 "\n      "
+                            R_BRACK@2478..2479 "]"
+                      R_PAREN@2479..2480 ")"
+              SEMI@2480..2481 ";"
+            WHITESPACE@2481..2487 "\n\n    "
+            STMT_LOCAL@2487..2769
+              LOCAL_KW@2487..2492 "local"
+              WHITESPACE@2492..2493 " "
+              BIND_FUNCTION@2493..2561
+                NAME@2493..2506
+                  IDENT@2493..2506 "section_lines"
+                PARAMS_DESC@2506..2520
+                  L_PAREN@2506..2507 "("
+                  PARAM@2507..2512
+                    DESTRUCT_FULL@2507..2512
+                      NAME@2507..2512
+                        IDENT@2507..2512 "sname"
+                  COMMA@2512..2513 ","
+                  WHITESPACE@2513..2514 " "
+                  PARAM@2514..2519
+                    DESTRUCT_FULL@2514..2519
+                      NAME@2514..2519
+                        IDENT@2514..2519 "sbody"
+                  R_PAREN@2519..2520 ")"
+                WHITESPACE@2520..2521 " "
+                ASSIGN@2521..2522 "="
+                WHITESPACE@2522..2523 " "
+                EXPR@2523..2561
+                  EXPR_BINARY@2523..2561
+                    EXPR@2523..2541
+                      EXPR_ARRAY@2523..2541
+                        L_BRACK@2523..2524 "["
+                        EXPR@2524..2540
+                          EXPR_BINARY@2524..2540
+                            EXPR@2524..2530
+                              EXPR_STRING@2524..2530
+                                STRING_SINGLE@2524..2530 "'[%s]'"
+                            WHITESPACE@2530..2531 " "
+                            MODULO@2531..2532 "%"
+                            WHITESPACE@2532..2533 " "
+                            EXPR@2533..2540
+                              EXPR_ARRAY@2533..2540
+                                L_BRACK@2533..2534 "["
+                                EXPR@2534..2539
+                                  EXPR_VAR@2534..2539
+                                    NAME@2534..2539
+                                      IDENT@2534..2539 "sname"
+                                R_BRACK@2539..2540 "]"
+                        R_BRACK@2540..2541 "]"
+                    WHITESPACE@2541..2542 " "
+                    PLUS@2542..2543 "+"
+                    WHITESPACE@2543..2544 " "
+                    EXPR@2544..2561
+                      EXPR_VAR@2544..2554
+                        NAME@2544..2554
+                          IDENT@2544..2554 "body_lines"
+                      SUFFIX_APPLY@2554..2561
+                        ARGS_DESC@2554..2561
+                          L_PAREN@2554..2555 "("
+                          ARG@2555..2560
+                            EXPR@2555..2560
+                              EXPR_VAR@2555..2560
+                                NAME@2555..2560
+                                  IDENT@2555..2560 "sbody"
+                          R_PAREN@2560..2561 ")"
+              COMMA@2561..2562 ","
+              WHITESPACE@2562..2573 "\n          "
+              BIND_DESTRUCT@2573..2648
+                DESTRUCT_FULL@2573..2582
+                  NAME@2573..2582
+                    IDENT@2573..2582 "main_body"
+                WHITESPACE@2582..2583 " "
+                ASSIGN@2583..2584 "="
+                WHITESPACE@2584..2585 " "
+                EXPR@2585..2648
+                  EXPR_IF_THEN_ELSE@2585..2648
+                    IF_KW@2585..2587 "if"
+                    WHITESPACE@2587..2588 " "
+                    EXPR@2588..2614
+                      EXPR_VAR@2588..2591
+                        NAME@2588..2591
+                          IDENT@2588..2591 "std"
+                      SUFFIX_INDEX@2591..2601
+                        DOT@2591..2592 "."
+                        NAME@2592..2601
+                          IDENT@2592..2601 "objectHas"
+                      SUFFIX_APPLY@2601..2614
+                        ARGS_DESC@2601..2614
+                          L_PAREN@2601..2602 "("
+                          ARG@2602..2605
+                            EXPR@2602..2605
+                              EXPR_VAR@2602..2605
+                                NAME@2602..2605
+                                  IDENT@2602..2605 "ini"
+                          COMMA@2605..2606 ","
+                          WHITESPACE@2606..2607 " "
+                          ARG@2607..2613
+                            EXPR@2607..2613
+                              EXPR_STRING@2607..2613
+                                STRING_SINGLE@2607..2613 "'main'"
+                          R_PAREN@2613..2614 ")"
                     WHITESPACE@2614..2615 " "
-                    EXPR_STRING@2615..2621
-                      STRING_SINGLE@2615..2621 "' != '"
-                WHITESPACE@2621..2622 " "
-                PLUS@2622..2623 "+"
-                WHITESPACE@2623..2624 " "
-                EXPR_VAR@2624..2625
-                  NAME@2624..2625
-                    IDENT@2624..2625 "b"
-      COMMA@2625..2626 ","
-      WHITESPACE@2626..2630 "\n\n  "
-      MEMBER_FIELD_METHOD@2630..2732
-        FIELD_NAME_FIXED@2630..2635
-          NAME@2630..2635
-            IDENT@2630..2635 "clamp"
-        PARAMS_DESC@2635..2654
-          L_PAREN@2635..2636 "("
-          PARAM@2636..2637
-            DESTRUCT_FULL@2636..2637
-              NAME@2636..2637
-                IDENT@2636..2637 "x"
-          COMMA@2637..2638 ","
-          WHITESPACE@2638..2639 " "
-          PARAM@2639..2645
-            DESTRUCT_FULL@2639..2645
-              NAME@2639..2645
-                IDENT@2639..2645 "minVal"
-          COMMA@2645..2646 ","
-          WHITESPACE@2646..2647 " "
-          PARAM@2647..2653
-            DESTRUCT_FULL@2647..2653
-              NAME@2647..2653
-                IDENT@2647..2653 "maxVal"
-          R_PAREN@2653..2654 ")"
-        COLONCOLON@2654..2656 "::"
-        WHITESPACE@2656..2661 "\n    "
-        EXPR_IF_THEN_ELSE@2661..2732
-          IF_KW@2661..2663 "if"
-          WHITESPACE@2663..2664 " "
-          EXPR_BINARY@2664..2674
-            LHS_EXPR@2664..2665
-              EXPR_VAR@2664..2665
-                NAME@2664..2665
-                  IDENT@2664..2665 "x"
-            WHITESPACE@2665..2666 " "
-            LT@2666..2667 "<"
-            WHITESPACE@2667..2668 " "
-            EXPR_VAR@2668..2674
-              NAME@2668..2674
-                IDENT@2668..2674 "minVal"
-          WHITESPACE@2674..2675 " "
-          THEN_KW@2675..2679 "then"
-          WHITESPACE@2679..2680 " "
-          TRUE_EXPR@2680..2686
-            EXPR_VAR@2680..2686
-              NAME@2680..2686
-                IDENT@2680..2686 "minVal"
-          WHITESPACE@2686..2691 "\n    "
-          ELSE_KW@2691..2695 "else"
-          WHITESPACE@2695..2696 " "
-          FALSE_EXPR@2696..2732
-            EXPR_IF_THEN_ELSE@2696..2732
-              IF_KW@2696..2698 "if"
-              WHITESPACE@2698..2699 " "
-              EXPR_BINARY@2699..2709
-                LHS_EXPR@2699..2700
-                  EXPR_VAR@2699..2700
-                    NAME@2699..2700
-                      IDENT@2699..2700 "x"
-                WHITESPACE@2700..2701 " "
-                GT@2701..2702 ">"
-                WHITESPACE@2702..2703 " "
-                EXPR_VAR@2703..2709
-                  NAME@2703..2709
-                    IDENT@2703..2709 "maxVal"
-              WHITESPACE@2709..2710 " "
-              THEN_KW@2710..2714 "then"
-              WHITESPACE@2714..2715 " "
-              TRUE_EXPR@2715..2721
-                EXPR_VAR@2715..2721
-                  NAME@2715..2721
-                    IDENT@2715..2721 "maxVal"
-              WHITESPACE@2721..2726 "\n    "
-              ELSE_KW@2726..2730 "else"
-              WHITESPACE@2730..2731 " "
-              FALSE_EXPR@2731..2732
-                EXPR_VAR@2731..2732
-                  NAME@2731..2732
-                    IDENT@2731..2732 "x"
-      COMMA@2732..2733 ","
-      WHITESPACE@2733..2737 "\n\n  "
-      MEMBER_FIELD_METHOD@2737..2804
-        FIELD_NAME_FIXED@2737..2750
-          NAME@2737..2750
-            IDENT@2737..2750 "flattenArrays"
-        PARAMS_DESC@2750..2756
-          L_PAREN@2750..2751 "("
-          PARAM@2751..2755
-            DESTRUCT_FULL@2751..2755
-              NAME@2751..2755
-                IDENT@2751..2755 "arrs"
-          R_PAREN@2755..2756 ")"
-        COLONCOLON@2756..2758 "::"
-        WHITESPACE@2758..2763 "\n    "
-        EXPR_APPLY@2763..2804
-          EXPR_INDEX@2763..2772
-            EXPR_VAR@2763..2766
-              NAME@2763..2766
-                IDENT@2763..2766 "std"
-            DOT@2766..2767 "."
-            NAME@2767..2772
-              IDENT@2767..2772 "foldl"
-          ARGS_DESC@2772..2804
-            L_PAREN@2772..2773 "("
-            ARG@2773..2793
-              EXPR_FUNCTION@2773..2793
-                FUNCTION_KW@2773..2781 "function"
-                PARAMS_DESC@2781..2787
-                  L_PAREN@2781..2782 "("
-                  PARAM@2782..2783
-                    DESTRUCT_FULL@2782..2783
-                      NAME@2782..2783
-                        IDENT@2782..2783 "a"
-                  COMMA@2783..2784 ","
-                  WHITESPACE@2784..2785 " "
-                  PARAM@2785..2786
-                    DESTRUCT_FULL@2785..2786
-                      NAME@2785..2786
-                        IDENT@2785..2786 "b"
-                  R_PAREN@2786..2787 ")"
-                WHITESPACE@2787..2788 " "
-                EXPR_BINARY@2788..2793
-                  LHS_EXPR@2788..2789
-                    EXPR_VAR@2788..2789
-                      NAME@2788..2789
-                        IDENT@2788..2789 "a"
-                  WHITESPACE@2789..2790 " "
-                  PLUS@2790..2791 "+"
-                  WHITESPACE@2791..2792 " "
-                  EXPR_VAR@2792..2793
-                    NAME@2792..2793
-                      IDENT@2792..2793 "b"
-            COMMA@2793..2794 ","
-            WHITESPACE@2794..2795 " "
-            ARG@2795..2799
-              EXPR_VAR@2795..2799
-                NAME@2795..2799
-                  IDENT@2795..2799 "arrs"
-            COMMA@2799..2800 ","
-            WHITESPACE@2800..2801 " "
-            ARG@2801..2803
-              EXPR_ARRAY@2801..2803
-                L_BRACK@2801..2802 "["
-                R_BRACK@2802..2803 "]"
-            R_PAREN@2803..2804 ")"
-      COMMA@2804..2805 ","
-      WHITESPACE@2805..2809 "\n\n  "
-      MEMBER_FIELD_METHOD@2809..3495
-        FIELD_NAME_FIXED@2809..2820
-          NAME@2809..2820
-            IDENT@2809..2820 "manifestIni"
-        PARAMS_DESC@2820..2825
-          L_PAREN@2820..2821 "("
-          PARAM@2821..2824
-            DESTRUCT_FULL@2821..2824
-              NAME@2821..2824
-                IDENT@2821..2824 "ini"
-          R_PAREN@2824..2825 ")"
-        COLONCOLON@2825..2827 "::"
-        WHITESPACE@2827..2832 "\n    "
-        STMT_LOCAL@2832..3136
-          LOCAL_KW@2832..2837 "local"
-          WHITESPACE@2837..2838 " "
-          BIND_FUNCTION@2838..3135
-            NAME@2838..2848
-              IDENT@2838..2848 "body_lines"
-            PARAMS_DESC@2848..2854
-              L_PAREN@2848..2849 "("
-              PARAM@2849..2853
-                DESTRUCT_FULL@2849..2853
-                  NAME@2849..2853
-                    IDENT@2849..2853 "body"
-              R_PAREN@2853..2854 ")"
-            WHITESPACE@2854..2855 " "
-            ASSIGN@2855..2856 "="
-            WHITESPACE@2856..2863 "\n      "
-            EXPR_APPLY@2863..3135
-              EXPR_INDEX@2863..2871
-                EXPR_VAR@2863..2866
-                  NAME@2863..2866
-                    IDENT@2863..2866 "std"
-                DOT@2866..2867 "."
-                NAME@2867..2871
-                  IDENT@2867..2871 "join"
-              ARGS_DESC@2871..3135
-                L_PAREN@2871..2872 "("
-                ARG@2872..2874
-                  EXPR_ARRAY@2872..2874
-                    L_BRACK@2872..2873 "["
-                    R_BRACK@2873..2874 "]"
-                COMMA@2874..2875 ","
-                WHITESPACE@2875..2876 " "
-                ARG@2876..3134
-                  EXPR_ARRAY_COMP@2876..3134
-                    L_BRACK@2876..2877 "["
-                    WHITESPACE@2877..2886 "\n        "
-                    STMT_LOCAL@2886..2918
-                      LOCAL_KW@2886..2891 "local"
-                      WHITESPACE@2891..2892 " "
-                      BIND_DESTRUCT@2892..2917
-                        DESTRUCT_FULL@2892..2907
-                          NAME@2892..2907
-                            IDENT@2892..2907 "value_or_values"
-                        WHITESPACE@2907..2908 " "
-                        ASSIGN@2908..2909 "="
-                        WHITESPACE@2909..2910 " "
-                        EXPR_INDEX_EXPR@2910..2917
-                          LHS_EXPR@2910..2914
-                            EXPR_VAR@2910..2914
-                              NAME@2910..2914
-                                IDENT@2910..2914 "body"
-                          L_BRACK@2914..2915 "["
-                          EXPR_VAR@2915..2916
-                            NAME@2915..2916
-                              IDENT@2915..2916 "k"
-                          R_BRACK@2916..2917 "]"
-                      SEMI@2917..2918 ";"
-                    WHITESPACE@2918..2927 "\n        "
-                    EXPR_IF_THEN_ELSE@2927..3085
-                      IF_KW@2927..2929 "if"
-                      WHITESPACE@2929..2930 " "
-                      EXPR_APPLY@2930..2958
-                        EXPR_INDEX@2930..2941
-                          EXPR_VAR@2930..2933
-                            NAME@2930..2933
-                              IDENT@2930..2933 "std"
-                          DOT@2933..2934 "."
-                          NAME@2934..2941
-                            IDENT@2934..2941 "isArray"
-                        ARGS_DESC@2941..2958
-                          L_PAREN@2941..2942 "("
-                          ARG@2942..2957
-                            EXPR_VAR@2942..2957
-                              NAME@2942..2957
-                                IDENT@2942..2957 "value_or_values"
-                          R_PAREN@2957..2958 ")"
-                      WHITESPACE@2958..2959 " "
-                      THEN_KW@2959..2963 "then"
-                      WHITESPACE@2963..2974 "\n          "
-                      TRUE_EXPR@2974..3027
-                        EXPR_ARRAY_COMP@2974..3027
-                          L_BRACK@2974..2975 "["
-                          EXPR_BINARY@2975..2997
-                            LHS_EXPR@2975..2984
-                              EXPR_STRING@2975..2984
-                                STRING_SINGLE@2975..2984 "'%s = %s'"
-                            WHITESPACE@2984..2985 " "
-                            MODULO@2985..2986 "%"
-                            WHITESPACE@2986..2987 " "
-                            EXPR_ARRAY@2987..2997
-                              L_BRACK@2987..2988 "["
-                              EXPR_VAR@2988..2989
-                                NAME@2988..2989
-                                  IDENT@2988..2989 "k"
-                              COMMA@2989..2990 ","
-                              WHITESPACE@2990..2991 " "
-                              EXPR_VAR@2991..2996
-                                NAME@2991..2996
-                                  IDENT@2991..2996 "value"
-                              R_BRACK@2996..2997 "]"
-                          WHITESPACE@2997..2998 " "
-                          FOR_SPEC@2998..3026
-                            FOR_KW@2998..3001 "for"
-                            WHITESPACE@3001..3002 " "
-                            NAME@3002..3007
-                              IDENT@3002..3007 "value"
-                            WHITESPACE@3007..3008 " "
-                            IN_KW@3008..3010 "in"
-                            WHITESPACE@3010..3011 " "
-                            EXPR_VAR@3011..3026
-                              NAME@3011..3026
-                                IDENT@3011..3026 "value_or_values"
-                          R_BRACK@3026..3027 "]"
-                      WHITESPACE@3027..3036 "\n        "
-                      ELSE_KW@3036..3040 "else"
-                      WHITESPACE@3040..3051 "\n          "
-                      FALSE_EXPR@3051..3085
-                        EXPR_ARRAY@3051..3085
-                          L_BRACK@3051..3052 "["
-                          EXPR_BINARY@3052..3084
-                            LHS_EXPR@3052..3061
-                              EXPR_STRING@3052..3061
-                                STRING_SINGLE@3052..3061 "'%s = %s'"
-                            WHITESPACE@3061..3062 " "
-                            MODULO@3062..3063 "%"
-                            WHITESPACE@3063..3064 " "
-                            EXPR_ARRAY@3064..3084
-                              L_BRACK@3064..3065 "["
-                              EXPR_VAR@3065..3066
-                                NAME@3065..3066
-                                  IDENT@3065..3066 "k"
-                              COMMA@3066..3067 ","
-                              WHITESPACE@3067..3068 " "
-                              EXPR_VAR@3068..3083
-                                NAME@3068..3083
-                                  IDENT@3068..3083 "value_or_values"
-                              R_BRACK@3083..3084 "]"
-                          R_BRACK@3084..3085 "]"
-                    WHITESPACE@3085..3095 "\n\n        "
-                    FOR_SPEC@3095..3126
-                      FOR_KW@3095..3098 "for"
-                      WHITESPACE@3098..3099 " "
-                      NAME@3099..3100
-                        IDENT@3099..3100 "k"
-                      WHITESPACE@3100..3101 " "
-                      IN_KW@3101..3103 "in"
-                      WHITESPACE@3103..3104 " "
-                      EXPR_APPLY@3104..3126
-                        EXPR_INDEX@3104..3120
-                          EXPR_VAR@3104..3107
-                            NAME@3104..3107
-                              IDENT@3104..3107 "std"
-                          DOT@3107..3108 "."
-                          NAME@3108..3120
-                            IDENT@3108..3120 "objectFields"
-                        ARGS_DESC@3120..3126
-                          L_PAREN@3120..3121 "("
-                          ARG@3121..3125
-                            EXPR_VAR@3121..3125
-                              NAME@3121..3125
-                                IDENT@3121..3125 "body"
-                          R_PAREN@3125..3126 ")"
-                    WHITESPACE@3126..3133 "\n      "
-                    R_BRACK@3133..3134 "]"
-                R_PAREN@3134..3135 ")"
-          SEMI@3135..3136 ";"
-        WHITESPACE@3136..3142 "\n\n    "
-        STMT_LOCAL@3142..3424
-          LOCAL_KW@3142..3147 "local"
-          WHITESPACE@3147..3148 " "
-          BIND_FUNCTION@3148..3216
-            NAME@3148..3161
-              IDENT@3148..3161 "section_lines"
-            PARAMS_DESC@3161..3175
-              L_PAREN@3161..3162 "("
-              PARAM@3162..3167
-                DESTRUCT_FULL@3162..3167
-                  NAME@3162..3167
-                    IDENT@3162..3167 "sname"
-              COMMA@3167..3168 ","
-              WHITESPACE@3168..3169 " "
-              PARAM@3169..3174
-                DESTRUCT_FULL@3169..3174
-                  NAME@3169..3174
-                    IDENT@3169..3174 "sbody"
-              R_PAREN@3174..3175 ")"
-            WHITESPACE@3175..3176 " "
-            ASSIGN@3176..3177 "="
-            WHITESPACE@3177..3178 " "
-            EXPR_BINARY@3178..3216
-              LHS_EXPR@3178..3196
-                EXPR_ARRAY@3178..3196
-                  L_BRACK@3178..3179 "["
-                  EXPR_BINARY@3179..3195
-                    LHS_EXPR@3179..3185
-                      EXPR_STRING@3179..3185
-                        STRING_SINGLE@3179..3185 "'[%s]'"
-                    WHITESPACE@3185..3186 " "
-                    MODULO@3186..3187 "%"
-                    WHITESPACE@3187..3188 " "
-                    EXPR_ARRAY@3188..3195
-                      L_BRACK@3188..3189 "["
-                      EXPR_VAR@3189..3194
-                        NAME@3189..3194
-                          IDENT@3189..3194 "sname"
-                      R_BRACK@3194..3195 "]"
-                  R_BRACK@3195..3196 "]"
-              WHITESPACE@3196..3197 " "
-              PLUS@3197..3198 "+"
-              WHITESPACE@3198..3199 " "
-              EXPR_APPLY@3199..3216
-                EXPR_VAR@3199..3209
-                  NAME@3199..3209
-                    IDENT@3199..3209 "body_lines"
-                ARGS_DESC@3209..3216
-                  L_PAREN@3209..3210 "("
-                  ARG@3210..3215
-                    EXPR_VAR@3210..3215
-                      NAME@3210..3215
-                        IDENT@3210..3215 "sbody"
-                  R_PAREN@3215..3216 ")"
-          COMMA@3216..3217 ","
-          WHITESPACE@3217..3228 "\n          "
-          BIND_DESTRUCT@3228..3303
-            DESTRUCT_FULL@3228..3237
-              NAME@3228..3237
-                IDENT@3228..3237 "main_body"
-            WHITESPACE@3237..3238 " "
-            ASSIGN@3238..3239 "="
-            WHITESPACE@3239..3240 " "
-            EXPR_IF_THEN_ELSE@3240..3303
-              IF_KW@3240..3242 "if"
-              WHITESPACE@3242..3243 " "
-              EXPR_APPLY@3243..3269
-                EXPR_INDEX@3243..3256
-                  EXPR_VAR@3243..3246
-                    NAME@3243..3246
-                      IDENT@3243..3246 "std"
-                  DOT@3246..3247 "."
-                  NAME@3247..3256
-                    IDENT@3247..3256 "objectHas"
-                ARGS_DESC@3256..3269
-                  L_PAREN@3256..3257 "("
-                  ARG@3257..3260
-                    EXPR_VAR@3257..3260
-                      NAME@3257..3260
-                        IDENT@3257..3260 "ini"
-                  COMMA@3260..3261 ","
-                  WHITESPACE@3261..3262 " "
-                  ARG@3262..3268
-                    EXPR_STRING@3262..3268
-                      STRING_SINGLE@3262..3268 "'main'"
-                  R_PAREN@3268..3269 ")"
-              WHITESPACE@3269..3270 " "
-              THEN_KW@3270..3274 "then"
-              WHITESPACE@3274..3275 " "
-              TRUE_EXPR@3275..3295
-                EXPR_APPLY@3275..3295
-                  EXPR_VAR@3275..3285
-                    NAME@3275..3285
-                      IDENT@3275..3285 "body_lines"
-                  ARGS_DESC@3285..3295
-                    L_PAREN@3285..3286 "("
-                    ARG@3286..3294
-                      EXPR_INDEX@3286..3294
-                        EXPR_VAR@3286..3289
-                          NAME@3286..3289
-                            IDENT@3286..3289 "ini"
-                        DOT@3289..3290 "."
-                        NAME@3290..3294
-                          IDENT@3290..3294 "main"
-                    R_PAREN@3294..3295 ")"
-              WHITESPACE@3295..3296 " "
-              ELSE_KW@3296..3300 "else"
-              WHITESPACE@3300..3301 " "
-              FALSE_EXPR@3301..3303
-                EXPR_ARRAY@3301..3303
-                  L_BRACK@3301..3302 "["
-                  R_BRACK@3302..3303 "]"
-          COMMA@3303..3304 ","
-          WHITESPACE@3304..3315 "\n          "
-          BIND_DESTRUCT@3315..3423
-            DESTRUCT_FULL@3315..3327
-              NAME@3315..3327
-                IDENT@3315..3327 "all_sections"
-            WHITESPACE@3327..3328 " "
-            ASSIGN@3328..3329 "="
-            WHITESPACE@3329..3330 " "
-            EXPR_ARRAY_COMP@3330..3423
-              L_BRACK@3330..3331 "["
-              WHITESPACE@3331..3338 "\n      "
-              EXPR_APPLY@3338..3371
-                EXPR_VAR@3338..3351
-                  NAME@3338..3351
-                    IDENT@3338..3351 "section_lines"
-                ARGS_DESC@3351..3371
-                  L_PAREN@3351..3352 "("
-                  ARG@3352..3353
-                    EXPR_VAR@3352..3353
-                      NAME@3352..3353
-                        IDENT@3352..3353 "k"
-                  COMMA@3353..3354 ","
-                  WHITESPACE@3354..3355 " "
-                  ARG@3355..3370
-                    EXPR_INDEX_EXPR@3355..3370
-                      LHS_EXPR@3355..3367
-                        EXPR_INDEX@3355..3367
-                          EXPR_VAR@3355..3358
-                            NAME@3355..3358
-                              IDENT@3355..3358 "ini"
-                          DOT@3358..3359 "."
-                          NAME@3359..3367
-                            IDENT@3359..3367 "sections"
-                      L_BRACK@3367..3368 "["
-                      EXPR_VAR@3368..3369
-                        NAME@3368..3369
-                          IDENT@3368..3369 "k"
-                      R_BRACK@3369..3370 "]"
-                  R_PAREN@3370..3371 ")"
-              WHITESPACE@3371..3378 "\n      "
-              FOR_SPEC@3378..3417
-                FOR_KW@3378..3381 "for"
-                WHITESPACE@3381..3382 " "
-                NAME@3382..3383
-                  IDENT@3382..3383 "k"
-                WHITESPACE@3383..3384 " "
-                IN_KW@3384..3386 "in"
-                WHITESPACE@3386..3387 " "
-                EXPR_APPLY@3387..3417
-                  EXPR_INDEX@3387..3403
-                    EXPR_VAR@3387..3390
-                      NAME@3387..3390
-                        IDENT@3387..3390 "std"
-                    DOT@3390..3391 "."
-                    NAME@3391..3403
-                      IDENT@3391..3403 "objectFields"
-                  ARGS_DESC@3403..3417
-                    L_PAREN@3403..3404 "("
-                    ARG@3404..3416
-                      EXPR_INDEX@3404..3416
-                        EXPR_VAR@3404..3407
-                          NAME@3404..3407
-                            IDENT@3404..3407 "ini"
-                        DOT@3407..3408 "."
-                        NAME@3408..3416
-                          IDENT@3408..3416 "sections"
-                    R_PAREN@3416..3417 ")"
-              WHITESPACE@3417..3422 "\n    "
-              R_BRACK@3422..3423 "]"
-          SEMI@3423..3424 ";"
-        WHITESPACE@3424..3429 "\n    "
-        EXPR_APPLY@3429..3495
-          EXPR_INDEX@3429..3437
-            EXPR_VAR@3429..3432
-              NAME@3429..3432
-                IDENT@3429..3432 "std"
-            DOT@3432..3433 "."
-            NAME@3433..3437
-              IDENT@3433..3437 "join"
-          ARGS_DESC@3437..3495
-            L_PAREN@3437..3438 "("
-            ARG@3438..3442
-              EXPR_STRING@3438..3442
-                STRING_SINGLE@3438..3442 "'\\n'"
-            COMMA@3442..3443 ","
-            WHITESPACE@3443..3444 " "
-            ARG@3444..3494
-              EXPR_BINARY@3444..3494
-                LHS_EXPR@3444..3487
-                  EXPR_BINARY@3444..3487
-                    LHS_EXPR@3444..3453
-                      EXPR_VAR@3444..3453
-                        NAME@3444..3453
-                          IDENT@3444..3453 "main_body"
-                    WHITESPACE@3453..3454 " "
-                    PLUS@3454..3455 "+"
-                    WHITESPACE@3455..3456 " "
-                    EXPR_APPLY@3456..3487
-                      EXPR_INDEX@3456..3473
-                        EXPR_VAR@3456..3459
-                          NAME@3456..3459
-                            IDENT@3456..3459 "std"
-                        DOT@3459..3460 "."
-                        NAME@3460..3473
-                          IDENT@3460..3473 "flattenArrays"
-                      ARGS_DESC@3473..3487
-                        L_PAREN@3473..3474 "("
-                        ARG@3474..3486
-                          EXPR_VAR@3474..3486
-                            NAME@3474..3486
-                              IDENT@3474..3486 "all_sections"
-                        R_PAREN@3486..3487 ")"
-                WHITESPACE@3487..3488 " "
-                PLUS@3488..3489 "+"
-                WHITESPACE@3489..3490 " "
-                EXPR_ARRAY@3490..3494
-                  L_BRACK@3490..3491 "["
-                  EXPR_STRING@3491..3493
-                    STRING_SINGLE@3491..3493 "''"
-                  R_BRACK@3493..3494 "]"
-            R_PAREN@3494..3495 ")"
-      COMMA@3495..3496 ","
-      WHITESPACE@3496..3500 "\n\n  "
-      MEMBER_FIELD_METHOD@3500..3553
-        FIELD_NAME_FIXED@3500..3512
-          NAME@3500..3512
-            IDENT@3500..3512 "manifestToml"
-        PARAMS_DESC@3512..3519
-          L_PAREN@3512..3513 "("
-          PARAM@3513..3518
-            DESTRUCT_FULL@3513..3518
-              NAME@3513..3518
-                IDENT@3513..3518 "value"
-          R_PAREN@3518..3519 ")"
-        COLONCOLON@3519..3521 "::"
-        WHITESPACE@3521..3522 " "
-        EXPR_APPLY@3522..3553
-          EXPR_INDEX@3522..3540
-            EXPR_VAR@3522..3525
-              NAME@3522..3525
-                IDENT@3522..3525 "std"
-            DOT@3525..3526 "."
-            NAME@3526..3540
-              IDENT@3526..3540 "manifestTomlEx"
-          ARGS_DESC@3540..3553
-            L_PAREN@3540..3541 "("
-            ARG@3541..3546
-              EXPR_VAR@3541..3546
-                NAME@3541..3546
-                  IDENT@3541..3546 "value"
-            COMMA@3546..3547 ","
-            WHITESPACE@3547..3548 " "
-            ARG@3548..3552
-              EXPR_STRING@3548..3552
-                STRING_SINGLE@3548..3552 "'  '"
-            R_PAREN@3552..3553 ")"
-      COMMA@3553..3554 ","
-      WHITESPACE@3554..3558 "\n\n  "
-      MEMBER_FIELD_METHOD@3558..3613
-        FIELD_NAME_FIXED@3558..3576
-          NAME@3558..3576
-            IDENT@3558..3576 "escapeStringPython"
-        PARAMS_DESC@3576..3581
-          L_PAREN@3576..3577 "("
-          PARAM@3577..3580
-            DESTRUCT_FULL@3577..3580
-              NAME@3577..3580
-                IDENT@3577..3580 "str"
-          R_PAREN@3580..3581 ")"
-        COLONCOLON@3581..3583 "::"
-        WHITESPACE@3583..3588 "\n    "
-        EXPR_APPLY@3588..3613
-          EXPR_INDEX@3588..3608
+                    THEN_KW@2615..2619 "then"
+                    WHITESPACE@2619..2620 " "
+                    TRUE_EXPR@2620..2640
+                      EXPR@2620..2640
+                        EXPR_VAR@2620..2630
+                          NAME@2620..2630
+                            IDENT@2620..2630 "body_lines"
+                        SUFFIX_APPLY@2630..2640
+                          ARGS_DESC@2630..2640
+                            L_PAREN@2630..2631 "("
+                            ARG@2631..2639
+                              EXPR@2631..2639
+                                EXPR_VAR@2631..2634
+                                  NAME@2631..2634
+                                    IDENT@2631..2634 "ini"
+                                SUFFIX_INDEX@2634..2639
+                                  DOT@2634..2635 "."
+                                  NAME@2635..2639
+                                    IDENT@2635..2639 "main"
+                            R_PAREN@2639..2640 ")"
+                    WHITESPACE@2640..2641 " "
+                    ELSE_KW@2641..2645 "else"
+                    WHITESPACE@2645..2646 " "
+                    FALSE_EXPR@2646..2648
+                      EXPR@2646..2648
+                        EXPR_ARRAY@2646..2648
+                          L_BRACK@2646..2647 "["
+                          R_BRACK@2647..2648 "]"
+              COMMA@2648..2649 ","
+              WHITESPACE@2649..2660 "\n          "
+              BIND_DESTRUCT@2660..2768
+                DESTRUCT_FULL@2660..2672
+                  NAME@2660..2672
+                    IDENT@2660..2672 "all_sections"
+                WHITESPACE@2672..2673 " "
+                ASSIGN@2673..2674 "="
+                WHITESPACE@2674..2675 " "
+                EXPR@2675..2768
+                  EXPR_ARRAY_COMP@2675..2768
+                    L_BRACK@2675..2676 "["
+                    WHITESPACE@2676..2683 "\n      "
+                    EXPR@2683..2716
+                      EXPR_VAR@2683..2696
+                        NAME@2683..2696
+                          IDENT@2683..2696 "section_lines"
+                      SUFFIX_APPLY@2696..2716
+                        ARGS_DESC@2696..2716
+                          L_PAREN@2696..2697 "("
+                          ARG@2697..2698
+                            EXPR@2697..2698
+                              EXPR_VAR@2697..2698
+                                NAME@2697..2698
+                                  IDENT@2697..2698 "k"
+                          COMMA@2698..2699 ","
+                          WHITESPACE@2699..2700 " "
+                          ARG@2700..2715
+                            EXPR@2700..2715
+                              EXPR_VAR@2700..2703
+                                NAME@2700..2703
+                                  IDENT@2700..2703 "ini"
+                              SUFFIX_INDEX@2703..2712
+                                DOT@2703..2704 "."
+                                NAME@2704..2712
+                                  IDENT@2704..2712 "sections"
+                              SUFFIX_INDEX_EXPR@2712..2715
+                                L_BRACK@2712..2713 "["
+                                EXPR@2713..2714
+                                  EXPR_VAR@2713..2714
+                                    NAME@2713..2714
+                                      IDENT@2713..2714 "k"
+                                R_BRACK@2714..2715 "]"
+                          R_PAREN@2715..2716 ")"
+                    WHITESPACE@2716..2723 "\n      "
+                    FOR_SPEC@2723..2762
+                      FOR_KW@2723..2726 "for"
+                      WHITESPACE@2726..2727 " "
+                      DESTRUCT_FULL@2727..2728
+                        NAME@2727..2728
+                          IDENT@2727..2728 "k"
+                      WHITESPACE@2728..2729 " "
+                      IN_KW@2729..2731 "in"
+                      WHITESPACE@2731..2732 " "
+                      EXPR@2732..2762
+                        EXPR_VAR@2732..2735
+                          NAME@2732..2735
+                            IDENT@2732..2735 "std"
+                        SUFFIX_INDEX@2735..2748
+                          DOT@2735..2736 "."
+                          NAME@2736..2748
+                            IDENT@2736..2748 "objectFields"
+                        SUFFIX_APPLY@2748..2762
+                          ARGS_DESC@2748..2762
+                            L_PAREN@2748..2749 "("
+                            ARG@2749..2761
+                              EXPR@2749..2761
+                                EXPR_VAR@2749..2752
+                                  NAME@2749..2752
+                                    IDENT@2749..2752 "ini"
+                                SUFFIX_INDEX@2752..2761
+                                  DOT@2752..2753 "."
+                                  NAME@2753..2761
+                                    IDENT@2753..2761 "sections"
+                            R_PAREN@2761..2762 ")"
+                    WHITESPACE@2762..2767 "\n    "
+                    R_BRACK@2767..2768 "]"
+              SEMI@2768..2769 ";"
+            WHITESPACE@2769..2774 "\n    "
+            EXPR_VAR@2774..2777
+              NAME@2774..2777
+                IDENT@2774..2777 "std"
+            SUFFIX_INDEX@2777..2782
+              DOT@2777..2778 "."
+              NAME@2778..2782
+                IDENT@2778..2782 "join"
+            SUFFIX_APPLY@2782..2840
+              ARGS_DESC@2782..2840
+                L_PAREN@2782..2783 "("
+                ARG@2783..2787
+                  EXPR@2783..2787
+                    EXPR_STRING@2783..2787
+                      STRING_SINGLE@2783..2787 "'\\n'"
+                COMMA@2787..2788 ","
+                WHITESPACE@2788..2789 " "
+                ARG@2789..2839
+                  EXPR@2789..2839
+                    EXPR_BINARY@2789..2839
+                      EXPR@2789..2832
+                        EXPR_BINARY@2789..2832
+                          EXPR@2789..2798
+                            EXPR_VAR@2789..2798
+                              NAME@2789..2798
+                                IDENT@2789..2798 "main_body"
+                          WHITESPACE@2798..2799 " "
+                          PLUS@2799..2800 "+"
+                          WHITESPACE@2800..2801 " "
+                          EXPR@2801..2832
+                            EXPR_VAR@2801..2804
+                              NAME@2801..2804
+                                IDENT@2801..2804 "std"
+                            SUFFIX_INDEX@2804..2818
+                              DOT@2804..2805 "."
+                              NAME@2805..2818
+                                IDENT@2805..2818 "flattenArrays"
+                            SUFFIX_APPLY@2818..2832
+                              ARGS_DESC@2818..2832
+                                L_PAREN@2818..2819 "("
+                                ARG@2819..2831
+                                  EXPR@2819..2831
+                                    EXPR_VAR@2819..2831
+                                      NAME@2819..2831
+                                        IDENT@2819..2831 "all_sections"
+                                R_PAREN@2831..2832 ")"
+                      WHITESPACE@2832..2833 " "
+                      PLUS@2833..2834 "+"
+                      WHITESPACE@2834..2835 " "
+                      EXPR@2835..2839
+                        EXPR_ARRAY@2835..2839
+                          L_BRACK@2835..2836 "["
+                          EXPR@2836..2838
+                            EXPR_STRING@2836..2838
+                              STRING_SINGLE@2836..2838 "''"
+                          R_BRACK@2838..2839 "]"
+                R_PAREN@2839..2840 ")"
+        COMMA@2840..2841 ","
+        WHITESPACE@2841..2845 "\n\n  "
+        MEMBER_FIELD_METHOD@2845..2898
+          FIELD_NAME_FIXED@2845..2857
+            NAME@2845..2857
+              IDENT@2845..2857 "manifestToml"
+          PARAMS_DESC@2857..2864
+            L_PAREN@2857..2858 "("
+            PARAM@2858..2863
+              DESTRUCT_FULL@2858..2863
+                NAME@2858..2863
+                  IDENT@2858..2863 "value"
+            R_PAREN@2863..2864 ")"
+          COLONCOLON@2864..2866 "::"
+          WHITESPACE@2866..2867 " "
+          EXPR@2867..2898
+            EXPR_VAR@2867..2870
+              NAME@2867..2870
+                IDENT@2867..2870 "std"
+            SUFFIX_INDEX@2870..2885
+              DOT@2870..2871 "."
+              NAME@2871..2885
+                IDENT@2871..2885 "manifestTomlEx"
+            SUFFIX_APPLY@2885..2898
+              ARGS_DESC@2885..2898
+                L_PAREN@2885..2886 "("
+                ARG@2886..2891
+                  EXPR@2886..2891
+                    EXPR_VAR@2886..2891
+                      NAME@2886..2891
+                        IDENT@2886..2891 "value"
+                COMMA@2891..2892 ","
+                WHITESPACE@2892..2893 " "
+                ARG@2893..2897
+                  EXPR@2893..2897
+                    EXPR_STRING@2893..2897
+                      STRING_SINGLE@2893..2897 "'  '"
+                R_PAREN@2897..2898 ")"
+        COMMA@2898..2899 ","
+        WHITESPACE@2899..2903 "\n\n  "
+        MEMBER_FIELD_METHOD@2903..2958
+          FIELD_NAME_FIXED@2903..2921
+            NAME@2903..2921
+              IDENT@2903..2921 "escapeStringPython"
+          PARAMS_DESC@2921..2926
+            L_PAREN@2921..2922 "("
+            PARAM@2922..2925
+              DESTRUCT_FULL@2922..2925
+                NAME@2922..2925
+                  IDENT@2922..2925 "str"
+            R_PAREN@2925..2926 ")"
+          COLONCOLON@2926..2928 "::"
+          WHITESPACE@2928..2933 "\n    "
+          EXPR@2933..2958
+            EXPR_VAR@2933..2936
+              NAME@2933..2936
+                IDENT@2933..2936 "std"
+            SUFFIX_INDEX@2936..2953
+              DOT@2936..2937 "."
+              NAME@2937..2953
+                IDENT@2937..2953 "escapeStringJson"
+            SUFFIX_APPLY@2953..2958
+              ARGS_DESC@2953..2958
+                L_PAREN@2953..2954 "("
+                ARG@2954..2957
+                  EXPR@2954..2957
+                    EXPR_VAR@2954..2957
+                      NAME@2954..2957
+                        IDENT@2954..2957 "str"
+                R_PAREN@2957..2958 ")"
+        COMMA@2958..2959 ","
+        WHITESPACE@2959..2963 "\n\n  "
+        MEMBER_FIELD_METHOD@2963..3180
+          FIELD_NAME_FIXED@2963..2979
+            NAME@2963..2979
+              IDENT@2963..2979 "escapeStringBash"
+          PARAMS_DESC@2979..2985
+            L_PAREN@2979..2980 "("
+            PARAM@2980..2984
+              DESTRUCT_FULL@2980..2984
+                NAME@2980..2984
+                  IDENT@2980..2984 "str_"
+            R_PAREN@2984..2985 ")"
+          COLONCOLON@2985..2987 "::"
+          WHITESPACE@2987..2992 "\n    "
+          EXPR@2992..3180
+            STMT_LOCAL@2992..3023
+              LOCAL_KW@2992..2997 "local"
+              WHITESPACE@2997..2998 " "
+              BIND_DESTRUCT@2998..3022
+                DESTRUCT_FULL@2998..3001
+                  NAME@2998..3001
+                    IDENT@2998..3001 "str"
+                WHITESPACE@3001..3002 " "
+                ASSIGN@3002..3003 "="
+                WHITESPACE@3003..3004 " "
+                EXPR@3004..3022
+                  EXPR_VAR@3004..3007
+                    NAME@3004..3007
+                      IDENT@3004..3007 "std"
+                  SUFFIX_INDEX@3007..3016
+                    DOT@3007..3008 "."
+                    NAME@3008..3016
+                      IDENT@3008..3016 "toString"
+                  SUFFIX_APPLY@3016..3022
+                    ARGS_DESC@3016..3022
+                      L_PAREN@3016..3017 "("
+                      ARG@3017..3021
+                        EXPR@3017..3021
+                          EXPR_VAR@3017..3021
+                            NAME@3017..3021
+                              IDENT@3017..3021 "str_"
+                      R_PAREN@3021..3022 ")"
+              SEMI@3022..3023 ";"
+            WHITESPACE@3023..3028 "\n    "
+            STMT_LOCAL@3028..3110
+              LOCAL_KW@3028..3033 "local"
+              WHITESPACE@3033..3034 " "
+              BIND_FUNCTION@3034..3109
+                NAME@3034..3039
+                  IDENT@3034..3039 "trans"
+                PARAMS_DESC@3039..3043
+                  L_PAREN@3039..3040 "("
+                  PARAM@3040..3042
+                    DESTRUCT_FULL@3040..3042
+                      NAME@3040..3042
+                        IDENT@3040..3042 "ch"
+                  R_PAREN@3042..3043 ")"
+                WHITESPACE@3043..3044 " "
+                ASSIGN@3044..3045 "="
+                WHITESPACE@3045..3052 "\n      "
+                EXPR@3052..3109
+                  EXPR_IF_THEN_ELSE@3052..3109
+                    IF_KW@3052..3054 "if"
+                    WHITESPACE@3054..3055 " "
+                    EXPR@3055..3064
+                      EXPR_BINARY@3055..3064
+                        EXPR@3055..3057
+                          EXPR_VAR@3055..3057
+                            NAME@3055..3057
+                              IDENT@3055..3057 "ch"
+                        WHITESPACE@3057..3058 " "
+                        EQ@3058..3060 "=="
+                        WHITESPACE@3060..3061 " "
+                        EXPR@3061..3064
+                          EXPR_STRING@3061..3064
+                            STRING_DOUBLE@3061..3064 "\"'\""
+                    WHITESPACE@3064..3065 " "
+                    THEN_KW@3065..3069 "then"
+                    WHITESPACE@3069..3078 "\n        "
+                    TRUE_EXPR@3078..3087
+                      EXPR@3078..3087
+                        EXPR_STRING@3078..3087
+                          STRING_DOUBLE@3078..3087 "\"'\\\"'\\\"'\""
+                    WHITESPACE@3087..3094 "\n      "
+                    ELSE_KW@3094..3098 "else"
+                    WHITESPACE@3098..3107 "\n        "
+                    FALSE_EXPR@3107..3109
+                      EXPR@3107..3109
+                        EXPR_VAR@3107..3109
+                          NAME@3107..3109
+                            IDENT@3107..3109 "ch"
+              SEMI@3109..3110 ";"
+            WHITESPACE@3110..3115 "\n    "
+            EXPR_BINARY@3115..3180
+              EXPR@3115..3121
+                EXPR_STRING@3115..3121
+                  STRING_DOUBLE@3115..3121 "\"'%s'\""
+              WHITESPACE@3121..3122 " "
+              MODULO@3122..3123 "%"
+              WHITESPACE@3123..3124 " "
+              EXPR@3124..3180
+                EXPR_VAR@3124..3127
+                  NAME@3124..3127
+                    IDENT@3124..3127 "std"
+                SUFFIX_INDEX@3127..3132
+                  DOT@3127..3128 "."
+                  NAME@3128..3132
+                    IDENT@3128..3132 "join"
+                SUFFIX_APPLY@3132..3180
+                  ARGS_DESC@3132..3180
+                    L_PAREN@3132..3133 "("
+                    ARG@3133..3135
+                      EXPR@3133..3135
+                        EXPR_STRING@3133..3135
+                          STRING_SINGLE@3133..3135 "''"
+                    COMMA@3135..3136 ","
+                    WHITESPACE@3136..3137 " "
+                    ARG@3137..3179
+                      EXPR@3137..3179
+                        EXPR_ARRAY_COMP@3137..3179
+                          L_BRACK@3137..3138 "["
+                          EXPR@3138..3147
+                            EXPR_VAR@3138..3143
+                              NAME@3138..3143
+                                IDENT@3138..3143 "trans"
+                            SUFFIX_APPLY@3143..3147
+                              ARGS_DESC@3143..3147
+                                L_PAREN@3143..3144 "("
+                                ARG@3144..3146
+                                  EXPR@3144..3146
+                                    EXPR_VAR@3144..3146
+                                      NAME@3144..3146
+                                        IDENT@3144..3146 "ch"
+                                R_PAREN@3146..3147 ")"
+                          WHITESPACE@3147..3148 " "
+                          FOR_SPEC@3148..3178
+                            FOR_KW@3148..3151 "for"
+                            WHITESPACE@3151..3152 " "
+                            DESTRUCT_FULL@3152..3154
+                              NAME@3152..3154
+                                IDENT@3152..3154 "ch"
+                            WHITESPACE@3154..3155 " "
+                            IN_KW@3155..3157 "in"
+                            WHITESPACE@3157..3158 " "
+                            EXPR@3158..3178
+                              EXPR_VAR@3158..3161
+                                NAME@3158..3161
+                                  IDENT@3158..3161 "std"
+                              SUFFIX_INDEX@3161..3173
+                                DOT@3161..3162 "."
+                                NAME@3162..3173
+                                  IDENT@3162..3173 "stringChars"
+                              SUFFIX_APPLY@3173..3178
+                                ARGS_DESC@3173..3178
+                                  L_PAREN@3173..3174 "("
+                                  ARG@3174..3177
+                                    EXPR@3174..3177
+                                      EXPR_VAR@3174..3177
+                                        NAME@3174..3177
+                                          IDENT@3174..3177 "str"
+                                  R_PAREN@3177..3178 ")"
+                          R_BRACK@3178..3179 "]"
+                    R_PAREN@3179..3180 ")"
+        COMMA@3180..3181 ","
+        WHITESPACE@3181..3185 "\n\n  "
+        MEMBER_FIELD_METHOD@3185..3399
+          FIELD_NAME_FIXED@3185..3204
+            NAME@3185..3204
+              IDENT@3185..3204 "escapeStringDollars"
+          PARAMS_DESC@3204..3210
+            L_PAREN@3204..3205 "("
+            PARAM@3205..3209
+              DESTRUCT_FULL@3205..3209
+                NAME@3205..3209
+                  IDENT@3205..3209 "str_"
+            R_PAREN@3209..3210 ")"
+          COLONCOLON@3210..3212 "::"
+          WHITESPACE@3212..3217 "\n    "
+          EXPR@3217..3399
+            STMT_LOCAL@3217..3248
+              LOCAL_KW@3217..3222 "local"
+              WHITESPACE@3222..3223 " "
+              BIND_DESTRUCT@3223..3247
+                DESTRUCT_FULL@3223..3226
+                  NAME@3223..3226
+                    IDENT@3223..3226 "str"
+                WHITESPACE@3226..3227 " "
+                ASSIGN@3227..3228 "="
+                WHITESPACE@3228..3229 " "
+                EXPR@3229..3247
+                  EXPR_VAR@3229..3232
+                    NAME@3229..3232
+                      IDENT@3229..3232 "std"
+                  SUFFIX_INDEX@3232..3241
+                    DOT@3232..3233 "."
+                    NAME@3233..3241
+                      IDENT@3233..3241 "toString"
+                  SUFFIX_APPLY@3241..3247
+                    ARGS_DESC@3241..3247
+                      L_PAREN@3241..3242 "("
+                      ARG@3242..3246
+                        EXPR@3242..3246
+                          EXPR_VAR@3242..3246
+                            NAME@3242..3246
+                              IDENT@3242..3246 "str_"
+                      R_PAREN@3246..3247 ")"
+              SEMI@3247..3248 ";"
+            WHITESPACE@3248..3253 "\n    "
+            STMT_LOCAL@3253..3330
+              LOCAL_KW@3253..3258 "local"
+              WHITESPACE@3258..3259 " "
+              BIND_FUNCTION@3259..3329
+                NAME@3259..3264
+                  IDENT@3259..3264 "trans"
+                PARAMS_DESC@3264..3268
+                  L_PAREN@3264..3265 "("
+                  PARAM@3265..3267
+                    DESTRUCT_FULL@3265..3267
+                      NAME@3265..3267
+                        IDENT@3265..3267 "ch"
+                  R_PAREN@3267..3268 ")"
+                WHITESPACE@3268..3269 " "
+                ASSIGN@3269..3270 "="
+                WHITESPACE@3270..3277 "\n      "
+                EXPR@3277..3329
+                  EXPR_IF_THEN_ELSE@3277..3329
+                    IF_KW@3277..3279 "if"
+                    WHITESPACE@3279..3280 " "
+                    EXPR@3280..3289
+                      EXPR_BINARY@3280..3289
+                        EXPR@3280..3282
+                          EXPR_VAR@3280..3282
+                            NAME@3280..3282
+                              IDENT@3280..3282 "ch"
+                        WHITESPACE@3282..3283 " "
+                        EQ@3283..3285 "=="
+                        WHITESPACE@3285..3286 " "
+                        EXPR@3286..3289
+                          EXPR_STRING@3286..3289
+                            STRING_SINGLE@3286..3289 "'$'"
+                    WHITESPACE@3289..3290 " "
+                    THEN_KW@3290..3294 "then"
+                    WHITESPACE@3294..3303 "\n        "
+                    TRUE_EXPR@3303..3307
+                      EXPR@3303..3307
+                        EXPR_STRING@3303..3307
+                          STRING_SINGLE@3303..3307 "'$$'"
+                    WHITESPACE@3307..3314 "\n      "
+                    ELSE_KW@3314..3318 "else"
+                    WHITESPACE@3318..3327 "\n        "
+                    FALSE_EXPR@3327..3329
+                      EXPR@3327..3329
+                        EXPR_VAR@3327..3329
+                          NAME@3327..3329
+                            IDENT@3327..3329 "ch"
+              SEMI@3329..3330 ";"
+            WHITESPACE@3330..3335 "\n    "
+            EXPR_VAR@3335..3338
+              NAME@3335..3338
+                IDENT@3335..3338 "std"
+            SUFFIX_INDEX@3338..3344
+              DOT@3338..3339 "."
+              NAME@3339..3344
+                IDENT@3339..3344 "foldl"
+            SUFFIX_APPLY@3344..3399
+              ARGS_DESC@3344..3399
+                L_PAREN@3344..3345 "("
+                ARG@3345..3372
+                  EXPR@3345..3372
+                    EXPR_FUNCTION@3345..3372
+                      FUNCTION_KW@3345..3353 "function"
+                      PARAMS_DESC@3353..3359
+                        L_PAREN@3353..3354 "("
+                        PARAM@3354..3355
+                          DESTRUCT_FULL@3354..3355
+                            NAME@3354..3355
+                              IDENT@3354..3355 "a"
+                        COMMA@3355..3356 ","
+                        WHITESPACE@3356..3357 " "
+                        PARAM@3357..3358
+                          DESTRUCT_FULL@3357..3358
+                            NAME@3357..3358
+                              IDENT@3357..3358 "b"
+                        R_PAREN@3358..3359 ")"
+                      WHITESPACE@3359..3360 " "
+                      EXPR@3360..3372
+                        EXPR_BINARY@3360..3372
+                          EXPR@3360..3361
+                            EXPR_VAR@3360..3361
+                              NAME@3360..3361
+                                IDENT@3360..3361 "a"
+                          WHITESPACE@3361..3362 " "
+                          PLUS@3362..3363 "+"
+                          WHITESPACE@3363..3364 " "
+                          EXPR@3364..3372
+                            EXPR_VAR@3364..3369
+                              NAME@3364..3369
+                                IDENT@3364..3369 "trans"
+                            SUFFIX_APPLY@3369..3372
+                              ARGS_DESC@3369..3372
+                                L_PAREN@3369..3370 "("
+                                ARG@3370..3371
+                                  EXPR@3370..3371
+                                    EXPR_VAR@3370..3371
+                                      NAME@3370..3371
+                                        IDENT@3370..3371 "b"
+                                R_PAREN@3371..3372 ")"
+                COMMA@3372..3373 ","
+                WHITESPACE@3373..3374 " "
+                ARG@3374..3394
+                  EXPR@3374..3394
+                    EXPR_VAR@3374..3377
+                      NAME@3374..3377
+                        IDENT@3374..3377 "std"
+                    SUFFIX_INDEX@3377..3389
+                      DOT@3377..3378 "."
+                      NAME@3378..3389
+                        IDENT@3378..3389 "stringChars"
+                    SUFFIX_APPLY@3389..3394
+                      ARGS_DESC@3389..3394
+                        L_PAREN@3389..3390 "("
+                        ARG@3390..3393
+                          EXPR@3390..3393
+                            EXPR_VAR@3390..3393
+                              NAME@3390..3393
+                                IDENT@3390..3393 "str"
+                        R_PAREN@3393..3394 ")"
+                COMMA@3394..3395 ","
+                WHITESPACE@3395..3396 " "
+                ARG@3396..3398
+                  EXPR@3396..3398
+                    EXPR_STRING@3396..3398
+                      STRING_SINGLE@3396..3398 "''"
+                R_PAREN@3398..3399 ")"
+        COMMA@3399..3400 ","
+        WHITESPACE@3400..3404 "\n\n  "
+        MEMBER_BIND_STMT@3404..3519
+          OBJ_LOCAL@3404..3519
+            LOCAL_KW@3404..3409 "local"
+            WHITESPACE@3409..3410 " "
+            BIND_DESTRUCT@3410..3519
+              DESTRUCT_FULL@3410..3421
+                NAME@3410..3421
+                  IDENT@3410..3421 "xml_escapes"
+              WHITESPACE@3421..3422 " "
+              ASSIGN@3422..3423 "="
+              WHITESPACE@3423..3424 " "
+              EXPR@3424..3519
+                EXPR_OBJECT@3424..3519
+                  OBJ_BODY_MEMBER_LIST@3424..3519
+                    L_BRACE@3424..3425 "{"
+                    WHITESPACE@3425..3430 "\n    "
+                    MEMBER_FIELD_NORMAL@3430..3441
+                      FIELD_NAME_FIXED@3430..3433
+                        STRING_SINGLE@3430..3433 "'<'"
+                      COLON@3433..3434 ":"
+                      WHITESPACE@3434..3435 " "
+                      EXPR@3435..3441
+                        EXPR_STRING@3435..3441
+                          STRING_SINGLE@3435..3441 "'&lt;'"
+                    COMMA@3441..3442 ","
+                    WHITESPACE@3442..3447 "\n    "
+                    MEMBER_FIELD_NORMAL@3447..3458
+                      FIELD_NAME_FIXED@3447..3450
+                        STRING_SINGLE@3447..3450 "'>'"
+                      COLON@3450..3451 ":"
+                      WHITESPACE@3451..3452 " "
+                      EXPR@3452..3458
+                        EXPR_STRING@3452..3458
+                          STRING_SINGLE@3452..3458 "'&gt;'"
+                    COMMA@3458..3459 ","
+                    WHITESPACE@3459..3464 "\n    "
+                    MEMBER_FIELD_NORMAL@3464..3476
+                      FIELD_NAME_FIXED@3464..3467
+                        STRING_SINGLE@3464..3467 "'&'"
+                      COLON@3467..3468 ":"
+                      WHITESPACE@3468..3469 " "
+                      EXPR@3469..3476
+                        EXPR_STRING@3469..3476
+                          STRING_SINGLE@3469..3476 "'&amp;'"
+                    COMMA@3476..3477 ","
+                    WHITESPACE@3477..3482 "\n    "
+                    MEMBER_FIELD_NORMAL@3482..3495
+                      FIELD_NAME_FIXED@3482..3485
+                        STRING_SINGLE@3482..3485 "'\"'"
+                      COLON@3485..3486 ":"
+                      WHITESPACE@3486..3487 " "
+                      EXPR@3487..3495
+                        EXPR_STRING@3487..3495
+                          STRING_SINGLE@3487..3495 "'&quot;'"
+                    COMMA@3495..3496 ","
+                    WHITESPACE@3496..3501 "\n    "
+                    MEMBER_FIELD_NORMAL@3501..3514
+                      FIELD_NAME_FIXED@3501..3504
+                        STRING_DOUBLE@3501..3504 "\"'\""
+                      COLON@3504..3505 ":"
+                      WHITESPACE@3505..3506 " "
+                      EXPR@3506..3514
+                        EXPR_STRING@3506..3514
+                          STRING_SINGLE@3506..3514 "'&apos;'"
+                    COMMA@3514..3515 ","
+                    WHITESPACE@3515..3518 "\n  "
+                    R_BRACE@3518..3519 "}"
+        COMMA@3519..3520 ","
+        WHITESPACE@3520..3524 "\n\n  "
+        MEMBER_FIELD_METHOD@3524..3663
+          FIELD_NAME_FIXED@3524..3539
+            NAME@3524..3539
+              IDENT@3524..3539 "escapeStringXML"
+          PARAMS_DESC@3539..3545
+            L_PAREN@3539..3540 "("
+            PARAM@3540..3544
+              DESTRUCT_FULL@3540..3544
+                NAME@3540..3544
+                  IDENT@3540..3544 "str_"
+            R_PAREN@3544..3545 ")"
+          COLONCOLON@3545..3547 "::"
+          WHITESPACE@3547..3552 "\n    "
+          EXPR@3552..3663
+            STMT_LOCAL@3552..3583
+              LOCAL_KW@3552..3557 "local"
+              WHITESPACE@3557..3558 " "
+              BIND_DESTRUCT@3558..3582
+                DESTRUCT_FULL@3558..3561
+                  NAME@3558..3561
+                    IDENT@3558..3561 "str"
+                WHITESPACE@3561..3562 " "
+                ASSIGN@3562..3563 "="
+                WHITESPACE@3563..3564 " "
+                EXPR@3564..3582
+                  EXPR_VAR@3564..3567
+                    NAME@3564..3567
+                      IDENT@3564..3567 "std"
+                  SUFFIX_INDEX@3567..3576
+                    DOT@3567..3568 "."
+                    NAME@3568..3576
+                      IDENT@3568..3576 "toString"
+                  SUFFIX_APPLY@3576..3582
+                    ARGS_DESC@3576..3582
+                      L_PAREN@3576..3577 "("
+                      ARG@3577..3581
+                        EXPR@3577..3581
+                          EXPR_VAR@3577..3581
+                            NAME@3577..3581
+                              IDENT@3577..3581 "str_"
+                      R_PAREN@3581..3582 ")"
+              SEMI@3582..3583 ";"
+            WHITESPACE@3583..3588 "\n    "
             EXPR_VAR@3588..3591
               NAME@3588..3591
                 IDENT@3588..3591 "std"
-            DOT@3591..3592 "."
-            NAME@3592..3608
-              IDENT@3592..3608 "escapeStringJson"
-          ARGS_DESC@3608..3613
-            L_PAREN@3608..3609 "("
-            ARG@3609..3612
-              EXPR_VAR@3609..3612
-                NAME@3609..3612
-                  IDENT@3609..3612 "str"
-            R_PAREN@3612..3613 ")"
-      COMMA@3613..3614 ","
-      WHITESPACE@3614..3618 "\n\n  "
-      MEMBER_FIELD_METHOD@3618..3835
-        FIELD_NAME_FIXED@3618..3634
-          NAME@3618..3634
-            IDENT@3618..3634 "escapeStringBash"
-        PARAMS_DESC@3634..3640
-          L_PAREN@3634..3635 "("
-          PARAM@3635..3639
-            DESTRUCT_FULL@3635..3639
-              NAME@3635..3639
-                IDENT@3635..3639 "str_"
-          R_PAREN@3639..3640 ")"
-        COLONCOLON@3640..3642 "::"
-        WHITESPACE@3642..3647 "\n    "
-        STMT_LOCAL@3647..3678
-          LOCAL_KW@3647..3652 "local"
-          WHITESPACE@3652..3653 " "
-          BIND_DESTRUCT@3653..3677
-            DESTRUCT_FULL@3653..3656
-              NAME@3653..3656
-                IDENT@3653..3656 "str"
-            WHITESPACE@3656..3657 " "
-            ASSIGN@3657..3658 "="
-            WHITESPACE@3658..3659 " "
-            EXPR_APPLY@3659..3677
-              EXPR_INDEX@3659..3671
-                EXPR_VAR@3659..3662
-                  NAME@3659..3662
-                    IDENT@3659..3662 "std"
-                DOT@3662..3663 "."
-                NAME@3663..3671
-                  IDENT@3663..3671 "toString"
-              ARGS_DESC@3671..3677
-                L_PAREN@3671..3672 "("
-                ARG@3672..3676
-                  EXPR_VAR@3672..3676
-                    NAME@3672..3676
-                      IDENT@3672..3676 "str_"
-                R_PAREN@3676..3677 ")"
-          SEMI@3677..3678 ";"
-        WHITESPACE@3678..3683 "\n    "
-        STMT_LOCAL@3683..3765
-          LOCAL_KW@3683..3688 "local"
-          WHITESPACE@3688..3689 " "
-          BIND_FUNCTION@3689..3764
-            NAME@3689..3694
-              IDENT@3689..3694 "trans"
-            PARAMS_DESC@3694..3698
-              L_PAREN@3694..3695 "("
-              PARAM@3695..3697
-                DESTRUCT_FULL@3695..3697
-                  NAME@3695..3697
-                    IDENT@3695..3697 "ch"
-              R_PAREN@3697..3698 ")"
-            WHITESPACE@3698..3699 " "
-            ASSIGN@3699..3700 "="
-            WHITESPACE@3700..3707 "\n      "
-            EXPR_IF_THEN_ELSE@3707..3764
-              IF_KW@3707..3709 "if"
-              WHITESPACE@3709..3710 " "
-              EXPR_BINARY@3710..3719
-                LHS_EXPR@3710..3712
-                  EXPR_VAR@3710..3712
-                    NAME@3710..3712
-                      IDENT@3710..3712 "ch"
-                WHITESPACE@3712..3713 " "
-                EQ@3713..3715 "=="
+            SUFFIX_INDEX@3591..3596
+              DOT@3591..3592 "."
+              NAME@3592..3596
+                IDENT@3592..3596 "join"
+            SUFFIX_APPLY@3596..3663
+              ARGS_DESC@3596..3663
+                L_PAREN@3596..3597 "("
+                ARG@3597..3599
+                  EXPR@3597..3599
+                    EXPR_STRING@3597..3599
+                      STRING_SINGLE@3597..3599 "''"
+                COMMA@3599..3600 ","
+                WHITESPACE@3600..3601 " "
+                ARG@3601..3662
+                  EXPR@3601..3662
+                    EXPR_ARRAY_COMP@3601..3662
+                      L_BRACK@3601..3602 "["
+                      EXPR@3602..3630
+                        EXPR_VAR@3602..3605
+                          NAME@3602..3605
+                            IDENT@3602..3605 "std"
+                        SUFFIX_INDEX@3605..3609
+                          DOT@3605..3606 "."
+                          NAME@3606..3609
+                            IDENT@3606..3609 "get"
+                        SUFFIX_APPLY@3609..3630
+                          ARGS_DESC@3609..3630
+                            L_PAREN@3609..3610 "("
+                            ARG@3610..3621
+                              EXPR@3610..3621
+                                EXPR_VAR@3610..3621
+                                  NAME@3610..3621
+                                    IDENT@3610..3621 "xml_escapes"
+                            COMMA@3621..3622 ","
+                            WHITESPACE@3622..3623 " "
+                            ARG@3623..3625
+                              EXPR@3623..3625
+                                EXPR_VAR@3623..3625
+                                  NAME@3623..3625
+                                    IDENT@3623..3625 "ch"
+                            COMMA@3625..3626 ","
+                            WHITESPACE@3626..3627 " "
+                            ARG@3627..3629
+                              EXPR@3627..3629
+                                EXPR_VAR@3627..3629
+                                  NAME@3627..3629
+                                    IDENT@3627..3629 "ch"
+                            R_PAREN@3629..3630 ")"
+                      WHITESPACE@3630..3631 " "
+                      FOR_SPEC@3631..3661
+                        FOR_KW@3631..3634 "for"
+                        WHITESPACE@3634..3635 " "
+                        DESTRUCT_FULL@3635..3637
+                          NAME@3635..3637
+                            IDENT@3635..3637 "ch"
+                        WHITESPACE@3637..3638 " "
+                        IN_KW@3638..3640 "in"
+                        WHITESPACE@3640..3641 " "
+                        EXPR@3641..3661
+                          EXPR_VAR@3641..3644
+                            NAME@3641..3644
+                              IDENT@3641..3644 "std"
+                          SUFFIX_INDEX@3644..3656
+                            DOT@3644..3645 "."
+                            NAME@3645..3656
+                              IDENT@3645..3656 "stringChars"
+                          SUFFIX_APPLY@3656..3661
+                            ARGS_DESC@3656..3661
+                              L_PAREN@3656..3657 "("
+                              ARG@3657..3660
+                                EXPR@3657..3660
+                                  EXPR_VAR@3657..3660
+                                    NAME@3657..3660
+                                      IDENT@3657..3660 "str"
+                              R_PAREN@3660..3661 ")"
+                      R_BRACK@3661..3662 "]"
+                R_PAREN@3662..3663 ")"
+        COMMA@3663..3664 ","
+        WHITESPACE@3664..3668 "\n\n  "
+        MEMBER_FIELD_METHOD@3668..3734
+          FIELD_NAME_FIXED@3668..3680
+            NAME@3668..3680
+              IDENT@3668..3680 "manifestJson"
+          PARAMS_DESC@3680..3687
+            L_PAREN@3680..3681 "("
+            PARAM@3681..3686
+              DESTRUCT_FULL@3681..3686
+                NAME@3681..3686
+                  IDENT@3681..3686 "value"
+            R_PAREN@3686..3687 ")"
+          COLONCOLON@3687..3689 "::"
+          WHITESPACE@3689..3690 " "
+          EXPR@3690..3734
+            EXPR_VAR@3690..3693
+              NAME@3690..3693
+                IDENT@3690..3693 "std"
+            SUFFIX_INDEX@3693..3708
+              DOT@3693..3694 "."
+              NAME@3694..3708
+                IDENT@3694..3708 "manifestJsonEx"
+            SUFFIX_APPLY@3708..3734
+              ARGS_DESC@3708..3734
+                L_PAREN@3708..3709 "("
+                ARG@3709..3714
+                  EXPR@3709..3714
+                    EXPR_VAR@3709..3714
+                      NAME@3709..3714
+                        IDENT@3709..3714 "value"
+                COMMA@3714..3715 ","
                 WHITESPACE@3715..3716 " "
-                EXPR_STRING@3716..3719
-                  STRING_DOUBLE@3716..3719 "\"'\""
-              WHITESPACE@3719..3720 " "
-              THEN_KW@3720..3724 "then"
-              WHITESPACE@3724..3733 "\n        "
-              TRUE_EXPR@3733..3742
-                EXPR_STRING@3733..3742
-                  STRING_DOUBLE@3733..3742 "\"'\\\"'\\\"'\""
-              WHITESPACE@3742..3749 "\n      "
-              ELSE_KW@3749..3753 "else"
-              WHITESPACE@3753..3762 "\n        "
-              FALSE_EXPR@3762..3764
-                EXPR_VAR@3762..3764
-                  NAME@3762..3764
-                    IDENT@3762..3764 "ch"
-          SEMI@3764..3765 ";"
-        WHITESPACE@3765..3770 "\n    "
-        EXPR_BINARY@3770..3835
-          LHS_EXPR@3770..3776
-            EXPR_STRING@3770..3776
-              STRING_DOUBLE@3770..3776 "\"'%s'\""
-          WHITESPACE@3776..3777 " "
-          MODULO@3777..3778 "%"
-          WHITESPACE@3778..3779 " "
-          EXPR_APPLY@3779..3835
-            EXPR_INDEX@3779..3787
-              EXPR_VAR@3779..3782
-                NAME@3779..3782
-                  IDENT@3779..3782 "std"
-              DOT@3782..3783 "."
-              NAME@3783..3787
-                IDENT@3783..3787 "join"
-            ARGS_DESC@3787..3835
-              L_PAREN@3787..3788 "("
-              ARG@3788..3790
-                EXPR_STRING@3788..3790
-                  STRING_SINGLE@3788..3790 "''"
-              COMMA@3790..3791 ","
-              WHITESPACE@3791..3792 " "
-              ARG@3792..3834
-                EXPR_ARRAY_COMP@3792..3834
-                  L_BRACK@3792..3793 "["
-                  EXPR_APPLY@3793..3802
-                    EXPR_VAR@3793..3798
-                      NAME@3793..3798
-                        IDENT@3793..3798 "trans"
-                    ARGS_DESC@3798..3802
-                      L_PAREN@3798..3799 "("
-                      ARG@3799..3801
-                        EXPR_VAR@3799..3801
-                          NAME@3799..3801
-                            IDENT@3799..3801 "ch"
-                      R_PAREN@3801..3802 ")"
-                  WHITESPACE@3802..3803 " "
-                  FOR_SPEC@3803..3833
-                    FOR_KW@3803..3806 "for"
-                    WHITESPACE@3806..3807 " "
-                    NAME@3807..3809
-                      IDENT@3807..3809 "ch"
-                    WHITESPACE@3809..3810 " "
-                    IN_KW@3810..3812 "in"
-                    WHITESPACE@3812..3813 " "
-                    EXPR_APPLY@3813..3833
-                      EXPR_INDEX@3813..3828
-                        EXPR_VAR@3813..3816
-                          NAME@3813..3816
-                            IDENT@3813..3816 "std"
-                        DOT@3816..3817 "."
-                        NAME@3817..3828
-                          IDENT@3817..3828 "stringChars"
-                      ARGS_DESC@3828..3833
-                        L_PAREN@3828..3829 "("
-                        ARG@3829..3832
-                          EXPR_VAR@3829..3832
-                            NAME@3829..3832
-                              IDENT@3829..3832 "str"
-                        R_PAREN@3832..3833 ")"
-                  R_BRACK@3833..3834 "]"
-              R_PAREN@3834..3835 ")"
-      COMMA@3835..3836 ","
-      WHITESPACE@3836..3840 "\n\n  "
-      MEMBER_FIELD_METHOD@3840..4054
-        FIELD_NAME_FIXED@3840..3859
-          NAME@3840..3859
-            IDENT@3840..3859 "escapeStringDollars"
-        PARAMS_DESC@3859..3865
-          L_PAREN@3859..3860 "("
-          PARAM@3860..3864
-            DESTRUCT_FULL@3860..3864
-              NAME@3860..3864
-                IDENT@3860..3864 "str_"
-          R_PAREN@3864..3865 ")"
-        COLONCOLON@3865..3867 "::"
-        WHITESPACE@3867..3872 "\n    "
-        STMT_LOCAL@3872..3903
-          LOCAL_KW@3872..3877 "local"
-          WHITESPACE@3877..3878 " "
-          BIND_DESTRUCT@3878..3902
-            DESTRUCT_FULL@3878..3881
-              NAME@3878..3881
-                IDENT@3878..3881 "str"
-            WHITESPACE@3881..3882 " "
-            ASSIGN@3882..3883 "="
-            WHITESPACE@3883..3884 " "
-            EXPR_APPLY@3884..3902
-              EXPR_INDEX@3884..3896
-                EXPR_VAR@3884..3887
-                  NAME@3884..3887
-                    IDENT@3884..3887 "std"
-                DOT@3887..3888 "."
-                NAME@3888..3896
-                  IDENT@3888..3896 "toString"
-              ARGS_DESC@3896..3902
-                L_PAREN@3896..3897 "("
-                ARG@3897..3901
-                  EXPR_VAR@3897..3901
-                    NAME@3897..3901
-                      IDENT@3897..3901 "str_"
-                R_PAREN@3901..3902 ")"
-          SEMI@3902..3903 ";"
-        WHITESPACE@3903..3908 "\n    "
-        STMT_LOCAL@3908..3985
-          LOCAL_KW@3908..3913 "local"
-          WHITESPACE@3913..3914 " "
-          BIND_FUNCTION@3914..3984
-            NAME@3914..3919
-              IDENT@3914..3919 "trans"
-            PARAMS_DESC@3919..3923
-              L_PAREN@3919..3920 "("
-              PARAM@3920..3922
-                DESTRUCT_FULL@3920..3922
-                  NAME@3920..3922
-                    IDENT@3920..3922 "ch"
-              R_PAREN@3922..3923 ")"
-            WHITESPACE@3923..3924 " "
-            ASSIGN@3924..3925 "="
-            WHITESPACE@3925..3932 "\n      "
-            EXPR_IF_THEN_ELSE@3932..3984
-              IF_KW@3932..3934 "if"
+                ARG@3716..3722
+                  EXPR@3716..3722
+                    EXPR_STRING@3716..3722
+                      STRING_SINGLE@3716..3722 "'    '"
+                R_PAREN@3722..3723 ")"
+                WHITESPACE@3723..3724 " "
+                TAILSTRICT_KW@3724..3734 "tailstrict"
+        COMMA@3734..3735 ","
+        WHITESPACE@3735..3739 "\n\n  "
+        MEMBER_FIELD_METHOD@3739..3807
+          FIELD_NAME_FIXED@3739..3759
+            NAME@3739..3759
+              IDENT@3739..3759 "manifestJsonMinified"
+          PARAMS_DESC@3759..3766
+            L_PAREN@3759..3760 "("
+            PARAM@3760..3765
+              DESTRUCT_FULL@3760..3765
+                NAME@3760..3765
+                  IDENT@3760..3765 "value"
+            R_PAREN@3765..3766 ")"
+          COLONCOLON@3766..3768 "::"
+          WHITESPACE@3768..3769 " "
+          EXPR@3769..3807
+            EXPR_VAR@3769..3772
+              NAME@3769..3772
+                IDENT@3769..3772 "std"
+            SUFFIX_INDEX@3772..3787
+              DOT@3772..3773 "."
+              NAME@3773..3787
+                IDENT@3773..3787 "manifestJsonEx"
+            SUFFIX_APPLY@3787..3807
+              ARGS_DESC@3787..3807
+                L_PAREN@3787..3788 "("
+                ARG@3788..3793
+                  EXPR@3788..3793
+                    EXPR_VAR@3788..3793
+                      NAME@3788..3793
+                        IDENT@3788..3793 "value"
+                COMMA@3793..3794 ","
+                WHITESPACE@3794..3795 " "
+                ARG@3795..3797
+                  EXPR@3795..3797
+                    EXPR_STRING@3795..3797
+                      STRING_SINGLE@3795..3797 "''"
+                COMMA@3797..3798 ","
+                WHITESPACE@3798..3799 " "
+                ARG@3799..3801
+                  EXPR@3799..3801
+                    EXPR_STRING@3799..3801
+                      STRING_SINGLE@3799..3801 "''"
+                COMMA@3801..3802 ","
+                WHITESPACE@3802..3803 " "
+                ARG@3803..3806
+                  EXPR@3803..3806
+                    EXPR_STRING@3803..3806
+                      STRING_SINGLE@3803..3806 "':'"
+                R_PAREN@3806..3807 ")"
+        COMMA@3807..3808 ","
+        WHITESPACE@3808..3812 "\n\n  "
+        MEMBER_FIELD_METHOD@3812..4197
+          FIELD_NAME_FIXED@3812..3830
+            NAME@3812..3830
+              IDENT@3812..3830 "manifestYamlStream"
+          PARAMS_DESC@3830..3905
+            L_PAREN@3830..3831 "("
+            PARAM@3831..3836
+              DESTRUCT_FULL@3831..3836
+                NAME@3831..3836
+                  IDENT@3831..3836 "value"
+            COMMA@3836..3837 ","
+            WHITESPACE@3837..3838 " "
+            PARAM@3838..3866
+              DESTRUCT_FULL@3838..3860
+                NAME@3838..3860
+                  IDENT@3838..3860 "indent_array_in_object"
+              ASSIGN@3860..3861 "="
+              EXPR@3861..3866
+                EXPR_LITERAL@3861..3866
+                  FALSE_KW@3861..3866 "false"
+            COMMA@3866..3867 ","
+            WHITESPACE@3867..3868 " "
+            PARAM@3868..3887
+              DESTRUCT_FULL@3868..3882
+                NAME@3868..3882
+                  IDENT@3868..3882 "c_document_end"
+              ASSIGN@3882..3883 "="
+              EXPR@3883..3887
+                EXPR_LITERAL@3883..3887
+                  TRUE_KW@3883..3887 "true"
+            COMMA@3887..3888 ","
+            WHITESPACE@3888..3889 " "
+            PARAM@3889..3904
+              DESTRUCT_FULL@3889..3899
+                NAME@3889..3899
+                  IDENT@3889..3899 "quote_keys"
+              ASSIGN@3899..3900 "="
+              EXPR@3900..3904
+                EXPR_LITERAL@3900..3904
+                  TRUE_KW@3900..3904 "true"
+            R_PAREN@3904..3905 ")"
+          COLONCOLON@3905..3907 "::"
+          WHITESPACE@3907..3912 "\n    "
+          EXPR@3912..4197
+            EXPR_IF_THEN_ELSE@3912..4197
+              IF_KW@3912..3914 "if"
+              WHITESPACE@3914..3915 " "
+              EXPR@3915..3934
+                EXPR_UNARY@3915..3934
+                  NOT@3915..3916 "!"
+                  EXPR_VAR@3916..3919
+                    NAME@3916..3919
+                      IDENT@3916..3919 "std"
+                  SUFFIX_INDEX@3919..3927
+                    DOT@3919..3920 "."
+                    NAME@3920..3927
+                      IDENT@3920..3927 "isArray"
+                  SUFFIX_APPLY@3927..3934
+                    ARGS_DESC@3927..3934
+                      L_PAREN@3927..3928 "("
+                      ARG@3928..3933
+                        EXPR@3928..3933
+                          EXPR_VAR@3928..3933
+                            NAME@3928..3933
+                              IDENT@3928..3933 "value"
+                      R_PAREN@3933..3934 ")"
               WHITESPACE@3934..3935 " "
-              EXPR_BINARY@3935..3944
-                LHS_EXPR@3935..3937
-                  EXPR_VAR@3935..3937
-                    NAME@3935..3937
-                      IDENT@3935..3937 "ch"
-                WHITESPACE@3937..3938 " "
-                EQ@3938..3940 "=="
-                WHITESPACE@3940..3941 " "
-                EXPR_STRING@3941..3944
-                  STRING_SINGLE@3941..3944 "'$'"
-              WHITESPACE@3944..3945 " "
-              THEN_KW@3945..3949 "then"
-              WHITESPACE@3949..3958 "\n        "
-              TRUE_EXPR@3958..3962
-                EXPR_STRING@3958..3962
-                  STRING_SINGLE@3958..3962 "'$$'"
-              WHITESPACE@3962..3969 "\n      "
-              ELSE_KW@3969..3973 "else"
-              WHITESPACE@3973..3982 "\n        "
-              FALSE_EXPR@3982..3984
-                EXPR_VAR@3982..3984
-                  NAME@3982..3984
-                    IDENT@3982..3984 "ch"
-          SEMI@3984..3985 ";"
-        WHITESPACE@3985..3990 "\n    "
-        EXPR_APPLY@3990..4054
-          EXPR_INDEX@3990..3999
-            EXPR_VAR@3990..3993
-              NAME@3990..3993
-                IDENT@3990..3993 "std"
-            DOT@3993..3994 "."
-            NAME@3994..3999
-              IDENT@3994..3999 "foldl"
-          ARGS_DESC@3999..4054
-            L_PAREN@3999..4000 "("
-            ARG@4000..4027
-              EXPR_FUNCTION@4000..4027
-                FUNCTION_KW@4000..4008 "function"
-                PARAMS_DESC@4008..4014
-                  L_PAREN@4008..4009 "("
-                  PARAM@4009..4010
-                    DESTRUCT_FULL@4009..4010
-                      NAME@4009..4010
-                        IDENT@4009..4010 "a"
-                  COMMA@4010..4011 ","
-                  WHITESPACE@4011..4012 " "
-                  PARAM@4012..4013
-                    DESTRUCT_FULL@4012..4013
-                      NAME@4012..4013
-                        IDENT@4012..4013 "b"
-                  R_PAREN@4013..4014 ")"
-                WHITESPACE@4014..4015 " "
-                EXPR_BINARY@4015..4027
-                  LHS_EXPR@4015..4016
-                    EXPR_VAR@4015..4016
-                      NAME@4015..4016
-                        IDENT@4015..4016 "a"
-                  WHITESPACE@4016..4017 " "
-                  PLUS@4017..4018 "+"
-                  WHITESPACE@4018..4019 " "
-                  EXPR_APPLY@4019..4027
-                    EXPR_VAR@4019..4024
-                      NAME@4019..4024
-                        IDENT@4019..4024 "trans"
-                    ARGS_DESC@4024..4027
-                      L_PAREN@4024..4025 "("
-                      ARG@4025..4026
-                        EXPR_VAR@4025..4026
-                          NAME@4025..4026
-                            IDENT@4025..4026 "b"
-                      R_PAREN@4026..4027 ")"
-            COMMA@4027..4028 ","
-            WHITESPACE@4028..4029 " "
-            ARG@4029..4049
-              EXPR_APPLY@4029..4049
-                EXPR_INDEX@4029..4044
-                  EXPR_VAR@4029..4032
-                    NAME@4029..4032
-                      IDENT@4029..4032 "std"
-                  DOT@4032..4033 "."
-                  NAME@4033..4044
-                    IDENT@4033..4044 "stringChars"
-                ARGS_DESC@4044..4049
-                  L_PAREN@4044..4045 "("
-                  ARG@4045..4048
-                    EXPR_VAR@4045..4048
-                      NAME@4045..4048
-                        IDENT@4045..4048 "str"
-                  R_PAREN@4048..4049 ")"
-            COMMA@4049..4050 ","
-            WHITESPACE@4050..4051 " "
-            ARG@4051..4053
-              EXPR_STRING@4051..4053
-                STRING_SINGLE@4051..4053 "''"
-            R_PAREN@4053..4054 ")"
-      COMMA@4054..4055 ","
-      WHITESPACE@4055..4059 "\n\n  "
-      MEMBER_BIND_STMT@4059..4174
-        OBJ_LOCAL@4059..4174
-          LOCAL_KW@4059..4064 "local"
-          WHITESPACE@4064..4065 " "
-          BIND_DESTRUCT@4065..4174
-            DESTRUCT_FULL@4065..4076
-              NAME@4065..4076
-                IDENT@4065..4076 "xml_escapes"
-            WHITESPACE@4076..4077 " "
-            ASSIGN@4077..4078 "="
-            WHITESPACE@4078..4079 " "
-            EXPR_OBJECT@4079..4174
-              OBJ_BODY_MEMBER_LIST@4079..4174
-                L_BRACE@4079..4080 "{"
-                WHITESPACE@4080..4085 "\n    "
-                MEMBER_FIELD_NORMAL@4085..4096
-                  FIELD_NAME_FIXED@4085..4088
-                    STRING_SINGLE@4085..4088 "'<'"
-                  COLON@4088..4089 ":"
-                  WHITESPACE@4089..4090 " "
-                  EXPR_STRING@4090..4096
-                    STRING_SINGLE@4090..4096 "'&lt;'"
-                COMMA@4096..4097 ","
-                WHITESPACE@4097..4102 "\n    "
-                MEMBER_FIELD_NORMAL@4102..4113
-                  FIELD_NAME_FIXED@4102..4105
-                    STRING_SINGLE@4102..4105 "'>'"
-                  COLON@4105..4106 ":"
-                  WHITESPACE@4106..4107 " "
-                  EXPR_STRING@4107..4113
-                    STRING_SINGLE@4107..4113 "'&gt;'"
-                COMMA@4113..4114 ","
-                WHITESPACE@4114..4119 "\n    "
-                MEMBER_FIELD_NORMAL@4119..4131
-                  FIELD_NAME_FIXED@4119..4122
-                    STRING_SINGLE@4119..4122 "'&'"
-                  COLON@4122..4123 ":"
-                  WHITESPACE@4123..4124 " "
-                  EXPR_STRING@4124..4131
-                    STRING_SINGLE@4124..4131 "'&amp;'"
-                COMMA@4131..4132 ","
-                WHITESPACE@4132..4137 "\n    "
-                MEMBER_FIELD_NORMAL@4137..4150
-                  FIELD_NAME_FIXED@4137..4140
-                    STRING_SINGLE@4137..4140 "'\"'"
-                  COLON@4140..4141 ":"
-                  WHITESPACE@4141..4142 " "
-                  EXPR_STRING@4142..4150
-                    STRING_SINGLE@4142..4150 "'&quot;'"
-                COMMA@4150..4151 ","
-                WHITESPACE@4151..4156 "\n    "
-                MEMBER_FIELD_NORMAL@4156..4169
-                  FIELD_NAME_FIXED@4156..4159
-                    STRING_DOUBLE@4156..4159 "\"'\""
-                  COLON@4159..4160 ":"
-                  WHITESPACE@4160..4161 " "
-                  EXPR_STRING@4161..4169
-                    STRING_SINGLE@4161..4169 "'&apos;'"
-                COMMA@4169..4170 ","
-                WHITESPACE@4170..4173 "\n  "
-                R_BRACE@4173..4174 "}"
-      COMMA@4174..4175 ","
-      WHITESPACE@4175..4179 "\n\n  "
-      MEMBER_FIELD_METHOD@4179..4318
-        FIELD_NAME_FIXED@4179..4194
-          NAME@4179..4194
-            IDENT@4179..4194 "escapeStringXML"
-        PARAMS_DESC@4194..4200
-          L_PAREN@4194..4195 "("
-          PARAM@4195..4199
-            DESTRUCT_FULL@4195..4199
-              NAME@4195..4199
-                IDENT@4195..4199 "str_"
-          R_PAREN@4199..4200 ")"
-        COLONCOLON@4200..4202 "::"
-        WHITESPACE@4202..4207 "\n    "
-        STMT_LOCAL@4207..4238
-          LOCAL_KW@4207..4212 "local"
-          WHITESPACE@4212..4213 " "
-          BIND_DESTRUCT@4213..4237
-            DESTRUCT_FULL@4213..4216
-              NAME@4213..4216
-                IDENT@4213..4216 "str"
-            WHITESPACE@4216..4217 " "
-            ASSIGN@4217..4218 "="
-            WHITESPACE@4218..4219 " "
-            EXPR_APPLY@4219..4237
-              EXPR_INDEX@4219..4231
-                EXPR_VAR@4219..4222
-                  NAME@4219..4222
-                    IDENT@4219..4222 "std"
-                DOT@4222..4223 "."
-                NAME@4223..4231
-                  IDENT@4223..4231 "toString"
-              ARGS_DESC@4231..4237
-                L_PAREN@4231..4232 "("
-                ARG@4232..4236
-                  EXPR_VAR@4232..4236
-                    NAME@4232..4236
-                      IDENT@4232..4236 "str_"
-                R_PAREN@4236..4237 ")"
-          SEMI@4237..4238 ";"
-        WHITESPACE@4238..4243 "\n    "
-        EXPR_APPLY@4243..4318
-          EXPR_INDEX@4243..4251
-            EXPR_VAR@4243..4246
-              NAME@4243..4246
-                IDENT@4243..4246 "std"
-            DOT@4246..4247 "."
-            NAME@4247..4251
-              IDENT@4247..4251 "join"
-          ARGS_DESC@4251..4318
-            L_PAREN@4251..4252 "("
-            ARG@4252..4254
-              EXPR_STRING@4252..4254
-                STRING_SINGLE@4252..4254 "''"
-            COMMA@4254..4255 ","
-            WHITESPACE@4255..4256 " "
-            ARG@4256..4317
-              EXPR_ARRAY_COMP@4256..4317
-                L_BRACK@4256..4257 "["
-                EXPR_APPLY@4257..4285
-                  EXPR_INDEX@4257..4264
-                    EXPR_VAR@4257..4260
-                      NAME@4257..4260
-                        IDENT@4257..4260 "std"
-                    DOT@4260..4261 "."
-                    NAME@4261..4264
-                      IDENT@4261..4264 "get"
-                  ARGS_DESC@4264..4285
-                    L_PAREN@4264..4265 "("
-                    ARG@4265..4276
-                      EXPR_VAR@4265..4276
-                        NAME@4265..4276
-                          IDENT@4265..4276 "xml_escapes"
-                    COMMA@4276..4277 ","
-                    WHITESPACE@4277..4278 " "
-                    ARG@4278..4280
-                      EXPR_VAR@4278..4280
-                        NAME@4278..4280
-                          IDENT@4278..4280 "ch"
-                    COMMA@4280..4281 ","
-                    WHITESPACE@4281..4282 " "
-                    ARG@4282..4284
-                      EXPR_VAR@4282..4284
-                        NAME@4282..4284
-                          IDENT@4282..4284 "ch"
-                    R_PAREN@4284..4285 ")"
-                WHITESPACE@4285..4286 " "
-                FOR_SPEC@4286..4316
-                  FOR_KW@4286..4289 "for"
-                  WHITESPACE@4289..4290 " "
-                  NAME@4290..4292
-                    IDENT@4290..4292 "ch"
-                  WHITESPACE@4292..4293 " "
-                  IN_KW@4293..4295 "in"
-                  WHITESPACE@4295..4296 " "
-                  EXPR_APPLY@4296..4316
-                    EXPR_INDEX@4296..4311
-                      EXPR_VAR@4296..4299
-                        NAME@4296..4299
-                          IDENT@4296..4299 "std"
-                      DOT@4299..4300 "."
-                      NAME@4300..4311
-                        IDENT@4300..4311 "stringChars"
-                    ARGS_DESC@4311..4316
-                      L_PAREN@4311..4312 "("
-                      ARG@4312..4315
-                        EXPR_VAR@4312..4315
-                          NAME@4312..4315
-                            IDENT@4312..4315 "str"
-                      R_PAREN@4315..4316 ")"
-                R_BRACK@4316..4317 "]"
-            R_PAREN@4317..4318 ")"
-      COMMA@4318..4319 ","
-      WHITESPACE@4319..4323 "\n\n  "
-      MEMBER_FIELD_METHOD@4323..4389
-        FIELD_NAME_FIXED@4323..4335
-          NAME@4323..4335
-            IDENT@4323..4335 "manifestJson"
-        PARAMS_DESC@4335..4342
-          L_PAREN@4335..4336 "("
-          PARAM@4336..4341
-            DESTRUCT_FULL@4336..4341
-              NAME@4336..4341
-                IDENT@4336..4341 "value"
-          R_PAREN@4341..4342 ")"
-        COLONCOLON@4342..4344 "::"
-        WHITESPACE@4344..4345 " "
-        EXPR_APPLY@4345..4389
-          EXPR_INDEX@4345..4363
-            EXPR_VAR@4345..4348
-              NAME@4345..4348
-                IDENT@4345..4348 "std"
-            DOT@4348..4349 "."
-            NAME@4349..4363
-              IDENT@4349..4363 "manifestJsonEx"
-          ARGS_DESC@4363..4389
-            L_PAREN@4363..4364 "("
-            ARG@4364..4369
-              EXPR_VAR@4364..4369
-                NAME@4364..4369
-                  IDENT@4364..4369 "value"
-            COMMA@4369..4370 ","
-            WHITESPACE@4370..4371 " "
-            ARG@4371..4377
-              EXPR_STRING@4371..4377
-                STRING_SINGLE@4371..4377 "'    '"
-            R_PAREN@4377..4378 ")"
-            WHITESPACE@4378..4379 " "
-            TAILSTRICT_KW@4379..4389 "tailstrict"
-      COMMA@4389..4390 ","
-      WHITESPACE@4390..4394 "\n\n  "
-      MEMBER_FIELD_METHOD@4394..4462
-        FIELD_NAME_FIXED@4394..4414
-          NAME@4394..4414
-            IDENT@4394..4414 "manifestJsonMinified"
-        PARAMS_DESC@4414..4421
-          L_PAREN@4414..4415 "("
-          PARAM@4415..4420
-            DESTRUCT_FULL@4415..4420
-              NAME@4415..4420
-                IDENT@4415..4420 "value"
-          R_PAREN@4420..4421 ")"
-        COLONCOLON@4421..4423 "::"
-        WHITESPACE@4423..4424 " "
-        EXPR_APPLY@4424..4462
-          EXPR_INDEX@4424..4442
-            EXPR_VAR@4424..4427
-              NAME@4424..4427
-                IDENT@4424..4427 "std"
-            DOT@4427..4428 "."
-            NAME@4428..4442
-              IDENT@4428..4442 "manifestJsonEx"
-          ARGS_DESC@4442..4462
-            L_PAREN@4442..4443 "("
-            ARG@4443..4448
-              EXPR_VAR@4443..4448
-                NAME@4443..4448
-                  IDENT@4443..4448 "value"
-            COMMA@4448..4449 ","
-            WHITESPACE@4449..4450 " "
-            ARG@4450..4452
-              EXPR_STRING@4450..4452
-                STRING_SINGLE@4450..4452 "''"
-            COMMA@4452..4453 ","
-            WHITESPACE@4453..4454 " "
-            ARG@4454..4456
-              EXPR_STRING@4454..4456
-                STRING_SINGLE@4454..4456 "''"
-            COMMA@4456..4457 ","
-            WHITESPACE@4457..4458 " "
-            ARG@4458..4461
-              EXPR_STRING@4458..4461
-                STRING_SINGLE@4458..4461 "':'"
-            R_PAREN@4461..4462 ")"
-      COMMA@4462..4463 ","
-      WHITESPACE@4463..4467 "\n\n  "
-      MEMBER_FIELD_METHOD@4467..4852
-        FIELD_NAME_FIXED@4467..4485
-          NAME@4467..4485
-            IDENT@4467..4485 "manifestYamlStream"
-        PARAMS_DESC@4485..4560
-          L_PAREN@4485..4486 "("
-          PARAM@4486..4491
-            DESTRUCT_FULL@4486..4491
-              NAME@4486..4491
-                IDENT@4486..4491 "value"
-          COMMA@4491..4492 ","
-          WHITESPACE@4492..4493 " "
-          PARAM@4493..4521
-            DESTRUCT_FULL@4493..4515
-              NAME@4493..4515
-                IDENT@4493..4515 "indent_array_in_object"
-            ASSIGN@4515..4516 "="
-            EXPR_LITERAL@4516..4521
-              FALSE_KW@4516..4521 "false"
-          COMMA@4521..4522 ","
-          WHITESPACE@4522..4523 " "
-          PARAM@4523..4542
-            DESTRUCT_FULL@4523..4537
-              NAME@4523..4537
-                IDENT@4523..4537 "c_document_end"
-            ASSIGN@4537..4538 "="
-            EXPR_LITERAL@4538..4542
-              TRUE_KW@4538..4542 "true"
-          COMMA@4542..4543 ","
-          WHITESPACE@4543..4544 " "
-          PARAM@4544..4559
-            DESTRUCT_FULL@4544..4554
-              NAME@4544..4554
-                IDENT@4544..4554 "quote_keys"
-            ASSIGN@4554..4555 "="
-            EXPR_LITERAL@4555..4559
-              TRUE_KW@4555..4559 "true"
-          R_PAREN@4559..4560 ")"
-        COLONCOLON@4560..4562 "::"
-        WHITESPACE@4562..4567 "\n    "
-        EXPR_IF_THEN_ELSE@4567..4852
-          IF_KW@4567..4569 "if"
-          WHITESPACE@4569..4570 " "
-          EXPR_UNARY@4570..4589
-            NOT@4570..4571 "!"
-            EXPR_APPLY@4571..4589
-              EXPR_INDEX@4571..4582
-                EXPR_VAR@4571..4574
-                  NAME@4571..4574
-                    IDENT@4571..4574 "std"
-                DOT@4574..4575 "."
-                NAME@4575..4582
-                  IDENT@4575..4582 "isArray"
-              ARGS_DESC@4582..4589
-                L_PAREN@4582..4583 "("
-                ARG@4583..4588
-                  EXPR_VAR@4583..4588
-                    NAME@4583..4588
-                      IDENT@4583..4588 "value"
-                R_PAREN@4588..4589 ")"
-          WHITESPACE@4589..4590 " "
-          THEN_KW@4590..4594 "then"
-          WHITESPACE@4594..4601 "\n      "
-          TRUE_EXPR@4601..4669
-            EXPR_ERROR@4601..4669
-              ERROR_KW@4601..4606 "error"
-              WHITESPACE@4606..4607 " "
-              EXPR_BINARY@4607..4669
-                LHS_EXPR@4607..4651
-                  EXPR_STRING@4607..4651
-                    STRING_SINGLE@4607..4651 "'manifestYamlStream o ..."
-                WHITESPACE@4651..4652 " "
-                PLUS@4652..4653 "+"
-                WHITESPACE@4653..4654 " "
-                EXPR_APPLY@4654..4669
-                  EXPR_INDEX@4654..4662
-                    EXPR_VAR@4654..4657
-                      NAME@4654..4657
-                        IDENT@4654..4657 "std"
-                    DOT@4657..4658 "."
-                    NAME@4658..4662
-                      IDENT@4658..4662 "type"
-                  ARGS_DESC@4662..4669
-                    L_PAREN@4662..4663 "("
-                    ARG@4663..4668
-                      EXPR_VAR@4663..4668
-                        NAME@4663..4668
-                          IDENT@4663..4668 "value"
-                    R_PAREN@4668..4669 ")"
-          WHITESPACE@4669..4674 "\n    "
-          ELSE_KW@4674..4678 "else"
-          WHITESPACE@4678..4685 "\n      "
-          FALSE_EXPR@4685..4852
-            EXPR_BINARY@4685..4852
-              LHS_EXPR@4685..4807
-                EXPR_BINARY@4685..4807
-                  LHS_EXPR@4685..4692
-                    EXPR_STRING@4685..4692
-                      STRING_SINGLE@4685..4692 "'---\\n'"
-                  WHITESPACE@4692..4693 " "
-                  PLUS@4693..4694 "+"
-                  WHITESPACE@4694..4695 " "
-                  EXPR_APPLY@4695..4807
-                    EXPR_INDEX@4695..4703
-                      EXPR_VAR@4695..4698
-                        NAME@4695..4698
-                          IDENT@4695..4698 "std"
-                      DOT@4698..4699 "."
-                      NAME@4699..4703
-                        IDENT@4699..4703 "join"
-                    ARGS_DESC@4703..4807
-                      L_PAREN@4703..4704 "("
-                      WHITESPACE@4704..4713 "\n        "
-                      ARG@4713..4722
-                        EXPR_STRING@4713..4722
-                          STRING_SINGLE@4713..4722 "'\\n---\\n'"
-                      COMMA@4722..4723 ","
-                      WHITESPACE@4723..4724 " "
-                      ARG@4724..4799
-                        EXPR_ARRAY_COMP@4724..4799
-                          L_BRACK@4724..4725 "["
-                          EXPR_APPLY@4725..4783
-                            EXPR_INDEX@4725..4744
-                              EXPR_VAR@4725..4728
-                                NAME@4725..4728
-                                  IDENT@4725..4728 "std"
-                              DOT@4728..4729 "."
-                              NAME@4729..4744
-                                IDENT@4729..4744 "manifestYamlDoc"
-                            ARGS_DESC@4744..4783
-                              L_PAREN@4744..4745 "("
-                              ARG@4745..4746
-                                EXPR_VAR@4745..4746
-                                  NAME@4745..4746
-                                    IDENT@4745..4746 "e"
-                              COMMA@4746..4747 ","
-                              WHITESPACE@4747..4748 " "
-                              ARG@4748..4770
-                                EXPR_VAR@4748..4770
-                                  NAME@4748..4770
-                                    IDENT@4748..4770 "indent_array_in_object"
-                              COMMA@4770..4771 ","
-                              WHITESPACE@4771..4772 " "
-                              ARG@4772..4782
-                                EXPR_VAR@4772..4782
-                                  NAME@4772..4782
-                                    IDENT@4772..4782 "quote_keys"
-                              R_PAREN@4782..4783 ")"
-                          WHITESPACE@4783..4784 " "
-                          FOR_SPEC@4784..4798
-                            FOR_KW@4784..4787 "for"
-                            WHITESPACE@4787..4788 " "
-                            NAME@4788..4789
-                              IDENT@4788..4789 "e"
-                            WHITESPACE@4789..4790 " "
-                            IN_KW@4790..4792 "in"
-                            WHITESPACE@4792..4793 " "
-                            EXPR_VAR@4793..4798
-                              NAME@4793..4798
-                                IDENT@4793..4798 "value"
-                          R_BRACK@4798..4799 "]"
-                      WHITESPACE@4799..4806 "\n      "
-                      R_PAREN@4806..4807 ")"
-              WHITESPACE@4807..4808 " "
-              PLUS@4808..4809 "+"
-              WHITESPACE@4809..4810 " "
-              EXPR_IF_THEN_ELSE@4810..4852
-                IF_KW@4810..4812 "if"
-                WHITESPACE@4812..4813 " "
-                EXPR_VAR@4813..4827
-                  NAME@4813..4827
-                    IDENT@4813..4827 "c_document_end"
-                WHITESPACE@4827..4828 " "
-                THEN_KW@4828..4832 "then"
-                WHITESPACE@4832..4833 " "
-                TRUE_EXPR@4833..4842
-                  EXPR_STRING@4833..4842
-                    STRING_SINGLE@4833..4842 "'\\n...\\n'"
-                WHITESPACE@4842..4843 " "
-                ELSE_KW@4843..4847 "else"
-                WHITESPACE@4847..4848 " "
-                FALSE_EXPR@4848..4852
-                  EXPR_STRING@4848..4852
-                    STRING_SINGLE@4848..4852 "'\\n'"
-      COMMA@4852..4853 ","
-      WHITESPACE@4853..4857 "\n\n  "
-      MEMBER_FIELD_METHOD@4857..5513
-        FIELD_NAME_FIXED@4857..4871
-          NAME@4857..4871
-            IDENT@4857..4871 "manifestPython"
-        PARAMS_DESC@4871..4874
-          L_PAREN@4871..4872 "("
-          PARAM@4872..4873
-            DESTRUCT_FULL@4872..4873
-              NAME@4872..4873
-                IDENT@4872..4873 "v"
-          R_PAREN@4873..4874 ")"
-        COLONCOLON@4874..4876 "::"
-        WHITESPACE@4876..4881 "\n    "
-        EXPR_IF_THEN_ELSE@4881..5513
-          IF_KW@4881..4883 "if"
-          WHITESPACE@4883..4884 " "
-          EXPR_APPLY@4884..4899
-            EXPR_INDEX@4884..4896
-              EXPR_VAR@4884..4887
-                NAME@4884..4887
-                  IDENT@4884..4887 "std"
-              DOT@4887..4888 "."
-              NAME@4888..4896
-                IDENT@4888..4896 "isObject"
-            ARGS_DESC@4896..4899
-              L_PAREN@4896..4897 "("
-              ARG@4897..4898
-                EXPR_VAR@4897..4898
-                  NAME@4897..4898
-                    IDENT@4897..4898 "v"
-              R_PAREN@4898..4899 ")"
-          WHITESPACE@4899..4900 " "
-          THEN_KW@4900..4904 "then"
-          WHITESPACE@4904..4911 "\n      "
-          STMT_LOCAL@4911..5046
-            LOCAL_KW@4911..4916 "local"
-            WHITESPACE@4916..4917 " "
-            BIND_DESTRUCT@4917..5045
-              DESTRUCT_FULL@4917..4923
-                NAME@4917..4923
-                  IDENT@4917..4923 "fields"
-              WHITESPACE@4923..4924 " "
-              ASSIGN@4924..4925 "="
-              WHITESPACE@4925..4926 " "
-              EXPR_ARRAY_COMP@4926..5045
-                L_BRACK@4926..4927 "["
-                WHITESPACE@4927..4936 "\n        "
-                EXPR_BINARY@4936..5000
-                  LHS_EXPR@4936..4944
-                    EXPR_STRING@4936..4944
-                      STRING_SINGLE@4936..4944 "'%s: %s'"
-                  WHITESPACE@4944..4945 " "
-                  MODULO@4945..4946 "%"
-                  WHITESPACE@4946..4947 " "
-                  EXPR_ARRAY@4947..5000
-                    L_BRACK@4947..4948 "["
-                    EXPR_APPLY@4948..4973
-                      EXPR_INDEX@4948..4970
-                        EXPR_VAR@4948..4951
-                          NAME@4948..4951
-                            IDENT@4948..4951 "std"
-                        DOT@4951..4952 "."
-                        NAME@4952..4970
-                          IDENT@4952..4970 "escapeStringPython"
-                      ARGS_DESC@4970..4973
-                        L_PAREN@4970..4971 "("
-                        ARG@4971..4972
-                          EXPR_VAR@4971..4972
-                            NAME@4971..4972
-                              IDENT@4971..4972 "k"
-                        R_PAREN@4972..4973 ")"
-                    COMMA@4973..4974 ","
-                    WHITESPACE@4974..4975 " "
-                    EXPR_APPLY@4975..4999
-                      EXPR_INDEX@4975..4993
-                        EXPR_VAR@4975..4978
-                          NAME@4975..4978
-                            IDENT@4975..4978 "std"
-                        DOT@4978..4979 "."
-                        NAME@4979..4993
-                          IDENT@4979..4993 "manifestPython"
-                      ARGS_DESC@4993..4999
-                        L_PAREN@4993..4994 "("
-                        ARG@4994..4998
-                          EXPR_INDEX_EXPR@4994..4998
-                            LHS_EXPR@4994..4995
-                              EXPR_VAR@4994..4995
-                                NAME@4994..4995
-                                  IDENT@4994..4995 "v"
-                            L_BRACK@4995..4996 "["
-                            EXPR_VAR@4996..4997
-                              NAME@4996..4997
-                                IDENT@4996..4997 "k"
-                            R_BRACK@4997..4998 "]"
-                        R_PAREN@4998..4999 ")"
-                    R_BRACK@4999..5000 "]"
-                WHITESPACE@5000..5009 "\n        "
-                FOR_SPEC@5009..5037
-                  FOR_KW@5009..5012 "for"
-                  WHITESPACE@5012..5013 " "
-                  NAME@5013..5014
-                    IDENT@5013..5014 "k"
-                  WHITESPACE@5014..5015 " "
-                  IN_KW@5015..5017 "in"
-                  WHITESPACE@5017..5018 " "
-                  EXPR_APPLY@5018..5037
-                    EXPR_INDEX@5018..5034
-                      EXPR_VAR@5018..5021
-                        NAME@5018..5021
-                          IDENT@5018..5021 "std"
-                      DOT@5021..5022 "."
-                      NAME@5022..5034
-                        IDENT@5022..5034 "objectFields"
-                    ARGS_DESC@5034..5037
-                      L_PAREN@5034..5035 "("
-                      ARG@5035..5036
-                        EXPR_VAR@5035..5036
-                          NAME@5035..5036
-                            IDENT@5035..5036 "v"
-                      R_PAREN@5036..5037 ")"
-                WHITESPACE@5037..5044 "\n      "
-                R_BRACK@5044..5045 "]"
-            SEMI@5045..5046 ";"
-          WHITESPACE@5046..5053 "\n      "
-          TRUE_EXPR@5053..5086
-            EXPR_BINARY@5053..5086
-              LHS_EXPR@5053..5059
-                EXPR_STRING@5053..5059
-                  STRING_SINGLE@5053..5059 "'{%s}'"
-              WHITESPACE@5059..5060 " "
-              MODULO@5060..5061 "%"
-              WHITESPACE@5061..5062 " "
-              EXPR_ARRAY@5062..5086
-                L_BRACK@5062..5063 "["
-                EXPR_APPLY@5063..5085
-                  EXPR_INDEX@5063..5071
-                    EXPR_VAR@5063..5066
-                      NAME@5063..5066
-                        IDENT@5063..5066 "std"
-                    DOT@5066..5067 "."
-                    NAME@5067..5071
-                      IDENT@5067..5071 "join"
-                  ARGS_DESC@5071..5085
-                    L_PAREN@5071..5072 "("
-                    ARG@5072..5076
-                      EXPR_STRING@5072..5076
-                        STRING_SINGLE@5072..5076 "', '"
-                    COMMA@5076..5077 ","
-                    WHITESPACE@5077..5078 " "
-                    ARG@5078..5084
-                      EXPR_VAR@5078..5084
-                        NAME@5078..5084
-                          IDENT@5078..5084 "fields"
-                    R_PAREN@5084..5085 ")"
-                R_BRACK@5085..5086 "]"
-          WHITESPACE@5086..5091 "\n    "
-          ELSE_KW@5091..5095 "else"
-          WHITESPACE@5095..5096 " "
-          FALSE_EXPR@5096..5513
-            EXPR_IF_THEN_ELSE@5096..5513
-              IF_KW@5096..5098 "if"
-              WHITESPACE@5098..5099 " "
-              EXPR_APPLY@5099..5113
-                EXPR_INDEX@5099..5110
-                  EXPR_VAR@5099..5102
-                    NAME@5099..5102
-                      IDENT@5099..5102 "std"
-                  DOT@5102..5103 "."
-                  NAME@5103..5110
-                    IDENT@5103..5110 "isArray"
-                ARGS_DESC@5110..5113
-                  L_PAREN@5110..5111 "("
-                  ARG@5111..5112
-                    EXPR_VAR@5111..5112
-                      NAME@5111..5112
-                        IDENT@5111..5112 "v"
-                  R_PAREN@5112..5113 ")"
-              WHITESPACE@5113..5114 " "
-              THEN_KW@5114..5118 "then"
-              WHITESPACE@5118..5125 "\n      "
-              TRUE_EXPR@5125..5188
-                EXPR_BINARY@5125..5188
-                  LHS_EXPR@5125..5131
-                    EXPR_STRING@5125..5131
-                      STRING_SINGLE@5125..5131 "'[%s]'"
-                  WHITESPACE@5131..5132 " "
-                  MODULO@5132..5133 "%"
-                  WHITESPACE@5133..5134 " "
-                  EXPR_ARRAY@5134..5188
-                    L_BRACK@5134..5135 "["
-                    EXPR_APPLY@5135..5187
-                      EXPR_INDEX@5135..5143
-                        EXPR_VAR@5135..5138
-                          NAME@5135..5138
-                            IDENT@5135..5138 "std"
-                        DOT@5138..5139 "."
-                        NAME@5139..5143
-                          IDENT@5139..5143 "join"
-                      ARGS_DESC@5143..5187
-                        L_PAREN@5143..5144 "("
-                        ARG@5144..5148
-                          EXPR_STRING@5144..5148
-                            STRING_SINGLE@5144..5148 "', '"
-                        COMMA@5148..5149 ","
-                        WHITESPACE@5149..5150 " "
-                        ARG@5150..5186
-                          EXPR_ARRAY_COMP@5150..5186
-                            L_BRACK@5150..5151 "["
-                            EXPR_APPLY@5151..5173
-                              EXPR_INDEX@5151..5169
-                                EXPR_VAR@5151..5154
-                                  NAME@5151..5154
-                                    IDENT@5151..5154 "std"
-                                DOT@5154..5155 "."
-                                NAME@5155..5169
-                                  IDENT@5155..5169 "manifestPython"
-                              ARGS_DESC@5169..5173
-                                L_PAREN@5169..5170 "("
-                                ARG@5170..5172
-                                  EXPR_VAR@5170..5172
-                                    NAME@5170..5172
-                                      IDENT@5170..5172 "v2"
-                                R_PAREN@5172..5173 ")"
-                            WHITESPACE@5173..5174 " "
-                            FOR_SPEC@5174..5185
-                              FOR_KW@5174..5177 "for"
-                              WHITESPACE@5177..5178 " "
-                              NAME@5178..5180
-                                IDENT@5178..5180 "v2"
-                              WHITESPACE@5180..5181 " "
-                              IN_KW@5181..5183 "in"
-                              WHITESPACE@5183..5184 " "
-                              EXPR_VAR@5184..5185
-                                NAME@5184..5185
-                                  IDENT@5184..5185 "v"
-                            R_BRACK@5185..5186 "]"
-                        R_PAREN@5186..5187 ")"
-                    R_BRACK@5187..5188 "]"
-              WHITESPACE@5188..5193 "\n    "
-              ELSE_KW@5193..5197 "else"
-              WHITESPACE@5197..5198 " "
-              FALSE_EXPR@5198..5513
-                EXPR_IF_THEN_ELSE@5198..5513
-                  IF_KW@5198..5200 "if"
-                  WHITESPACE@5200..5201 " "
-                  EXPR_APPLY@5201..5216
-                    EXPR_INDEX@5201..5213
-                      EXPR_VAR@5201..5204
-                        NAME@5201..5204
-                          IDENT@5201..5204 "std"
-                      DOT@5204..5205 "."
-                      NAME@5205..5213
-                        IDENT@5205..5213 "isString"
-                    ARGS_DESC@5213..5216
-                      L_PAREN@5213..5214 "("
-                      ARG@5214..5215
-                        EXPR_VAR@5214..5215
-                          NAME@5214..5215
-                            IDENT@5214..5215 "v"
-                      R_PAREN@5215..5216 ")"
-                  WHITESPACE@5216..5217 " "
-                  THEN_KW@5217..5221 "then"
-                  WHITESPACE@5221..5228 "\n      "
-                  TRUE_EXPR@5228..5262
-                    EXPR_BINARY@5228..5262
-                      LHS_EXPR@5228..5232
-                        EXPR_STRING@5228..5232
-                          STRING_SINGLE@5228..5232 "'%s'"
-                      WHITESPACE@5232..5233 " "
-                      MODULO@5233..5234 "%"
-                      WHITESPACE@5234..5235 " "
-                      EXPR_ARRAY@5235..5262
-                        L_BRACK@5235..5236 "["
-                        EXPR_APPLY@5236..5261
-                          EXPR_INDEX@5236..5258
-                            EXPR_VAR@5236..5239
-                              NAME@5236..5239
-                                IDENT@5236..5239 "std"
-                            DOT@5239..5240 "."
-                            NAME@5240..5258
-                              IDENT@5240..5258 "escapeStringPython"
-                          ARGS_DESC@5258..5261
-                            L_PAREN@5258..5259 "("
-                            ARG@5259..5260
-                              EXPR_VAR@5259..5260
-                                NAME@5259..5260
-                                  IDENT@5259..5260 "v"
-                            R_PAREN@5260..5261 ")"
-                        R_BRACK@5261..5262 "]"
-                  WHITESPACE@5262..5267 "\n    "
-                  ELSE_KW@5267..5271 "else"
-                  WHITESPACE@5271..5272 " "
-                  FALSE_EXPR@5272..5513
-                    EXPR_IF_THEN_ELSE@5272..5513
-                      IF_KW@5272..5274 "if"
-                      WHITESPACE@5274..5275 " "
-                      EXPR_APPLY@5275..5292
-                        EXPR_INDEX@5275..5289
-                          EXPR_VAR@5275..5278
-                            NAME@5275..5278
-                              IDENT@5275..5278 "std"
-                          DOT@5278..5279 "."
-                          NAME@5279..5289
-                            IDENT@5279..5289 "isFunction"
-                        ARGS_DESC@5289..5292
-                          L_PAREN@5289..5290 "("
-                          ARG@5290..5291
-                            EXPR_VAR@5290..5291
-                              NAME@5290..5291
-                                IDENT@5290..5291 "v"
-                          R_PAREN@5291..5292 ")"
-                      WHITESPACE@5292..5293 " "
-                      THEN_KW@5293..5297 "then"
-                      WHITESPACE@5297..5304 "\n      "
-                      TRUE_EXPR@5304..5336
-                        EXPR_ERROR@5304..5336
-                          ERROR_KW@5304..5309 "error"
-                          WHITESPACE@5309..5310 " "
-                          EXPR_STRING@5310..5336
-                            STRING_SINGLE@5310..5336 "'cannot manifest func ..."
-                      WHITESPACE@5336..5341 "\n    "
-                      ELSE_KW@5341..5345 "else"
-                      WHITESPACE@5345..5346 " "
-                      FALSE_EXPR@5346..5513
-                        EXPR_IF_THEN_ELSE@5346..5513
-                          IF_KW@5346..5348 "if"
-                          WHITESPACE@5348..5349 " "
-                          EXPR_APPLY@5349..5364
-                            EXPR_INDEX@5349..5361
-                              EXPR_VAR@5349..5352
-                                NAME@5349..5352
-                                  IDENT@5349..5352 "std"
-                              DOT@5352..5353 "."
-                              NAME@5353..5361
-                                IDENT@5353..5361 "isNumber"
-                            ARGS_DESC@5361..5364
-                              L_PAREN@5361..5362 "("
-                              ARG@5362..5363
-                                EXPR_VAR@5362..5363
-                                  NAME@5362..5363
-                                    IDENT@5362..5363 "v"
-                              R_PAREN@5363..5364 ")"
-                          WHITESPACE@5364..5365 " "
-                          THEN_KW@5365..5369 "then"
-                          WHITESPACE@5369..5376 "\n      "
-                          TRUE_EXPR@5376..5391
-                            EXPR_APPLY@5376..5391
-                              EXPR_INDEX@5376..5388
-                                EXPR_VAR@5376..5379
-                                  NAME@5376..5379
-                                    IDENT@5376..5379 "std"
-                                DOT@5379..5380 "."
-                                NAME@5380..5388
-                                  IDENT@5380..5388 "toString"
-                              ARGS_DESC@5388..5391
-                                L_PAREN@5388..5389 "("
-                                ARG@5389..5390
-                                  EXPR_VAR@5389..5390
-                                    NAME@5389..5390
-                                      IDENT@5389..5390 "v"
-                                R_PAREN@5390..5391 ")"
-                          WHITESPACE@5391..5396 "\n    "
-                          ELSE_KW@5396..5400 "else"
-                          WHITESPACE@5400..5401 " "
-                          FALSE_EXPR@5401..5513
-                            EXPR_IF_THEN_ELSE@5401..5513
-                              IF_KW@5401..5403 "if"
-                              WHITESPACE@5403..5404 " "
-                              EXPR_BINARY@5404..5413
-                                LHS_EXPR@5404..5405
-                                  EXPR_VAR@5404..5405
-                                    NAME@5404..5405
-                                      IDENT@5404..5405 "v"
-                                WHITESPACE@5405..5406 " "
-                                EQ@5406..5408 "=="
-                                WHITESPACE@5408..5409 " "
-                                EXPR_LITERAL@5409..5413
-                                  TRUE_KW@5409..5413 "true"
-                              WHITESPACE@5413..5414 " "
-                              THEN_KW@5414..5418 "then"
-                              WHITESPACE@5418..5425 "\n      "
-                              TRUE_EXPR@5425..5431
-                                EXPR_STRING@5425..5431
-                                  STRING_SINGLE@5425..5431 "'True'"
-                              WHITESPACE@5431..5436 "\n    "
-                              ELSE_KW@5436..5440 "else"
-                              WHITESPACE@5440..5441 " "
-                              FALSE_EXPR@5441..5513
-                                EXPR_IF_THEN_ELSE@5441..5513
-                                  IF_KW@5441..5443 "if"
-                                  WHITESPACE@5443..5444 " "
-                                  EXPR_BINARY@5444..5454
-                                    LHS_EXPR@5444..5445
-                                      EXPR_VAR@5444..5445
-                                        NAME@5444..5445
-                                          IDENT@5444..5445 "v"
-                                    WHITESPACE@5445..5446 " "
-                                    EQ@5446..5448 "=="
-                                    WHITESPACE@5448..5449 " "
-                                    EXPR_LITERAL@5449..5454
-                                      FALSE_KW@5449..5454 "false"
-                                  WHITESPACE@5454..5455 " "
-                                  THEN_KW@5455..5459 "then"
-                                  WHITESPACE@5459..5466 "\n      "
-                                  TRUE_EXPR@5466..5473
-                                    EXPR_STRING@5466..5473
-                                      STRING_SINGLE@5466..5473 "'False'"
-                                  WHITESPACE@5473..5478 "\n    "
-                                  ELSE_KW@5478..5482 "else"
-                                  WHITESPACE@5482..5483 " "
-                                  FALSE_EXPR@5483..5513
-                                    EXPR_IF_THEN_ELSE@5483..5513
-                                      IF_KW@5483..5485 "if"
-                                      WHITESPACE@5485..5486 " "
-                                      EXPR_BINARY@5486..5495
-                                        LHS_EXPR@5486..5487
-                                          EXPR_VAR@5486..5487
-                                            NAME@5486..5487
-                                              IDENT@5486..5487 "v"
-                                        WHITESPACE@5487..5488 " "
-                                        EQ@5488..5490 "=="
-                                        WHITESPACE@5490..5491 " "
-                                        EXPR_LITERAL@5491..5495
-                                          NULL_KW@5491..5495 "null"
-                                      WHITESPACE@5495..5496 " "
-                                      THEN_KW@5496..5500 "then"
-                                      WHITESPACE@5500..5507 "\n      "
-                                      TRUE_EXPR@5507..5513
-                                        EXPR_STRING@5507..5513
-                                          STRING_SINGLE@5507..5513 "'None'"
-      COMMA@5513..5514 ","
-      WHITESPACE@5514..5518 "\n\n  "
-      MEMBER_FIELD_METHOD@5518..5673
-        FIELD_NAME_FIXED@5518..5536
-          NAME@5518..5536
-            IDENT@5518..5536 "manifestPythonVars"
-        PARAMS_DESC@5536..5542
-          L_PAREN@5536..5537 "("
-          PARAM@5537..5541
-            DESTRUCT_FULL@5537..5541
-              NAME@5537..5541
-                IDENT@5537..5541 "conf"
-          R_PAREN@5541..5542 ")"
-        COLONCOLON@5542..5544 "::"
-        WHITESPACE@5544..5549 "\n    "
-        STMT_LOCAL@5549..5641
-          LOCAL_KW@5549..5554 "local"
-          WHITESPACE@5554..5555 " "
-          BIND_DESTRUCT@5555..5640
-            DESTRUCT_FULL@5555..5559
-              NAME@5555..5559
-                IDENT@5555..5559 "vars"
-            WHITESPACE@5559..5560 " "
-            ASSIGN@5560..5561 "="
-            WHITESPACE@5561..5562 " "
-            EXPR_ARRAY_COMP@5562..5640
-              L_BRACK@5562..5563 "["
-              EXPR_BINARY@5563..5607
-                LHS_EXPR@5563..5572
-                  EXPR_STRING@5563..5572
-                    STRING_SINGLE@5563..5572 "'%s = %s'"
-                WHITESPACE@5572..5573 " "
-                MODULO@5573..5574 "%"
-                WHITESPACE@5574..5575 " "
-                EXPR_ARRAY@5575..5607
-                  L_BRACK@5575..5576 "["
-                  EXPR_VAR@5576..5577
-                    NAME@5576..5577
-                      IDENT@5576..5577 "k"
-                  COMMA@5577..5578 ","
-                  WHITESPACE@5578..5579 " "
-                  EXPR_APPLY@5579..5606
-                    EXPR_INDEX@5579..5597
-                      EXPR_VAR@5579..5582
-                        NAME@5579..5582
-                          IDENT@5579..5582 "std"
-                      DOT@5582..5583 "."
-                      NAME@5583..5597
-                        IDENT@5583..5597 "manifestPython"
-                    ARGS_DESC@5597..5606
-                      L_PAREN@5597..5598 "("
-                      ARG@5598..5605
-                        EXPR_INDEX_EXPR@5598..5605
-                          LHS_EXPR@5598..5602
-                            EXPR_VAR@5598..5602
-                              NAME@5598..5602
-                                IDENT@5598..5602 "conf"
-                          L_BRACK@5602..5603 "["
-                          EXPR_VAR@5603..5604
-                            NAME@5603..5604
-                              IDENT@5603..5604 "k"
-                          R_BRACK@5604..5605 "]"
-                      R_PAREN@5605..5606 ")"
-                  R_BRACK@5606..5607 "]"
-              WHITESPACE@5607..5608 " "
-              FOR_SPEC@5608..5639
-                FOR_KW@5608..5611 "for"
-                WHITESPACE@5611..5612 " "
-                NAME@5612..5613
-                  IDENT@5612..5613 "k"
-                WHITESPACE@5613..5614 " "
-                IN_KW@5614..5616 "in"
-                WHITESPACE@5616..5617 " "
-                EXPR_APPLY@5617..5639
-                  EXPR_INDEX@5617..5633
-                    EXPR_VAR@5617..5620
-                      NAME@5617..5620
-                        IDENT@5617..5620 "std"
-                    DOT@5620..5621 "."
-                    NAME@5621..5633
-                      IDENT@5621..5633 "objectFields"
-                  ARGS_DESC@5633..5639
-                    L_PAREN@5633..5634 "("
-                    ARG@5634..5638
-                      EXPR_VAR@5634..5638
-                        NAME@5634..5638
-                          IDENT@5634..5638 "conf"
-                    R_PAREN@5638..5639 ")"
-              R_BRACK@5639..5640 "]"
-          SEMI@5640..5641 ";"
-        WHITESPACE@5641..5646 "\n    "
-        EXPR_APPLY@5646..5673
-          EXPR_INDEX@5646..5654
-            EXPR_VAR@5646..5649
-              NAME@5646..5649
-                IDENT@5646..5649 "std"
-            DOT@5649..5650 "."
-            NAME@5650..5654
-              IDENT@5650..5654 "join"
-          ARGS_DESC@5654..5673
-            L_PAREN@5654..5655 "("
-            ARG@5655..5659
-              EXPR_STRING@5655..5659
-                STRING_SINGLE@5655..5659 "'\\n'"
-            COMMA@5659..5660 ","
-            WHITESPACE@5660..5661 " "
-            ARG@5661..5672
-              EXPR_BINARY@5661..5672
-                LHS_EXPR@5661..5665
-                  EXPR_VAR@5661..5665
-                    NAME@5661..5665
-                      IDENT@5661..5665 "vars"
-                WHITESPACE@5665..5666 " "
-                PLUS@5666..5667 "+"
-                WHITESPACE@5667..5668 " "
-                EXPR_ARRAY@5668..5672
-                  L_BRACK@5668..5669 "["
-                  EXPR_STRING@5669..5671
-                    STRING_SINGLE@5669..5671 "''"
-                  R_BRACK@5671..5672 "]"
-            R_PAREN@5672..5673 ")"
-      COMMA@5673..5674 ","
-      WHITESPACE@5674..5678 "\n\n  "
-      MEMBER_FIELD_METHOD@5678..6345
-        FIELD_NAME_FIXED@5678..5695
-          NAME@5678..5695
-            IDENT@5678..5695 "manifestXmlJsonml"
-        PARAMS_DESC@5695..5702
-          L_PAREN@5695..5696 "("
-          PARAM@5696..5701
-            DESTRUCT_FULL@5696..5701
-              NAME@5696..5701
-                IDENT@5696..5701 "value"
-          R_PAREN@5701..5702 ")"
-        COLONCOLON@5702..5704 "::"
-        WHITESPACE@5704..5709 "\n    "
-        EXPR_IF_THEN_ELSE@5709..6345
-          IF_KW@5709..5711 "if"
-          WHITESPACE@5711..5712 " "
-          EXPR_UNARY@5712..5731
-            NOT@5712..5713 "!"
-            EXPR_APPLY@5713..5731
-              EXPR_INDEX@5713..5724
-                EXPR_VAR@5713..5716
-                  NAME@5713..5716
-                    IDENT@5713..5716 "std"
-                DOT@5716..5717 "."
-                NAME@5717..5724
-                  IDENT@5717..5724 "isArray"
-              ARGS_DESC@5724..5731
-                L_PAREN@5724..5725 "("
-                ARG@5725..5730
-                  EXPR_VAR@5725..5730
-                    NAME@5725..5730
-                      IDENT@5725..5730 "value"
-                R_PAREN@5730..5731 ")"
-          WHITESPACE@5731..5732 " "
-          THEN_KW@5732..5736 "then"
-          WHITESPACE@5736..5743 "\n      "
-          TRUE_EXPR@5743..5811
-            EXPR_ERROR@5743..5811
-              ERROR_KW@5743..5748 "error"
-              WHITESPACE@5748..5749 " "
-              EXPR_BINARY@5749..5811
-                LHS_EXPR@5749..5793
-                  EXPR_STRING@5749..5793
-                    STRING_SINGLE@5749..5793 "'Expected a JSONML va ..."
-                WHITESPACE@5793..5794 " "
-                MODULO@5794..5795 "%"
-                WHITESPACE@5795..5796 " "
-                EXPR_APPLY@5796..5811
-                  EXPR_INDEX@5796..5804
-                    EXPR_VAR@5796..5799
-                      NAME@5796..5799
-                        IDENT@5796..5799 "std"
-                    DOT@5799..5800 "."
-                    NAME@5800..5804
-                      IDENT@5800..5804 "type"
-                  ARGS_DESC@5804..5811
-                    L_PAREN@5804..5805 "("
-                    ARG@5805..5810
-                      EXPR_VAR@5805..5810
-                        NAME@5805..5810
-                          IDENT@5805..5810 "value"
-                    R_PAREN@5810..5811 ")"
-          WHITESPACE@5811..5816 "\n    "
-          ELSE_KW@5816..5820 "else"
-          WHITESPACE@5820..5827 "\n      "
-          STMT_LOCAL@5827..6327
-            LOCAL_KW@5827..5832 "local"
-            WHITESPACE@5832..5833 " "
-            BIND_FUNCTION@5833..6326
-              NAME@5833..5836
-                IDENT@5833..5836 "aux"
-              PARAMS_DESC@5836..5839
-                L_PAREN@5836..5837 "("
-                PARAM@5837..5838
-                  DESTRUCT_FULL@5837..5838
-                    NAME@5837..5838
-                      IDENT@5837..5838 "v"
-                R_PAREN@5838..5839 ")"
-              WHITESPACE@5839..5840 " "
-              ASSIGN@5840..5841 "="
-              WHITESPACE@5841..5850 "\n        "
-              EXPR_IF_THEN_ELSE@5850..6326
-                IF_KW@5850..5852 "if"
-                WHITESPACE@5852..5853 " "
-                EXPR_APPLY@5853..5868
-                  EXPR_INDEX@5853..5865
-                    EXPR_VAR@5853..5856
-                      NAME@5853..5856
-                        IDENT@5853..5856 "std"
-                    DOT@5856..5857 "."
-                    NAME@5857..5865
-                      IDENT@5857..5865 "isString"
-                  ARGS_DESC@5865..5868
-                    L_PAREN@5865..5866 "("
-                    ARG@5866..5867
-                      EXPR_VAR@5866..5867
-                        NAME@5866..5867
-                          IDENT@5866..5867 "v"
-                    R_PAREN@5867..5868 ")"
-                WHITESPACE@5868..5869 " "
-                THEN_KW@5869..5873 "then"
-                WHITESPACE@5873..5884 "\n          "
-                TRUE_EXPR@5884..5885
-                  EXPR_VAR@5884..5885
-                    NAME@5884..5885
-                      IDENT@5884..5885 "v"
-                WHITESPACE@5885..5894 "\n        "
-                ELSE_KW@5894..5898 "else"
-                WHITESPACE@5898..5909 "\n          "
-                STMT_LOCAL@5909..5926
-                  LOCAL_KW@5909..5914 "local"
-                  WHITESPACE@5914..5915 " "
-                  BIND_DESTRUCT@5915..5925
-                    DESTRUCT_FULL@5915..5918
-                      NAME@5915..5918
-                        IDENT@5915..5918 "tag"
-                    WHITESPACE@5918..5919 " "
-                    ASSIGN@5919..5920 "="
-                    WHITESPACE@5920..5921 " "
-                    EXPR_INDEX_EXPR@5921..5925
-                      LHS_EXPR@5921..5922
-                        EXPR_VAR@5921..5922
-                          NAME@5921..5922
-                            IDENT@5921..5922 "v"
-                      L_BRACK@5922..5923 "["
-                      EXPR_NUMBER@5923..5924
-                        FLOAT@5923..5924 "0"
-                      R_BRACK@5924..5925 "]"
-                  SEMI@5925..5926 ";"
-                WHITESPACE@5926..5937 "\n          "
-                STMT_LOCAL@5937..5995
-                  LOCAL_KW@5937..5942 "local"
-                  WHITESPACE@5942..5943 " "
-                  BIND_DESTRUCT@5943..5994
-                    DESTRUCT_FULL@5943..5952
-                      NAME@5943..5952
-                        IDENT@5943..5952 "has_attrs"
-                    WHITESPACE@5952..5953 " "
-                    ASSIGN@5953..5954 "="
-                    WHITESPACE@5954..5955 " "
-                    EXPR_BINARY@5955..5994
-                      LHS_EXPR@5955..5972
-                        EXPR_BINARY@5955..5972
-                          LHS_EXPR@5955..5968
-                            EXPR_APPLY@5955..5968
-                              EXPR_INDEX@5955..5965
-                                EXPR_VAR@5955..5958
-                                  NAME@5955..5958
-                                    IDENT@5955..5958 "std"
-                                DOT@5958..5959 "."
-                                NAME@5959..5965
-                                  IDENT@5959..5965 "length"
-                              ARGS_DESC@5965..5968
-                                L_PAREN@5965..5966 "("
-                                ARG@5966..5967
-                                  EXPR_VAR@5966..5967
-                                    NAME@5966..5967
-                                      IDENT@5966..5967 "v"
-                                R_PAREN@5967..5968 ")"
-                          WHITESPACE@5968..5969 " "
-                          GT@5969..5970 ">"
-                          WHITESPACE@5970..5971 " "
-                          EXPR_NUMBER@5971..5972
-                            FLOAT@5971..5972 "1"
-                      WHITESPACE@5972..5973 " "
-                      AND@5973..5975 "&&"
-                      WHITESPACE@5975..5976 " "
-                      EXPR_APPLY@5976..5994
-                        EXPR_INDEX@5976..5988
-                          EXPR_VAR@5976..5979
-                            NAME@5976..5979
-                              IDENT@5976..5979 "std"
-                          DOT@5979..5980 "."
-                          NAME@5980..5988
-                            IDENT@5980..5988 "isObject"
-                        ARGS_DESC@5988..5994
-                          L_PAREN@5988..5989 "("
-                          ARG@5989..5993
-                            EXPR_INDEX_EXPR@5989..5993
-                              LHS_EXPR@5989..5990
-                                EXPR_VAR@5989..5990
-                                  NAME@5989..5990
-                                    IDENT@5989..5990 "v"
-                              L_BRACK@5990..5991 "["
-                              EXPR_NUMBER@5991..5992
-                                FLOAT@5991..5992 "1"
-                              R_BRACK@5992..5993 "]"
-                          R_PAREN@5993..5994 ")"
-                  SEMI@5994..5995 ";"
-                WHITESPACE@5995..6006 "\n          "
-                STMT_LOCAL@6006..6051
-                  LOCAL_KW@6006..6011 "local"
-                  WHITESPACE@6011..6012 " "
-                  BIND_DESTRUCT@6012..6050
-                    DESTRUCT_FULL@6012..6017
-                      NAME@6012..6017
-                        IDENT@6012..6017 "attrs"
-                    WHITESPACE@6017..6018 " "
-                    ASSIGN@6018..6019 "="
-                    WHITESPACE@6019..6020 " "
-                    EXPR_IF_THEN_ELSE@6020..6050
-                      IF_KW@6020..6022 "if"
-                      WHITESPACE@6022..6023 " "
-                      EXPR_VAR@6023..6032
-                        NAME@6023..6032
-                          IDENT@6023..6032 "has_attrs"
-                      WHITESPACE@6032..6033 " "
-                      THEN_KW@6033..6037 "then"
-                      WHITESPACE@6037..6038 " "
-                      TRUE_EXPR@6038..6042
-                        EXPR_INDEX_EXPR@6038..6042
-                          LHS_EXPR@6038..6039
-                            EXPR_VAR@6038..6039
-                              NAME@6038..6039
-                                IDENT@6038..6039 "v"
-                          L_BRACK@6039..6040 "["
-                          EXPR_NUMBER@6040..6041
-                            FLOAT@6040..6041 "1"
-                          R_BRACK@6041..6042 "]"
-                      WHITESPACE@6042..6043 " "
-                      ELSE_KW@6043..6047 "else"
-                      WHITESPACE@6047..6048 " "
-                      FALSE_EXPR@6048..6050
-                        EXPR_OBJECT@6048..6050
-                          OBJ_BODY_MEMBER_LIST@6048..6050
-                            L_BRACE@6048..6049 "{"
-                            R_BRACE@6049..6050 "}"
-                  SEMI@6050..6051 ";"
-                WHITESPACE@6051..6062 "\n          "
-                STMT_LOCAL@6062..6114
-                  LOCAL_KW@6062..6067 "local"
-                  WHITESPACE@6067..6068 " "
-                  BIND_DESTRUCT@6068..6113
-                    DESTRUCT_FULL@6068..6076
-                      NAME@6068..6076
-                        IDENT@6068..6076 "children"
-                    WHITESPACE@6076..6077 " "
-                    ASSIGN@6077..6078 "="
-                    WHITESPACE@6078..6079 " "
-                    EXPR_IF_THEN_ELSE@6079..6113
-                      IF_KW@6079..6081 "if"
-                      WHITESPACE@6081..6082 " "
-                      EXPR_VAR@6082..6091
-                        NAME@6082..6091
-                          IDENT@6082..6091 "has_attrs"
-                      WHITESPACE@6091..6092 " "
-                      THEN_KW@6092..6096 "then"
-                      WHITESPACE@6096..6097 " "
-                      TRUE_EXPR@6097..6102
-                        EXPR_SLICE@6097..6102
-                          EXPR_VAR@6097..6098
-                            NAME@6097..6098
-                              IDENT@6097..6098 "v"
-                          SLICE_DESC@6098..6102
-                            L_BRACK@6098..6099 "["
-                            EXPR_NUMBER@6099..6100
-                              FLOAT@6099..6100 "2"
-                            COLON@6100..6101 ":"
-                            R_BRACK@6101..6102 "]"
-                      WHITESPACE@6102..6103 " "
-                      ELSE_KW@6103..6107 "else"
-                      WHITESPACE@6107..6108 " "
-                      FALSE_EXPR@6108..6113
-                        EXPR_SLICE@6108..6113
-                          EXPR_VAR@6108..6109
-                            NAME@6108..6109
-                              IDENT@6108..6109 "v"
-                          SLICE_DESC@6109..6113
-                            L_BRACK@6109..6110 "["
-                            EXPR_NUMBER@6110..6111
-                              FLOAT@6110..6111 "1"
-                            COLON@6111..6112 ":"
-                            R_BRACK@6112..6113 "]"
-                  SEMI@6113..6114 ";"
-                WHITESPACE@6114..6125 "\n          "
-                STMT_LOCAL@6125..6231
-                  LOCAL_KW@6125..6130 "local"
-                  WHITESPACE@6130..6131 " "
-                  BIND_DESTRUCT@6131..6230
-                    DESTRUCT_FULL@6131..6140
-                      NAME@6131..6140
-                        IDENT@6131..6140 "attrs_str"
-                    WHITESPACE@6140..6141 " "
-                    ASSIGN@6141..6142 "="
-                    WHITESPACE@6142..6155 "\n            "
-                    EXPR_APPLY@6155..6230
-                      EXPR_INDEX@6155..6163
-                        EXPR_VAR@6155..6158
-                          NAME@6155..6158
-                            IDENT@6155..6158 "std"
-                        DOT@6158..6159 "."
-                        NAME@6159..6163
-                          IDENT@6159..6163 "join"
-                      ARGS_DESC@6163..6230
-                        L_PAREN@6163..6164 "("
-                        ARG@6164..6166
-                          EXPR_STRING@6164..6166
-                            STRING_SINGLE@6164..6166 "''"
-                        COMMA@6166..6167 ","
-                        WHITESPACE@6167..6168 " "
-                        ARG@6168..6229
-                          EXPR_ARRAY_COMP@6168..6229
-                            L_BRACK@6168..6169 "["
-                            EXPR_BINARY@6169..6195
-                              LHS_EXPR@6169..6179
-                                EXPR_STRING@6169..6179
-                                  STRING_SINGLE@6169..6179 "' %s=\"%s\"'"
-                              WHITESPACE@6179..6180 " "
-                              MODULO@6180..6181 "%"
-                              WHITESPACE@6181..6182 " "
-                              EXPR_ARRAY@6182..6195
-                                L_BRACK@6182..6183 "["
-                                EXPR_VAR@6183..6184
-                                  NAME@6183..6184
-                                    IDENT@6183..6184 "k"
-                                COMMA@6184..6185 ","
-                                WHITESPACE@6185..6186 " "
-                                EXPR_INDEX_EXPR@6186..6194
-                                  LHS_EXPR@6186..6191
-                                    EXPR_VAR@6186..6191
-                                      NAME@6186..6191
-                                        IDENT@6186..6191 "attrs"
-                                  L_BRACK@6191..6192 "["
-                                  EXPR_VAR@6192..6193
-                                    NAME@6192..6193
-                                      IDENT@6192..6193 "k"
-                                  R_BRACK@6193..6194 "]"
-                                R_BRACK@6194..6195 "]"
-                            WHITESPACE@6195..6196 " "
-                            FOR_SPEC@6196..6228
-                              FOR_KW@6196..6199 "for"
-                              WHITESPACE@6199..6200 " "
-                              NAME@6200..6201
-                                IDENT@6200..6201 "k"
-                              WHITESPACE@6201..6202 " "
-                              IN_KW@6202..6204 "in"
-                              WHITESPACE@6204..6205 " "
-                              EXPR_APPLY@6205..6228
-                                EXPR_INDEX@6205..6221
-                                  EXPR_VAR@6205..6208
-                                    NAME@6205..6208
-                                      IDENT@6205..6208 "std"
-                                  DOT@6208..6209 "."
-                                  NAME@6209..6221
-                                    IDENT@6209..6221 "objectFields"
-                                ARGS_DESC@6221..6228
-                                  L_PAREN@6221..6222 "("
-                                  ARG@6222..6227
-                                    EXPR_VAR@6222..6227
-                                      NAME@6222..6227
-                                        IDENT@6222..6227 "attrs"
-                                  R_PAREN@6227..6228 ")"
-                            R_BRACK@6228..6229 "]"
-                        R_PAREN@6229..6230 ")"
-                  SEMI@6230..6231 ";"
-                WHITESPACE@6231..6242 "\n          "
-                FALSE_EXPR@6242..6326
-                  EXPR_APPLY@6242..6326
-                    EXPR_INDEX@6242..6254
-                      EXPR_VAR@6242..6245
-                        NAME@6242..6245
-                          IDENT@6242..6245 "std"
-                      DOT@6245..6246 "."
-                      NAME@6246..6254
-                        IDENT@6246..6254 "deepJoin"
-                    ARGS_DESC@6254..6326
-                      L_PAREN@6254..6255 "("
-                      ARG@6255..6325
-                        EXPR_ARRAY@6255..6325
-                          L_BRACK@6255..6256 "["
-                          EXPR_STRING@6256..6259
-                            STRING_SINGLE@6256..6259 "'<'"
-                          COMMA@6259..6260 ","
-                          WHITESPACE@6260..6261 " "
-                          EXPR_VAR@6261..6264
-                            NAME@6261..6264
-                              IDENT@6261..6264 "tag"
-                          COMMA@6264..6265 ","
-                          WHITESPACE@6265..6266 " "
-                          EXPR_VAR@6266..6275
-                            NAME@6266..6275
-                              IDENT@6266..6275 "attrs_str"
-                          COMMA@6275..6276 ","
-                          WHITESPACE@6276..6277 " "
-                          EXPR_STRING@6277..6280
-                            STRING_SINGLE@6277..6280 "'>'"
-                          COMMA@6280..6281 ","
-                          WHITESPACE@6281..6282 " "
-                          EXPR_ARRAY_COMP@6282..6308
-                            L_BRACK@6282..6283 "["
-                            EXPR_APPLY@6283..6289
-                              EXPR_VAR@6283..6286
-                                NAME@6283..6286
-                                  IDENT@6283..6286 "aux"
-                              ARGS_DESC@6286..6289
-                                L_PAREN@6286..6287 "("
-                                ARG@6287..6288
-                                  EXPR_VAR@6287..6288
-                                    NAME@6287..6288
-                                      IDENT@6287..6288 "x"
-                                R_PAREN@6288..6289 ")"
-                            WHITESPACE@6289..6290 " "
-                            FOR_SPEC@6290..6307
-                              FOR_KW@6290..6293 "for"
-                              WHITESPACE@6293..6294 " "
-                              NAME@6294..6295
-                                IDENT@6294..6295 "x"
-                              WHITESPACE@6295..6296 " "
-                              IN_KW@6296..6298 "in"
-                              WHITESPACE@6298..6299 " "
-                              EXPR_VAR@6299..6307
-                                NAME@6299..6307
-                                  IDENT@6299..6307 "children"
-                            R_BRACK@6307..6308 "]"
-                          COMMA@6308..6309 ","
-                          WHITESPACE@6309..6310 " "
-                          EXPR_STRING@6310..6314
-                            STRING_SINGLE@6310..6314 "'</'"
-                          COMMA@6314..6315 ","
-                          WHITESPACE@6315..6316 " "
-                          EXPR_VAR@6316..6319
-                            NAME@6316..6319
-                              IDENT@6316..6319 "tag"
-                          COMMA@6319..6320 ","
-                          WHITESPACE@6320..6321 " "
-                          EXPR_STRING@6321..6324
-                            STRING_SINGLE@6321..6324 "'>'"
-                          R_BRACK@6324..6325 "]"
-                      R_PAREN@6325..6326 ")"
-            SEMI@6326..6327 ";"
-          WHITESPACE@6327..6335 "\n\n      "
-          FALSE_EXPR@6335..6345
-            EXPR_APPLY@6335..6345
-              EXPR_VAR@6335..6338
-                NAME@6335..6338
-                  IDENT@6335..6338 "aux"
-              ARGS_DESC@6338..6345
-                L_PAREN@6338..6339 "("
-                ARG@6339..6344
-                  EXPR_VAR@6339..6344
-                    NAME@6339..6344
-                      IDENT@6339..6344 "value"
-                R_PAREN@6344..6345 ")"
-      COMMA@6345..6346 ","
-      WHITESPACE@6346..6350 "\n\n  "
-      MEMBER_FIELD_METHOD@6350..6899
-        FIELD_NAME_FIXED@6350..6358
-          NAME@6350..6358
-            IDENT@6350..6358 "setUnion"
-        PARAMS_DESC@6358..6373
-          L_PAREN@6358..6359 "("
-          PARAM@6359..6360
-            DESTRUCT_FULL@6359..6360
-              NAME@6359..6360
-                IDENT@6359..6360 "a"
-          COMMA@6360..6361 ","
-          WHITESPACE@6361..6362 " "
-          PARAM@6362..6363
-            DESTRUCT_FULL@6362..6363
-              NAME@6362..6363
-                IDENT@6362..6363 "b"
-          COMMA@6363..6364 ","
-          WHITESPACE@6364..6365 " "
-          PARAM@6365..6372
-            DESTRUCT_FULL@6365..6369
-              NAME@6365..6369
-                IDENT@6365..6369 "keyF"
-            ASSIGN@6369..6370 "="
-            EXPR_VAR@6370..6372
-              NAME@6370..6372
-                IDENT@6370..6372 "id"
-          R_PAREN@6372..6373 ")"
-        COLONCOLON@6373..6375 "::"
-        WHITESPACE@6375..6380 "\n    "
-        SINGLE_LINE_SLASH_COMMENT@6380..6422 "// NOTE: order matter ..."
-        WHITESPACE@6422..6426 "    "
-        STMT_LOCAL@6426..6875
-          LOCAL_KW@6426..6431 "local"
-          WHITESPACE@6431..6432 " "
-          BIND_FUNCTION@6432..6874
-            NAME@6432..6435
-              IDENT@6432..6435 "aux"
-            PARAMS_DESC@6435..6452
-              L_PAREN@6435..6436 "("
-              PARAM@6436..6437
-                DESTRUCT_FULL@6436..6437
-                  NAME@6436..6437
-                    IDENT@6436..6437 "a"
-              COMMA@6437..6438 ","
-              WHITESPACE@6438..6439 " "
-              PARAM@6439..6440
-                DESTRUCT_FULL@6439..6440
-                  NAME@6439..6440
-                    IDENT@6439..6440 "b"
-              COMMA@6440..6441 ","
-              WHITESPACE@6441..6442 " "
-              PARAM@6442..6443
-                DESTRUCT_FULL@6442..6443
-                  NAME@6442..6443
-                    IDENT@6442..6443 "i"
-              COMMA@6443..6444 ","
-              WHITESPACE@6444..6445 " "
-              PARAM@6445..6446
-                DESTRUCT_FULL@6445..6446
-                  NAME@6445..6446
-                    IDENT@6445..6446 "j"
-              COMMA@6446..6447 ","
-              WHITESPACE@6447..6448 " "
-              PARAM@6448..6451
-                DESTRUCT_FULL@6448..6451
-                  NAME@6448..6451
-                    IDENT@6448..6451 "acc"
-              R_PAREN@6451..6452 ")"
-            WHITESPACE@6452..6453 " "
-            ASSIGN@6453..6454 "="
-            WHITESPACE@6454..6461 "\n      "
-            EXPR_IF_THEN_ELSE@6461..6874
-              IF_KW@6461..6463 "if"
-              WHITESPACE@6463..6464 " "
-              EXPR_BINARY@6464..6482
-                LHS_EXPR@6464..6465
-                  EXPR_VAR@6464..6465
-                    NAME@6464..6465
-                      IDENT@6464..6465 "i"
-                WHITESPACE@6465..6466 " "
-                GE@6466..6468 ">="
-                WHITESPACE@6468..6469 " "
-                EXPR_APPLY@6469..6482
-                  EXPR_INDEX@6469..6479
-                    EXPR_VAR@6469..6472
-                      NAME@6469..6472
-                        IDENT@6469..6472 "std"
-                    DOT@6472..6473 "."
-                    NAME@6473..6479
-                      IDENT@6473..6479 "length"
-                  ARGS_DESC@6479..6482
-                    L_PAREN@6479..6480 "("
-                    ARG@6480..6481
-                      EXPR_VAR@6480..6481
-                        NAME@6480..6481
-                          IDENT@6480..6481 "a"
-                    R_PAREN@6481..6482 ")"
-              WHITESPACE@6482..6483 " "
-              THEN_KW@6483..6487 "then"
-              WHITESPACE@6487..6496 "\n        "
-              TRUE_EXPR@6496..6507
-                EXPR_BINARY@6496..6507
-                  LHS_EXPR@6496..6499
-                    EXPR_VAR@6496..6499
-                      NAME@6496..6499
-                        IDENT@6496..6499 "acc"
-                  WHITESPACE@6499..6500 " "
-                  PLUS@6500..6501 "+"
-                  WHITESPACE@6501..6502 " "
-                  EXPR_SLICE@6502..6507
-                    EXPR_VAR@6502..6503
-                      NAME@6502..6503
-                        IDENT@6502..6503 "b"
-                    SLICE_DESC@6503..6507
-                      L_BRACK@6503..6504 "["
-                      EXPR_VAR@6504..6505
-                        NAME@6504..6505
-                          IDENT@6504..6505 "j"
-                      COLON@6505..6506 ":"
-                      R_BRACK@6506..6507 "]"
-              WHITESPACE@6507..6514 "\n      "
-              ELSE_KW@6514..6518 "else"
-              WHITESPACE@6518..6519 " "
-              FALSE_EXPR@6519..6874
-                EXPR_IF_THEN_ELSE@6519..6874
-                  IF_KW@6519..6521 "if"
-                  WHITESPACE@6521..6522 " "
-                  EXPR_BINARY@6522..6540
-                    LHS_EXPR@6522..6523
-                      EXPR_VAR@6522..6523
-                        NAME@6522..6523
-                          IDENT@6522..6523 "j"
-                    WHITESPACE@6523..6524 " "
-                    GE@6524..6526 ">="
-                    WHITESPACE@6526..6527 " "
-                    EXPR_APPLY@6527..6540
-                      EXPR_INDEX@6527..6537
-                        EXPR_VAR@6527..6530
-                          NAME@6527..6530
-                            IDENT@6527..6530 "std"
-                        DOT@6530..6531 "."
-                        NAME@6531..6537
-                          IDENT@6531..6537 "length"
-                      ARGS_DESC@6537..6540
-                        L_PAREN@6537..6538 "("
-                        ARG@6538..6539
-                          EXPR_VAR@6538..6539
-                            NAME@6538..6539
-                              IDENT@6538..6539 "b"
-                        R_PAREN@6539..6540 ")"
-                  WHITESPACE@6540..6541 " "
-                  THEN_KW@6541..6545 "then"
-                  WHITESPACE@6545..6554 "\n        "
-                  TRUE_EXPR@6554..6565
-                    EXPR_BINARY@6554..6565
-                      LHS_EXPR@6554..6557
-                        EXPR_VAR@6554..6557
-                          NAME@6554..6557
-                            IDENT@6554..6557 "acc"
-                      WHITESPACE@6557..6558 " "
-                      PLUS@6558..6559 "+"
-                      WHITESPACE@6559..6560 " "
-                      EXPR_SLICE@6560..6565
-                        EXPR_VAR@6560..6561
-                          NAME@6560..6561
-                            IDENT@6560..6561 "a"
-                        SLICE_DESC@6561..6565
-                          L_BRACK@6561..6562 "["
-                          EXPR_VAR@6562..6563
-                            NAME@6562..6563
-                              IDENT@6562..6563 "i"
-                          COLON@6563..6564 ":"
-                          R_BRACK@6564..6565 "]"
-                  WHITESPACE@6565..6572 "\n      "
-                  ELSE_KW@6572..6576 "else"
-                  WHITESPACE@6576..6585 "\n        "
-                  STMT_LOCAL@6585..6607
-                    LOCAL_KW@6585..6590 "local"
-                    WHITESPACE@6590..6591 " "
-                    BIND_DESTRUCT@6591..6606
-                      DESTRUCT_FULL@6591..6593
-                        NAME@6591..6593
-                          IDENT@6591..6593 "ak"
-                      WHITESPACE@6593..6594 " "
-                      ASSIGN@6594..6595 "="
-                      WHITESPACE@6595..6596 " "
-                      EXPR_APPLY@6596..6606
-                        EXPR_VAR@6596..6600
-                          NAME@6596..6600
-                            IDENT@6596..6600 "keyF"
-                        ARGS_DESC@6600..6606
-                          L_PAREN@6600..6601 "("
-                          ARG@6601..6605
-                            EXPR_INDEX_EXPR@6601..6605
-                              LHS_EXPR@6601..6602
-                                EXPR_VAR@6601..6602
-                                  NAME@6601..6602
-                                    IDENT@6601..6602 "a"
-                              L_BRACK@6602..6603 "["
-                              EXPR_VAR@6603..6604
-                                NAME@6603..6604
-                                  IDENT@6603..6604 "i"
-                              R_BRACK@6604..6605 "]"
-                          R_PAREN@6605..6606 ")"
-                    SEMI@6606..6607 ";"
-                  WHITESPACE@6607..6616 "\n        "
-                  STMT_LOCAL@6616..6638
-                    LOCAL_KW@6616..6621 "local"
-                    WHITESPACE@6621..6622 " "
-                    BIND_DESTRUCT@6622..6637
-                      DESTRUCT_FULL@6622..6624
-                        NAME@6622..6624
-                          IDENT@6622..6624 "bk"
-                      WHITESPACE@6624..6625 " "
-                      ASSIGN@6625..6626 "="
-                      WHITESPACE@6626..6627 " "
-                      EXPR_APPLY@6627..6637
-                        EXPR_VAR@6627..6631
-                          NAME@6627..6631
-                            IDENT@6627..6631 "keyF"
-                        ARGS_DESC@6631..6637
-                          L_PAREN@6631..6632 "("
-                          ARG@6632..6636
-                            EXPR_INDEX_EXPR@6632..6636
-                              LHS_EXPR@6632..6633
-                                EXPR_VAR@6632..6633
-                                  NAME@6632..6633
-                                    IDENT@6632..6633 "b"
-                              L_BRACK@6633..6634 "["
-                              EXPR_VAR@6634..6635
-                                NAME@6634..6635
-                                  IDENT@6634..6635 "j"
-                              R_BRACK@6635..6636 "]"
-                          R_PAREN@6636..6637 ")"
-                    SEMI@6637..6638 ";"
-                  WHITESPACE@6638..6647 "\n        "
-                  FALSE_EXPR@6647..6874
-                    EXPR_IF_THEN_ELSE@6647..6874
-                      IF_KW@6647..6649 "if"
-                      WHITESPACE@6649..6650 " "
-                      EXPR_BINARY@6650..6658
-                        LHS_EXPR@6650..6652
-                          EXPR_VAR@6650..6652
-                            NAME@6650..6652
-                              IDENT@6650..6652 "ak"
-                        WHITESPACE@6652..6653 " "
-                        EQ@6653..6655 "=="
-                        WHITESPACE@6655..6656 " "
-                        EXPR_VAR@6656..6658
-                          NAME@6656..6658
-                            IDENT@6656..6658 "bk"
-                      WHITESPACE@6658..6659 " "
-                      THEN_KW@6659..6663 "then"
-                      WHITESPACE@6663..6674 "\n          "
-                      TRUE_EXPR@6674..6722
-                        EXPR_APPLY@6674..6722
-                          EXPR_VAR@6674..6677
-                            NAME@6674..6677
-                              IDENT@6674..6677 "aux"
-                          ARGS_DESC@6677..6722
-                            L_PAREN@6677..6678 "("
-                            ARG@6678..6679
-                              EXPR_VAR@6678..6679
-                                NAME@6678..6679
-                                  IDENT@6678..6679 "a"
-                            COMMA@6679..6680 ","
-                            WHITESPACE@6680..6681 " "
-                            ARG@6681..6682
-                              EXPR_VAR@6681..6682
-                                NAME@6681..6682
-                                  IDENT@6681..6682 "b"
-                            COMMA@6682..6683 ","
-                            WHITESPACE@6683..6684 " "
-                            ARG@6684..6689
-                              EXPR_BINARY@6684..6689
-                                LHS_EXPR@6684..6685
-                                  EXPR_VAR@6684..6685
-                                    NAME@6684..6685
-                                      IDENT@6684..6685 "i"
-                                WHITESPACE@6685..6686 " "
-                                PLUS@6686..6687 "+"
-                                WHITESPACE@6687..6688 " "
-                                EXPR_NUMBER@6688..6689
-                                  FLOAT@6688..6689 "1"
-                            COMMA@6689..6690 ","
-                            WHITESPACE@6690..6691 " "
-                            ARG@6691..6696
-                              EXPR_BINARY@6691..6696
-                                LHS_EXPR@6691..6692
-                                  EXPR_VAR@6691..6692
-                                    NAME@6691..6692
-                                      IDENT@6691..6692 "j"
-                                WHITESPACE@6692..6693 " "
-                                PLUS@6693..6694 "+"
-                                WHITESPACE@6694..6695 " "
-                                EXPR_NUMBER@6695..6696
-                                  FLOAT@6695..6696 "1"
-                            COMMA@6696..6697 ","
-                            WHITESPACE@6697..6698 " "
-                            ARG@6698..6710
-                              EXPR_BINARY@6698..6710
-                                LHS_EXPR@6698..6701
-                                  EXPR_VAR@6698..6701
-                                    NAME@6698..6701
-                                      IDENT@6698..6701 "acc"
+              THEN_KW@3935..3939 "then"
+              WHITESPACE@3939..3946 "\n      "
+              TRUE_EXPR@3946..4014
+                EXPR@3946..4014
+                  EXPR_ERROR@3946..4014
+                    ERROR_KW@3946..3951 "error"
+                    WHITESPACE@3951..3952 " "
+                    EXPR@3952..4014
+                      EXPR_BINARY@3952..4014
+                        EXPR@3952..3996
+                          EXPR_STRING@3952..3996
+                            STRING_SINGLE@3952..3996 "'manifestYamlStream o ..."
+                        WHITESPACE@3996..3997 " "
+                        PLUS@3997..3998 "+"
+                        WHITESPACE@3998..3999 " "
+                        EXPR@3999..4014
+                          EXPR_VAR@3999..4002
+                            NAME@3999..4002
+                              IDENT@3999..4002 "std"
+                          SUFFIX_INDEX@4002..4007
+                            DOT@4002..4003 "."
+                            NAME@4003..4007
+                              IDENT@4003..4007 "type"
+                          SUFFIX_APPLY@4007..4014
+                            ARGS_DESC@4007..4014
+                              L_PAREN@4007..4008 "("
+                              ARG@4008..4013
+                                EXPR@4008..4013
+                                  EXPR_VAR@4008..4013
+                                    NAME@4008..4013
+                                      IDENT@4008..4013 "value"
+                              R_PAREN@4013..4014 ")"
+              WHITESPACE@4014..4019 "\n    "
+              ELSE_KW@4019..4023 "else"
+              WHITESPACE@4023..4030 "\n      "
+              FALSE_EXPR@4030..4197
+                EXPR@4030..4197
+                  EXPR_BINARY@4030..4197
+                    EXPR@4030..4152
+                      EXPR_BINARY@4030..4152
+                        EXPR@4030..4037
+                          EXPR_STRING@4030..4037
+                            STRING_SINGLE@4030..4037 "'---\\n'"
+                        WHITESPACE@4037..4038 " "
+                        PLUS@4038..4039 "+"
+                        WHITESPACE@4039..4040 " "
+                        EXPR@4040..4152
+                          EXPR_VAR@4040..4043
+                            NAME@4040..4043
+                              IDENT@4040..4043 "std"
+                          SUFFIX_INDEX@4043..4048
+                            DOT@4043..4044 "."
+                            NAME@4044..4048
+                              IDENT@4044..4048 "join"
+                          SUFFIX_APPLY@4048..4152
+                            ARGS_DESC@4048..4152
+                              L_PAREN@4048..4049 "("
+                              WHITESPACE@4049..4058 "\n        "
+                              ARG@4058..4067
+                                EXPR@4058..4067
+                                  EXPR_STRING@4058..4067
+                                    STRING_SINGLE@4058..4067 "'\\n---\\n'"
+                              COMMA@4067..4068 ","
+                              WHITESPACE@4068..4069 " "
+                              ARG@4069..4144
+                                EXPR@4069..4144
+                                  EXPR_ARRAY_COMP@4069..4144
+                                    L_BRACK@4069..4070 "["
+                                    EXPR@4070..4128
+                                      EXPR_VAR@4070..4073
+                                        NAME@4070..4073
+                                          IDENT@4070..4073 "std"
+                                      SUFFIX_INDEX@4073..4089
+                                        DOT@4073..4074 "."
+                                        NAME@4074..4089
+                                          IDENT@4074..4089 "manifestYamlDoc"
+                                      SUFFIX_APPLY@4089..4128
+                                        ARGS_DESC@4089..4128
+                                          L_PAREN@4089..4090 "("
+                                          ARG@4090..4091
+                                            EXPR@4090..4091
+                                              EXPR_VAR@4090..4091
+                                                NAME@4090..4091
+                                                  IDENT@4090..4091 "e"
+                                          COMMA@4091..4092 ","
+                                          WHITESPACE@4092..4093 " "
+                                          ARG@4093..4115
+                                            EXPR@4093..4115
+                                              EXPR_VAR@4093..4115
+                                                NAME@4093..4115
+                                                  IDENT@4093..4115 "indent_array_in_object"
+                                          COMMA@4115..4116 ","
+                                          WHITESPACE@4116..4117 " "
+                                          ARG@4117..4127
+                                            EXPR@4117..4127
+                                              EXPR_VAR@4117..4127
+                                                NAME@4117..4127
+                                                  IDENT@4117..4127 "quote_keys"
+                                          R_PAREN@4127..4128 ")"
+                                    WHITESPACE@4128..4129 " "
+                                    FOR_SPEC@4129..4143
+                                      FOR_KW@4129..4132 "for"
+                                      WHITESPACE@4132..4133 " "
+                                      DESTRUCT_FULL@4133..4134
+                                        NAME@4133..4134
+                                          IDENT@4133..4134 "e"
+                                      WHITESPACE@4134..4135 " "
+                                      IN_KW@4135..4137 "in"
+                                      WHITESPACE@4137..4138 " "
+                                      EXPR@4138..4143
+                                        EXPR_VAR@4138..4143
+                                          NAME@4138..4143
+                                            IDENT@4138..4143 "value"
+                                    R_BRACK@4143..4144 "]"
+                              WHITESPACE@4144..4151 "\n      "
+                              R_PAREN@4151..4152 ")"
+                    WHITESPACE@4152..4153 " "
+                    PLUS@4153..4154 "+"
+                    WHITESPACE@4154..4155 " "
+                    EXPR@4155..4197
+                      EXPR_IF_THEN_ELSE@4155..4197
+                        IF_KW@4155..4157 "if"
+                        WHITESPACE@4157..4158 " "
+                        EXPR@4158..4172
+                          EXPR_VAR@4158..4172
+                            NAME@4158..4172
+                              IDENT@4158..4172 "c_document_end"
+                        WHITESPACE@4172..4173 " "
+                        THEN_KW@4173..4177 "then"
+                        WHITESPACE@4177..4178 " "
+                        TRUE_EXPR@4178..4187
+                          EXPR@4178..4187
+                            EXPR_STRING@4178..4187
+                              STRING_SINGLE@4178..4187 "'\\n...\\n'"
+                        WHITESPACE@4187..4188 " "
+                        ELSE_KW@4188..4192 "else"
+                        WHITESPACE@4192..4193 " "
+                        FALSE_EXPR@4193..4197
+                          EXPR@4193..4197
+                            EXPR_STRING@4193..4197
+                              STRING_SINGLE@4193..4197 "'\\n'"
+        COMMA@4197..4198 ","
+        WHITESPACE@4198..4202 "\n\n  "
+        MEMBER_FIELD_METHOD@4202..4858
+          FIELD_NAME_FIXED@4202..4216
+            NAME@4202..4216
+              IDENT@4202..4216 "manifestPython"
+          PARAMS_DESC@4216..4219
+            L_PAREN@4216..4217 "("
+            PARAM@4217..4218
+              DESTRUCT_FULL@4217..4218
+                NAME@4217..4218
+                  IDENT@4217..4218 "v"
+            R_PAREN@4218..4219 ")"
+          COLONCOLON@4219..4221 "::"
+          WHITESPACE@4221..4226 "\n    "
+          EXPR@4226..4858
+            EXPR_IF_THEN_ELSE@4226..4858
+              IF_KW@4226..4228 "if"
+              WHITESPACE@4228..4229 " "
+              EXPR@4229..4244
+                EXPR_VAR@4229..4232
+                  NAME@4229..4232
+                    IDENT@4229..4232 "std"
+                SUFFIX_INDEX@4232..4241
+                  DOT@4232..4233 "."
+                  NAME@4233..4241
+                    IDENT@4233..4241 "isObject"
+                SUFFIX_APPLY@4241..4244
+                  ARGS_DESC@4241..4244
+                    L_PAREN@4241..4242 "("
+                    ARG@4242..4243
+                      EXPR@4242..4243
+                        EXPR_VAR@4242..4243
+                          NAME@4242..4243
+                            IDENT@4242..4243 "v"
+                    R_PAREN@4243..4244 ")"
+              WHITESPACE@4244..4245 " "
+              THEN_KW@4245..4249 "then"
+              WHITESPACE@4249..4256 "\n      "
+              TRUE_EXPR@4256..4431
+                EXPR@4256..4431
+                  STMT_LOCAL@4256..4391
+                    LOCAL_KW@4256..4261 "local"
+                    WHITESPACE@4261..4262 " "
+                    BIND_DESTRUCT@4262..4390
+                      DESTRUCT_FULL@4262..4268
+                        NAME@4262..4268
+                          IDENT@4262..4268 "fields"
+                      WHITESPACE@4268..4269 " "
+                      ASSIGN@4269..4270 "="
+                      WHITESPACE@4270..4271 " "
+                      EXPR@4271..4390
+                        EXPR_ARRAY_COMP@4271..4390
+                          L_BRACK@4271..4272 "["
+                          WHITESPACE@4272..4281 "\n        "
+                          EXPR@4281..4345
+                            EXPR_BINARY@4281..4345
+                              EXPR@4281..4289
+                                EXPR_STRING@4281..4289
+                                  STRING_SINGLE@4281..4289 "'%s: %s'"
+                              WHITESPACE@4289..4290 " "
+                              MODULO@4290..4291 "%"
+                              WHITESPACE@4291..4292 " "
+                              EXPR@4292..4345
+                                EXPR_ARRAY@4292..4345
+                                  L_BRACK@4292..4293 "["
+                                  EXPR@4293..4318
+                                    EXPR_VAR@4293..4296
+                                      NAME@4293..4296
+                                        IDENT@4293..4296 "std"
+                                    SUFFIX_INDEX@4296..4315
+                                      DOT@4296..4297 "."
+                                      NAME@4297..4315
+                                        IDENT@4297..4315 "escapeStringPython"
+                                    SUFFIX_APPLY@4315..4318
+                                      ARGS_DESC@4315..4318
+                                        L_PAREN@4315..4316 "("
+                                        ARG@4316..4317
+                                          EXPR@4316..4317
+                                            EXPR_VAR@4316..4317
+                                              NAME@4316..4317
+                                                IDENT@4316..4317 "k"
+                                        R_PAREN@4317..4318 ")"
+                                  COMMA@4318..4319 ","
+                                  WHITESPACE@4319..4320 " "
+                                  EXPR@4320..4344
+                                    EXPR_VAR@4320..4323
+                                      NAME@4320..4323
+                                        IDENT@4320..4323 "std"
+                                    SUFFIX_INDEX@4323..4338
+                                      DOT@4323..4324 "."
+                                      NAME@4324..4338
+                                        IDENT@4324..4338 "manifestPython"
+                                    SUFFIX_APPLY@4338..4344
+                                      ARGS_DESC@4338..4344
+                                        L_PAREN@4338..4339 "("
+                                        ARG@4339..4343
+                                          EXPR@4339..4343
+                                            EXPR_VAR@4339..4340
+                                              NAME@4339..4340
+                                                IDENT@4339..4340 "v"
+                                            SUFFIX_INDEX_EXPR@4340..4343
+                                              L_BRACK@4340..4341 "["
+                                              EXPR@4341..4342
+                                                EXPR_VAR@4341..4342
+                                                  NAME@4341..4342
+                                                    IDENT@4341..4342 "k"
+                                              R_BRACK@4342..4343 "]"
+                                        R_PAREN@4343..4344 ")"
+                                  R_BRACK@4344..4345 "]"
+                          WHITESPACE@4345..4354 "\n        "
+                          FOR_SPEC@4354..4382
+                            FOR_KW@4354..4357 "for"
+                            WHITESPACE@4357..4358 " "
+                            DESTRUCT_FULL@4358..4359
+                              NAME@4358..4359
+                                IDENT@4358..4359 "k"
+                            WHITESPACE@4359..4360 " "
+                            IN_KW@4360..4362 "in"
+                            WHITESPACE@4362..4363 " "
+                            EXPR@4363..4382
+                              EXPR_VAR@4363..4366
+                                NAME@4363..4366
+                                  IDENT@4363..4366 "std"
+                              SUFFIX_INDEX@4366..4379
+                                DOT@4366..4367 "."
+                                NAME@4367..4379
+                                  IDENT@4367..4379 "objectFields"
+                              SUFFIX_APPLY@4379..4382
+                                ARGS_DESC@4379..4382
+                                  L_PAREN@4379..4380 "("
+                                  ARG@4380..4381
+                                    EXPR@4380..4381
+                                      EXPR_VAR@4380..4381
+                                        NAME@4380..4381
+                                          IDENT@4380..4381 "v"
+                                  R_PAREN@4381..4382 ")"
+                          WHITESPACE@4382..4389 "\n      "
+                          R_BRACK@4389..4390 "]"
+                    SEMI@4390..4391 ";"
+                  WHITESPACE@4391..4398 "\n      "
+                  EXPR_BINARY@4398..4431
+                    EXPR@4398..4404
+                      EXPR_STRING@4398..4404
+                        STRING_SINGLE@4398..4404 "'{%s}'"
+                    WHITESPACE@4404..4405 " "
+                    MODULO@4405..4406 "%"
+                    WHITESPACE@4406..4407 " "
+                    EXPR@4407..4431
+                      EXPR_ARRAY@4407..4431
+                        L_BRACK@4407..4408 "["
+                        EXPR@4408..4430
+                          EXPR_VAR@4408..4411
+                            NAME@4408..4411
+                              IDENT@4408..4411 "std"
+                          SUFFIX_INDEX@4411..4416
+                            DOT@4411..4412 "."
+                            NAME@4412..4416
+                              IDENT@4412..4416 "join"
+                          SUFFIX_APPLY@4416..4430
+                            ARGS_DESC@4416..4430
+                              L_PAREN@4416..4417 "("
+                              ARG@4417..4421
+                                EXPR@4417..4421
+                                  EXPR_STRING@4417..4421
+                                    STRING_SINGLE@4417..4421 "', '"
+                              COMMA@4421..4422 ","
+                              WHITESPACE@4422..4423 " "
+                              ARG@4423..4429
+                                EXPR@4423..4429
+                                  EXPR_VAR@4423..4429
+                                    NAME@4423..4429
+                                      IDENT@4423..4429 "fields"
+                              R_PAREN@4429..4430 ")"
+                        R_BRACK@4430..4431 "]"
+              WHITESPACE@4431..4436 "\n    "
+              ELSE_KW@4436..4440 "else"
+              WHITESPACE@4440..4441 " "
+              FALSE_EXPR@4441..4858
+                EXPR@4441..4858
+                  EXPR_IF_THEN_ELSE@4441..4858
+                    IF_KW@4441..4443 "if"
+                    WHITESPACE@4443..4444 " "
+                    EXPR@4444..4458
+                      EXPR_VAR@4444..4447
+                        NAME@4444..4447
+                          IDENT@4444..4447 "std"
+                      SUFFIX_INDEX@4447..4455
+                        DOT@4447..4448 "."
+                        NAME@4448..4455
+                          IDENT@4448..4455 "isArray"
+                      SUFFIX_APPLY@4455..4458
+                        ARGS_DESC@4455..4458
+                          L_PAREN@4455..4456 "("
+                          ARG@4456..4457
+                            EXPR@4456..4457
+                              EXPR_VAR@4456..4457
+                                NAME@4456..4457
+                                  IDENT@4456..4457 "v"
+                          R_PAREN@4457..4458 ")"
+                    WHITESPACE@4458..4459 " "
+                    THEN_KW@4459..4463 "then"
+                    WHITESPACE@4463..4470 "\n      "
+                    TRUE_EXPR@4470..4533
+                      EXPR@4470..4533
+                        EXPR_BINARY@4470..4533
+                          EXPR@4470..4476
+                            EXPR_STRING@4470..4476
+                              STRING_SINGLE@4470..4476 "'[%s]'"
+                          WHITESPACE@4476..4477 " "
+                          MODULO@4477..4478 "%"
+                          WHITESPACE@4478..4479 " "
+                          EXPR@4479..4533
+                            EXPR_ARRAY@4479..4533
+                              L_BRACK@4479..4480 "["
+                              EXPR@4480..4532
+                                EXPR_VAR@4480..4483
+                                  NAME@4480..4483
+                                    IDENT@4480..4483 "std"
+                                SUFFIX_INDEX@4483..4488
+                                  DOT@4483..4484 "."
+                                  NAME@4484..4488
+                                    IDENT@4484..4488 "join"
+                                SUFFIX_APPLY@4488..4532
+                                  ARGS_DESC@4488..4532
+                                    L_PAREN@4488..4489 "("
+                                    ARG@4489..4493
+                                      EXPR@4489..4493
+                                        EXPR_STRING@4489..4493
+                                          STRING_SINGLE@4489..4493 "', '"
+                                    COMMA@4493..4494 ","
+                                    WHITESPACE@4494..4495 " "
+                                    ARG@4495..4531
+                                      EXPR@4495..4531
+                                        EXPR_ARRAY_COMP@4495..4531
+                                          L_BRACK@4495..4496 "["
+                                          EXPR@4496..4518
+                                            EXPR_VAR@4496..4499
+                                              NAME@4496..4499
+                                                IDENT@4496..4499 "std"
+                                            SUFFIX_INDEX@4499..4514
+                                              DOT@4499..4500 "."
+                                              NAME@4500..4514
+                                                IDENT@4500..4514 "manifestPython"
+                                            SUFFIX_APPLY@4514..4518
+                                              ARGS_DESC@4514..4518
+                                                L_PAREN@4514..4515 "("
+                                                ARG@4515..4517
+                                                  EXPR@4515..4517
+                                                    EXPR_VAR@4515..4517
+                                                      NAME@4515..4517
+                                                        IDENT@4515..4517 "v2"
+                                                R_PAREN@4517..4518 ")"
+                                          WHITESPACE@4518..4519 " "
+                                          FOR_SPEC@4519..4530
+                                            FOR_KW@4519..4522 "for"
+                                            WHITESPACE@4522..4523 " "
+                                            DESTRUCT_FULL@4523..4525
+                                              NAME@4523..4525
+                                                IDENT@4523..4525 "v2"
+                                            WHITESPACE@4525..4526 " "
+                                            IN_KW@4526..4528 "in"
+                                            WHITESPACE@4528..4529 " "
+                                            EXPR@4529..4530
+                                              EXPR_VAR@4529..4530
+                                                NAME@4529..4530
+                                                  IDENT@4529..4530 "v"
+                                          R_BRACK@4530..4531 "]"
+                                    R_PAREN@4531..4532 ")"
+                              R_BRACK@4532..4533 "]"
+                    WHITESPACE@4533..4538 "\n    "
+                    ELSE_KW@4538..4542 "else"
+                    WHITESPACE@4542..4543 " "
+                    FALSE_EXPR@4543..4858
+                      EXPR@4543..4858
+                        EXPR_IF_THEN_ELSE@4543..4858
+                          IF_KW@4543..4545 "if"
+                          WHITESPACE@4545..4546 " "
+                          EXPR@4546..4561
+                            EXPR_VAR@4546..4549
+                              NAME@4546..4549
+                                IDENT@4546..4549 "std"
+                            SUFFIX_INDEX@4549..4558
+                              DOT@4549..4550 "."
+                              NAME@4550..4558
+                                IDENT@4550..4558 "isString"
+                            SUFFIX_APPLY@4558..4561
+                              ARGS_DESC@4558..4561
+                                L_PAREN@4558..4559 "("
+                                ARG@4559..4560
+                                  EXPR@4559..4560
+                                    EXPR_VAR@4559..4560
+                                      NAME@4559..4560
+                                        IDENT@4559..4560 "v"
+                                R_PAREN@4560..4561 ")"
+                          WHITESPACE@4561..4562 " "
+                          THEN_KW@4562..4566 "then"
+                          WHITESPACE@4566..4573 "\n      "
+                          TRUE_EXPR@4573..4607
+                            EXPR@4573..4607
+                              EXPR_BINARY@4573..4607
+                                EXPR@4573..4577
+                                  EXPR_STRING@4573..4577
+                                    STRING_SINGLE@4573..4577 "'%s'"
+                                WHITESPACE@4577..4578 " "
+                                MODULO@4578..4579 "%"
+                                WHITESPACE@4579..4580 " "
+                                EXPR@4580..4607
+                                  EXPR_ARRAY@4580..4607
+                                    L_BRACK@4580..4581 "["
+                                    EXPR@4581..4606
+                                      EXPR_VAR@4581..4584
+                                        NAME@4581..4584
+                                          IDENT@4581..4584 "std"
+                                      SUFFIX_INDEX@4584..4603
+                                        DOT@4584..4585 "."
+                                        NAME@4585..4603
+                                          IDENT@4585..4603 "escapeStringPython"
+                                      SUFFIX_APPLY@4603..4606
+                                        ARGS_DESC@4603..4606
+                                          L_PAREN@4603..4604 "("
+                                          ARG@4604..4605
+                                            EXPR@4604..4605
+                                              EXPR_VAR@4604..4605
+                                                NAME@4604..4605
+                                                  IDENT@4604..4605 "v"
+                                          R_PAREN@4605..4606 ")"
+                                    R_BRACK@4606..4607 "]"
+                          WHITESPACE@4607..4612 "\n    "
+                          ELSE_KW@4612..4616 "else"
+                          WHITESPACE@4616..4617 " "
+                          FALSE_EXPR@4617..4858
+                            EXPR@4617..4858
+                              EXPR_IF_THEN_ELSE@4617..4858
+                                IF_KW@4617..4619 "if"
+                                WHITESPACE@4619..4620 " "
+                                EXPR@4620..4637
+                                  EXPR_VAR@4620..4623
+                                    NAME@4620..4623
+                                      IDENT@4620..4623 "std"
+                                  SUFFIX_INDEX@4623..4634
+                                    DOT@4623..4624 "."
+                                    NAME@4624..4634
+                                      IDENT@4624..4634 "isFunction"
+                                  SUFFIX_APPLY@4634..4637
+                                    ARGS_DESC@4634..4637
+                                      L_PAREN@4634..4635 "("
+                                      ARG@4635..4636
+                                        EXPR@4635..4636
+                                          EXPR_VAR@4635..4636
+                                            NAME@4635..4636
+                                              IDENT@4635..4636 "v"
+                                      R_PAREN@4636..4637 ")"
+                                WHITESPACE@4637..4638 " "
+                                THEN_KW@4638..4642 "then"
+                                WHITESPACE@4642..4649 "\n      "
+                                TRUE_EXPR@4649..4681
+                                  EXPR@4649..4681
+                                    EXPR_ERROR@4649..4681
+                                      ERROR_KW@4649..4654 "error"
+                                      WHITESPACE@4654..4655 " "
+                                      EXPR@4655..4681
+                                        EXPR_STRING@4655..4681
+                                          STRING_SINGLE@4655..4681 "'cannot manifest func ..."
+                                WHITESPACE@4681..4686 "\n    "
+                                ELSE_KW@4686..4690 "else"
+                                WHITESPACE@4690..4691 " "
+                                FALSE_EXPR@4691..4858
+                                  EXPR@4691..4858
+                                    EXPR_IF_THEN_ELSE@4691..4858
+                                      IF_KW@4691..4693 "if"
+                                      WHITESPACE@4693..4694 " "
+                                      EXPR@4694..4709
+                                        EXPR_VAR@4694..4697
+                                          NAME@4694..4697
+                                            IDENT@4694..4697 "std"
+                                        SUFFIX_INDEX@4697..4706
+                                          DOT@4697..4698 "."
+                                          NAME@4698..4706
+                                            IDENT@4698..4706 "isNumber"
+                                        SUFFIX_APPLY@4706..4709
+                                          ARGS_DESC@4706..4709
+                                            L_PAREN@4706..4707 "("
+                                            ARG@4707..4708
+                                              EXPR@4707..4708
+                                                EXPR_VAR@4707..4708
+                                                  NAME@4707..4708
+                                                    IDENT@4707..4708 "v"
+                                            R_PAREN@4708..4709 ")"
+                                      WHITESPACE@4709..4710 " "
+                                      THEN_KW@4710..4714 "then"
+                                      WHITESPACE@4714..4721 "\n      "
+                                      TRUE_EXPR@4721..4736
+                                        EXPR@4721..4736
+                                          EXPR_VAR@4721..4724
+                                            NAME@4721..4724
+                                              IDENT@4721..4724 "std"
+                                          SUFFIX_INDEX@4724..4733
+                                            DOT@4724..4725 "."
+                                            NAME@4725..4733
+                                              IDENT@4725..4733 "toString"
+                                          SUFFIX_APPLY@4733..4736
+                                            ARGS_DESC@4733..4736
+                                              L_PAREN@4733..4734 "("
+                                              ARG@4734..4735
+                                                EXPR@4734..4735
+                                                  EXPR_VAR@4734..4735
+                                                    NAME@4734..4735
+                                                      IDENT@4734..4735 "v"
+                                              R_PAREN@4735..4736 ")"
+                                      WHITESPACE@4736..4741 "\n    "
+                                      ELSE_KW@4741..4745 "else"
+                                      WHITESPACE@4745..4746 " "
+                                      FALSE_EXPR@4746..4858
+                                        EXPR@4746..4858
+                                          EXPR_IF_THEN_ELSE@4746..4858
+                                            IF_KW@4746..4748 "if"
+                                            WHITESPACE@4748..4749 " "
+                                            EXPR@4749..4758
+                                              EXPR_BINARY@4749..4758
+                                                EXPR@4749..4750
+                                                  EXPR_VAR@4749..4750
+                                                    NAME@4749..4750
+                                                      IDENT@4749..4750 "v"
+                                                WHITESPACE@4750..4751 " "
+                                                EQ@4751..4753 "=="
+                                                WHITESPACE@4753..4754 " "
+                                                EXPR@4754..4758
+                                                  EXPR_LITERAL@4754..4758
+                                                    TRUE_KW@4754..4758 "true"
+                                            WHITESPACE@4758..4759 " "
+                                            THEN_KW@4759..4763 "then"
+                                            WHITESPACE@4763..4770 "\n      "
+                                            TRUE_EXPR@4770..4776
+                                              EXPR@4770..4776
+                                                EXPR_STRING@4770..4776
+                                                  STRING_SINGLE@4770..4776 "'True'"
+                                            WHITESPACE@4776..4781 "\n    "
+                                            ELSE_KW@4781..4785 "else"
+                                            WHITESPACE@4785..4786 " "
+                                            FALSE_EXPR@4786..4858
+                                              EXPR@4786..4858
+                                                EXPR_IF_THEN_ELSE@4786..4858
+                                                  IF_KW@4786..4788 "if"
+                                                  WHITESPACE@4788..4789 " "
+                                                  EXPR@4789..4799
+                                                    EXPR_BINARY@4789..4799
+                                                      EXPR@4789..4790
+                                                        EXPR_VAR@4789..4790
+                                                          NAME@4789..4790
+                                                            IDENT@4789..4790 "v"
+                                                      WHITESPACE@4790..4791 " "
+                                                      EQ@4791..4793 "=="
+                                                      WHITESPACE@4793..4794 " "
+                                                      EXPR@4794..4799
+                                                        EXPR_LITERAL@4794..4799
+                                                          FALSE_KW@4794..4799 "false"
+                                                  WHITESPACE@4799..4800 " "
+                                                  THEN_KW@4800..4804 "then"
+                                                  WHITESPACE@4804..4811 "\n      "
+                                                  TRUE_EXPR@4811..4818
+                                                    EXPR@4811..4818
+                                                      EXPR_STRING@4811..4818
+                                                        STRING_SINGLE@4811..4818 "'False'"
+                                                  WHITESPACE@4818..4823 "\n    "
+                                                  ELSE_KW@4823..4827 "else"
+                                                  WHITESPACE@4827..4828 " "
+                                                  FALSE_EXPR@4828..4858
+                                                    EXPR@4828..4858
+                                                      EXPR_IF_THEN_ELSE@4828..4858
+                                                        IF_KW@4828..4830 "if"
+                                                        WHITESPACE@4830..4831 " "
+                                                        EXPR@4831..4840
+                                                          EXPR_BINARY@4831..4840
+                                                            EXPR@4831..4832
+                                                              EXPR_VAR@4831..4832
+                                                                NAME@4831..4832
+                                                                  IDENT@4831..4832 "v"
+                                                            WHITESPACE@4832..4833 " "
+                                                            EQ@4833..4835 "=="
+                                                            WHITESPACE@4835..4836 " "
+                                                            EXPR@4836..4840
+                                                              EXPR_LITERAL@4836..4840
+                                                                NULL_KW@4836..4840 "null"
+                                                        WHITESPACE@4840..4841 " "
+                                                        THEN_KW@4841..4845 "then"
+                                                        WHITESPACE@4845..4852 "\n      "
+                                                        TRUE_EXPR@4852..4858
+                                                          EXPR@4852..4858
+                                                            EXPR_STRING@4852..4858
+                                                              STRING_SINGLE@4852..4858 "'None'"
+        COMMA@4858..4859 ","
+        WHITESPACE@4859..4863 "\n\n  "
+        MEMBER_FIELD_METHOD@4863..5018
+          FIELD_NAME_FIXED@4863..4881
+            NAME@4863..4881
+              IDENT@4863..4881 "manifestPythonVars"
+          PARAMS_DESC@4881..4887
+            L_PAREN@4881..4882 "("
+            PARAM@4882..4886
+              DESTRUCT_FULL@4882..4886
+                NAME@4882..4886
+                  IDENT@4882..4886 "conf"
+            R_PAREN@4886..4887 ")"
+          COLONCOLON@4887..4889 "::"
+          WHITESPACE@4889..4894 "\n    "
+          EXPR@4894..5018
+            STMT_LOCAL@4894..4986
+              LOCAL_KW@4894..4899 "local"
+              WHITESPACE@4899..4900 " "
+              BIND_DESTRUCT@4900..4985
+                DESTRUCT_FULL@4900..4904
+                  NAME@4900..4904
+                    IDENT@4900..4904 "vars"
+                WHITESPACE@4904..4905 " "
+                ASSIGN@4905..4906 "="
+                WHITESPACE@4906..4907 " "
+                EXPR@4907..4985
+                  EXPR_ARRAY_COMP@4907..4985
+                    L_BRACK@4907..4908 "["
+                    EXPR@4908..4952
+                      EXPR_BINARY@4908..4952
+                        EXPR@4908..4917
+                          EXPR_STRING@4908..4917
+                            STRING_SINGLE@4908..4917 "'%s = %s'"
+                        WHITESPACE@4917..4918 " "
+                        MODULO@4918..4919 "%"
+                        WHITESPACE@4919..4920 " "
+                        EXPR@4920..4952
+                          EXPR_ARRAY@4920..4952
+                            L_BRACK@4920..4921 "["
+                            EXPR@4921..4922
+                              EXPR_VAR@4921..4922
+                                NAME@4921..4922
+                                  IDENT@4921..4922 "k"
+                            COMMA@4922..4923 ","
+                            WHITESPACE@4923..4924 " "
+                            EXPR@4924..4951
+                              EXPR_VAR@4924..4927
+                                NAME@4924..4927
+                                  IDENT@4924..4927 "std"
+                              SUFFIX_INDEX@4927..4942
+                                DOT@4927..4928 "."
+                                NAME@4928..4942
+                                  IDENT@4928..4942 "manifestPython"
+                              SUFFIX_APPLY@4942..4951
+                                ARGS_DESC@4942..4951
+                                  L_PAREN@4942..4943 "("
+                                  ARG@4943..4950
+                                    EXPR@4943..4950
+                                      EXPR_VAR@4943..4947
+                                        NAME@4943..4947
+                                          IDENT@4943..4947 "conf"
+                                      SUFFIX_INDEX_EXPR@4947..4950
+                                        L_BRACK@4947..4948 "["
+                                        EXPR@4948..4949
+                                          EXPR_VAR@4948..4949
+                                            NAME@4948..4949
+                                              IDENT@4948..4949 "k"
+                                        R_BRACK@4949..4950 "]"
+                                  R_PAREN@4950..4951 ")"
+                            R_BRACK@4951..4952 "]"
+                    WHITESPACE@4952..4953 " "
+                    FOR_SPEC@4953..4984
+                      FOR_KW@4953..4956 "for"
+                      WHITESPACE@4956..4957 " "
+                      DESTRUCT_FULL@4957..4958
+                        NAME@4957..4958
+                          IDENT@4957..4958 "k"
+                      WHITESPACE@4958..4959 " "
+                      IN_KW@4959..4961 "in"
+                      WHITESPACE@4961..4962 " "
+                      EXPR@4962..4984
+                        EXPR_VAR@4962..4965
+                          NAME@4962..4965
+                            IDENT@4962..4965 "std"
+                        SUFFIX_INDEX@4965..4978
+                          DOT@4965..4966 "."
+                          NAME@4966..4978
+                            IDENT@4966..4978 "objectFields"
+                        SUFFIX_APPLY@4978..4984
+                          ARGS_DESC@4978..4984
+                            L_PAREN@4978..4979 "("
+                            ARG@4979..4983
+                              EXPR@4979..4983
+                                EXPR_VAR@4979..4983
+                                  NAME@4979..4983
+                                    IDENT@4979..4983 "conf"
+                            R_PAREN@4983..4984 ")"
+                    R_BRACK@4984..4985 "]"
+              SEMI@4985..4986 ";"
+            WHITESPACE@4986..4991 "\n    "
+            EXPR_VAR@4991..4994
+              NAME@4991..4994
+                IDENT@4991..4994 "std"
+            SUFFIX_INDEX@4994..4999
+              DOT@4994..4995 "."
+              NAME@4995..4999
+                IDENT@4995..4999 "join"
+            SUFFIX_APPLY@4999..5018
+              ARGS_DESC@4999..5018
+                L_PAREN@4999..5000 "("
+                ARG@5000..5004
+                  EXPR@5000..5004
+                    EXPR_STRING@5000..5004
+                      STRING_SINGLE@5000..5004 "'\\n'"
+                COMMA@5004..5005 ","
+                WHITESPACE@5005..5006 " "
+                ARG@5006..5017
+                  EXPR@5006..5017
+                    EXPR_BINARY@5006..5017
+                      EXPR@5006..5010
+                        EXPR_VAR@5006..5010
+                          NAME@5006..5010
+                            IDENT@5006..5010 "vars"
+                      WHITESPACE@5010..5011 " "
+                      PLUS@5011..5012 "+"
+                      WHITESPACE@5012..5013 " "
+                      EXPR@5013..5017
+                        EXPR_ARRAY@5013..5017
+                          L_BRACK@5013..5014 "["
+                          EXPR@5014..5016
+                            EXPR_STRING@5014..5016
+                              STRING_SINGLE@5014..5016 "''"
+                          R_BRACK@5016..5017 "]"
+                R_PAREN@5017..5018 ")"
+        COMMA@5018..5019 ","
+        WHITESPACE@5019..5023 "\n\n  "
+        MEMBER_FIELD_METHOD@5023..5690
+          FIELD_NAME_FIXED@5023..5040
+            NAME@5023..5040
+              IDENT@5023..5040 "manifestXmlJsonml"
+          PARAMS_DESC@5040..5047
+            L_PAREN@5040..5041 "("
+            PARAM@5041..5046
+              DESTRUCT_FULL@5041..5046
+                NAME@5041..5046
+                  IDENT@5041..5046 "value"
+            R_PAREN@5046..5047 ")"
+          COLONCOLON@5047..5049 "::"
+          WHITESPACE@5049..5054 "\n    "
+          EXPR@5054..5690
+            EXPR_IF_THEN_ELSE@5054..5690
+              IF_KW@5054..5056 "if"
+              WHITESPACE@5056..5057 " "
+              EXPR@5057..5076
+                EXPR_UNARY@5057..5076
+                  NOT@5057..5058 "!"
+                  EXPR_VAR@5058..5061
+                    NAME@5058..5061
+                      IDENT@5058..5061 "std"
+                  SUFFIX_INDEX@5061..5069
+                    DOT@5061..5062 "."
+                    NAME@5062..5069
+                      IDENT@5062..5069 "isArray"
+                  SUFFIX_APPLY@5069..5076
+                    ARGS_DESC@5069..5076
+                      L_PAREN@5069..5070 "("
+                      ARG@5070..5075
+                        EXPR@5070..5075
+                          EXPR_VAR@5070..5075
+                            NAME@5070..5075
+                              IDENT@5070..5075 "value"
+                      R_PAREN@5075..5076 ")"
+              WHITESPACE@5076..5077 " "
+              THEN_KW@5077..5081 "then"
+              WHITESPACE@5081..5088 "\n      "
+              TRUE_EXPR@5088..5156
+                EXPR@5088..5156
+                  EXPR_ERROR@5088..5156
+                    ERROR_KW@5088..5093 "error"
+                    WHITESPACE@5093..5094 " "
+                    EXPR@5094..5156
+                      EXPR_BINARY@5094..5156
+                        EXPR@5094..5138
+                          EXPR_STRING@5094..5138
+                            STRING_SINGLE@5094..5138 "'Expected a JSONML va ..."
+                        WHITESPACE@5138..5139 " "
+                        MODULO@5139..5140 "%"
+                        WHITESPACE@5140..5141 " "
+                        EXPR@5141..5156
+                          EXPR_VAR@5141..5144
+                            NAME@5141..5144
+                              IDENT@5141..5144 "std"
+                          SUFFIX_INDEX@5144..5149
+                            DOT@5144..5145 "."
+                            NAME@5145..5149
+                              IDENT@5145..5149 "type"
+                          SUFFIX_APPLY@5149..5156
+                            ARGS_DESC@5149..5156
+                              L_PAREN@5149..5150 "("
+                              ARG@5150..5155
+                                EXPR@5150..5155
+                                  EXPR_VAR@5150..5155
+                                    NAME@5150..5155
+                                      IDENT@5150..5155 "value"
+                              R_PAREN@5155..5156 ")"
+              WHITESPACE@5156..5161 "\n    "
+              ELSE_KW@5161..5165 "else"
+              WHITESPACE@5165..5172 "\n      "
+              FALSE_EXPR@5172..5690
+                EXPR@5172..5690
+                  STMT_LOCAL@5172..5672
+                    LOCAL_KW@5172..5177 "local"
+                    WHITESPACE@5177..5178 " "
+                    BIND_FUNCTION@5178..5671
+                      NAME@5178..5181
+                        IDENT@5178..5181 "aux"
+                      PARAMS_DESC@5181..5184
+                        L_PAREN@5181..5182 "("
+                        PARAM@5182..5183
+                          DESTRUCT_FULL@5182..5183
+                            NAME@5182..5183
+                              IDENT@5182..5183 "v"
+                        R_PAREN@5183..5184 ")"
+                      WHITESPACE@5184..5185 " "
+                      ASSIGN@5185..5186 "="
+                      WHITESPACE@5186..5195 "\n        "
+                      EXPR@5195..5671
+                        EXPR_IF_THEN_ELSE@5195..5671
+                          IF_KW@5195..5197 "if"
+                          WHITESPACE@5197..5198 " "
+                          EXPR@5198..5213
+                            EXPR_VAR@5198..5201
+                              NAME@5198..5201
+                                IDENT@5198..5201 "std"
+                            SUFFIX_INDEX@5201..5210
+                              DOT@5201..5202 "."
+                              NAME@5202..5210
+                                IDENT@5202..5210 "isString"
+                            SUFFIX_APPLY@5210..5213
+                              ARGS_DESC@5210..5213
+                                L_PAREN@5210..5211 "("
+                                ARG@5211..5212
+                                  EXPR@5211..5212
+                                    EXPR_VAR@5211..5212
+                                      NAME@5211..5212
+                                        IDENT@5211..5212 "v"
+                                R_PAREN@5212..5213 ")"
+                          WHITESPACE@5213..5214 " "
+                          THEN_KW@5214..5218 "then"
+                          WHITESPACE@5218..5229 "\n          "
+                          TRUE_EXPR@5229..5230
+                            EXPR@5229..5230
+                              EXPR_VAR@5229..5230
+                                NAME@5229..5230
+                                  IDENT@5229..5230 "v"
+                          WHITESPACE@5230..5239 "\n        "
+                          ELSE_KW@5239..5243 "else"
+                          WHITESPACE@5243..5254 "\n          "
+                          FALSE_EXPR@5254..5671
+                            EXPR@5254..5671
+                              STMT_LOCAL@5254..5271
+                                LOCAL_KW@5254..5259 "local"
+                                WHITESPACE@5259..5260 " "
+                                BIND_DESTRUCT@5260..5270
+                                  DESTRUCT_FULL@5260..5263
+                                    NAME@5260..5263
+                                      IDENT@5260..5263 "tag"
+                                  WHITESPACE@5263..5264 " "
+                                  ASSIGN@5264..5265 "="
+                                  WHITESPACE@5265..5266 " "
+                                  EXPR@5266..5270
+                                    EXPR_VAR@5266..5267
+                                      NAME@5266..5267
+                                        IDENT@5266..5267 "v"
+                                    SUFFIX_INDEX_EXPR@5267..5270
+                                      L_BRACK@5267..5268 "["
+                                      EXPR@5268..5269
+                                        EXPR_NUMBER@5268..5269
+                                          FLOAT@5268..5269 "0"
+                                      R_BRACK@5269..5270 "]"
+                                SEMI@5270..5271 ";"
+                              WHITESPACE@5271..5282 "\n          "
+                              STMT_LOCAL@5282..5340
+                                LOCAL_KW@5282..5287 "local"
+                                WHITESPACE@5287..5288 " "
+                                BIND_DESTRUCT@5288..5339
+                                  DESTRUCT_FULL@5288..5297
+                                    NAME@5288..5297
+                                      IDENT@5288..5297 "has_attrs"
+                                  WHITESPACE@5297..5298 " "
+                                  ASSIGN@5298..5299 "="
+                                  WHITESPACE@5299..5300 " "
+                                  EXPR@5300..5339
+                                    EXPR_BINARY@5300..5339
+                                      EXPR@5300..5317
+                                        EXPR_BINARY@5300..5317
+                                          EXPR@5300..5303
+                                            EXPR_VAR@5300..5303
+                                              NAME@5300..5303
+                                                IDENT@5300..5303 "std"
+                                          SUFFIX_INDEX@5303..5310
+                                            DOT@5303..5304 "."
+                                            NAME@5304..5310
+                                              IDENT@5304..5310 "length"
+                                          SUFFIX_APPLY@5310..5313
+                                            ARGS_DESC@5310..5313
+                                              L_PAREN@5310..5311 "("
+                                              ARG@5311..5312
+                                                EXPR@5311..5312
+                                                  EXPR_VAR@5311..5312
+                                                    NAME@5311..5312
+                                                      IDENT@5311..5312 "v"
+                                              R_PAREN@5312..5313 ")"
+                                          WHITESPACE@5313..5314 " "
+                                          GT@5314..5315 ">"
+                                          WHITESPACE@5315..5316 " "
+                                          EXPR@5316..5317
+                                            EXPR_NUMBER@5316..5317
+                                              FLOAT@5316..5317 "1"
+                                      WHITESPACE@5317..5318 " "
+                                      AND@5318..5320 "&&"
+                                      WHITESPACE@5320..5321 " "
+                                      EXPR@5321..5339
+                                        EXPR_VAR@5321..5324
+                                          NAME@5321..5324
+                                            IDENT@5321..5324 "std"
+                                        SUFFIX_INDEX@5324..5333
+                                          DOT@5324..5325 "."
+                                          NAME@5325..5333
+                                            IDENT@5325..5333 "isObject"
+                                        SUFFIX_APPLY@5333..5339
+                                          ARGS_DESC@5333..5339
+                                            L_PAREN@5333..5334 "("
+                                            ARG@5334..5338
+                                              EXPR@5334..5338
+                                                EXPR_VAR@5334..5335
+                                                  NAME@5334..5335
+                                                    IDENT@5334..5335 "v"
+                                                SUFFIX_INDEX_EXPR@5335..5338
+                                                  L_BRACK@5335..5336 "["
+                                                  EXPR@5336..5337
+                                                    EXPR_NUMBER@5336..5337
+                                                      FLOAT@5336..5337 "1"
+                                                  R_BRACK@5337..5338 "]"
+                                            R_PAREN@5338..5339 ")"
+                                SEMI@5339..5340 ";"
+                              WHITESPACE@5340..5351 "\n          "
+                              STMT_LOCAL@5351..5396
+                                LOCAL_KW@5351..5356 "local"
+                                WHITESPACE@5356..5357 " "
+                                BIND_DESTRUCT@5357..5395
+                                  DESTRUCT_FULL@5357..5362
+                                    NAME@5357..5362
+                                      IDENT@5357..5362 "attrs"
+                                  WHITESPACE@5362..5363 " "
+                                  ASSIGN@5363..5364 "="
+                                  WHITESPACE@5364..5365 " "
+                                  EXPR@5365..5395
+                                    EXPR_IF_THEN_ELSE@5365..5395
+                                      IF_KW@5365..5367 "if"
+                                      WHITESPACE@5367..5368 " "
+                                      EXPR@5368..5377
+                                        EXPR_VAR@5368..5377
+                                          NAME@5368..5377
+                                            IDENT@5368..5377 "has_attrs"
+                                      WHITESPACE@5377..5378 " "
+                                      THEN_KW@5378..5382 "then"
+                                      WHITESPACE@5382..5383 " "
+                                      TRUE_EXPR@5383..5387
+                                        EXPR@5383..5387
+                                          EXPR_VAR@5383..5384
+                                            NAME@5383..5384
+                                              IDENT@5383..5384 "v"
+                                          SUFFIX_INDEX_EXPR@5384..5387
+                                            L_BRACK@5384..5385 "["
+                                            EXPR@5385..5386
+                                              EXPR_NUMBER@5385..5386
+                                                FLOAT@5385..5386 "1"
+                                            R_BRACK@5386..5387 "]"
+                                      WHITESPACE@5387..5388 " "
+                                      ELSE_KW@5388..5392 "else"
+                                      WHITESPACE@5392..5393 " "
+                                      FALSE_EXPR@5393..5395
+                                        EXPR@5393..5395
+                                          EXPR_OBJECT@5393..5395
+                                            OBJ_BODY_MEMBER_LIST@5393..5395
+                                              L_BRACE@5393..5394 "{"
+                                              R_BRACE@5394..5395 "}"
+                                SEMI@5395..5396 ";"
+                              WHITESPACE@5396..5407 "\n          "
+                              STMT_LOCAL@5407..5459
+                                LOCAL_KW@5407..5412 "local"
+                                WHITESPACE@5412..5413 " "
+                                BIND_DESTRUCT@5413..5458
+                                  DESTRUCT_FULL@5413..5421
+                                    NAME@5413..5421
+                                      IDENT@5413..5421 "children"
+                                  WHITESPACE@5421..5422 " "
+                                  ASSIGN@5422..5423 "="
+                                  WHITESPACE@5423..5424 " "
+                                  EXPR@5424..5458
+                                    EXPR_IF_THEN_ELSE@5424..5458
+                                      IF_KW@5424..5426 "if"
+                                      WHITESPACE@5426..5427 " "
+                                      EXPR@5427..5436
+                                        EXPR_VAR@5427..5436
+                                          NAME@5427..5436
+                                            IDENT@5427..5436 "has_attrs"
+                                      WHITESPACE@5436..5437 " "
+                                      THEN_KW@5437..5441 "then"
+                                      WHITESPACE@5441..5442 " "
+                                      TRUE_EXPR@5442..5447
+                                        EXPR@5442..5447
+                                          EXPR_VAR@5442..5443
+                                            NAME@5442..5443
+                                              IDENT@5442..5443 "v"
+                                          SUFFIX_SLICE@5443..5447
+                                            SLICE_DESC@5443..5447
+                                              L_BRACK@5443..5444 "["
+                                              EXPR@5444..5445
+                                                EXPR_NUMBER@5444..5445
+                                                  FLOAT@5444..5445 "2"
+                                              COLON@5445..5446 ":"
+                                              R_BRACK@5446..5447 "]"
+                                      WHITESPACE@5447..5448 " "
+                                      ELSE_KW@5448..5452 "else"
+                                      WHITESPACE@5452..5453 " "
+                                      FALSE_EXPR@5453..5458
+                                        EXPR@5453..5458
+                                          EXPR_VAR@5453..5454
+                                            NAME@5453..5454
+                                              IDENT@5453..5454 "v"
+                                          SUFFIX_SLICE@5454..5458
+                                            SLICE_DESC@5454..5458
+                                              L_BRACK@5454..5455 "["
+                                              EXPR@5455..5456
+                                                EXPR_NUMBER@5455..5456
+                                                  FLOAT@5455..5456 "1"
+                                              COLON@5456..5457 ":"
+                                              R_BRACK@5457..5458 "]"
+                                SEMI@5458..5459 ";"
+                              WHITESPACE@5459..5470 "\n          "
+                              STMT_LOCAL@5470..5576
+                                LOCAL_KW@5470..5475 "local"
+                                WHITESPACE@5475..5476 " "
+                                BIND_DESTRUCT@5476..5575
+                                  DESTRUCT_FULL@5476..5485
+                                    NAME@5476..5485
+                                      IDENT@5476..5485 "attrs_str"
+                                  WHITESPACE@5485..5486 " "
+                                  ASSIGN@5486..5487 "="
+                                  WHITESPACE@5487..5500 "\n            "
+                                  EXPR@5500..5575
+                                    EXPR_VAR@5500..5503
+                                      NAME@5500..5503
+                                        IDENT@5500..5503 "std"
+                                    SUFFIX_INDEX@5503..5508
+                                      DOT@5503..5504 "."
+                                      NAME@5504..5508
+                                        IDENT@5504..5508 "join"
+                                    SUFFIX_APPLY@5508..5575
+                                      ARGS_DESC@5508..5575
+                                        L_PAREN@5508..5509 "("
+                                        ARG@5509..5511
+                                          EXPR@5509..5511
+                                            EXPR_STRING@5509..5511
+                                              STRING_SINGLE@5509..5511 "''"
+                                        COMMA@5511..5512 ","
+                                        WHITESPACE@5512..5513 " "
+                                        ARG@5513..5574
+                                          EXPR@5513..5574
+                                            EXPR_ARRAY_COMP@5513..5574
+                                              L_BRACK@5513..5514 "["
+                                              EXPR@5514..5540
+                                                EXPR_BINARY@5514..5540
+                                                  EXPR@5514..5524
+                                                    EXPR_STRING@5514..5524
+                                                      STRING_SINGLE@5514..5524 "' %s=\"%s\"'"
+                                                  WHITESPACE@5524..5525 " "
+                                                  MODULO@5525..5526 "%"
+                                                  WHITESPACE@5526..5527 " "
+                                                  EXPR@5527..5540
+                                                    EXPR_ARRAY@5527..5540
+                                                      L_BRACK@5527..5528 "["
+                                                      EXPR@5528..5529
+                                                        EXPR_VAR@5528..5529
+                                                          NAME@5528..5529
+                                                            IDENT@5528..5529 "k"
+                                                      COMMA@5529..5530 ","
+                                                      WHITESPACE@5530..5531 " "
+                                                      EXPR@5531..5539
+                                                        EXPR_VAR@5531..5536
+                                                          NAME@5531..5536
+                                                            IDENT@5531..5536 "attrs"
+                                                        SUFFIX_INDEX_EXPR@5536..5539
+                                                          L_BRACK@5536..5537 "["
+                                                          EXPR@5537..5538
+                                                            EXPR_VAR@5537..5538
+                                                              NAME@5537..5538
+                                                                IDENT@5537..5538 "k"
+                                                          R_BRACK@5538..5539 "]"
+                                                      R_BRACK@5539..5540 "]"
+                                              WHITESPACE@5540..5541 " "
+                                              FOR_SPEC@5541..5573
+                                                FOR_KW@5541..5544 "for"
+                                                WHITESPACE@5544..5545 " "
+                                                DESTRUCT_FULL@5545..5546
+                                                  NAME@5545..5546
+                                                    IDENT@5545..5546 "k"
+                                                WHITESPACE@5546..5547 " "
+                                                IN_KW@5547..5549 "in"
+                                                WHITESPACE@5549..5550 " "
+                                                EXPR@5550..5573
+                                                  EXPR_VAR@5550..5553
+                                                    NAME@5550..5553
+                                                      IDENT@5550..5553 "std"
+                                                  SUFFIX_INDEX@5553..5566
+                                                    DOT@5553..5554 "."
+                                                    NAME@5554..5566
+                                                      IDENT@5554..5566 "objectFields"
+                                                  SUFFIX_APPLY@5566..5573
+                                                    ARGS_DESC@5566..5573
+                                                      L_PAREN@5566..5567 "("
+                                                      ARG@5567..5572
+                                                        EXPR@5567..5572
+                                                          EXPR_VAR@5567..5572
+                                                            NAME@5567..5572
+                                                              IDENT@5567..5572 "attrs"
+                                                      R_PAREN@5572..5573 ")"
+                                              R_BRACK@5573..5574 "]"
+                                        R_PAREN@5574..5575 ")"
+                                SEMI@5575..5576 ";"
+                              WHITESPACE@5576..5587 "\n          "
+                              EXPR_VAR@5587..5590
+                                NAME@5587..5590
+                                  IDENT@5587..5590 "std"
+                              SUFFIX_INDEX@5590..5599
+                                DOT@5590..5591 "."
+                                NAME@5591..5599
+                                  IDENT@5591..5599 "deepJoin"
+                              SUFFIX_APPLY@5599..5671
+                                ARGS_DESC@5599..5671
+                                  L_PAREN@5599..5600 "("
+                                  ARG@5600..5670
+                                    EXPR@5600..5670
+                                      EXPR_ARRAY@5600..5670
+                                        L_BRACK@5600..5601 "["
+                                        EXPR@5601..5604
+                                          EXPR_STRING@5601..5604
+                                            STRING_SINGLE@5601..5604 "'<'"
+                                        COMMA@5604..5605 ","
+                                        WHITESPACE@5605..5606 " "
+                                        EXPR@5606..5609
+                                          EXPR_VAR@5606..5609
+                                            NAME@5606..5609
+                                              IDENT@5606..5609 "tag"
+                                        COMMA@5609..5610 ","
+                                        WHITESPACE@5610..5611 " "
+                                        EXPR@5611..5620
+                                          EXPR_VAR@5611..5620
+                                            NAME@5611..5620
+                                              IDENT@5611..5620 "attrs_str"
+                                        COMMA@5620..5621 ","
+                                        WHITESPACE@5621..5622 " "
+                                        EXPR@5622..5625
+                                          EXPR_STRING@5622..5625
+                                            STRING_SINGLE@5622..5625 "'>'"
+                                        COMMA@5625..5626 ","
+                                        WHITESPACE@5626..5627 " "
+                                        EXPR@5627..5653
+                                          EXPR_ARRAY_COMP@5627..5653
+                                            L_BRACK@5627..5628 "["
+                                            EXPR@5628..5634
+                                              EXPR_VAR@5628..5631
+                                                NAME@5628..5631
+                                                  IDENT@5628..5631 "aux"
+                                              SUFFIX_APPLY@5631..5634
+                                                ARGS_DESC@5631..5634
+                                                  L_PAREN@5631..5632 "("
+                                                  ARG@5632..5633
+                                                    EXPR@5632..5633
+                                                      EXPR_VAR@5632..5633
+                                                        NAME@5632..5633
+                                                          IDENT@5632..5633 "x"
+                                                  R_PAREN@5633..5634 ")"
+                                            WHITESPACE@5634..5635 " "
+                                            FOR_SPEC@5635..5652
+                                              FOR_KW@5635..5638 "for"
+                                              WHITESPACE@5638..5639 " "
+                                              DESTRUCT_FULL@5639..5640
+                                                NAME@5639..5640
+                                                  IDENT@5639..5640 "x"
+                                              WHITESPACE@5640..5641 " "
+                                              IN_KW@5641..5643 "in"
+                                              WHITESPACE@5643..5644 " "
+                                              EXPR@5644..5652
+                                                EXPR_VAR@5644..5652
+                                                  NAME@5644..5652
+                                                    IDENT@5644..5652 "children"
+                                            R_BRACK@5652..5653 "]"
+                                        COMMA@5653..5654 ","
+                                        WHITESPACE@5654..5655 " "
+                                        EXPR@5655..5659
+                                          EXPR_STRING@5655..5659
+                                            STRING_SINGLE@5655..5659 "'</'"
+                                        COMMA@5659..5660 ","
+                                        WHITESPACE@5660..5661 " "
+                                        EXPR@5661..5664
+                                          EXPR_VAR@5661..5664
+                                            NAME@5661..5664
+                                              IDENT@5661..5664 "tag"
+                                        COMMA@5664..5665 ","
+                                        WHITESPACE@5665..5666 " "
+                                        EXPR@5666..5669
+                                          EXPR_STRING@5666..5669
+                                            STRING_SINGLE@5666..5669 "'>'"
+                                        R_BRACK@5669..5670 "]"
+                                  R_PAREN@5670..5671 ")"
+                    SEMI@5671..5672 ";"
+                  WHITESPACE@5672..5680 "\n\n      "
+                  EXPR_VAR@5680..5683
+                    NAME@5680..5683
+                      IDENT@5680..5683 "aux"
+                  SUFFIX_APPLY@5683..5690
+                    ARGS_DESC@5683..5690
+                      L_PAREN@5683..5684 "("
+                      ARG@5684..5689
+                        EXPR@5684..5689
+                          EXPR_VAR@5684..5689
+                            NAME@5684..5689
+                              IDENT@5684..5689 "value"
+                      R_PAREN@5689..5690 ")"
+        COMMA@5690..5691 ","
+        WHITESPACE@5691..5695 "\n\n  "
+        MEMBER_FIELD_METHOD@5695..6483
+          FIELD_NAME_FIXED@5695..5705
+            NAME@5695..5705
+              IDENT@5695..5705 "mergePatch"
+          PARAMS_DESC@5705..5720
+            L_PAREN@5705..5706 "("
+            PARAM@5706..5712
+              DESTRUCT_FULL@5706..5712
+                NAME@5706..5712
+                  IDENT@5706..5712 "target"
+            COMMA@5712..5713 ","
+            WHITESPACE@5713..5714 " "
+            PARAM@5714..5719
+              DESTRUCT_FULL@5714..5719
+                NAME@5714..5719
+                  IDENT@5714..5719 "patch"
+            R_PAREN@5719..5720 ")"
+          COLONCOLON@5720..5722 "::"
+          WHITESPACE@5722..5727 "\n    "
+          EXPR@5727..6483
+            EXPR_IF_THEN_ELSE@5727..6483
+              IF_KW@5727..5729 "if"
+              WHITESPACE@5729..5730 " "
+              EXPR@5730..5749
+                EXPR_VAR@5730..5733
+                  NAME@5730..5733
+                    IDENT@5730..5733 "std"
+                SUFFIX_INDEX@5733..5742
+                  DOT@5733..5734 "."
+                  NAME@5734..5742
+                    IDENT@5734..5742 "isObject"
+                SUFFIX_APPLY@5742..5749
+                  ARGS_DESC@5742..5749
+                    L_PAREN@5742..5743 "("
+                    ARG@5743..5748
+                      EXPR@5743..5748
+                        EXPR_VAR@5743..5748
+                          NAME@5743..5748
+                            IDENT@5743..5748 "patch"
+                    R_PAREN@5748..5749 ")"
+              WHITESPACE@5749..5750 " "
+              THEN_KW@5750..5754 "then"
+              WHITESPACE@5754..5761 "\n      "
+              TRUE_EXPR@5761..6462
+                EXPR@5761..6462
+                  STMT_LOCAL@5761..5835
+                    LOCAL_KW@5761..5766 "local"
+                    WHITESPACE@5766..5767 " "
+                    BIND_DESTRUCT@5767..5834
+                      DESTRUCT_FULL@5767..5780
+                        NAME@5767..5780
+                          IDENT@5767..5780 "target_object"
+                      WHITESPACE@5780..5781 " "
+                      ASSIGN@5781..5782 "="
+                      WHITESPACE@5782..5791 "\n        "
+                      EXPR@5791..5834
+                        EXPR_IF_THEN_ELSE@5791..5834
+                          IF_KW@5791..5793 "if"
+                          WHITESPACE@5793..5794 " "
+                          EXPR@5794..5814
+                            EXPR_VAR@5794..5797
+                              NAME@5794..5797
+                                IDENT@5794..5797 "std"
+                            SUFFIX_INDEX@5797..5806
+                              DOT@5797..5798 "."
+                              NAME@5798..5806
+                                IDENT@5798..5806 "isObject"
+                            SUFFIX_APPLY@5806..5814
+                              ARGS_DESC@5806..5814
+                                L_PAREN@5806..5807 "("
+                                ARG@5807..5813
+                                  EXPR@5807..5813
+                                    EXPR_VAR@5807..5813
+                                      NAME@5807..5813
+                                        IDENT@5807..5813 "target"
+                                R_PAREN@5813..5814 ")"
+                          WHITESPACE@5814..5815 " "
+                          THEN_KW@5815..5819 "then"
+                          WHITESPACE@5819..5820 " "
+                          TRUE_EXPR@5820..5826
+                            EXPR@5820..5826
+                              EXPR_VAR@5820..5826
+                                NAME@5820..5826
+                                  IDENT@5820..5826 "target"
+                          WHITESPACE@5826..5827 " "
+                          ELSE_KW@5827..5831 "else"
+                          WHITESPACE@5831..5832 " "
+                          FALSE_EXPR@5832..5834
+                            EXPR@5832..5834
+                              EXPR_OBJECT@5832..5834
+                                OBJ_BODY_MEMBER_LIST@5832..5834
+                                  L_BRACE@5832..5833 "{"
+                                  R_BRACE@5833..5834 "}"
+                    SEMI@5834..5835 ";"
+                  WHITESPACE@5835..5843 "\n\n      "
+                  STMT_LOCAL@5843..5949
+                    LOCAL_KW@5843..5848 "local"
+                    WHITESPACE@5848..5849 " "
+                    BIND_DESTRUCT@5849..5948
+                      DESTRUCT_FULL@5849..5862
+                        NAME@5849..5862
+                          IDENT@5849..5862 "target_fields"
+                      WHITESPACE@5862..5863 " "
+                      ASSIGN@5863..5864 "="
+                      WHITESPACE@5864..5873 "\n        "
+                      EXPR@5873..5948
+                        EXPR_IF_THEN_ELSE@5873..5948
+                          IF_KW@5873..5875 "if"
+                          WHITESPACE@5875..5876 " "
+                          EXPR@5876..5903
+                            EXPR_VAR@5876..5879
+                              NAME@5876..5879
+                                IDENT@5876..5879 "std"
+                            SUFFIX_INDEX@5879..5888
+                              DOT@5879..5880 "."
+                              NAME@5880..5888
+                                IDENT@5880..5888 "isObject"
+                            SUFFIX_APPLY@5888..5903
+                              ARGS_DESC@5888..5903
+                                L_PAREN@5888..5889 "("
+                                ARG@5889..5902
+                                  EXPR@5889..5902
+                                    EXPR_VAR@5889..5902
+                                      NAME@5889..5902
+                                        IDENT@5889..5902 "target_object"
+                                R_PAREN@5902..5903 ")"
+                          WHITESPACE@5903..5904 " "
+                          THEN_KW@5904..5908 "then"
+                          WHITESPACE@5908..5909 " "
+                          TRUE_EXPR@5909..5940
+                            EXPR@5909..5940
+                              EXPR_VAR@5909..5912
+                                NAME@5909..5912
+                                  IDENT@5909..5912 "std"
+                              SUFFIX_INDEX@5912..5925
+                                DOT@5912..5913 "."
+                                NAME@5913..5925
+                                  IDENT@5913..5925 "objectFields"
+                              SUFFIX_APPLY@5925..5940
+                                ARGS_DESC@5925..5940
+                                  L_PAREN@5925..5926 "("
+                                  ARG@5926..5939
+                                    EXPR@5926..5939
+                                      EXPR_VAR@5926..5939
+                                        NAME@5926..5939
+                                          IDENT@5926..5939 "target_object"
+                                  R_PAREN@5939..5940 ")"
+                          WHITESPACE@5940..5941 " "
+                          ELSE_KW@5941..5945 "else"
+                          WHITESPACE@5945..5946 " "
+                          FALSE_EXPR@5946..5948
+                            EXPR@5946..5948
+                              EXPR_ARRAY@5946..5948
+                                L_BRACK@5946..5947 "["
+                                R_BRACK@5947..5948 "]"
+                    SEMI@5948..5949 ";"
+                  WHITESPACE@5949..5957 "\n\n      "
+                  STMT_LOCAL@5957..6034
+                    LOCAL_KW@5957..5962 "local"
+                    WHITESPACE@5962..5963 " "
+                    BIND_DESTRUCT@5963..6033
+                      DESTRUCT_FULL@5963..5974
+                        NAME@5963..5974
+                          IDENT@5963..5974 "null_fields"
+                      WHITESPACE@5974..5975 " "
+                      ASSIGN@5975..5976 "="
+                      WHITESPACE@5976..5977 " "
+                      EXPR@5977..6033
+                        EXPR_ARRAY_COMP@5977..6033
+                          L_BRACK@5977..5978 "["
+                          EXPR@5978..5979
+                            EXPR_VAR@5978..5979
+                              NAME@5978..5979
+                                IDENT@5978..5979 "k"
+                          WHITESPACE@5979..5980 " "
+                          FOR_SPEC@5980..6012
+                            FOR_KW@5980..5983 "for"
+                            WHITESPACE@5983..5984 " "
+                            DESTRUCT_FULL@5984..5985
+                              NAME@5984..5985
+                                IDENT@5984..5985 "k"
+                            WHITESPACE@5985..5986 " "
+                            IN_KW@5986..5988 "in"
+                            WHITESPACE@5988..5989 " "
+                            EXPR@5989..6012
+                              EXPR_VAR@5989..5992
+                                NAME@5989..5992
+                                  IDENT@5989..5992 "std"
+                              SUFFIX_INDEX@5992..6005
+                                DOT@5992..5993 "."
+                                NAME@5993..6005
+                                  IDENT@5993..6005 "objectFields"
+                              SUFFIX_APPLY@6005..6012
+                                ARGS_DESC@6005..6012
+                                  L_PAREN@6005..6006 "("
+                                  ARG@6006..6011
+                                    EXPR@6006..6011
+                                      EXPR_VAR@6006..6011
+                                        NAME@6006..6011
+                                          IDENT@6006..6011 "patch"
+                                  R_PAREN@6011..6012 ")"
+                          WHITESPACE@6012..6013 " "
+                          IF_SPEC@6013..6032
+                            IF_KW@6013..6015 "if"
+                            WHITESPACE@6015..6016 " "
+                            EXPR@6016..6032
+                              EXPR_BINARY@6016..6032
+                                EXPR@6016..6021
+                                  EXPR_VAR@6016..6021
+                                    NAME@6016..6021
+                                      IDENT@6016..6021 "patch"
+                                SUFFIX_INDEX_EXPR@6021..6024
+                                  L_BRACK@6021..6022 "["
+                                  EXPR@6022..6023
+                                    EXPR_VAR@6022..6023
+                                      NAME@6022..6023
+                                        IDENT@6022..6023 "k"
+                                  R_BRACK@6023..6024 "]"
+                                WHITESPACE@6024..6025 " "
+                                EQ@6025..6027 "=="
+                                WHITESPACE@6027..6028 " "
+                                EXPR@6028..6032
+                                  EXPR_LITERAL@6028..6032
+                                    NULL_KW@6028..6032 "null"
+                          R_BRACK@6032..6033 "]"
+                    SEMI@6033..6034 ";"
+                  WHITESPACE@6034..6041 "\n      "
+                  STMT_LOCAL@6041..6114
+                    LOCAL_KW@6041..6046 "local"
+                    WHITESPACE@6046..6047 " "
+                    BIND_DESTRUCT@6047..6113
+                      DESTRUCT_FULL@6047..6058
+                        NAME@6047..6058
+                          IDENT@6047..6058 "both_fields"
+                      WHITESPACE@6058..6059 " "
+                      ASSIGN@6059..6060 "="
+                      WHITESPACE@6060..6061 " "
+                      EXPR@6061..6113
+                        EXPR_VAR@6061..6064
+                          NAME@6061..6064
+                            IDENT@6061..6064 "std"
+                        SUFFIX_INDEX@6064..6073
+                          DOT@6064..6065 "."
+                          NAME@6065..6073
+                            IDENT@6065..6073 "setUnion"
+                        SUFFIX_APPLY@6073..6113
+                          ARGS_DESC@6073..6113
+                            L_PAREN@6073..6074 "("
+                            ARG@6074..6087
+                              EXPR@6074..6087
+                                EXPR_VAR@6074..6087
+                                  NAME@6074..6087
+                                    IDENT@6074..6087 "target_fields"
+                            COMMA@6087..6088 ","
+                            WHITESPACE@6088..6089 " "
+                            ARG@6089..6112
+                              EXPR@6089..6112
+                                EXPR_VAR@6089..6092
+                                  NAME@6089..6092
+                                    IDENT@6089..6092 "std"
+                                SUFFIX_INDEX@6092..6105
+                                  DOT@6092..6093 "."
+                                  NAME@6093..6105
+                                    IDENT@6093..6105 "objectFields"
+                                SUFFIX_APPLY@6105..6112
+                                  ARGS_DESC@6105..6112
+                                    L_PAREN@6105..6106 "("
+                                    ARG@6106..6111
+                                      EXPR@6106..6111
+                                        EXPR_VAR@6106..6111
+                                          NAME@6106..6111
+                                            IDENT@6106..6111 "patch"
+                                    R_PAREN@6111..6112 ")"
+                            R_PAREN@6112..6113 ")"
+                    SEMI@6113..6114 ";"
+                  WHITESPACE@6114..6122 "\n\n      "
+                  EXPR_OBJECT@6122..6462
+                    OBJ_BODY_COMP@6122..6462
+                      L_BRACE@6122..6123 "{"
+                      WHITESPACE@6123..6132 "\n        "
+                      MEMBER_FIELD_NORMAL@6132..6399
+                        FIELD_NAME_DYNAMIC@6132..6135
+                          L_BRACK@6132..6133 "["
+                          EXPR@6133..6134
+                            EXPR_VAR@6133..6134
+                              NAME@6133..6134
+                                IDENT@6133..6134 "k"
+                          R_BRACK@6134..6135 "]"
+                        COLON@6135..6136 ":"
+                        WHITESPACE@6136..6147 "\n          "
+                        EXPR@6147..6399
+                          EXPR_IF_THEN_ELSE@6147..6399
+                            IF_KW@6147..6149 "if"
+                            WHITESPACE@6149..6150 " "
+                            EXPR@6150..6174
+                              EXPR_UNARY@6150..6174
+                                NOT@6150..6151 "!"
+                                EXPR_VAR@6151..6154
+                                  NAME@6151..6154
+                                    IDENT@6151..6154 "std"
+                                SUFFIX_INDEX@6154..6164
+                                  DOT@6154..6155 "."
+                                  NAME@6155..6164
+                                    IDENT@6155..6164 "objectHas"
+                                SUFFIX_APPLY@6164..6174
+                                  ARGS_DESC@6164..6174
+                                    L_PAREN@6164..6165 "("
+                                    ARG@6165..6170
+                                      EXPR@6165..6170
+                                        EXPR_VAR@6165..6170
+                                          NAME@6165..6170
+                                            IDENT@6165..6170 "patch"
+                                    COMMA@6170..6171 ","
+                                    WHITESPACE@6171..6172 " "
+                                    ARG@6172..6173
+                                      EXPR@6172..6173
+                                        EXPR_VAR@6172..6173
+                                          NAME@6172..6173
+                                            IDENT@6172..6173 "k"
+                                    R_PAREN@6173..6174 ")"
+                            WHITESPACE@6174..6175 " "
+                            THEN_KW@6175..6179 "then"
+                            WHITESPACE@6179..6192 "\n            "
+                            TRUE_EXPR@6192..6208
+                              EXPR@6192..6208
+                                EXPR_VAR@6192..6205
+                                  NAME@6192..6205
+                                    IDENT@6192..6205 "target_object"
+                                SUFFIX_INDEX_EXPR@6205..6208
+                                  L_BRACK@6205..6206 "["
+                                  EXPR@6206..6207
+                                    EXPR_VAR@6206..6207
+                                      NAME@6206..6207
+                                        IDENT@6206..6207 "k"
+                                  R_BRACK@6207..6208 "]"
+                            WHITESPACE@6208..6219 "\n          "
+                            ELSE_KW@6219..6223 "else"
+                            WHITESPACE@6223..6224 " "
+                            FALSE_EXPR@6224..6399
+                              EXPR@6224..6399
+                                EXPR_IF_THEN_ELSE@6224..6399
+                                  IF_KW@6224..6226 "if"
+                                  WHITESPACE@6226..6227 " "
+                                  EXPR@6227..6259
+                                    EXPR_UNARY@6227..6259
+                                      NOT@6227..6228 "!"
+                                      EXPR_VAR@6228..6231
+                                        NAME@6228..6231
+                                          IDENT@6228..6231 "std"
+                                      SUFFIX_INDEX@6231..6241
+                                        DOT@6231..6232 "."
+                                        NAME@6232..6241
+                                          IDENT@6232..6241 "objectHas"
+                                      SUFFIX_APPLY@6241..6259
+                                        ARGS_DESC@6241..6259
+                                          L_PAREN@6241..6242 "("
+                                          ARG@6242..6255
+                                            EXPR@6242..6255
+                                              EXPR_VAR@6242..6255
+                                                NAME@6242..6255
+                                                  IDENT@6242..6255 "target_object"
+                                          COMMA@6255..6256 ","
+                                          WHITESPACE@6256..6257 " "
+                                          ARG@6257..6258
+                                            EXPR@6257..6258
+                                              EXPR_VAR@6257..6258
+                                                NAME@6257..6258
+                                                  IDENT@6257..6258 "k"
+                                          R_PAREN@6258..6259 ")"
+                                  WHITESPACE@6259..6260 " "
+                                  THEN_KW@6260..6264 "then"
+                                  WHITESPACE@6264..6277 "\n            "
+                                  TRUE_EXPR@6277..6318
+                                    EXPR@6277..6318
+                                      EXPR_VAR@6277..6280
+                                        NAME@6277..6280
+                                          IDENT@6277..6280 "std"
+                                      SUFFIX_INDEX@6280..6291
+                                        DOT@6280..6281 "."
+                                        NAME@6281..6291
+                                          IDENT@6281..6291 "mergePatch"
+                                      SUFFIX_APPLY@6291..6318
+                                        ARGS_DESC@6291..6318
+                                          L_PAREN@6291..6292 "("
+                                          ARG@6292..6296
+                                            EXPR@6292..6296
+                                              EXPR_LITERAL@6292..6296
+                                                NULL_KW@6292..6296 "null"
+                                          COMMA@6296..6297 ","
+                                          WHITESPACE@6297..6298 " "
+                                          ARG@6298..6306
+                                            EXPR@6298..6306
+                                              EXPR_VAR@6298..6303
+                                                NAME@6298..6303
+                                                  IDENT@6298..6303 "patch"
+                                              SUFFIX_INDEX_EXPR@6303..6306
+                                                L_BRACK@6303..6304 "["
+                                                EXPR@6304..6305
+                                                  EXPR_VAR@6304..6305
+                                                    NAME@6304..6305
+                                                      IDENT@6304..6305 "k"
+                                                R_BRACK@6305..6306 "]"
+                                          R_PAREN@6306..6307 ")"
+                                          WHITESPACE@6307..6308 " "
+                                          TAILSTRICT_KW@6308..6318 "tailstrict"
+                                  WHITESPACE@6318..6329 "\n          "
+                                  ELSE_KW@6329..6333 "else"
+                                  WHITESPACE@6333..6346 "\n            "
+                                  FALSE_EXPR@6346..6399
+                                    EXPR@6346..6399
+                                      EXPR_VAR@6346..6349
+                                        NAME@6346..6349
+                                          IDENT@6346..6349 "std"
+                                      SUFFIX_INDEX@6349..6360
+                                        DOT@6349..6350 "."
+                                        NAME@6350..6360
+                                          IDENT@6350..6360 "mergePatch"
+                                      SUFFIX_APPLY@6360..6399
+                                        ARGS_DESC@6360..6399
+                                          L_PAREN@6360..6361 "("
+                                          ARG@6361..6377
+                                            EXPR@6361..6377
+                                              EXPR_VAR@6361..6374
+                                                NAME@6361..6374
+                                                  IDENT@6361..6374 "target_object"
+                                              SUFFIX_INDEX_EXPR@6374..6377
+                                                L_BRACK@6374..6375 "["
+                                                EXPR@6375..6376
+                                                  EXPR_VAR@6375..6376
+                                                    NAME@6375..6376
+                                                      IDENT@6375..6376 "k"
+                                                R_BRACK@6376..6377 "]"
+                                          COMMA@6377..6378 ","
+                                          WHITESPACE@6378..6379 " "
+                                          ARG@6379..6387
+                                            EXPR@6379..6387
+                                              EXPR_VAR@6379..6384
+                                                NAME@6379..6384
+                                                  IDENT@6379..6384 "patch"
+                                              SUFFIX_INDEX_EXPR@6384..6387
+                                                L_BRACK@6384..6385 "["
+                                                EXPR@6385..6386
+                                                  EXPR_VAR@6385..6386
+                                                    NAME@6385..6386
+                                                      IDENT@6385..6386 "k"
+                                                R_BRACK@6386..6387 "]"
+                                          R_PAREN@6387..6388 ")"
+                                          WHITESPACE@6388..6389 " "
+                                          TAILSTRICT_KW@6389..6399 "tailstrict"
+                      WHITESPACE@6399..6408 "\n        "
+                      FOR_SPEC@6408..6454
+                        FOR_KW@6408..6411 "for"
+                        WHITESPACE@6411..6412 " "
+                        DESTRUCT_FULL@6412..6413
+                          NAME@6412..6413
+                            IDENT@6412..6413 "k"
+                        WHITESPACE@6413..6414 " "
+                        IN_KW@6414..6416 "in"
+                        WHITESPACE@6416..6417 " "
+                        EXPR@6417..6454
+                          EXPR_VAR@6417..6420
+                            NAME@6417..6420
+                              IDENT@6417..6420 "std"
+                          SUFFIX_INDEX@6420..6428
+                            DOT@6420..6421 "."
+                            NAME@6421..6428
+                              IDENT@6421..6428 "setDiff"
+                          SUFFIX_APPLY@6428..6454
+                            ARGS_DESC@6428..6454
+                              L_PAREN@6428..6429 "("
+                              ARG@6429..6440
+                                EXPR@6429..6440
+                                  EXPR_VAR@6429..6440
+                                    NAME@6429..6440
+                                      IDENT@6429..6440 "both_fields"
+                              COMMA@6440..6441 ","
+                              WHITESPACE@6441..6442 " "
+                              ARG@6442..6453
+                                EXPR@6442..6453
+                                  EXPR_VAR@6442..6453
+                                    NAME@6442..6453
+                                      IDENT@6442..6453 "null_fields"
+                              R_PAREN@6453..6454 ")"
+                      WHITESPACE@6454..6461 "\n      "
+                      R_BRACE@6461..6462 "}"
+              WHITESPACE@6462..6467 "\n    "
+              ELSE_KW@6467..6471 "else"
+              WHITESPACE@6471..6478 "\n      "
+              FALSE_EXPR@6478..6483
+                EXPR@6478..6483
+                  EXPR_VAR@6478..6483
+                    NAME@6478..6483
+                      IDENT@6478..6483 "patch"
+        COMMA@6483..6484 ","
+        WHITESPACE@6484..6488 "\n\n  "
+        MEMBER_FIELD_METHOD@6488..6594
+          FIELD_NAME_FIXED@6488..6491
+            NAME@6488..6491
+              IDENT@6488..6491 "get"
+          PARAMS_DESC@6491..6528
+            L_PAREN@6491..6492 "("
+            PARAM@6492..6493
+              DESTRUCT_FULL@6492..6493
+                NAME@6492..6493
+                  IDENT@6492..6493 "o"
+            COMMA@6493..6494 ","
+            WHITESPACE@6494..6495 " "
+            PARAM@6495..6496
+              DESTRUCT_FULL@6495..6496
+                NAME@6495..6496
+                  IDENT@6495..6496 "f"
+            COMMA@6496..6497 ","
+            WHITESPACE@6497..6498 " "
+            PARAM@6498..6510
+              DESTRUCT_FULL@6498..6505
+                NAME@6498..6505
+                  IDENT@6498..6505 "default"
+              ASSIGN@6505..6506 "="
+              EXPR@6506..6510
+                EXPR_LITERAL@6506..6510
+                  NULL_KW@6506..6510 "null"
+            COMMA@6510..6511 ","
+            WHITESPACE@6511..6512 " "
+            PARAM@6512..6527
+              DESTRUCT_FULL@6512..6522
+                NAME@6512..6522
+                  IDENT@6512..6522 "inc_hidden"
+              ASSIGN@6522..6523 "="
+              EXPR@6523..6527
+                EXPR_LITERAL@6523..6527
+                  TRUE_KW@6523..6527 "true"
+            R_PAREN@6527..6528 ")"
+          COLONCOLON@6528..6530 "::"
+          WHITESPACE@6530..6535 "\n    "
+          EXPR@6535..6594
+            EXPR_IF_THEN_ELSE@6535..6594
+              IF_KW@6535..6537 "if"
+              WHITESPACE@6537..6538 " "
+              EXPR@6538..6571
+                EXPR_VAR@6538..6541
+                  NAME@6538..6541
+                    IDENT@6538..6541 "std"
+                SUFFIX_INDEX@6541..6553
+                  DOT@6541..6542 "."
+                  NAME@6542..6553
+                    IDENT@6542..6553 "objectHasEx"
+                SUFFIX_APPLY@6553..6571
+                  ARGS_DESC@6553..6571
+                    L_PAREN@6553..6554 "("
+                    ARG@6554..6555
+                      EXPR@6554..6555
+                        EXPR_VAR@6554..6555
+                          NAME@6554..6555
+                            IDENT@6554..6555 "o"
+                    COMMA@6555..6556 ","
+                    WHITESPACE@6556..6557 " "
+                    ARG@6557..6558
+                      EXPR@6557..6558
+                        EXPR_VAR@6557..6558
+                          NAME@6557..6558
+                            IDENT@6557..6558 "f"
+                    COMMA@6558..6559 ","
+                    WHITESPACE@6559..6560 " "
+                    ARG@6560..6570
+                      EXPR@6560..6570
+                        EXPR_VAR@6560..6570
+                          NAME@6560..6570
+                            IDENT@6560..6570 "inc_hidden"
+                    R_PAREN@6570..6571 ")"
+              WHITESPACE@6571..6572 " "
+              THEN_KW@6572..6576 "then"
+              WHITESPACE@6576..6577 " "
+              TRUE_EXPR@6577..6581
+                EXPR@6577..6581
+                  EXPR_VAR@6577..6578
+                    NAME@6577..6578
+                      IDENT@6577..6578 "o"
+                  SUFFIX_INDEX_EXPR@6578..6581
+                    L_BRACK@6578..6579 "["
+                    EXPR@6579..6580
+                      EXPR_VAR@6579..6580
+                        NAME@6579..6580
+                          IDENT@6579..6580 "f"
+                    R_BRACK@6580..6581 "]"
+              WHITESPACE@6581..6582 " "
+              ELSE_KW@6582..6586 "else"
+              WHITESPACE@6586..6587 " "
+              FALSE_EXPR@6587..6594
+                EXPR@6587..6594
+                  EXPR_VAR@6587..6594
+                    NAME@6587..6594
+                      IDENT@6587..6594 "default"
+        COMMA@6594..6595 ","
+        WHITESPACE@6595..6599 "\n\n  "
+        MEMBER_FIELD_METHOD@6599..6733
+          FIELD_NAME_FIXED@6599..6610
+            NAME@6599..6610
+              IDENT@6599..6610 "resolvePath"
+          PARAMS_DESC@6610..6616
+            L_PAREN@6610..6611 "("
+            PARAM@6611..6612
+              DESTRUCT_FULL@6611..6612
+                NAME@6611..6612
+                  IDENT@6611..6612 "f"
+            COMMA@6612..6613 ","
+            WHITESPACE@6613..6614 " "
+            PARAM@6614..6615
+              DESTRUCT_FULL@6614..6615
+                NAME@6614..6615
+                  IDENT@6614..6615 "r"
+            R_PAREN@6615..6616 ")"
+          COLONCOLON@6616..6618 "::"
+          WHITESPACE@6618..6623 "\n    "
+          EXPR@6623..6733
+            STMT_LOCAL@6623..6653
+              LOCAL_KW@6623..6628 "local"
+              WHITESPACE@6628..6629 " "
+              BIND_DESTRUCT@6629..6652
+                DESTRUCT_FULL@6629..6632
+                  NAME@6629..6632
+                    IDENT@6629..6632 "arr"
+                WHITESPACE@6632..6633 " "
+                ASSIGN@6633..6634 "="
+                WHITESPACE@6634..6635 " "
+                EXPR@6635..6652
+                  EXPR_VAR@6635..6638
+                    NAME@6635..6638
+                      IDENT@6635..6638 "std"
+                  SUFFIX_INDEX@6638..6644
+                    DOT@6638..6639 "."
+                    NAME@6639..6644
+                      IDENT@6639..6644 "split"
+                  SUFFIX_APPLY@6644..6652
+                    ARGS_DESC@6644..6652
+                      L_PAREN@6644..6645 "("
+                      ARG@6645..6646
+                        EXPR@6645..6646
+                          EXPR_VAR@6645..6646
+                            NAME@6645..6646
+                              IDENT@6645..6646 "f"
+                      COMMA@6646..6647 ","
+                      WHITESPACE@6647..6648 " "
+                      ARG@6648..6651
+                        EXPR@6648..6651
+                          EXPR_STRING@6648..6651
+                            STRING_SINGLE@6648..6651 "'/'"
+                      R_PAREN@6651..6652 ")"
+              SEMI@6652..6653 ";"
+            WHITESPACE@6653..6658 "\n    "
+            EXPR_VAR@6658..6661
+              NAME@6658..6661
+                IDENT@6658..6661 "std"
+            SUFFIX_INDEX@6661..6666
+              DOT@6661..6662 "."
+              NAME@6662..6666
+                IDENT@6662..6666 "join"
+            SUFFIX_APPLY@6666..6733
+              ARGS_DESC@6666..6733
+                L_PAREN@6666..6667 "("
+                ARG@6667..6670
+                  EXPR@6667..6670
+                    EXPR_STRING@6667..6670
+                      STRING_SINGLE@6667..6670 "'/'"
+                COMMA@6670..6671 ","
+                WHITESPACE@6671..6672 " "
+                ARG@6672..6732
+                  EXPR@6672..6732
+                    EXPR_BINARY@6672..6732
+                      EXPR@6672..6675
+                        EXPR_VAR@6672..6675
+                          NAME@6672..6675
+                            IDENT@6672..6675 "std"
+                      SUFFIX_INDEX@6675..6685
+                        DOT@6675..6676 "."
+                        NAME@6676..6685
+                          IDENT@6676..6685 "makeArray"
+                      SUFFIX_APPLY@6685..6726
+                        ARGS_DESC@6685..6726
+                          L_PAREN@6685..6686 "("
+                          ARG@6686..6705
+                            EXPR@6686..6705
+                              EXPR_BINARY@6686..6705
+                                EXPR@6686..6689
+                                  EXPR_VAR@6686..6689
+                                    NAME@6686..6689
+                                      IDENT@6686..6689 "std"
+                                SUFFIX_INDEX@6689..6696
+                                  DOT@6689..6690 "."
+                                  NAME@6690..6696
+                                    IDENT@6690..6696 "length"
+                                SUFFIX_APPLY@6696..6701
+                                  ARGS_DESC@6696..6701
+                                    L_PAREN@6696..6697 "("
+                                    ARG@6697..6700
+                                      EXPR@6697..6700
+                                        EXPR_VAR@6697..6700
+                                          NAME@6697..6700
+                                            IDENT@6697..6700 "arr"
+                                    R_PAREN@6700..6701 ")"
                                 WHITESPACE@6701..6702 " "
-                                PLUS@6702..6703 "+"
+                                MINUS@6702..6703 "-"
                                 WHITESPACE@6703..6704 " "
-                                EXPR_ARRAY@6704..6710
-                                  L_BRACK@6704..6705 "["
-                                  EXPR_INDEX_EXPR@6705..6709
-                                    LHS_EXPR@6705..6706
-                                      EXPR_VAR@6705..6706
-                                        NAME@6705..6706
-                                          IDENT@6705..6706 "a"
-                                    L_BRACK@6706..6707 "["
-                                    EXPR_VAR@6707..6708
-                                      NAME@6707..6708
-                                        IDENT@6707..6708 "i"
-                                    R_BRACK@6708..6709 "]"
-                                  R_BRACK@6709..6710 "]"
-                            R_PAREN@6710..6711 ")"
-                            WHITESPACE@6711..6712 " "
-                            TAILSTRICT_KW@6712..6722 "tailstrict"
-                      WHITESPACE@6722..6731 "\n        "
-                      ELSE_KW@6731..6735 "else"
-                      WHITESPACE@6735..6736 " "
-                      FALSE_EXPR@6736..6874
-                        EXPR_IF_THEN_ELSE@6736..6874
-                          IF_KW@6736..6738 "if"
-                          WHITESPACE@6738..6739 " "
-                          EXPR_BINARY@6739..6746
-                            LHS_EXPR@6739..6741
-                              EXPR_VAR@6739..6741
-                                NAME@6739..6741
-                                  IDENT@6739..6741 "ak"
-                            WHITESPACE@6741..6742 " "
-                            LT@6742..6743 "<"
-                            WHITESPACE@6743..6744 " "
-                            EXPR_VAR@6744..6746
-                              NAME@6744..6746
-                                IDENT@6744..6746 "bk"
-                          WHITESPACE@6746..6747 " "
-                          THEN_KW@6747..6751 "then"
-                          WHITESPACE@6751..6762 "\n          "
-                          TRUE_EXPR@6762..6806
-                            EXPR_APPLY@6762..6806
-                              EXPR_VAR@6762..6765
-                                NAME@6762..6765
-                                  IDENT@6762..6765 "aux"
-                              ARGS_DESC@6765..6806
-                                L_PAREN@6765..6766 "("
-                                ARG@6766..6767
-                                  EXPR_VAR@6766..6767
-                                    NAME@6766..6767
-                                      IDENT@6766..6767 "a"
-                                COMMA@6767..6768 ","
-                                WHITESPACE@6768..6769 " "
-                                ARG@6769..6770
-                                  EXPR_VAR@6769..6770
-                                    NAME@6769..6770
-                                      IDENT@6769..6770 "b"
-                                COMMA@6770..6771 ","
-                                WHITESPACE@6771..6772 " "
-                                ARG@6772..6777
-                                  EXPR_BINARY@6772..6777
-                                    LHS_EXPR@6772..6773
-                                      EXPR_VAR@6772..6773
-                                        NAME@6772..6773
-                                          IDENT@6772..6773 "i"
-                                    WHITESPACE@6773..6774 " "
-                                    PLUS@6774..6775 "+"
-                                    WHITESPACE@6775..6776 " "
-                                    EXPR_NUMBER@6776..6777
-                                      FLOAT@6776..6777 "1"
-                                COMMA@6777..6778 ","
-                                WHITESPACE@6778..6779 " "
-                                ARG@6779..6780
-                                  EXPR_VAR@6779..6780
-                                    NAME@6779..6780
-                                      IDENT@6779..6780 "j"
-                                COMMA@6780..6781 ","
-                                WHITESPACE@6781..6782 " "
-                                ARG@6782..6794
-                                  EXPR_BINARY@6782..6794
-                                    LHS_EXPR@6782..6785
-                                      EXPR_VAR@6782..6785
-                                        NAME@6782..6785
-                                          IDENT@6782..6785 "acc"
-                                    WHITESPACE@6785..6786 " "
-                                    PLUS@6786..6787 "+"
-                                    WHITESPACE@6787..6788 " "
-                                    EXPR_ARRAY@6788..6794
-                                      L_BRACK@6788..6789 "["
-                                      EXPR_INDEX_EXPR@6789..6793
-                                        LHS_EXPR@6789..6790
-                                          EXPR_VAR@6789..6790
-                                            NAME@6789..6790
-                                              IDENT@6789..6790 "a"
-                                        L_BRACK@6790..6791 "["
-                                        EXPR_VAR@6791..6792
-                                          NAME@6791..6792
-                                            IDENT@6791..6792 "i"
-                                        R_BRACK@6792..6793 "]"
-                                      R_BRACK@6793..6794 "]"
-                                R_PAREN@6794..6795 ")"
-                                WHITESPACE@6795..6796 " "
-                                TAILSTRICT_KW@6796..6806 "tailstrict"
-                          WHITESPACE@6806..6815 "\n        "
-                          ELSE_KW@6815..6819 "else"
-                          WHITESPACE@6819..6830 "\n          "
-                          FALSE_EXPR@6830..6874
-                            EXPR_APPLY@6830..6874
-                              EXPR_VAR@6830..6833
-                                NAME@6830..6833
-                                  IDENT@6830..6833 "aux"
-                              ARGS_DESC@6833..6874
-                                L_PAREN@6833..6834 "("
-                                ARG@6834..6835
-                                  EXPR_VAR@6834..6835
-                                    NAME@6834..6835
-                                      IDENT@6834..6835 "a"
-                                COMMA@6835..6836 ","
-                                WHITESPACE@6836..6837 " "
-                                ARG@6837..6838
-                                  EXPR_VAR@6837..6838
-                                    NAME@6837..6838
-                                      IDENT@6837..6838 "b"
-                                COMMA@6838..6839 ","
-                                WHITESPACE@6839..6840 " "
-                                ARG@6840..6841
-                                  EXPR_VAR@6840..6841
-                                    NAME@6840..6841
-                                      IDENT@6840..6841 "i"
-                                COMMA@6841..6842 ","
-                                WHITESPACE@6842..6843 " "
-                                ARG@6843..6848
-                                  EXPR_BINARY@6843..6848
-                                    LHS_EXPR@6843..6844
-                                      EXPR_VAR@6843..6844
-                                        NAME@6843..6844
-                                          IDENT@6843..6844 "j"
-                                    WHITESPACE@6844..6845 " "
-                                    PLUS@6845..6846 "+"
-                                    WHITESPACE@6846..6847 " "
-                                    EXPR_NUMBER@6847..6848
-                                      FLOAT@6847..6848 "1"
-                                COMMA@6848..6849 ","
-                                WHITESPACE@6849..6850 " "
-                                ARG@6850..6862
-                                  EXPR_BINARY@6850..6862
-                                    LHS_EXPR@6850..6853
-                                      EXPR_VAR@6850..6853
-                                        NAME@6850..6853
-                                          IDENT@6850..6853 "acc"
-                                    WHITESPACE@6853..6854 " "
-                                    PLUS@6854..6855 "+"
-                                    WHITESPACE@6855..6856 " "
-                                    EXPR_ARRAY@6856..6862
-                                      L_BRACK@6856..6857 "["
-                                      EXPR_INDEX_EXPR@6857..6861
-                                        LHS_EXPR@6857..6858
-                                          EXPR_VAR@6857..6858
-                                            NAME@6857..6858
-                                              IDENT@6857..6858 "b"
-                                        L_BRACK@6858..6859 "["
-                                        EXPR_VAR@6859..6860
-                                          NAME@6859..6860
-                                            IDENT@6859..6860 "j"
-                                        R_BRACK@6860..6861 "]"
-                                      R_BRACK@6861..6862 "]"
-                                R_PAREN@6862..6863 ")"
-                                WHITESPACE@6863..6864 " "
-                                TAILSTRICT_KW@6864..6874 "tailstrict"
-          SEMI@6874..6875 ";"
-        WHITESPACE@6875..6880 "\n    "
-        EXPR_APPLY@6880..6899
-          EXPR_VAR@6880..6883
-            NAME@6880..6883
-              IDENT@6880..6883 "aux"
-          ARGS_DESC@6883..6899
-            L_PAREN@6883..6884 "("
-            ARG@6884..6885
-              EXPR_VAR@6884..6885
-                NAME@6884..6885
-                  IDENT@6884..6885 "a"
-            COMMA@6885..6886 ","
-            WHITESPACE@6886..6887 " "
-            ARG@6887..6888
-              EXPR_VAR@6887..6888
-                NAME@6887..6888
-                  IDENT@6887..6888 "b"
-            COMMA@6888..6889 ","
-            WHITESPACE@6889..6890 " "
-            ARG@6890..6891
-              EXPR_NUMBER@6890..6891
-                FLOAT@6890..6891 "0"
-            COMMA@6891..6892 ","
-            WHITESPACE@6892..6893 " "
-            ARG@6893..6894
-              EXPR_NUMBER@6893..6894
-                FLOAT@6893..6894 "0"
-            COMMA@6894..6895 ","
-            WHITESPACE@6895..6896 " "
-            ARG@6896..6898
-              EXPR_ARRAY@6896..6898
-                L_BRACK@6896..6897 "["
-                R_BRACK@6897..6898 "]"
-            R_PAREN@6898..6899 ")"
-      COMMA@6899..6900 ","
-      WHITESPACE@6900..6904 "\n\n  "
-      MEMBER_FIELD_METHOD@6904..7361
-        FIELD_NAME_FIXED@6904..6911
-          NAME@6904..6911
-            IDENT@6904..6911 "setDiff"
-        PARAMS_DESC@6911..6926
-          L_PAREN@6911..6912 "("
-          PARAM@6912..6913
-            DESTRUCT_FULL@6912..6913
-              NAME@6912..6913
-                IDENT@6912..6913 "a"
-          COMMA@6913..6914 ","
-          WHITESPACE@6914..6915 " "
-          PARAM@6915..6916
-            DESTRUCT_FULL@6915..6916
-              NAME@6915..6916
-                IDENT@6915..6916 "b"
-          COMMA@6916..6917 ","
-          WHITESPACE@6917..6918 " "
-          PARAM@6918..6925
-            DESTRUCT_FULL@6918..6922
-              NAME@6918..6922
-                IDENT@6918..6922 "keyF"
-            ASSIGN@6922..6923 "="
-            EXPR_VAR@6923..6925
-              NAME@6923..6925
-                IDENT@6923..6925 "id"
-          R_PAREN@6925..6926 ")"
-        COLONCOLON@6926..6928 "::"
-        WHITESPACE@6928..6933 "\n    "
-        STMT_LOCAL@6933..7326
-          LOCAL_KW@6933..6938 "local"
-          WHITESPACE@6938..6939 " "
-          BIND_FUNCTION@6939..7325
-            NAME@6939..6942
-              IDENT@6939..6942 "aux"
-            PARAMS_DESC@6942..6959
-              L_PAREN@6942..6943 "("
-              PARAM@6943..6944
-                DESTRUCT_FULL@6943..6944
-                  NAME@6943..6944
-                    IDENT@6943..6944 "a"
-              COMMA@6944..6945 ","
-              WHITESPACE@6945..6946 " "
-              PARAM@6946..6947
-                DESTRUCT_FULL@6946..6947
-                  NAME@6946..6947
-                    IDENT@6946..6947 "b"
-              COMMA@6947..6948 ","
-              WHITESPACE@6948..6949 " "
-              PARAM@6949..6950
-                DESTRUCT_FULL@6949..6950
-                  NAME@6949..6950
-                    IDENT@6949..6950 "i"
-              COMMA@6950..6951 ","
-              WHITESPACE@6951..6952 " "
-              PARAM@6952..6953
-                DESTRUCT_FULL@6952..6953
-                  NAME@6952..6953
-                    IDENT@6952..6953 "j"
-              COMMA@6953..6954 ","
-              WHITESPACE@6954..6955 " "
-              PARAM@6955..6958
-                DESTRUCT_FULL@6955..6958
-                  NAME@6955..6958
-                    IDENT@6955..6958 "acc"
-              R_PAREN@6958..6959 ")"
-            WHITESPACE@6959..6960 " "
-            ASSIGN@6960..6961 "="
-            WHITESPACE@6961..6968 "\n      "
-            EXPR_IF_THEN_ELSE@6968..7325
-              IF_KW@6968..6970 "if"
-              WHITESPACE@6970..6971 " "
-              EXPR_BINARY@6971..6989
-                LHS_EXPR@6971..6972
-                  EXPR_VAR@6971..6972
-                    NAME@6971..6972
-                      IDENT@6971..6972 "i"
-                WHITESPACE@6972..6973 " "
-                GE@6973..6975 ">="
-                WHITESPACE@6975..6976 " "
-                EXPR_APPLY@6976..6989
-                  EXPR_INDEX@6976..6986
-                    EXPR_VAR@6976..6979
-                      NAME@6976..6979
-                        IDENT@6976..6979 "std"
-                    DOT@6979..6980 "."
-                    NAME@6980..6986
-                      IDENT@6980..6986 "length"
-                  ARGS_DESC@6986..6989
-                    L_PAREN@6986..6987 "("
-                    ARG@6987..6988
-                      EXPR_VAR@6987..6988
-                        NAME@6987..6988
-                          IDENT@6987..6988 "a"
-                    R_PAREN@6988..6989 ")"
-              WHITESPACE@6989..6990 " "
-              THEN_KW@6990..6994 "then"
-              WHITESPACE@6994..7003 "\n        "
-              TRUE_EXPR@7003..7006
-                EXPR_VAR@7003..7006
-                  NAME@7003..7006
-                    IDENT@7003..7006 "acc"
-              WHITESPACE@7006..7013 "\n      "
-              ELSE_KW@7013..7017 "else"
-              WHITESPACE@7017..7018 " "
-              FALSE_EXPR@7018..7325
-                EXPR_IF_THEN_ELSE@7018..7325
-                  IF_KW@7018..7020 "if"
-                  WHITESPACE@7020..7021 " "
-                  EXPR_BINARY@7021..7039
-                    LHS_EXPR@7021..7022
-                      EXPR_VAR@7021..7022
-                        NAME@7021..7022
-                          IDENT@7021..7022 "j"
-                    WHITESPACE@7022..7023 " "
-                    GE@7023..7025 ">="
-                    WHITESPACE@7025..7026 " "
-                    EXPR_APPLY@7026..7039
-                      EXPR_INDEX@7026..7036
-                        EXPR_VAR@7026..7029
-                          NAME@7026..7029
-                            IDENT@7026..7029 "std"
-                        DOT@7029..7030 "."
-                        NAME@7030..7036
-                          IDENT@7030..7036 "length"
-                      ARGS_DESC@7036..7039
-                        L_PAREN@7036..7037 "("
-                        ARG@7037..7038
-                          EXPR_VAR@7037..7038
-                            NAME@7037..7038
-                              IDENT@7037..7038 "b"
-                        R_PAREN@7038..7039 ")"
-                  WHITESPACE@7039..7040 " "
-                  THEN_KW@7040..7044 "then"
-                  WHITESPACE@7044..7053 "\n        "
-                  TRUE_EXPR@7053..7064
-                    EXPR_BINARY@7053..7064
-                      LHS_EXPR@7053..7056
-                        EXPR_VAR@7053..7056
-                          NAME@7053..7056
-                            IDENT@7053..7056 "acc"
-                      WHITESPACE@7056..7057 " "
-                      PLUS@7057..7058 "+"
-                      WHITESPACE@7058..7059 " "
-                      EXPR_SLICE@7059..7064
-                        EXPR_VAR@7059..7060
-                          NAME@7059..7060
-                            IDENT@7059..7060 "a"
-                        SLICE_DESC@7060..7064
-                          L_BRACK@7060..7061 "["
-                          EXPR_VAR@7061..7062
-                            NAME@7061..7062
-                              IDENT@7061..7062 "i"
-                          COLON@7062..7063 ":"
-                          R_BRACK@7063..7064 "]"
-                  WHITESPACE@7064..7071 "\n      "
-                  ELSE_KW@7071..7075 "else"
-                  WHITESPACE@7075..7084 "\n        "
-                  FALSE_EXPR@7084..7325
-                    EXPR_IF_THEN_ELSE@7084..7325
-                      IF_KW@7084..7086 "if"
-                      WHITESPACE@7086..7087 " "
-                      EXPR_BINARY@7087..7111
-                        LHS_EXPR@7087..7097
-                          EXPR_APPLY@7087..7097
-                            EXPR_VAR@7087..7091
-                              NAME@7087..7091
-                                IDENT@7087..7091 "keyF"
-                            ARGS_DESC@7091..7097
-                              L_PAREN@7091..7092 "("
-                              ARG@7092..7096
-                                EXPR_INDEX_EXPR@7092..7096
-                                  LHS_EXPR@7092..7093
-                                    EXPR_VAR@7092..7093
-                                      NAME@7092..7093
-                                        IDENT@7092..7093 "a"
-                                  L_BRACK@7093..7094 "["
-                                  EXPR_VAR@7094..7095
-                                    NAME@7094..7095
-                                      IDENT@7094..7095 "i"
-                                  R_BRACK@7095..7096 "]"
-                              R_PAREN@7096..7097 ")"
-                        WHITESPACE@7097..7098 " "
-                        EQ@7098..7100 "=="
-                        WHITESPACE@7100..7101 " "
-                        EXPR_APPLY@7101..7111
-                          EXPR_VAR@7101..7105
-                            NAME@7101..7105
-                              IDENT@7101..7105 "keyF"
-                          ARGS_DESC@7105..7111
-                            L_PAREN@7105..7106 "("
-                            ARG@7106..7110
-                              EXPR_INDEX_EXPR@7106..7110
-                                LHS_EXPR@7106..7107
-                                  EXPR_VAR@7106..7107
-                                    NAME@7106..7107
-                                      IDENT@7106..7107 "b"
-                                L_BRACK@7107..7108 "["
-                                EXPR_VAR@7108..7109
-                                  NAME@7108..7109
-                                    IDENT@7108..7109 "j"
-                                R_BRACK@7109..7110 "]"
-                            R_PAREN@7110..7111 ")"
-                      WHITESPACE@7111..7112 " "
-                      THEN_KW@7112..7116 "then"
-                      WHITESPACE@7116..7127 "\n          "
-                      TRUE_EXPR@7127..7166
-                        EXPR_APPLY@7127..7166
-                          EXPR_VAR@7127..7130
-                            NAME@7127..7130
-                              IDENT@7127..7130 "aux"
-                          ARGS_DESC@7130..7166
-                            L_PAREN@7130..7131 "("
-                            ARG@7131..7132
-                              EXPR_VAR@7131..7132
-                                NAME@7131..7132
-                                  IDENT@7131..7132 "a"
-                            COMMA@7132..7133 ","
-                            WHITESPACE@7133..7134 " "
-                            ARG@7134..7135
-                              EXPR_VAR@7134..7135
-                                NAME@7134..7135
-                                  IDENT@7134..7135 "b"
-                            COMMA@7135..7136 ","
-                            WHITESPACE@7136..7137 " "
-                            ARG@7137..7142
-                              EXPR_BINARY@7137..7142
-                                LHS_EXPR@7137..7138
-                                  EXPR_VAR@7137..7138
-                                    NAME@7137..7138
-                                      IDENT@7137..7138 "i"
-                                WHITESPACE@7138..7139 " "
-                                PLUS@7139..7140 "+"
-                                WHITESPACE@7140..7141 " "
-                                EXPR_NUMBER@7141..7142
-                                  FLOAT@7141..7142 "1"
-                            COMMA@7142..7143 ","
-                            WHITESPACE@7143..7144 " "
-                            ARG@7144..7149
-                              EXPR_BINARY@7144..7149
-                                LHS_EXPR@7144..7145
-                                  EXPR_VAR@7144..7145
-                                    NAME@7144..7145
-                                      IDENT@7144..7145 "j"
-                                WHITESPACE@7145..7146 " "
-                                PLUS@7146..7147 "+"
-                                WHITESPACE@7147..7148 " "
-                                EXPR_NUMBER@7148..7149
-                                  FLOAT@7148..7149 "1"
-                            COMMA@7149..7150 ","
-                            WHITESPACE@7150..7151 " "
-                            ARG@7151..7154
-                              EXPR_VAR@7151..7154
-                                NAME@7151..7154
-                                  IDENT@7151..7154 "acc"
-                            R_PAREN@7154..7155 ")"
-                            WHITESPACE@7155..7156 " "
-                            TAILSTRICT_KW@7156..7166 "tailstrict"
-                      WHITESPACE@7166..7175 "\n        "
-                      ELSE_KW@7175..7179 "else"
-                      WHITESPACE@7179..7180 " "
-                      FALSE_EXPR@7180..7325
-                        EXPR_IF_THEN_ELSE@7180..7325
-                          IF_KW@7180..7182 "if"
-                          WHITESPACE@7182..7183 " "
-                          EXPR_BINARY@7183..7206
-                            LHS_EXPR@7183..7193
-                              EXPR_APPLY@7183..7193
-                                EXPR_VAR@7183..7187
-                                  NAME@7183..7187
-                                    IDENT@7183..7187 "keyF"
-                                ARGS_DESC@7187..7193
-                                  L_PAREN@7187..7188 "("
-                                  ARG@7188..7192
-                                    EXPR_INDEX_EXPR@7188..7192
-                                      LHS_EXPR@7188..7189
-                                        EXPR_VAR@7188..7189
-                                          NAME@7188..7189
-                                            IDENT@7188..7189 "a"
-                                      L_BRACK@7189..7190 "["
-                                      EXPR_VAR@7190..7191
-                                        NAME@7190..7191
-                                          IDENT@7190..7191 "i"
-                                      R_BRACK@7191..7192 "]"
-                                  R_PAREN@7192..7193 ")"
-                            WHITESPACE@7193..7194 " "
-                            LT@7194..7195 "<"
-                            WHITESPACE@7195..7196 " "
-                            EXPR_APPLY@7196..7206
-                              EXPR_VAR@7196..7200
-                                NAME@7196..7200
-                                  IDENT@7196..7200 "keyF"
-                              ARGS_DESC@7200..7206
-                                L_PAREN@7200..7201 "("
-                                ARG@7201..7205
-                                  EXPR_INDEX_EXPR@7201..7205
-                                    LHS_EXPR@7201..7202
-                                      EXPR_VAR@7201..7202
-                                        NAME@7201..7202
-                                          IDENT@7201..7202 "b"
-                                    L_BRACK@7202..7203 "["
-                                    EXPR_VAR@7203..7204
-                                      NAME@7203..7204
-                                        IDENT@7203..7204 "j"
-                                    R_BRACK@7204..7205 "]"
-                                R_PAREN@7205..7206 ")"
-                          WHITESPACE@7206..7207 " "
-                          THEN_KW@7207..7211 "then"
-                          WHITESPACE@7211..7222 "\n          "
-                          TRUE_EXPR@7222..7266
-                            EXPR_APPLY@7222..7266
-                              EXPR_VAR@7222..7225
-                                NAME@7222..7225
-                                  IDENT@7222..7225 "aux"
-                              ARGS_DESC@7225..7266
-                                L_PAREN@7225..7226 "("
-                                ARG@7226..7227
-                                  EXPR_VAR@7226..7227
-                                    NAME@7226..7227
-                                      IDENT@7226..7227 "a"
-                                COMMA@7227..7228 ","
-                                WHITESPACE@7228..7229 " "
-                                ARG@7229..7230
-                                  EXPR_VAR@7229..7230
-                                    NAME@7229..7230
-                                      IDENT@7229..7230 "b"
-                                COMMA@7230..7231 ","
-                                WHITESPACE@7231..7232 " "
-                                ARG@7232..7237
-                                  EXPR_BINARY@7232..7237
-                                    LHS_EXPR@7232..7233
-                                      EXPR_VAR@7232..7233
-                                        NAME@7232..7233
-                                          IDENT@7232..7233 "i"
-                                    WHITESPACE@7233..7234 " "
-                                    PLUS@7234..7235 "+"
-                                    WHITESPACE@7235..7236 " "
-                                    EXPR_NUMBER@7236..7237
-                                      FLOAT@7236..7237 "1"
-                                COMMA@7237..7238 ","
-                                WHITESPACE@7238..7239 " "
-                                ARG@7239..7240
-                                  EXPR_VAR@7239..7240
-                                    NAME@7239..7240
-                                      IDENT@7239..7240 "j"
-                                COMMA@7240..7241 ","
-                                WHITESPACE@7241..7242 " "
-                                ARG@7242..7254
-                                  EXPR_BINARY@7242..7254
-                                    LHS_EXPR@7242..7245
-                                      EXPR_VAR@7242..7245
-                                        NAME@7242..7245
-                                          IDENT@7242..7245 "acc"
-                                    WHITESPACE@7245..7246 " "
-                                    PLUS@7246..7247 "+"
-                                    WHITESPACE@7247..7248 " "
-                                    EXPR_ARRAY@7248..7254
-                                      L_BRACK@7248..7249 "["
-                                      EXPR_INDEX_EXPR@7249..7253
-                                        LHS_EXPR@7249..7250
-                                          EXPR_VAR@7249..7250
-                                            NAME@7249..7250
-                                              IDENT@7249..7250 "a"
-                                        L_BRACK@7250..7251 "["
-                                        EXPR_VAR@7251..7252
-                                          NAME@7251..7252
-                                            IDENT@7251..7252 "i"
-                                        R_BRACK@7252..7253 "]"
-                                      R_BRACK@7253..7254 "]"
-                                R_PAREN@7254..7255 ")"
-                                WHITESPACE@7255..7256 " "
-                                TAILSTRICT_KW@7256..7266 "tailstrict"
-                          WHITESPACE@7266..7275 "\n        "
-                          ELSE_KW@7275..7279 "else"
-                          WHITESPACE@7279..7290 "\n          "
-                          FALSE_EXPR@7290..7325
-                            EXPR_APPLY@7290..7325
-                              EXPR_VAR@7290..7293
-                                NAME@7290..7293
-                                  IDENT@7290..7293 "aux"
-                              ARGS_DESC@7293..7325
-                                L_PAREN@7293..7294 "("
-                                ARG@7294..7295
-                                  EXPR_VAR@7294..7295
-                                    NAME@7294..7295
-                                      IDENT@7294..7295 "a"
-                                COMMA@7295..7296 ","
-                                WHITESPACE@7296..7297 " "
-                                ARG@7297..7298
-                                  EXPR_VAR@7297..7298
-                                    NAME@7297..7298
-                                      IDENT@7297..7298 "b"
-                                COMMA@7298..7299 ","
-                                WHITESPACE@7299..7300 " "
-                                ARG@7300..7301
-                                  EXPR_VAR@7300..7301
-                                    NAME@7300..7301
-                                      IDENT@7300..7301 "i"
-                                COMMA@7301..7302 ","
-                                WHITESPACE@7302..7303 " "
-                                ARG@7303..7308
-                                  EXPR_BINARY@7303..7308
-                                    LHS_EXPR@7303..7304
-                                      EXPR_VAR@7303..7304
-                                        NAME@7303..7304
-                                          IDENT@7303..7304 "j"
-                                    WHITESPACE@7304..7305 " "
-                                    PLUS@7305..7306 "+"
-                                    WHITESPACE@7306..7307 " "
-                                    EXPR_NUMBER@7307..7308
-                                      FLOAT@7307..7308 "1"
-                                COMMA@7308..7309 ","
-                                WHITESPACE@7309..7310 " "
-                                ARG@7310..7313
-                                  EXPR_VAR@7310..7313
-                                    NAME@7310..7313
-                                      IDENT@7310..7313 "acc"
-                                R_PAREN@7313..7314 ")"
-                                WHITESPACE@7314..7315 " "
-                                TAILSTRICT_KW@7315..7325 "tailstrict"
-          SEMI@7325..7326 ";"
-        WHITESPACE@7326..7331 "\n    "
-        EXPR_APPLY@7331..7361
-          EXPR_VAR@7331..7334
-            NAME@7331..7334
-              IDENT@7331..7334 "aux"
-          ARGS_DESC@7334..7361
-            L_PAREN@7334..7335 "("
-            ARG@7335..7336
-              EXPR_VAR@7335..7336
-                NAME@7335..7336
-                  IDENT@7335..7336 "a"
-            COMMA@7336..7337 ","
-            WHITESPACE@7337..7338 " "
-            ARG@7338..7339
-              EXPR_VAR@7338..7339
-                NAME@7338..7339
-                  IDENT@7338..7339 "b"
-            COMMA@7339..7340 ","
-            WHITESPACE@7340..7341 " "
-            ARG@7341..7342
-              EXPR_NUMBER@7341..7342
-                FLOAT@7341..7342 "0"
-            COMMA@7342..7343 ","
-            WHITESPACE@7343..7344 " "
-            ARG@7344..7345
-              EXPR_NUMBER@7344..7345
-                FLOAT@7344..7345 "0"
-            COMMA@7345..7346 ","
-            WHITESPACE@7346..7347 " "
-            ARG@7347..7349
-              EXPR_ARRAY@7347..7349
-                L_BRACK@7347..7348 "["
-                R_BRACK@7348..7349 "]"
-            R_PAREN@7349..7350 ")"
-            WHITESPACE@7350..7351 " "
-            TAILSTRICT_KW@7351..7361 "tailstrict"
-      COMMA@7361..7362 ","
-      WHITESPACE@7362..7366 "\n\n  "
-      MEMBER_FIELD_METHOD@7366..8154
-        FIELD_NAME_FIXED@7366..7376
-          NAME@7366..7376
-            IDENT@7366..7376 "mergePatch"
-        PARAMS_DESC@7376..7391
-          L_PAREN@7376..7377 "("
-          PARAM@7377..7383
-            DESTRUCT_FULL@7377..7383
-              NAME@7377..7383
-                IDENT@7377..7383 "target"
-          COMMA@7383..7384 ","
-          WHITESPACE@7384..7385 " "
-          PARAM@7385..7390
-            DESTRUCT_FULL@7385..7390
-              NAME@7385..7390
-                IDENT@7385..7390 "patch"
-          R_PAREN@7390..7391 ")"
-        COLONCOLON@7391..7393 "::"
-        WHITESPACE@7393..7398 "\n    "
-        EXPR_IF_THEN_ELSE@7398..8154
-          IF_KW@7398..7400 "if"
-          WHITESPACE@7400..7401 " "
-          EXPR_APPLY@7401..7420
-            EXPR_INDEX@7401..7413
-              EXPR_VAR@7401..7404
-                NAME@7401..7404
-                  IDENT@7401..7404 "std"
-              DOT@7404..7405 "."
-              NAME@7405..7413
-                IDENT@7405..7413 "isObject"
-            ARGS_DESC@7413..7420
-              L_PAREN@7413..7414 "("
-              ARG@7414..7419
-                EXPR_VAR@7414..7419
-                  NAME@7414..7419
-                    IDENT@7414..7419 "patch"
-              R_PAREN@7419..7420 ")"
-          WHITESPACE@7420..7421 " "
-          THEN_KW@7421..7425 "then"
-          WHITESPACE@7425..7432 "\n      "
-          STMT_LOCAL@7432..7506
-            LOCAL_KW@7432..7437 "local"
-            WHITESPACE@7437..7438 " "
-            BIND_DESTRUCT@7438..7505
-              DESTRUCT_FULL@7438..7451
-                NAME@7438..7451
-                  IDENT@7438..7451 "target_object"
-              WHITESPACE@7451..7452 " "
-              ASSIGN@7452..7453 "="
-              WHITESPACE@7453..7462 "\n        "
-              EXPR_IF_THEN_ELSE@7462..7505
-                IF_KW@7462..7464 "if"
-                WHITESPACE@7464..7465 " "
-                EXPR_APPLY@7465..7485
-                  EXPR_INDEX@7465..7477
-                    EXPR_VAR@7465..7468
-                      NAME@7465..7468
-                        IDENT@7465..7468 "std"
-                    DOT@7468..7469 "."
-                    NAME@7469..7477
-                      IDENT@7469..7477 "isObject"
-                  ARGS_DESC@7477..7485
-                    L_PAREN@7477..7478 "("
-                    ARG@7478..7484
-                      EXPR_VAR@7478..7484
-                        NAME@7478..7484
-                          IDENT@7478..7484 "target"
-                    R_PAREN@7484..7485 ")"
-                WHITESPACE@7485..7486 " "
-                THEN_KW@7486..7490 "then"
-                WHITESPACE@7490..7491 " "
-                TRUE_EXPR@7491..7497
-                  EXPR_VAR@7491..7497
-                    NAME@7491..7497
-                      IDENT@7491..7497 "target"
-                WHITESPACE@7497..7498 " "
-                ELSE_KW@7498..7502 "else"
-                WHITESPACE@7502..7503 " "
-                FALSE_EXPR@7503..7505
-                  EXPR_OBJECT@7503..7505
-                    OBJ_BODY_MEMBER_LIST@7503..7505
-                      L_BRACE@7503..7504 "{"
-                      R_BRACE@7504..7505 "}"
-            SEMI@7505..7506 ";"
-          WHITESPACE@7506..7514 "\n\n      "
-          STMT_LOCAL@7514..7620
-            LOCAL_KW@7514..7519 "local"
-            WHITESPACE@7519..7520 " "
-            BIND_DESTRUCT@7520..7619
-              DESTRUCT_FULL@7520..7533
-                NAME@7520..7533
-                  IDENT@7520..7533 "target_fields"
-              WHITESPACE@7533..7534 " "
-              ASSIGN@7534..7535 "="
-              WHITESPACE@7535..7544 "\n        "
-              EXPR_IF_THEN_ELSE@7544..7619
-                IF_KW@7544..7546 "if"
-                WHITESPACE@7546..7547 " "
-                EXPR_APPLY@7547..7574
-                  EXPR_INDEX@7547..7559
-                    EXPR_VAR@7547..7550
-                      NAME@7547..7550
-                        IDENT@7547..7550 "std"
-                    DOT@7550..7551 "."
-                    NAME@7551..7559
-                      IDENT@7551..7559 "isObject"
-                  ARGS_DESC@7559..7574
-                    L_PAREN@7559..7560 "("
-                    ARG@7560..7573
-                      EXPR_VAR@7560..7573
-                        NAME@7560..7573
-                          IDENT@7560..7573 "target_object"
-                    R_PAREN@7573..7574 ")"
-                WHITESPACE@7574..7575 " "
-                THEN_KW@7575..7579 "then"
-                WHITESPACE@7579..7580 " "
-                TRUE_EXPR@7580..7611
-                  EXPR_APPLY@7580..7611
-                    EXPR_INDEX@7580..7596
-                      EXPR_VAR@7580..7583
-                        NAME@7580..7583
-                          IDENT@7580..7583 "std"
-                      DOT@7583..7584 "."
-                      NAME@7584..7596
-                        IDENT@7584..7596 "objectFields"
-                    ARGS_DESC@7596..7611
-                      L_PAREN@7596..7597 "("
-                      ARG@7597..7610
-                        EXPR_VAR@7597..7610
-                          NAME@7597..7610
-                            IDENT@7597..7610 "target_object"
-                      R_PAREN@7610..7611 ")"
-                WHITESPACE@7611..7612 " "
-                ELSE_KW@7612..7616 "else"
-                WHITESPACE@7616..7617 " "
-                FALSE_EXPR@7617..7619
-                  EXPR_ARRAY@7617..7619
-                    L_BRACK@7617..7618 "["
-                    R_BRACK@7618..7619 "]"
-            SEMI@7619..7620 ";"
-          WHITESPACE@7620..7628 "\n\n      "
-          STMT_LOCAL@7628..7705
-            LOCAL_KW@7628..7633 "local"
-            WHITESPACE@7633..7634 " "
-            BIND_DESTRUCT@7634..7704
-              DESTRUCT_FULL@7634..7645
-                NAME@7634..7645
-                  IDENT@7634..7645 "null_fields"
-              WHITESPACE@7645..7646 " "
-              ASSIGN@7646..7647 "="
-              WHITESPACE@7647..7648 " "
-              EXPR_ARRAY_COMP@7648..7704
-                L_BRACK@7648..7649 "["
-                EXPR_VAR@7649..7650
-                  NAME@7649..7650
-                    IDENT@7649..7650 "k"
-                WHITESPACE@7650..7651 " "
-                FOR_SPEC@7651..7683
-                  FOR_KW@7651..7654 "for"
-                  WHITESPACE@7654..7655 " "
-                  NAME@7655..7656
-                    IDENT@7655..7656 "k"
-                  WHITESPACE@7656..7657 " "
-                  IN_KW@7657..7659 "in"
-                  WHITESPACE@7659..7660 " "
-                  EXPR_APPLY@7660..7683
-                    EXPR_INDEX@7660..7676
-                      EXPR_VAR@7660..7663
-                        NAME@7660..7663
-                          IDENT@7660..7663 "std"
-                      DOT@7663..7664 "."
-                      NAME@7664..7676
-                        IDENT@7664..7676 "objectFields"
-                    ARGS_DESC@7676..7683
-                      L_PAREN@7676..7677 "("
-                      ARG@7677..7682
-                        EXPR_VAR@7677..7682
-                          NAME@7677..7682
-                            IDENT@7677..7682 "patch"
-                      R_PAREN@7682..7683 ")"
-                WHITESPACE@7683..7684 " "
-                IF_SPEC@7684..7703
-                  IF_KW@7684..7686 "if"
-                  WHITESPACE@7686..7687 " "
-                  EXPR_BINARY@7687..7703
-                    LHS_EXPR@7687..7695
-                      EXPR_INDEX_EXPR@7687..7695
-                        LHS_EXPR@7687..7692
-                          EXPR_VAR@7687..7692
-                            NAME@7687..7692
-                              IDENT@7687..7692 "patch"
-                        L_BRACK@7692..7693 "["
-                        EXPR_VAR@7693..7694
-                          NAME@7693..7694
-                            IDENT@7693..7694 "k"
-                        R_BRACK@7694..7695 "]"
-                    WHITESPACE@7695..7696 " "
-                    EQ@7696..7698 "=="
-                    WHITESPACE@7698..7699 " "
-                    EXPR_LITERAL@7699..7703
-                      NULL_KW@7699..7703 "null"
-                R_BRACK@7703..7704 "]"
-            SEMI@7704..7705 ";"
-          WHITESPACE@7705..7712 "\n      "
-          STMT_LOCAL@7712..7785
-            LOCAL_KW@7712..7717 "local"
-            WHITESPACE@7717..7718 " "
-            BIND_DESTRUCT@7718..7784
-              DESTRUCT_FULL@7718..7729
-                NAME@7718..7729
-                  IDENT@7718..7729 "both_fields"
-              WHITESPACE@7729..7730 " "
-              ASSIGN@7730..7731 "="
-              WHITESPACE@7731..7732 " "
-              EXPR_APPLY@7732..7784
-                EXPR_INDEX@7732..7744
-                  EXPR_VAR@7732..7735
-                    NAME@7732..7735
-                      IDENT@7732..7735 "std"
-                  DOT@7735..7736 "."
-                  NAME@7736..7744
-                    IDENT@7736..7744 "setUnion"
-                ARGS_DESC@7744..7784
-                  L_PAREN@7744..7745 "("
-                  ARG@7745..7758
-                    EXPR_VAR@7745..7758
-                      NAME@7745..7758
-                        IDENT@7745..7758 "target_fields"
-                  COMMA@7758..7759 ","
-                  WHITESPACE@7759..7760 " "
-                  ARG@7760..7783
-                    EXPR_APPLY@7760..7783
-                      EXPR_INDEX@7760..7776
-                        EXPR_VAR@7760..7763
-                          NAME@7760..7763
-                            IDENT@7760..7763 "std"
-                        DOT@7763..7764 "."
-                        NAME@7764..7776
-                          IDENT@7764..7776 "objectFields"
-                      ARGS_DESC@7776..7783
-                        L_PAREN@7776..7777 "("
-                        ARG@7777..7782
-                          EXPR_VAR@7777..7782
-                            NAME@7777..7782
-                              IDENT@7777..7782 "patch"
-                        R_PAREN@7782..7783 ")"
-                  R_PAREN@7783..7784 ")"
-            SEMI@7784..7785 ";"
-          WHITESPACE@7785..7793 "\n\n      "
-          TRUE_EXPR@7793..8133
-            EXPR_OBJECT@7793..8133
-              OBJ_BODY_COMP@7793..8133
-                L_BRACE@7793..7794 "{"
-                WHITESPACE@7794..7803 "\n        "
-                MEMBER_FIELD_NORMAL@7803..8070
-                  FIELD_NAME_DYNAMIC@7803..7806
-                    L_BRACK@7803..7804 "["
-                    EXPR_VAR@7804..7805
-                      NAME@7804..7805
-                        IDENT@7804..7805 "k"
-                    R_BRACK@7805..7806 "]"
-                  COLON@7806..7807 ":"
-                  WHITESPACE@7807..7818 "\n          "
-                  EXPR_IF_THEN_ELSE@7818..8070
-                    IF_KW@7818..7820 "if"
-                    WHITESPACE@7820..7821 " "
-                    EXPR_UNARY@7821..7845
-                      NOT@7821..7822 "!"
-                      EXPR_APPLY@7822..7845
-                        EXPR_INDEX@7822..7835
-                          EXPR_VAR@7822..7825
-                            NAME@7822..7825
-                              IDENT@7822..7825 "std"
-                          DOT@7825..7826 "."
-                          NAME@7826..7835
-                            IDENT@7826..7835 "objectHas"
-                        ARGS_DESC@7835..7845
-                          L_PAREN@7835..7836 "("
-                          ARG@7836..7841
-                            EXPR_VAR@7836..7841
-                              NAME@7836..7841
-                                IDENT@7836..7841 "patch"
-                          COMMA@7841..7842 ","
-                          WHITESPACE@7842..7843 " "
-                          ARG@7843..7844
-                            EXPR_VAR@7843..7844
-                              NAME@7843..7844
-                                IDENT@7843..7844 "k"
-                          R_PAREN@7844..7845 ")"
-                    WHITESPACE@7845..7846 " "
-                    THEN_KW@7846..7850 "then"
-                    WHITESPACE@7850..7863 "\n            "
-                    TRUE_EXPR@7863..7879
-                      EXPR_INDEX_EXPR@7863..7879
-                        LHS_EXPR@7863..7876
-                          EXPR_VAR@7863..7876
-                            NAME@7863..7876
-                              IDENT@7863..7876 "target_object"
-                        L_BRACK@7876..7877 "["
-                        EXPR_VAR@7877..7878
-                          NAME@7877..7878
-                            IDENT@7877..7878 "k"
-                        R_BRACK@7878..7879 "]"
-                    WHITESPACE@7879..7890 "\n          "
-                    ELSE_KW@7890..7894 "else"
-                    WHITESPACE@7894..7895 " "
-                    FALSE_EXPR@7895..8070
-                      EXPR_IF_THEN_ELSE@7895..8070
-                        IF_KW@7895..7897 "if"
-                        WHITESPACE@7897..7898 " "
-                        EXPR_UNARY@7898..7930
-                          NOT@7898..7899 "!"
-                          EXPR_APPLY@7899..7930
-                            EXPR_INDEX@7899..7912
-                              EXPR_VAR@7899..7902
-                                NAME@7899..7902
-                                  IDENT@7899..7902 "std"
-                              DOT@7902..7903 "."
-                              NAME@7903..7912
-                                IDENT@7903..7912 "objectHas"
-                            ARGS_DESC@7912..7930
-                              L_PAREN@7912..7913 "("
-                              ARG@7913..7926
-                                EXPR_VAR@7913..7926
-                                  NAME@7913..7926
-                                    IDENT@7913..7926 "target_object"
-                              COMMA@7926..7927 ","
-                              WHITESPACE@7927..7928 " "
-                              ARG@7928..7929
-                                EXPR_VAR@7928..7929
-                                  NAME@7928..7929
-                                    IDENT@7928..7929 "k"
-                              R_PAREN@7929..7930 ")"
-                        WHITESPACE@7930..7931 " "
-                        THEN_KW@7931..7935 "then"
-                        WHITESPACE@7935..7948 "\n            "
-                        TRUE_EXPR@7948..7989
-                          EXPR_APPLY@7948..7989
-                            EXPR_INDEX@7948..7962
-                              EXPR_VAR@7948..7951
-                                NAME@7948..7951
-                                  IDENT@7948..7951 "std"
-                              DOT@7951..7952 "."
-                              NAME@7952..7962
-                                IDENT@7952..7962 "mergePatch"
-                            ARGS_DESC@7962..7989
-                              L_PAREN@7962..7963 "("
-                              ARG@7963..7967
-                                EXPR_LITERAL@7963..7967
-                                  NULL_KW@7963..7967 "null"
-                              COMMA@7967..7968 ","
-                              WHITESPACE@7968..7969 " "
-                              ARG@7969..7977
-                                EXPR_INDEX_EXPR@7969..7977
-                                  LHS_EXPR@7969..7974
-                                    EXPR_VAR@7969..7974
-                                      NAME@7969..7974
-                                        IDENT@7969..7974 "patch"
-                                  L_BRACK@7974..7975 "["
-                                  EXPR_VAR@7975..7976
-                                    NAME@7975..7976
-                                      IDENT@7975..7976 "k"
-                                  R_BRACK@7976..7977 "]"
-                              R_PAREN@7977..7978 ")"
-                              WHITESPACE@7978..7979 " "
-                              TAILSTRICT_KW@7979..7989 "tailstrict"
-                        WHITESPACE@7989..8000 "\n          "
-                        ELSE_KW@8000..8004 "else"
-                        WHITESPACE@8004..8017 "\n            "
-                        FALSE_EXPR@8017..8070
-                          EXPR_APPLY@8017..8070
-                            EXPR_INDEX@8017..8031
-                              EXPR_VAR@8017..8020
-                                NAME@8017..8020
-                                  IDENT@8017..8020 "std"
-                              DOT@8020..8021 "."
-                              NAME@8021..8031
-                                IDENT@8021..8031 "mergePatch"
-                            ARGS_DESC@8031..8070
-                              L_PAREN@8031..8032 "("
-                              ARG@8032..8048
-                                EXPR_INDEX_EXPR@8032..8048
-                                  LHS_EXPR@8032..8045
-                                    EXPR_VAR@8032..8045
-                                      NAME@8032..8045
-                                        IDENT@8032..8045 "target_object"
-                                  L_BRACK@8045..8046 "["
-                                  EXPR_VAR@8046..8047
-                                    NAME@8046..8047
-                                      IDENT@8046..8047 "k"
-                                  R_BRACK@8047..8048 "]"
-                              COMMA@8048..8049 ","
-                              WHITESPACE@8049..8050 " "
-                              ARG@8050..8058
-                                EXPR_INDEX_EXPR@8050..8058
-                                  LHS_EXPR@8050..8055
-                                    EXPR_VAR@8050..8055
-                                      NAME@8050..8055
-                                        IDENT@8050..8055 "patch"
-                                  L_BRACK@8055..8056 "["
-                                  EXPR_VAR@8056..8057
-                                    NAME@8056..8057
-                                      IDENT@8056..8057 "k"
-                                  R_BRACK@8057..8058 "]"
-                              R_PAREN@8058..8059 ")"
-                              WHITESPACE@8059..8060 " "
-                              TAILSTRICT_KW@8060..8070 "tailstrict"
-                WHITESPACE@8070..8079 "\n        "
-                FOR_SPEC@8079..8125
-                  FOR_KW@8079..8082 "for"
-                  WHITESPACE@8082..8083 " "
-                  NAME@8083..8084
-                    IDENT@8083..8084 "k"
-                  WHITESPACE@8084..8085 " "
-                  IN_KW@8085..8087 "in"
-                  WHITESPACE@8087..8088 " "
-                  EXPR_APPLY@8088..8125
-                    EXPR_INDEX@8088..8099
-                      EXPR_VAR@8088..8091
-                        NAME@8088..8091
-                          IDENT@8088..8091 "std"
-                      DOT@8091..8092 "."
-                      NAME@8092..8099
-                        IDENT@8092..8099 "setDiff"
-                    ARGS_DESC@8099..8125
-                      L_PAREN@8099..8100 "("
-                      ARG@8100..8111
-                        EXPR_VAR@8100..8111
-                          NAME@8100..8111
-                            IDENT@8100..8111 "both_fields"
-                      COMMA@8111..8112 ","
-                      WHITESPACE@8112..8113 " "
-                      ARG@8113..8124
-                        EXPR_VAR@8113..8124
-                          NAME@8113..8124
-                            IDENT@8113..8124 "null_fields"
-                      R_PAREN@8124..8125 ")"
-                WHITESPACE@8125..8132 "\n      "
-                R_BRACE@8132..8133 "}"
-          WHITESPACE@8133..8138 "\n    "
-          ELSE_KW@8138..8142 "else"
-          WHITESPACE@8142..8149 "\n      "
-          FALSE_EXPR@8149..8154
-            EXPR_VAR@8149..8154
-              NAME@8149..8154
-                IDENT@8149..8154 "patch"
-      COMMA@8154..8155 ","
-      WHITESPACE@8155..8159 "\n\n  "
-      MEMBER_FIELD_METHOD@8159..8265
-        FIELD_NAME_FIXED@8159..8162
-          NAME@8159..8162
-            IDENT@8159..8162 "get"
-        PARAMS_DESC@8162..8199
-          L_PAREN@8162..8163 "("
-          PARAM@8163..8164
-            DESTRUCT_FULL@8163..8164
-              NAME@8163..8164
-                IDENT@8163..8164 "o"
-          COMMA@8164..8165 ","
-          WHITESPACE@8165..8166 " "
-          PARAM@8166..8167
-            DESTRUCT_FULL@8166..8167
-              NAME@8166..8167
-                IDENT@8166..8167 "f"
-          COMMA@8167..8168 ","
-          WHITESPACE@8168..8169 " "
-          PARAM@8169..8181
-            DESTRUCT_FULL@8169..8176
-              NAME@8169..8176
-                IDENT@8169..8176 "default"
-            ASSIGN@8176..8177 "="
-            EXPR_LITERAL@8177..8181
-              NULL_KW@8177..8181 "null"
-          COMMA@8181..8182 ","
-          WHITESPACE@8182..8183 " "
-          PARAM@8183..8198
-            DESTRUCT_FULL@8183..8193
-              NAME@8183..8193
-                IDENT@8183..8193 "inc_hidden"
-            ASSIGN@8193..8194 "="
-            EXPR_LITERAL@8194..8198
-              TRUE_KW@8194..8198 "true"
-          R_PAREN@8198..8199 ")"
-        COLONCOLON@8199..8201 "::"
-        WHITESPACE@8201..8206 "\n    "
-        EXPR_IF_THEN_ELSE@8206..8265
-          IF_KW@8206..8208 "if"
-          WHITESPACE@8208..8209 " "
-          EXPR_APPLY@8209..8242
-            EXPR_INDEX@8209..8224
-              EXPR_VAR@8209..8212
-                NAME@8209..8212
-                  IDENT@8209..8212 "std"
-              DOT@8212..8213 "."
-              NAME@8213..8224
-                IDENT@8213..8224 "objectHasEx"
-            ARGS_DESC@8224..8242
-              L_PAREN@8224..8225 "("
-              ARG@8225..8226
-                EXPR_VAR@8225..8226
-                  NAME@8225..8226
-                    IDENT@8225..8226 "o"
-              COMMA@8226..8227 ","
-              WHITESPACE@8227..8228 " "
-              ARG@8228..8229
-                EXPR_VAR@8228..8229
-                  NAME@8228..8229
-                    IDENT@8228..8229 "f"
-              COMMA@8229..8230 ","
-              WHITESPACE@8230..8231 " "
-              ARG@8231..8241
-                EXPR_VAR@8231..8241
-                  NAME@8231..8241
-                    IDENT@8231..8241 "inc_hidden"
-              R_PAREN@8241..8242 ")"
-          WHITESPACE@8242..8243 " "
-          THEN_KW@8243..8247 "then"
-          WHITESPACE@8247..8248 " "
-          TRUE_EXPR@8248..8252
-            EXPR_INDEX_EXPR@8248..8252
-              LHS_EXPR@8248..8249
-                EXPR_VAR@8248..8249
-                  NAME@8248..8249
-                    IDENT@8248..8249 "o"
-              L_BRACK@8249..8250 "["
-              EXPR_VAR@8250..8251
-                NAME@8250..8251
-                  IDENT@8250..8251 "f"
-              R_BRACK@8251..8252 "]"
-          WHITESPACE@8252..8253 " "
-          ELSE_KW@8253..8257 "else"
-          WHITESPACE@8257..8258 " "
-          FALSE_EXPR@8258..8265
-            EXPR_VAR@8258..8265
-              NAME@8258..8265
-                IDENT@8258..8265 "default"
-      COMMA@8265..8266 ","
-      WHITESPACE@8266..8270 "\n\n  "
-      MEMBER_FIELD_METHOD@8270..8320
-        FIELD_NAME_FIXED@8270..8282
-          NAME@8270..8282
-            IDENT@8270..8282 "objectFields"
-        PARAMS_DESC@8282..8285
-          L_PAREN@8282..8283 "("
-          PARAM@8283..8284
-            DESTRUCT_FULL@8283..8284
-              NAME@8283..8284
-                IDENT@8283..8284 "o"
-          R_PAREN@8284..8285 ")"
-        COLONCOLON@8285..8287 "::"
-        WHITESPACE@8287..8292 "\n    "
-        EXPR_APPLY@8292..8320
-          EXPR_INDEX@8292..8310
-            EXPR_VAR@8292..8295
-              NAME@8292..8295
-                IDENT@8292..8295 "std"
-            DOT@8295..8296 "."
-            NAME@8296..8310
-              IDENT@8296..8310 "objectFieldsEx"
-          ARGS_DESC@8310..8320
-            L_PAREN@8310..8311 "("
-            ARG@8311..8312
-              EXPR_VAR@8311..8312
-                NAME@8311..8312
-                  IDENT@8311..8312 "o"
-            COMMA@8312..8313 ","
-            WHITESPACE@8313..8314 " "
-            ARG@8314..8319
-              EXPR_LITERAL@8314..8319
-                FALSE_KW@8314..8319 "false"
-            R_PAREN@8319..8320 ")"
-      COMMA@8320..8321 ","
-      WHITESPACE@8321..8325 "\n\n  "
-      MEMBER_FIELD_METHOD@8325..8377
-        FIELD_NAME_FIXED@8325..8340
-          NAME@8325..8340
-            IDENT@8325..8340 "objectFieldsAll"
-        PARAMS_DESC@8340..8343
-          L_PAREN@8340..8341 "("
-          PARAM@8341..8342
-            DESTRUCT_FULL@8341..8342
-              NAME@8341..8342
-                IDENT@8341..8342 "o"
-          R_PAREN@8342..8343 ")"
-        COLONCOLON@8343..8345 "::"
-        WHITESPACE@8345..8350 "\n    "
-        EXPR_APPLY@8350..8377
-          EXPR_INDEX@8350..8368
-            EXPR_VAR@8350..8353
-              NAME@8350..8353
-                IDENT@8350..8353 "std"
-            DOT@8353..8354 "."
-            NAME@8354..8368
-              IDENT@8354..8368 "objectFieldsEx"
-          ARGS_DESC@8368..8377
-            L_PAREN@8368..8369 "("
-            ARG@8369..8370
-              EXPR_VAR@8369..8370
-                NAME@8369..8370
-                  IDENT@8369..8370 "o"
-            COMMA@8370..8371 ","
-            WHITESPACE@8371..8372 " "
-            ARG@8372..8376
-              EXPR_LITERAL@8372..8376
-                TRUE_KW@8372..8376 "true"
-            R_PAREN@8376..8377 ")"
-      COMMA@8377..8378 ","
-      WHITESPACE@8378..8382 "\n\n  "
-      MEMBER_FIELD_METHOD@8382..8432
-        FIELD_NAME_FIXED@8382..8391
-          NAME@8382..8391
-            IDENT@8382..8391 "objectHas"
-        PARAMS_DESC@8391..8397
-          L_PAREN@8391..8392 "("
-          PARAM@8392..8393
-            DESTRUCT_FULL@8392..8393
-              NAME@8392..8393
-                IDENT@8392..8393 "o"
-          COMMA@8393..8394 ","
-          WHITESPACE@8394..8395 " "
-          PARAM@8395..8396
-            DESTRUCT_FULL@8395..8396
-              NAME@8395..8396
-                IDENT@8395..8396 "f"
-          R_PAREN@8396..8397 ")"
-        COLONCOLON@8397..8399 "::"
-        WHITESPACE@8399..8404 "\n    "
-        EXPR_APPLY@8404..8432
-          EXPR_INDEX@8404..8419
-            EXPR_VAR@8404..8407
-              NAME@8404..8407
-                IDENT@8404..8407 "std"
-            DOT@8407..8408 "."
-            NAME@8408..8419
-              IDENT@8408..8419 "objectHasEx"
-          ARGS_DESC@8419..8432
-            L_PAREN@8419..8420 "("
-            ARG@8420..8421
-              EXPR_VAR@8420..8421
-                NAME@8420..8421
-                  IDENT@8420..8421 "o"
-            COMMA@8421..8422 ","
-            WHITESPACE@8422..8423 " "
-            ARG@8423..8424
-              EXPR_VAR@8423..8424
-                NAME@8423..8424
-                  IDENT@8423..8424 "f"
-            COMMA@8424..8425 ","
-            WHITESPACE@8425..8426 " "
-            ARG@8426..8431
-              EXPR_LITERAL@8426..8431
-                FALSE_KW@8426..8431 "false"
-            R_PAREN@8431..8432 ")"
-      COMMA@8432..8433 ","
-      WHITESPACE@8433..8437 "\n\n  "
-      MEMBER_FIELD_METHOD@8437..8489
-        FIELD_NAME_FIXED@8437..8449
-          NAME@8437..8449
-            IDENT@8437..8449 "objectHasAll"
-        PARAMS_DESC@8449..8455
-          L_PAREN@8449..8450 "("
-          PARAM@8450..8451
-            DESTRUCT_FULL@8450..8451
-              NAME@8450..8451
-                IDENT@8450..8451 "o"
-          COMMA@8451..8452 ","
-          WHITESPACE@8452..8453 " "
-          PARAM@8453..8454
-            DESTRUCT_FULL@8453..8454
-              NAME@8453..8454
-                IDENT@8453..8454 "f"
-          R_PAREN@8454..8455 ")"
-        COLONCOLON@8455..8457 "::"
-        WHITESPACE@8457..8462 "\n    "
-        EXPR_APPLY@8462..8489
-          EXPR_INDEX@8462..8477
-            EXPR_VAR@8462..8465
-              NAME@8462..8465
-                IDENT@8462..8465 "std"
-            DOT@8465..8466 "."
-            NAME@8466..8477
-              IDENT@8466..8477 "objectHasEx"
-          ARGS_DESC@8477..8489
-            L_PAREN@8477..8478 "("
-            ARG@8478..8479
-              EXPR_VAR@8478..8479
-                NAME@8478..8479
-                  IDENT@8478..8479 "o"
-            COMMA@8479..8480 ","
-            WHITESPACE@8480..8481 " "
-            ARG@8481..8482
-              EXPR_VAR@8481..8482
-                NAME@8481..8482
-                  IDENT@8481..8482 "f"
-            COMMA@8482..8483 ","
-            WHITESPACE@8483..8484 " "
-            ARG@8484..8488
-              EXPR_LITERAL@8484..8488
-                TRUE_KW@8484..8488 "true"
-            R_PAREN@8488..8489 ")"
-      COMMA@8489..8490 ","
-      WHITESPACE@8490..8494 "\n\n  "
-      MEMBER_FIELD_METHOD@8494..8551
-        FIELD_NAME_FIXED@8494..8506
-          NAME@8494..8506
-            IDENT@8494..8506 "objectValues"
-        PARAMS_DESC@8506..8509
-          L_PAREN@8506..8507 "("
-          PARAM@8507..8508
-            DESTRUCT_FULL@8507..8508
-              NAME@8507..8508
-                IDENT@8507..8508 "o"
-          R_PAREN@8508..8509 ")"
-        COLONCOLON@8509..8511 "::"
-        WHITESPACE@8511..8516 "\n    "
-        EXPR_ARRAY_COMP@8516..8551
-          L_BRACK@8516..8517 "["
-          EXPR_INDEX_EXPR@8517..8521
-            LHS_EXPR@8517..8518
-              EXPR_VAR@8517..8518
-                NAME@8517..8518
-                  IDENT@8517..8518 "o"
-            L_BRACK@8518..8519 "["
-            EXPR_VAR@8519..8520
-              NAME@8519..8520
-                IDENT@8519..8520 "k"
-            R_BRACK@8520..8521 "]"
-          WHITESPACE@8521..8522 " "
-          FOR_SPEC@8522..8550
-            FOR_KW@8522..8525 "for"
-            WHITESPACE@8525..8526 " "
-            NAME@8526..8527
-              IDENT@8526..8527 "k"
-            WHITESPACE@8527..8528 " "
-            IN_KW@8528..8530 "in"
-            WHITESPACE@8530..8531 " "
-            EXPR_APPLY@8531..8550
-              EXPR_INDEX@8531..8547
-                EXPR_VAR@8531..8534
-                  NAME@8531..8534
-                    IDENT@8531..8534 "std"
-                DOT@8534..8535 "."
-                NAME@8535..8547
-                  IDENT@8535..8547 "objectFields"
-              ARGS_DESC@8547..8550
-                L_PAREN@8547..8548 "("
-                ARG@8548..8549
-                  EXPR_VAR@8548..8549
-                    NAME@8548..8549
-                      IDENT@8548..8549 "o"
-                R_PAREN@8549..8550 ")"
-          R_BRACK@8550..8551 "]"
-      COMMA@8551..8552 ","
-      WHITESPACE@8552..8556 "\n\n  "
-      MEMBER_FIELD_METHOD@8556..8619
-        FIELD_NAME_FIXED@8556..8571
-          NAME@8556..8571
-            IDENT@8556..8571 "objectValuesAll"
-        PARAMS_DESC@8571..8574
-          L_PAREN@8571..8572 "("
-          PARAM@8572..8573
-            DESTRUCT_FULL@8572..8573
-              NAME@8572..8573
-                IDENT@8572..8573 "o"
-          R_PAREN@8573..8574 ")"
-        COLONCOLON@8574..8576 "::"
-        WHITESPACE@8576..8581 "\n    "
-        EXPR_ARRAY_COMP@8581..8619
-          L_BRACK@8581..8582 "["
-          EXPR_INDEX_EXPR@8582..8586
-            LHS_EXPR@8582..8583
-              EXPR_VAR@8582..8583
-                NAME@8582..8583
-                  IDENT@8582..8583 "o"
-            L_BRACK@8583..8584 "["
-            EXPR_VAR@8584..8585
-              NAME@8584..8585
-                IDENT@8584..8585 "k"
-            R_BRACK@8585..8586 "]"
-          WHITESPACE@8586..8587 " "
-          FOR_SPEC@8587..8618
-            FOR_KW@8587..8590 "for"
-            WHITESPACE@8590..8591 " "
-            NAME@8591..8592
-              IDENT@8591..8592 "k"
-            WHITESPACE@8592..8593 " "
-            IN_KW@8593..8595 "in"
-            WHITESPACE@8595..8596 " "
-            EXPR_APPLY@8596..8618
-              EXPR_INDEX@8596..8615
-                EXPR_VAR@8596..8599
-                  NAME@8596..8599
-                    IDENT@8596..8599 "std"
-                DOT@8599..8600 "."
-                NAME@8600..8615
-                  IDENT@8600..8615 "objectFieldsAll"
-              ARGS_DESC@8615..8618
-                L_PAREN@8615..8616 "("
-                ARG@8616..8617
-                  EXPR_VAR@8616..8617
-                    NAME@8616..8617
-                      IDENT@8616..8617 "o"
-                R_PAREN@8617..8618 ")"
-          R_BRACK@8618..8619 "]"
-      COMMA@8619..8620 ","
-      WHITESPACE@8620..8624 "\n\n  "
-      MEMBER_FIELD_METHOD@8624..8758
-        FIELD_NAME_FIXED@8624..8635
-          NAME@8624..8635
-            IDENT@8624..8635 "resolvePath"
-        PARAMS_DESC@8635..8641
-          L_PAREN@8635..8636 "("
-          PARAM@8636..8637
-            DESTRUCT_FULL@8636..8637
-              NAME@8636..8637
-                IDENT@8636..8637 "f"
-          COMMA@8637..8638 ","
-          WHITESPACE@8638..8639 " "
-          PARAM@8639..8640
-            DESTRUCT_FULL@8639..8640
-              NAME@8639..8640
-                IDENT@8639..8640 "r"
-          R_PAREN@8640..8641 ")"
-        COLONCOLON@8641..8643 "::"
-        WHITESPACE@8643..8648 "\n    "
-        STMT_LOCAL@8648..8678
-          LOCAL_KW@8648..8653 "local"
-          WHITESPACE@8653..8654 " "
-          BIND_DESTRUCT@8654..8677
-            DESTRUCT_FULL@8654..8657
-              NAME@8654..8657
-                IDENT@8654..8657 "arr"
-            WHITESPACE@8657..8658 " "
-            ASSIGN@8658..8659 "="
-            WHITESPACE@8659..8660 " "
-            EXPR_APPLY@8660..8677
-              EXPR_INDEX@8660..8669
-                EXPR_VAR@8660..8663
-                  NAME@8660..8663
-                    IDENT@8660..8663 "std"
-                DOT@8663..8664 "."
-                NAME@8664..8669
-                  IDENT@8664..8669 "split"
-              ARGS_DESC@8669..8677
-                L_PAREN@8669..8670 "("
-                ARG@8670..8671
-                  EXPR_VAR@8670..8671
-                    NAME@8670..8671
-                      IDENT@8670..8671 "f"
-                COMMA@8671..8672 ","
-                WHITESPACE@8672..8673 " "
-                ARG@8673..8676
-                  EXPR_STRING@8673..8676
-                    STRING_SINGLE@8673..8676 "'/'"
-                R_PAREN@8676..8677 ")"
-          SEMI@8677..8678 ";"
-        WHITESPACE@8678..8683 "\n    "
-        EXPR_APPLY@8683..8758
-          EXPR_INDEX@8683..8691
-            EXPR_VAR@8683..8686
-              NAME@8683..8686
-                IDENT@8683..8686 "std"
-            DOT@8686..8687 "."
-            NAME@8687..8691
-              IDENT@8687..8691 "join"
-          ARGS_DESC@8691..8758
-            L_PAREN@8691..8692 "("
-            ARG@8692..8695
-              EXPR_STRING@8692..8695
-                STRING_SINGLE@8692..8695 "'/'"
-            COMMA@8695..8696 ","
-            WHITESPACE@8696..8697 " "
-            ARG@8697..8757
-              EXPR_BINARY@8697..8757
-                LHS_EXPR@8697..8751
-                  EXPR_APPLY@8697..8751
-                    EXPR_INDEX@8697..8710
-                      EXPR_VAR@8697..8700
-                        NAME@8697..8700
-                          IDENT@8697..8700 "std"
-                      DOT@8700..8701 "."
-                      NAME@8701..8710
-                        IDENT@8701..8710 "makeArray"
-                    ARGS_DESC@8710..8751
-                      L_PAREN@8710..8711 "("
-                      ARG@8711..8730
-                        EXPR_BINARY@8711..8730
-                          LHS_EXPR@8711..8726
-                            EXPR_APPLY@8711..8726
-                              EXPR_INDEX@8711..8721
-                                EXPR_VAR@8711..8714
-                                  NAME@8711..8714
-                                    IDENT@8711..8714 "std"
-                                DOT@8714..8715 "."
-                                NAME@8715..8721
-                                  IDENT@8715..8721 "length"
-                              ARGS_DESC@8721..8726
-                                L_PAREN@8721..8722 "("
-                                ARG@8722..8725
-                                  EXPR_VAR@8722..8725
-                                    NAME@8722..8725
-                                      IDENT@8722..8725 "arr"
-                                R_PAREN@8725..8726 ")"
-                          WHITESPACE@8726..8727 " "
-                          MINUS@8727..8728 "-"
-                          WHITESPACE@8728..8729 " "
-                          EXPR_NUMBER@8729..8730
-                            FLOAT@8729..8730 "1"
-                      COMMA@8730..8731 ","
-                      WHITESPACE@8731..8732 " "
-                      ARG@8732..8750
-                        EXPR_FUNCTION@8732..8750
-                          FUNCTION_KW@8732..8740 "function"
-                          PARAMS_DESC@8740..8743
-                            L_PAREN@8740..8741 "("
-                            PARAM@8741..8742
-                              DESTRUCT_FULL@8741..8742
-                                NAME@8741..8742
-                                  IDENT@8741..8742 "i"
-                            R_PAREN@8742..8743 ")"
-                          WHITESPACE@8743..8744 " "
-                          EXPR_INDEX_EXPR@8744..8750
-                            LHS_EXPR@8744..8747
-                              EXPR_VAR@8744..8747
-                                NAME@8744..8747
-                                  IDENT@8744..8747 "arr"
-                            L_BRACK@8747..8748 "["
-                            EXPR_VAR@8748..8749
-                              NAME@8748..8749
-                                IDENT@8748..8749 "i"
-                            R_BRACK@8749..8750 "]"
-                      R_PAREN@8750..8751 ")"
-                WHITESPACE@8751..8752 " "
-                PLUS@8752..8753 "+"
-                WHITESPACE@8753..8754 " "
-                EXPR_ARRAY@8754..8757
-                  L_BRACK@8754..8755 "["
-                  EXPR_VAR@8755..8756
-                    NAME@8755..8756
-                      IDENT@8755..8756 "r"
-                  R_BRACK@8756..8757 "]"
-            R_PAREN@8757..8758 ")"
-      COMMA@8758..8759 ","
-      WHITESPACE@8759..8763 "\n\n  "
-      MEMBER_FIELD_METHOD@8763..9216
-        FIELD_NAME_FIXED@8763..8768
-          NAME@8763..8768
-            IDENT@8763..8768 "prune"
-        PARAMS_DESC@8768..8771
-          L_PAREN@8768..8769 "("
-          PARAM@8769..8770
-            DESTRUCT_FULL@8769..8770
-              NAME@8769..8770
-                IDENT@8769..8770 "a"
-          R_PAREN@8770..8771 ")"
-        COLONCOLON@8771..8773 "::"
-        WHITESPACE@8773..8778 "\n    "
-        STMT_LOCAL@8778..8982
-          LOCAL_KW@8778..8783 "local"
-          WHITESPACE@8783..8784 " "
-          BIND_FUNCTION@8784..8981
-            NAME@8784..8793
-              IDENT@8784..8793 "isContent"
-            PARAMS_DESC@8793..8796
-              L_PAREN@8793..8794 "("
-              PARAM@8794..8795
-                DESTRUCT_FULL@8794..8795
-                  NAME@8794..8795
-                    IDENT@8794..8795 "b"
-              R_PAREN@8795..8796 ")"
-            WHITESPACE@8796..8797 " "
-            ASSIGN@8797..8798 "="
-            WHITESPACE@8798..8805 "\n      "
-            EXPR_IF_THEN_ELSE@8805..8981
-              IF_KW@8805..8807 "if"
-              WHITESPACE@8807..8808 " "
-              EXPR_BINARY@8808..8817
-                LHS_EXPR@8808..8809
-                  EXPR_VAR@8808..8809
-                    NAME@8808..8809
-                      IDENT@8808..8809 "b"
-                WHITESPACE@8809..8810 " "
-                EQ@8810..8812 "=="
-                WHITESPACE@8812..8813 " "
-                EXPR_LITERAL@8813..8817
-                  NULL_KW@8813..8817 "null"
-              WHITESPACE@8817..8818 " "
-              THEN_KW@8818..8822 "then"
-              WHITESPACE@8822..8831 "\n        "
-              TRUE_EXPR@8831..8836
-                EXPR_LITERAL@8831..8836
-                  FALSE_KW@8831..8836 "false"
-              WHITESPACE@8836..8843 "\n      "
-              ELSE_KW@8843..8847 "else"
-              WHITESPACE@8847..8848 " "
-              FALSE_EXPR@8848..8981
-                EXPR_IF_THEN_ELSE@8848..8981
-                  IF_KW@8848..8850 "if"
-                  WHITESPACE@8850..8851 " "
-                  EXPR_APPLY@8851..8865
-                    EXPR_INDEX@8851..8862
-                      EXPR_VAR@8851..8854
-                        NAME@8851..8854
-                          IDENT@8851..8854 "std"
-                      DOT@8854..8855 "."
-                      NAME@8855..8862
-                        IDENT@8855..8862 "isArray"
-                    ARGS_DESC@8862..8865
-                      L_PAREN@8862..8863 "("
-                      ARG@8863..8864
-                        EXPR_VAR@8863..8864
-                          NAME@8863..8864
-                            IDENT@8863..8864 "b"
-                      R_PAREN@8864..8865 ")"
-                  WHITESPACE@8865..8866 " "
-                  THEN_KW@8866..8870 "then"
-                  WHITESPACE@8870..8879 "\n        "
-                  TRUE_EXPR@8879..8896
-                    EXPR_BINARY@8879..8896
-                      LHS_EXPR@8879..8892
-                        EXPR_APPLY@8879..8892
-                          EXPR_INDEX@8879..8889
-                            EXPR_VAR@8879..8882
-                              NAME@8879..8882
-                                IDENT@8879..8882 "std"
-                            DOT@8882..8883 "."
-                            NAME@8883..8889
-                              IDENT@8883..8889 "length"
-                          ARGS_DESC@8889..8892
-                            L_PAREN@8889..8890 "("
-                            ARG@8890..8891
-                              EXPR_VAR@8890..8891
-                                NAME@8890..8891
-                                  IDENT@8890..8891 "b"
-                            R_PAREN@8891..8892 ")"
-                      WHITESPACE@8892..8893 " "
-                      GT@8893..8894 ">"
-                      WHITESPACE@8894..8895 " "
-                      EXPR_NUMBER@8895..8896
-                        FLOAT@8895..8896 "0"
-                  WHITESPACE@8896..8903 "\n      "
-                  ELSE_KW@8903..8907 "else"
-                  WHITESPACE@8907..8908 " "
-                  FALSE_EXPR@8908..8981
-                    EXPR_IF_THEN_ELSE@8908..8981
-                      IF_KW@8908..8910 "if"
-                      WHITESPACE@8910..8911 " "
-                      EXPR_APPLY@8911..8926
-                        EXPR_INDEX@8911..8923
-                          EXPR_VAR@8911..8914
-                            NAME@8911..8914
-                              IDENT@8911..8914 "std"
-                          DOT@8914..8915 "."
-                          NAME@8915..8923
-                            IDENT@8915..8923 "isObject"
-                        ARGS_DESC@8923..8926
-                          L_PAREN@8923..8924 "("
-                          ARG@8924..8925
-                            EXPR_VAR@8924..8925
-                              NAME@8924..8925
-                                IDENT@8924..8925 "b"
-                          R_PAREN@8925..8926 ")"
-                      WHITESPACE@8926..8927 " "
-                      THEN_KW@8927..8931 "then"
-                      WHITESPACE@8931..8940 "\n        "
-                      TRUE_EXPR@8940..8957
-                        EXPR_BINARY@8940..8957
-                          LHS_EXPR@8940..8953
-                            EXPR_APPLY@8940..8953
-                              EXPR_INDEX@8940..8950
-                                EXPR_VAR@8940..8943
-                                  NAME@8940..8943
-                                    IDENT@8940..8943 "std"
-                                DOT@8943..8944 "."
-                                NAME@8944..8950
-                                  IDENT@8944..8950 "length"
-                              ARGS_DESC@8950..8953
-                                L_PAREN@8950..8951 "("
-                                ARG@8951..8952
-                                  EXPR_VAR@8951..8952
-                                    NAME@8951..8952
-                                      IDENT@8951..8952 "b"
-                                R_PAREN@8952..8953 ")"
-                          WHITESPACE@8953..8954 " "
-                          GT@8954..8955 ">"
-                          WHITESPACE@8955..8956 " "
-                          EXPR_NUMBER@8956..8957
-                            FLOAT@8956..8957 "0"
-                      WHITESPACE@8957..8964 "\n      "
-                      ELSE_KW@8964..8968 "else"
-                      WHITESPACE@8968..8977 "\n        "
-                      FALSE_EXPR@8977..8981
-                        EXPR_LITERAL@8977..8981
-                          TRUE_KW@8977..8981 "true"
-          SEMI@8981..8982 ";"
-        WHITESPACE@8982..8987 "\n    "
-        EXPR_IF_THEN_ELSE@8987..9216
-          IF_KW@8987..8989 "if"
-          WHITESPACE@8989..8990 " "
-          EXPR_APPLY@8990..9004
-            EXPR_INDEX@8990..9001
-              EXPR_VAR@8990..8993
-                NAME@8990..8993
-                  IDENT@8990..8993 "std"
-              DOT@8993..8994 "."
-              NAME@8994..9001
-                IDENT@8994..9001 "isArray"
-            ARGS_DESC@9001..9004
-              L_PAREN@9001..9002 "("
-              ARG@9002..9003
-                EXPR_VAR@9002..9003
-                  NAME@9002..9003
-                    IDENT@9002..9003 "a"
-              R_PAREN@9003..9004 ")"
-          WHITESPACE@9004..9005 " "
-          THEN_KW@9005..9009 "then"
-          WHITESPACE@9009..9016 "\n      "
-          TRUE_EXPR@9016..9066
-            EXPR_ARRAY_COMP@9016..9066
-              L_BRACK@9016..9017 "["
-              EXPR_APPLY@9017..9029
-                EXPR_INDEX@9017..9026
-                  EXPR_VAR@9017..9020
-                    NAME@9017..9020
-                      IDENT@9017..9020 "std"
-                  DOT@9020..9021 "."
-                  NAME@9021..9026
-                    IDENT@9021..9026 "prune"
-                ARGS_DESC@9026..9029
-                  L_PAREN@9026..9027 "("
-                  ARG@9027..9028
-                    EXPR_VAR@9027..9028
-                      NAME@9027..9028
-                        IDENT@9027..9028 "x"
-                  R_PAREN@9028..9029 ")"
-              WHITESPACE@9029..9030 " "
-              FOR_SPEC@9030..9040
-                FOR_KW@9030..9033 "for"
-                WHITESPACE@9033..9034 " "
-                NAME@9034..9035
-                  IDENT@9034..9035 "x"
-                WHITESPACE@9035..9036 " "
-                IN_KW@9036..9038 "in"
-                WHITESPACE@9038..9039 " "
-                EXPR_VAR@9039..9040
-                  NAME@9039..9040
-                    IDENT@9039..9040 "a"
-              WHITESPACE@9040..9041 " "
-              IF_SPEC@9041..9065
-                IF_KW@9041..9043 "if"
-                WHITESPACE@9043..9044 " "
-                EXPR_APPLY@9044..9065
-                  EXPR_VAR@9044..9053
-                    NAME@9044..9053
-                      IDENT@9044..9053 "isContent"
-                  ARGS_DESC@9053..9065
-                    L_PAREN@9053..9054 "("
-                    ARG@9054..9064
-                      EXPR_APPLY@9054..9064
-                        EXPR_INDEX@9054..9061
-                          EXPR_LITERAL@9054..9055
-                            DOLLAR@9054..9055 "$"
-                          DOT@9055..9056 "."
-                          NAME@9056..9061
-                            IDENT@9056..9061 "prune"
-                        ARGS_DESC@9061..9064
-                          L_PAREN@9061..9062 "("
-                          ARG@9062..9063
-                            EXPR_VAR@9062..9063
-                              NAME@9062..9063
-                                IDENT@9062..9063 "x"
-                          R_PAREN@9063..9064 ")"
-                    R_PAREN@9064..9065 ")"
-              R_BRACK@9065..9066 "]"
-          WHITESPACE@9066..9071 "\n    "
-          ELSE_KW@9071..9075 "else"
-          WHITESPACE@9075..9076 " "
-          FALSE_EXPR@9076..9216
-            EXPR_IF_THEN_ELSE@9076..9216
-              IF_KW@9076..9078 "if"
-              WHITESPACE@9078..9079 " "
-              EXPR_APPLY@9079..9094
-                EXPR_INDEX@9079..9091
-                  EXPR_VAR@9079..9082
-                    NAME@9079..9082
-                      IDENT@9079..9082 "std"
-                  DOT@9082..9083 "."
-                  NAME@9083..9091
-                    IDENT@9083..9091 "isObject"
-                ARGS_DESC@9091..9094
-                  L_PAREN@9091..9092 "("
-                  ARG@9092..9093
-                    EXPR_VAR@9092..9093
-                      NAME@9092..9093
-                        IDENT@9092..9093 "a"
-                  R_PAREN@9093..9094 ")"
-              WHITESPACE@9094..9095 " "
-              THEN_KW@9095..9099 "then"
-              WHITESPACE@9099..9100 " "
-              TRUE_EXPR@9100..9203
-                EXPR_OBJECT@9100..9203
-                  OBJ_BODY_COMP@9100..9203
-                    L_BRACE@9100..9101 "{"
-                    WHITESPACE@9101..9108 "\n      "
-                    MEMBER_FIELD_NORMAL@9108..9126
-                      FIELD_NAME_DYNAMIC@9108..9111
-                        L_BRACK@9108..9109 "["
-                        EXPR_VAR@9109..9110
-                          NAME@9109..9110
-                            IDENT@9109..9110 "x"
-                        R_BRACK@9110..9111 "]"
-                      COLON@9111..9112 ":"
-                      WHITESPACE@9112..9113 " "
-                      EXPR_APPLY@9113..9126
-                        EXPR_INDEX@9113..9120
-                          EXPR_LITERAL@9113..9114
-                            DOLLAR@9113..9114 "$"
-                          DOT@9114..9115 "."
-                          NAME@9115..9120
-                            IDENT@9115..9120 "prune"
-                        ARGS_DESC@9120..9126
-                          L_PAREN@9120..9121 "("
-                          ARG@9121..9125
-                            EXPR_INDEX_EXPR@9121..9125
-                              LHS_EXPR@9121..9122
-                                EXPR_VAR@9121..9122
-                                  NAME@9121..9122
-                                    IDENT@9121..9122 "a"
-                              L_BRACK@9122..9123 "["
-                              EXPR_VAR@9123..9124
-                                NAME@9123..9124
-                                  IDENT@9123..9124 "x"
-                              R_BRACK@9124..9125 "]"
-                          R_PAREN@9125..9126 ")"
-                    WHITESPACE@9126..9133 "\n      "
-                    FOR_SPEC@9133..9161
-                      FOR_KW@9133..9136 "for"
-                      WHITESPACE@9136..9137 " "
-                      NAME@9137..9138
-                        IDENT@9137..9138 "x"
-                      WHITESPACE@9138..9139 " "
-                      IN_KW@9139..9141 "in"
-                      WHITESPACE@9141..9142 " "
-                      EXPR_APPLY@9142..9161
-                        EXPR_INDEX@9142..9158
-                          EXPR_VAR@9142..9145
-                            NAME@9142..9145
-                              IDENT@9142..9145 "std"
-                          DOT@9145..9146 "."
-                          NAME@9146..9158
-                            IDENT@9146..9158 "objectFields"
-                        ARGS_DESC@9158..9161
-                          L_PAREN@9158..9159 "("
-                          ARG@9159..9160
-                            EXPR_VAR@9159..9160
-                              NAME@9159..9160
-                                IDENT@9159..9160 "a"
-                          R_PAREN@9160..9161 ")"
-                    WHITESPACE@9161..9168 "\n      "
-                    IF_SPEC@9168..9197
-                      IF_KW@9168..9170 "if"
-                      WHITESPACE@9170..9171 " "
-                      EXPR_APPLY@9171..9197
-                        EXPR_VAR@9171..9180
-                          NAME@9171..9180
-                            IDENT@9171..9180 "isContent"
-                        ARGS_DESC@9180..9197
-                          L_PAREN@9180..9181 "("
-                          ARG@9181..9196
-                            EXPR_APPLY@9181..9196
-                              EXPR_INDEX@9181..9190
-                                EXPR_VAR@9181..9184
-                                  NAME@9181..9184
-                                    IDENT@9181..9184 "std"
-                                DOT@9184..9185 "."
-                                NAME@9185..9190
-                                  IDENT@9185..9190 "prune"
-                              ARGS_DESC@9190..9196
-                                L_PAREN@9190..9191 "("
-                                ARG@9191..9195
-                                  EXPR_INDEX_EXPR@9191..9195
-                                    LHS_EXPR@9191..9192
-                                      EXPR_VAR@9191..9192
-                                        NAME@9191..9192
-                                          IDENT@9191..9192 "a"
-                                    L_BRACK@9192..9193 "["
-                                    EXPR_VAR@9193..9194
-                                      NAME@9193..9194
-                                        IDENT@9193..9194 "x"
-                                    R_BRACK@9194..9195 "]"
-                                R_PAREN@9195..9196 ")"
-                          R_PAREN@9196..9197 ")"
-                    WHITESPACE@9197..9202 "\n    "
-                    R_BRACE@9202..9203 "}"
-              WHITESPACE@9203..9204 " "
-              ELSE_KW@9204..9208 "else"
-              WHITESPACE@9208..9215 "\n      "
-              FALSE_EXPR@9215..9216
-                EXPR_VAR@9215..9216
-                  NAME@9215..9216
-                    IDENT@9215..9216 "a"
-      COMMA@9216..9217 ","
-      WHITESPACE@9217..9221 "\n\n  "
-      MEMBER_FIELD_METHOD@9221..9436
-        FIELD_NAME_FIXED@9221..9225
-          NAME@9221..9225
-            IDENT@9221..9225 "find"
-        PARAMS_DESC@9225..9237
-          L_PAREN@9225..9226 "("
-          PARAM@9226..9231
-            DESTRUCT_FULL@9226..9231
-              NAME@9226..9231
-                IDENT@9226..9231 "value"
-          COMMA@9231..9232 ","
-          WHITESPACE@9232..9233 " "
-          PARAM@9233..9236
-            DESTRUCT_FULL@9233..9236
-              NAME@9233..9236
-                IDENT@9233..9236 "arr"
-          R_PAREN@9236..9237 ")"
-        COLONCOLON@9237..9239 "::"
-        WHITESPACE@9239..9244 "\n    "
-        EXPR_IF_THEN_ELSE@9244..9436
-          IF_KW@9244..9246 "if"
-          WHITESPACE@9246..9247 " "
-          EXPR_UNARY@9247..9264
-            NOT@9247..9248 "!"
-            EXPR_APPLY@9248..9264
-              EXPR_INDEX@9248..9259
-                EXPR_VAR@9248..9251
-                  NAME@9248..9251
-                    IDENT@9248..9251 "std"
-                DOT@9251..9252 "."
-                NAME@9252..9259
-                  IDENT@9252..9259 "isArray"
-              ARGS_DESC@9259..9264
-                L_PAREN@9259..9260 "("
-                ARG@9260..9263
-                  EXPR_VAR@9260..9263
-                    NAME@9260..9263
-                      IDENT@9260..9263 "arr"
-                R_PAREN@9263..9264 ")"
-          WHITESPACE@9264..9265 " "
-          THEN_KW@9265..9269 "then"
-          WHITESPACE@9269..9276 "\n      "
-          TRUE_EXPR@9276..9346
-            EXPR_ERROR@9276..9346
-              ERROR_KW@9276..9281 "error"
-              WHITESPACE@9281..9282 " "
-              EXPR_BINARY@9282..9346
-                LHS_EXPR@9282..9330
-                  EXPR_STRING@9282..9330
-                    STRING_SINGLE@9282..9330 "'find second paramete ..."
-                WHITESPACE@9330..9331 " "
-                PLUS@9331..9332 "+"
-                WHITESPACE@9332..9333 " "
-                EXPR_APPLY@9333..9346
-                  EXPR_INDEX@9333..9341
-                    EXPR_VAR@9333..9336
-                      NAME@9333..9336
-                        IDENT@9333..9336 "std"
-                    DOT@9336..9337 "."
-                    NAME@9337..9341
-                      IDENT@9337..9341 "type"
-                  ARGS_DESC@9341..9346
-                    L_PAREN@9341..9342 "("
-                    ARG@9342..9345
-                      EXPR_VAR@9342..9345
-                        NAME@9342..9345
-                          IDENT@9342..9345 "arr"
-                    R_PAREN@9345..9346 ")"
-          WHITESPACE@9346..9351 "\n    "
-          ELSE_KW@9351..9355 "else"
-          WHITESPACE@9355..9362 "\n      "
-          FALSE_EXPR@9362..9436
-            EXPR_APPLY@9362..9436
-              EXPR_INDEX@9362..9372
-                EXPR_VAR@9362..9365
-                  NAME@9362..9365
-                    IDENT@9362..9365 "std"
-                DOT@9365..9366 "."
-                NAME@9366..9372
-                  IDENT@9366..9372 "filter"
-              ARGS_DESC@9372..9436
-                L_PAREN@9372..9373 "("
-                ARG@9373..9400
-                  EXPR_FUNCTION@9373..9400
-                    FUNCTION_KW@9373..9381 "function"
-                    PARAMS_DESC@9381..9384
-                      L_PAREN@9381..9382 "("
-                      PARAM@9382..9383
-                        DESTRUCT_FULL@9382..9383
-                          NAME@9382..9383
-                            IDENT@9382..9383 "i"
-                      R_PAREN@9383..9384 ")"
-                    WHITESPACE@9384..9385 " "
-                    EXPR_BINARY@9385..9400
-                      LHS_EXPR@9385..9391
-                        EXPR_INDEX_EXPR@9385..9391
-                          LHS_EXPR@9385..9388
-                            EXPR_VAR@9385..9388
-                              NAME@9385..9388
-                                IDENT@9385..9388 "arr"
-                          L_BRACK@9388..9389 "["
-                          EXPR_VAR@9389..9390
-                            NAME@9389..9390
-                              IDENT@9389..9390 "i"
-                          R_BRACK@9390..9391 "]"
-                      WHITESPACE@9391..9392 " "
-                      EQ@9392..9394 "=="
-                      WHITESPACE@9394..9395 " "
-                      EXPR_VAR@9395..9400
-                        NAME@9395..9400
-                          IDENT@9395..9400 "value"
-                COMMA@9400..9401 ","
-                WHITESPACE@9401..9402 " "
-                ARG@9402..9435
-                  EXPR_APPLY@9402..9435
-                    EXPR_INDEX@9402..9411
-                      EXPR_VAR@9402..9405
-                        NAME@9402..9405
-                          IDENT@9402..9405 "std"
-                      DOT@9405..9406 "."
-                      NAME@9406..9411
-                        IDENT@9406..9411 "range"
-                    ARGS_DESC@9411..9435
-                      L_PAREN@9411..9412 "("
-                      ARG@9412..9413
-                        EXPR_NUMBER@9412..9413
-                          FLOAT@9412..9413 "0"
-                      COMMA@9413..9414 ","
-                      WHITESPACE@9414..9415 " "
-                      ARG@9415..9434
-                        EXPR_BINARY@9415..9434
-                          LHS_EXPR@9415..9430
-                            EXPR_APPLY@9415..9430
-                              EXPR_INDEX@9415..9425
-                                EXPR_VAR@9415..9418
-                                  NAME@9415..9418
-                                    IDENT@9415..9418 "std"
-                                DOT@9418..9419 "."
-                                NAME@9419..9425
-                                  IDENT@9419..9425 "length"
-                              ARGS_DESC@9425..9430
-                                L_PAREN@9425..9426 "("
-                                ARG@9426..9429
-                                  EXPR_VAR@9426..9429
-                                    NAME@9426..9429
-                                      IDENT@9426..9429 "arr"
-                                R_PAREN@9429..9430 ")"
-                          WHITESPACE@9430..9431 " "
-                          MINUS@9431..9432 "-"
-                          WHITESPACE@9432..9433 " "
-                          EXPR_NUMBER@9433..9434
-                            FLOAT@9433..9434 "1"
-                      R_PAREN@9434..9435 ")"
-                R_PAREN@9435..9436 ")"
-      COMMA@9436..9437 ","
-      WHITESPACE@9437..9441 "\n\n  "
-      SINGLE_LINE_SLASH_COMMENT@9441..9451 "// Compat\n"
-      WHITESPACE@9451..9453 "  "
-      MEMBER_FIELD_METHOD@9453..9563
-        FIELD_NAME_FIXED@9453..9468
-          NAME@9453..9468
-            IDENT@9453..9468 "__compare_array"
-        PARAMS_DESC@9468..9480
-          L_PAREN@9468..9469 "("
-          PARAM@9469..9473
-            DESTRUCT_FULL@9469..9473
-              NAME@9469..9473
-                IDENT@9469..9473 "arr1"
-          COMMA@9473..9474 ","
-          WHITESPACE@9474..9475 " "
-          PARAM@9475..9479
-            DESTRUCT_FULL@9475..9479
-              NAME@9475..9479
-                IDENT@9475..9479 "arr2"
-          R_PAREN@9479..9480 ")"
-        COLONCOLON@9480..9482 "::"
-        WHITESPACE@9482..9487 "\n    "
-        EXPR_ASSERT@9487..9563
-          ASSERTION@9487..9532
-            ASSERT_KW@9487..9493 "assert"
-            WHITESPACE@9493..9494 " "
-            LHS_EXPR@9494..9532
-              EXPR_BINARY@9494..9532
-                LHS_EXPR@9494..9511
-                  EXPR_APPLY@9494..9511
-                    EXPR_INDEX@9494..9505
-                      EXPR_VAR@9494..9497
-                        NAME@9494..9497
-                          IDENT@9494..9497 "std"
-                      DOT@9497..9498 "."
-                      NAME@9498..9505
-                        IDENT@9498..9505 "isArray"
-                    ARGS_DESC@9505..9511
-                      L_PAREN@9505..9506 "("
-                      ARG@9506..9510
-                        EXPR_VAR@9506..9510
-                          NAME@9506..9510
-                            IDENT@9506..9510 "arr1"
-                      R_PAREN@9510..9511 ")"
-                WHITESPACE@9511..9512 " "
-                AND@9512..9514 "&&"
-                WHITESPACE@9514..9515 " "
-                EXPR_APPLY@9515..9532
-                  EXPR_INDEX@9515..9526
-                    EXPR_VAR@9515..9518
-                      NAME@9515..9518
-                        IDENT@9515..9518 "std"
-                    DOT@9518..9519 "."
-                    NAME@9519..9526
-                      IDENT@9519..9526 "isArray"
-                  ARGS_DESC@9526..9532
-                    L_PAREN@9526..9527 "("
-                    ARG@9527..9531
-                      EXPR_VAR@9527..9531
-                        NAME@9527..9531
-                          IDENT@9527..9531 "arr2"
-                    R_PAREN@9531..9532 ")"
-          SEMI@9532..9533 ";"
-          WHITESPACE@9533..9538 "\n    "
-          EXPR_APPLY@9538..9563
-            EXPR_INDEX@9538..9551
-              EXPR_VAR@9538..9541
-                NAME@9538..9541
-                  IDENT@9538..9541 "std"
-              DOT@9541..9542 "."
-              NAME@9542..9551
-                IDENT@9542..9551 "__compare"
-            ARGS_DESC@9551..9563
-              L_PAREN@9551..9552 "("
-              ARG@9552..9556
-                EXPR_VAR@9552..9556
-                  NAME@9552..9556
-                    IDENT@9552..9556 "arr1"
-              COMMA@9556..9557 ","
-              WHITESPACE@9557..9558 " "
-              ARG@9558..9562
-                EXPR_VAR@9558..9562
-                  NAME@9558..9562
-                    IDENT@9558..9562 "arr2"
-              R_PAREN@9562..9563 ")"
-      COMMA@9563..9564 ","
-      WHITESPACE@9564..9567 "\n  "
-      MEMBER_FIELD_METHOD@9567..9631
-        FIELD_NAME_FIXED@9567..9579
-          NAME@9567..9579
-            IDENT@9567..9579 "__array_less"
-        PARAMS_DESC@9579..9591
-          L_PAREN@9579..9580 "("
-          PARAM@9580..9584
-            DESTRUCT_FULL@9580..9584
-              NAME@9580..9584
-                IDENT@9580..9584 "arr1"
-          COMMA@9584..9585 ","
-          WHITESPACE@9585..9586 " "
-          PARAM@9586..9590
-            DESTRUCT_FULL@9586..9590
-              NAME@9586..9590
-                IDENT@9586..9590 "arr2"
-          R_PAREN@9590..9591 ")"
-        COLONCOLON@9591..9593 "::"
-        WHITESPACE@9593..9594 " "
-        EXPR_BINARY@9594..9631
-          LHS_EXPR@9594..9625
-            EXPR_APPLY@9594..9625
-              EXPR_INDEX@9594..9613
-                EXPR_VAR@9594..9597
-                  NAME@9594..9597
-                    IDENT@9594..9597 "std"
-                DOT@9597..9598 "."
-                NAME@9598..9613
-                  IDENT@9598..9613 "__compare_array"
-              ARGS_DESC@9613..9625
-                L_PAREN@9613..9614 "("
-                ARG@9614..9618
-                  EXPR_VAR@9614..9618
-                    NAME@9614..9618
-                      IDENT@9614..9618 "arr1"
-                COMMA@9618..9619 ","
-                WHITESPACE@9619..9620 " "
-                ARG@9620..9624
-                  EXPR_VAR@9620..9624
-                    NAME@9620..9624
-                      IDENT@9620..9624 "arr2"
-                R_PAREN@9624..9625 ")"
-          WHITESPACE@9625..9626 " "
-          EQ@9626..9628 "=="
-          WHITESPACE@9628..9629 " "
-          EXPR_UNARY@9629..9631
-            MINUS@9629..9630 "-"
-            EXPR_NUMBER@9630..9631
-              FLOAT@9630..9631 "1"
-      COMMA@9631..9632 ","
-      WHITESPACE@9632..9635 "\n  "
-      MEMBER_FIELD_METHOD@9635..9701
-        FIELD_NAME_FIXED@9635..9650
-          NAME@9635..9650
-            IDENT@9635..9650 "__array_greater"
-        PARAMS_DESC@9650..9662
-          L_PAREN@9650..9651 "("
-          PARAM@9651..9655
-            DESTRUCT_FULL@9651..9655
-              NAME@9651..9655
-                IDENT@9651..9655 "arr1"
-          COMMA@9655..9656 ","
-          WHITESPACE@9656..9657 " "
-          PARAM@9657..9661
-            DESTRUCT_FULL@9657..9661
-              NAME@9657..9661
-                IDENT@9657..9661 "arr2"
-          R_PAREN@9661..9662 ")"
-        COLONCOLON@9662..9664 "::"
-        WHITESPACE@9664..9665 " "
-        EXPR_BINARY@9665..9701
-          LHS_EXPR@9665..9696
-            EXPR_APPLY@9665..9696
-              EXPR_INDEX@9665..9684
-                EXPR_VAR@9665..9668
-                  NAME@9665..9668
-                    IDENT@9665..9668 "std"
-                DOT@9668..9669 "."
-                NAME@9669..9684
-                  IDENT@9669..9684 "__compare_array"
-              ARGS_DESC@9684..9696
-                L_PAREN@9684..9685 "("
-                ARG@9685..9689
-                  EXPR_VAR@9685..9689
-                    NAME@9685..9689
-                      IDENT@9685..9689 "arr1"
-                COMMA@9689..9690 ","
-                WHITESPACE@9690..9691 " "
-                ARG@9691..9695
-                  EXPR_VAR@9691..9695
-                    NAME@9691..9695
-                      IDENT@9691..9695 "arr2"
-                R_PAREN@9695..9696 ")"
-          WHITESPACE@9696..9697 " "
-          EQ@9697..9699 "=="
-          WHITESPACE@9699..9700 " "
-          EXPR_NUMBER@9700..9701
-            FLOAT@9700..9701 "1"
-      COMMA@9701..9702 ","
-      WHITESPACE@9702..9705 "\n  "
-      MEMBER_FIELD_METHOD@9705..9777
-        FIELD_NAME_FIXED@9705..9726
-          NAME@9705..9726
-            IDENT@9705..9726 "__array_less_or_equal"
-        PARAMS_DESC@9726..9738
-          L_PAREN@9726..9727 "("
-          PARAM@9727..9731
-            DESTRUCT_FULL@9727..9731
-              NAME@9727..9731
-                IDENT@9727..9731 "arr1"
-          COMMA@9731..9732 ","
-          WHITESPACE@9732..9733 " "
-          PARAM@9733..9737
-            DESTRUCT_FULL@9733..9737
-              NAME@9733..9737
-                IDENT@9733..9737 "arr2"
-          R_PAREN@9737..9738 ")"
-        COLONCOLON@9738..9740 "::"
-        WHITESPACE@9740..9741 " "
-        EXPR_BINARY@9741..9777
-          LHS_EXPR@9741..9772
-            EXPR_APPLY@9741..9772
-              EXPR_INDEX@9741..9760
-                EXPR_VAR@9741..9744
-                  NAME@9741..9744
-                    IDENT@9741..9744 "std"
-                DOT@9744..9745 "."
-                NAME@9745..9760
-                  IDENT@9745..9760 "__compare_array"
-              ARGS_DESC@9760..9772
-                L_PAREN@9760..9761 "("
-                ARG@9761..9765
-                  EXPR_VAR@9761..9765
-                    NAME@9761..9765
-                      IDENT@9761..9765 "arr1"
-                COMMA@9765..9766 ","
-                WHITESPACE@9766..9767 " "
-                ARG@9767..9771
-                  EXPR_VAR@9767..9771
-                    NAME@9767..9771
-                      IDENT@9767..9771 "arr2"
-                R_PAREN@9771..9772 ")"
-          WHITESPACE@9772..9773 " "
-          LE@9773..9775 "<="
-          WHITESPACE@9775..9776 " "
-          EXPR_NUMBER@9776..9777
-            FLOAT@9776..9777 "0"
-      COMMA@9777..9778 ","
-      WHITESPACE@9778..9781 "\n  "
-      MEMBER_FIELD_METHOD@9781..9856
-        FIELD_NAME_FIXED@9781..9805
-          NAME@9781..9805
-            IDENT@9781..9805 "__array_greater_or_equal"
-        PARAMS_DESC@9805..9817
-          L_PAREN@9805..9806 "("
-          PARAM@9806..9810
-            DESTRUCT_FULL@9806..9810
-              NAME@9806..9810
-                IDENT@9806..9810 "arr1"
-          COMMA@9810..9811 ","
-          WHITESPACE@9811..9812 " "
-          PARAM@9812..9816
-            DESTRUCT_FULL@9812..9816
-              NAME@9812..9816
-                IDENT@9812..9816 "arr2"
-          R_PAREN@9816..9817 ")"
-        COLONCOLON@9817..9819 "::"
-        WHITESPACE@9819..9820 " "
-        EXPR_BINARY@9820..9856
-          LHS_EXPR@9820..9851
-            EXPR_APPLY@9820..9851
-              EXPR_INDEX@9820..9839
-                EXPR_VAR@9820..9823
-                  NAME@9820..9823
-                    IDENT@9820..9823 "std"
-                DOT@9823..9824 "."
-                NAME@9824..9839
-                  IDENT@9824..9839 "__compare_array"
-              ARGS_DESC@9839..9851
-                L_PAREN@9839..9840 "("
-                ARG@9840..9844
-                  EXPR_VAR@9840..9844
-                    NAME@9840..9844
-                      IDENT@9840..9844 "arr1"
-                COMMA@9844..9845 ","
-                WHITESPACE@9845..9846 " "
-                ARG@9846..9850
-                  EXPR_VAR@9846..9850
-                    NAME@9846..9850
-                      IDENT@9846..9850 "arr2"
-                R_PAREN@9850..9851 ")"
-          WHITESPACE@9851..9852 " "
-          GE@9852..9854 ">="
-          WHITESPACE@9854..9855 " "
-          EXPR_NUMBER@9855..9856
-            FLOAT@9855..9856 "0"
-      COMMA@9856..9857 ","
-      WHITESPACE@9857..9858 "\n"
-      R_BRACE@9858..9859 "}"
-  WHITESPACE@9859..9860 "\n"
+                                EXPR@6704..6705
+                                  EXPR_NUMBER@6704..6705
+                                    FLOAT@6704..6705 "1"
+                          COMMA@6705..6706 ","
+                          WHITESPACE@6706..6707 " "
+                          ARG@6707..6725
+                            EXPR@6707..6725
+                              EXPR_FUNCTION@6707..6725
+                                FUNCTION_KW@6707..6715 "function"
+                                PARAMS_DESC@6715..6718
+                                  L_PAREN@6715..6716 "("
+                                  PARAM@6716..6717
+                                    DESTRUCT_FULL@6716..6717
+                                      NAME@6716..6717
+                                        IDENT@6716..6717 "i"
+                                  R_PAREN@6717..6718 ")"
+                                WHITESPACE@6718..6719 " "
+                                EXPR@6719..6725
+                                  EXPR_VAR@6719..6722
+                                    NAME@6719..6722
+                                      IDENT@6719..6722 "arr"
+                                  SUFFIX_INDEX_EXPR@6722..6725
+                                    L_BRACK@6722..6723 "["
+                                    EXPR@6723..6724
+                                      EXPR_VAR@6723..6724
+                                        NAME@6723..6724
+                                          IDENT@6723..6724 "i"
+                                    R_BRACK@6724..6725 "]"
+                          R_PAREN@6725..6726 ")"
+                      WHITESPACE@6726..6727 " "
+                      PLUS@6727..6728 "+"
+                      WHITESPACE@6728..6729 " "
+                      EXPR@6729..6732
+                        EXPR_ARRAY@6729..6732
+                          L_BRACK@6729..6730 "["
+                          EXPR@6730..6731
+                            EXPR_VAR@6730..6731
+                              NAME@6730..6731
+                                IDENT@6730..6731 "r"
+                          R_BRACK@6731..6732 "]"
+                R_PAREN@6732..6733 ")"
+        COMMA@6733..6734 ","
+        WHITESPACE@6734..6738 "\n\n  "
+        MEMBER_FIELD_METHOD@6738..7191
+          FIELD_NAME_FIXED@6738..6743
+            NAME@6738..6743
+              IDENT@6738..6743 "prune"
+          PARAMS_DESC@6743..6746
+            L_PAREN@6743..6744 "("
+            PARAM@6744..6745
+              DESTRUCT_FULL@6744..6745
+                NAME@6744..6745
+                  IDENT@6744..6745 "a"
+            R_PAREN@6745..6746 ")"
+          COLONCOLON@6746..6748 "::"
+          WHITESPACE@6748..6753 "\n    "
+          EXPR@6753..7191
+            STMT_LOCAL@6753..6957
+              LOCAL_KW@6753..6758 "local"
+              WHITESPACE@6758..6759 " "
+              BIND_FUNCTION@6759..6956
+                NAME@6759..6768
+                  IDENT@6759..6768 "isContent"
+                PARAMS_DESC@6768..6771
+                  L_PAREN@6768..6769 "("
+                  PARAM@6769..6770
+                    DESTRUCT_FULL@6769..6770
+                      NAME@6769..6770
+                        IDENT@6769..6770 "b"
+                  R_PAREN@6770..6771 ")"
+                WHITESPACE@6771..6772 " "
+                ASSIGN@6772..6773 "="
+                WHITESPACE@6773..6780 "\n      "
+                EXPR@6780..6956
+                  EXPR_IF_THEN_ELSE@6780..6956
+                    IF_KW@6780..6782 "if"
+                    WHITESPACE@6782..6783 " "
+                    EXPR@6783..6792
+                      EXPR_BINARY@6783..6792
+                        EXPR@6783..6784
+                          EXPR_VAR@6783..6784
+                            NAME@6783..6784
+                              IDENT@6783..6784 "b"
+                        WHITESPACE@6784..6785 " "
+                        EQ@6785..6787 "=="
+                        WHITESPACE@6787..6788 " "
+                        EXPR@6788..6792
+                          EXPR_LITERAL@6788..6792
+                            NULL_KW@6788..6792 "null"
+                    WHITESPACE@6792..6793 " "
+                    THEN_KW@6793..6797 "then"
+                    WHITESPACE@6797..6806 "\n        "
+                    TRUE_EXPR@6806..6811
+                      EXPR@6806..6811
+                        EXPR_LITERAL@6806..6811
+                          FALSE_KW@6806..6811 "false"
+                    WHITESPACE@6811..6818 "\n      "
+                    ELSE_KW@6818..6822 "else"
+                    WHITESPACE@6822..6823 " "
+                    FALSE_EXPR@6823..6956
+                      EXPR@6823..6956
+                        EXPR_IF_THEN_ELSE@6823..6956
+                          IF_KW@6823..6825 "if"
+                          WHITESPACE@6825..6826 " "
+                          EXPR@6826..6840
+                            EXPR_VAR@6826..6829
+                              NAME@6826..6829
+                                IDENT@6826..6829 "std"
+                            SUFFIX_INDEX@6829..6837
+                              DOT@6829..6830 "."
+                              NAME@6830..6837
+                                IDENT@6830..6837 "isArray"
+                            SUFFIX_APPLY@6837..6840
+                              ARGS_DESC@6837..6840
+                                L_PAREN@6837..6838 "("
+                                ARG@6838..6839
+                                  EXPR@6838..6839
+                                    EXPR_VAR@6838..6839
+                                      NAME@6838..6839
+                                        IDENT@6838..6839 "b"
+                                R_PAREN@6839..6840 ")"
+                          WHITESPACE@6840..6841 " "
+                          THEN_KW@6841..6845 "then"
+                          WHITESPACE@6845..6854 "\n        "
+                          TRUE_EXPR@6854..6871
+                            EXPR@6854..6871
+                              EXPR_BINARY@6854..6871
+                                EXPR@6854..6857
+                                  EXPR_VAR@6854..6857
+                                    NAME@6854..6857
+                                      IDENT@6854..6857 "std"
+                                SUFFIX_INDEX@6857..6864
+                                  DOT@6857..6858 "."
+                                  NAME@6858..6864
+                                    IDENT@6858..6864 "length"
+                                SUFFIX_APPLY@6864..6867
+                                  ARGS_DESC@6864..6867
+                                    L_PAREN@6864..6865 "("
+                                    ARG@6865..6866
+                                      EXPR@6865..6866
+                                        EXPR_VAR@6865..6866
+                                          NAME@6865..6866
+                                            IDENT@6865..6866 "b"
+                                    R_PAREN@6866..6867 ")"
+                                WHITESPACE@6867..6868 " "
+                                GT@6868..6869 ">"
+                                WHITESPACE@6869..6870 " "
+                                EXPR@6870..6871
+                                  EXPR_NUMBER@6870..6871
+                                    FLOAT@6870..6871 "0"
+                          WHITESPACE@6871..6878 "\n      "
+                          ELSE_KW@6878..6882 "else"
+                          WHITESPACE@6882..6883 " "
+                          FALSE_EXPR@6883..6956
+                            EXPR@6883..6956
+                              EXPR_IF_THEN_ELSE@6883..6956
+                                IF_KW@6883..6885 "if"
+                                WHITESPACE@6885..6886 " "
+                                EXPR@6886..6901
+                                  EXPR_VAR@6886..6889
+                                    NAME@6886..6889
+                                      IDENT@6886..6889 "std"
+                                  SUFFIX_INDEX@6889..6898
+                                    DOT@6889..6890 "."
+                                    NAME@6890..6898
+                                      IDENT@6890..6898 "isObject"
+                                  SUFFIX_APPLY@6898..6901
+                                    ARGS_DESC@6898..6901
+                                      L_PAREN@6898..6899 "("
+                                      ARG@6899..6900
+                                        EXPR@6899..6900
+                                          EXPR_VAR@6899..6900
+                                            NAME@6899..6900
+                                              IDENT@6899..6900 "b"
+                                      R_PAREN@6900..6901 ")"
+                                WHITESPACE@6901..6902 " "
+                                THEN_KW@6902..6906 "then"
+                                WHITESPACE@6906..6915 "\n        "
+                                TRUE_EXPR@6915..6932
+                                  EXPR@6915..6932
+                                    EXPR_BINARY@6915..6932
+                                      EXPR@6915..6918
+                                        EXPR_VAR@6915..6918
+                                          NAME@6915..6918
+                                            IDENT@6915..6918 "std"
+                                      SUFFIX_INDEX@6918..6925
+                                        DOT@6918..6919 "."
+                                        NAME@6919..6925
+                                          IDENT@6919..6925 "length"
+                                      SUFFIX_APPLY@6925..6928
+                                        ARGS_DESC@6925..6928
+                                          L_PAREN@6925..6926 "("
+                                          ARG@6926..6927
+                                            EXPR@6926..6927
+                                              EXPR_VAR@6926..6927
+                                                NAME@6926..6927
+                                                  IDENT@6926..6927 "b"
+                                          R_PAREN@6927..6928 ")"
+                                      WHITESPACE@6928..6929 " "
+                                      GT@6929..6930 ">"
+                                      WHITESPACE@6930..6931 " "
+                                      EXPR@6931..6932
+                                        EXPR_NUMBER@6931..6932
+                                          FLOAT@6931..6932 "0"
+                                WHITESPACE@6932..6939 "\n      "
+                                ELSE_KW@6939..6943 "else"
+                                WHITESPACE@6943..6952 "\n        "
+                                FALSE_EXPR@6952..6956
+                                  EXPR@6952..6956
+                                    EXPR_LITERAL@6952..6956
+                                      TRUE_KW@6952..6956 "true"
+              SEMI@6956..6957 ";"
+            WHITESPACE@6957..6962 "\n    "
+            EXPR_IF_THEN_ELSE@6962..7191
+              IF_KW@6962..6964 "if"
+              WHITESPACE@6964..6965 " "
+              EXPR@6965..6979
+                EXPR_VAR@6965..6968
+                  NAME@6965..6968
+                    IDENT@6965..6968 "std"
+                SUFFIX_INDEX@6968..6976
+                  DOT@6968..6969 "."
+                  NAME@6969..6976
+                    IDENT@6969..6976 "isArray"
+                SUFFIX_APPLY@6976..6979
+                  ARGS_DESC@6976..6979
+                    L_PAREN@6976..6977 "("
+                    ARG@6977..6978
+                      EXPR@6977..6978
+                        EXPR_VAR@6977..6978
+                          NAME@6977..6978
+                            IDENT@6977..6978 "a"
+                    R_PAREN@6978..6979 ")"
+              WHITESPACE@6979..6980 " "
+              THEN_KW@6980..6984 "then"
+              WHITESPACE@6984..6991 "\n      "
+              TRUE_EXPR@6991..7041
+                EXPR@6991..7041
+                  EXPR_ARRAY_COMP@6991..7041
+                    L_BRACK@6991..6992 "["
+                    EXPR@6992..7004
+                      EXPR_VAR@6992..6995
+                        NAME@6992..6995
+                          IDENT@6992..6995 "std"
+                      SUFFIX_INDEX@6995..7001
+                        DOT@6995..6996 "."
+                        NAME@6996..7001
+                          IDENT@6996..7001 "prune"
+                      SUFFIX_APPLY@7001..7004
+                        ARGS_DESC@7001..7004
+                          L_PAREN@7001..7002 "("
+                          ARG@7002..7003
+                            EXPR@7002..7003
+                              EXPR_VAR@7002..7003
+                                NAME@7002..7003
+                                  IDENT@7002..7003 "x"
+                          R_PAREN@7003..7004 ")"
+                    WHITESPACE@7004..7005 " "
+                    FOR_SPEC@7005..7015
+                      FOR_KW@7005..7008 "for"
+                      WHITESPACE@7008..7009 " "
+                      DESTRUCT_FULL@7009..7010
+                        NAME@7009..7010
+                          IDENT@7009..7010 "x"
+                      WHITESPACE@7010..7011 " "
+                      IN_KW@7011..7013 "in"
+                      WHITESPACE@7013..7014 " "
+                      EXPR@7014..7015
+                        EXPR_VAR@7014..7015
+                          NAME@7014..7015
+                            IDENT@7014..7015 "a"
+                    WHITESPACE@7015..7016 " "
+                    IF_SPEC@7016..7040
+                      IF_KW@7016..7018 "if"
+                      WHITESPACE@7018..7019 " "
+                      EXPR@7019..7040
+                        EXPR_VAR@7019..7028
+                          NAME@7019..7028
+                            IDENT@7019..7028 "isContent"
+                        SUFFIX_APPLY@7028..7040
+                          ARGS_DESC@7028..7040
+                            L_PAREN@7028..7029 "("
+                            ARG@7029..7039
+                              EXPR@7029..7039
+                                EXPR_LITERAL@7029..7030
+                                  DOLLAR@7029..7030 "$"
+                                SUFFIX_INDEX@7030..7036
+                                  DOT@7030..7031 "."
+                                  NAME@7031..7036
+                                    IDENT@7031..7036 "prune"
+                                SUFFIX_APPLY@7036..7039
+                                  ARGS_DESC@7036..7039
+                                    L_PAREN@7036..7037 "("
+                                    ARG@7037..7038
+                                      EXPR@7037..7038
+                                        EXPR_VAR@7037..7038
+                                          NAME@7037..7038
+                                            IDENT@7037..7038 "x"
+                                    R_PAREN@7038..7039 ")"
+                            R_PAREN@7039..7040 ")"
+                    R_BRACK@7040..7041 "]"
+              WHITESPACE@7041..7046 "\n    "
+              ELSE_KW@7046..7050 "else"
+              WHITESPACE@7050..7051 " "
+              FALSE_EXPR@7051..7191
+                EXPR@7051..7191
+                  EXPR_IF_THEN_ELSE@7051..7191
+                    IF_KW@7051..7053 "if"
+                    WHITESPACE@7053..7054 " "
+                    EXPR@7054..7069
+                      EXPR_VAR@7054..7057
+                        NAME@7054..7057
+                          IDENT@7054..7057 "std"
+                      SUFFIX_INDEX@7057..7066
+                        DOT@7057..7058 "."
+                        NAME@7058..7066
+                          IDENT@7058..7066 "isObject"
+                      SUFFIX_APPLY@7066..7069
+                        ARGS_DESC@7066..7069
+                          L_PAREN@7066..7067 "("
+                          ARG@7067..7068
+                            EXPR@7067..7068
+                              EXPR_VAR@7067..7068
+                                NAME@7067..7068
+                                  IDENT@7067..7068 "a"
+                          R_PAREN@7068..7069 ")"
+                    WHITESPACE@7069..7070 " "
+                    THEN_KW@7070..7074 "then"
+                    WHITESPACE@7074..7075 " "
+                    TRUE_EXPR@7075..7178
+                      EXPR@7075..7178
+                        EXPR_OBJECT@7075..7178
+                          OBJ_BODY_COMP@7075..7178
+                            L_BRACE@7075..7076 "{"
+                            WHITESPACE@7076..7083 "\n      "
+                            MEMBER_FIELD_NORMAL@7083..7101
+                              FIELD_NAME_DYNAMIC@7083..7086
+                                L_BRACK@7083..7084 "["
+                                EXPR@7084..7085
+                                  EXPR_VAR@7084..7085
+                                    NAME@7084..7085
+                                      IDENT@7084..7085 "x"
+                                R_BRACK@7085..7086 "]"
+                              COLON@7086..7087 ":"
+                              WHITESPACE@7087..7088 " "
+                              EXPR@7088..7101
+                                EXPR_LITERAL@7088..7089
+                                  DOLLAR@7088..7089 "$"
+                                SUFFIX_INDEX@7089..7095
+                                  DOT@7089..7090 "."
+                                  NAME@7090..7095
+                                    IDENT@7090..7095 "prune"
+                                SUFFIX_APPLY@7095..7101
+                                  ARGS_DESC@7095..7101
+                                    L_PAREN@7095..7096 "("
+                                    ARG@7096..7100
+                                      EXPR@7096..7100
+                                        EXPR_VAR@7096..7097
+                                          NAME@7096..7097
+                                            IDENT@7096..7097 "a"
+                                        SUFFIX_INDEX_EXPR@7097..7100
+                                          L_BRACK@7097..7098 "["
+                                          EXPR@7098..7099
+                                            EXPR_VAR@7098..7099
+                                              NAME@7098..7099
+                                                IDENT@7098..7099 "x"
+                                          R_BRACK@7099..7100 "]"
+                                    R_PAREN@7100..7101 ")"
+                            WHITESPACE@7101..7108 "\n      "
+                            FOR_SPEC@7108..7136
+                              FOR_KW@7108..7111 "for"
+                              WHITESPACE@7111..7112 " "
+                              DESTRUCT_FULL@7112..7113
+                                NAME@7112..7113
+                                  IDENT@7112..7113 "x"
+                              WHITESPACE@7113..7114 " "
+                              IN_KW@7114..7116 "in"
+                              WHITESPACE@7116..7117 " "
+                              EXPR@7117..7136
+                                EXPR_VAR@7117..7120
+                                  NAME@7117..7120
+                                    IDENT@7117..7120 "std"
+                                SUFFIX_INDEX@7120..7133
+                                  DOT@7120..7121 "."
+                                  NAME@7121..7133
+                                    IDENT@7121..7133 "objectFields"
+                                SUFFIX_APPLY@7133..7136
+                                  ARGS_DESC@7133..7136
+                                    L_PAREN@7133..7134 "("
+                                    ARG@7134..7135
+                                      EXPR@7134..7135
+                                        EXPR_VAR@7134..7135
+                                          NAME@7134..7135
+                                            IDENT@7134..7135 "a"
+                                    R_PAREN@7135..7136 ")"
+                            WHITESPACE@7136..7143 "\n      "
+                            IF_SPEC@7143..7172
+                              IF_KW@7143..7145 "if"
+                              WHITESPACE@7145..7146 " "
+                              EXPR@7146..7172
+                                EXPR_VAR@7146..7155
+                                  NAME@7146..7155
+                                    IDENT@7146..7155 "isContent"
+                                SUFFIX_APPLY@7155..7172
+                                  ARGS_DESC@7155..7172
+                                    L_PAREN@7155..7156 "("
+                                    ARG@7156..7171
+                                      EXPR@7156..7171
+                                        EXPR_VAR@7156..7159
+                                          NAME@7156..7159
+                                            IDENT@7156..7159 "std"
+                                        SUFFIX_INDEX@7159..7165
+                                          DOT@7159..7160 "."
+                                          NAME@7160..7165
+                                            IDENT@7160..7165 "prune"
+                                        SUFFIX_APPLY@7165..7171
+                                          ARGS_DESC@7165..7171
+                                            L_PAREN@7165..7166 "("
+                                            ARG@7166..7170
+                                              EXPR@7166..7170
+                                                EXPR_VAR@7166..7167
+                                                  NAME@7166..7167
+                                                    IDENT@7166..7167 "a"
+                                                SUFFIX_INDEX_EXPR@7167..7170
+                                                  L_BRACK@7167..7168 "["
+                                                  EXPR@7168..7169
+                                                    EXPR_VAR@7168..7169
+                                                      NAME@7168..7169
+                                                        IDENT@7168..7169 "x"
+                                                  R_BRACK@7169..7170 "]"
+                                            R_PAREN@7170..7171 ")"
+                                    R_PAREN@7171..7172 ")"
+                            WHITESPACE@7172..7177 "\n    "
+                            R_BRACE@7177..7178 "}"
+                    WHITESPACE@7178..7179 " "
+                    ELSE_KW@7179..7183 "else"
+                    WHITESPACE@7183..7190 "\n      "
+                    FALSE_EXPR@7190..7191
+                      EXPR@7190..7191
+                        EXPR_VAR@7190..7191
+                          NAME@7190..7191
+                            IDENT@7190..7191 "a"
+        COMMA@7191..7192 ","
+        WHITESPACE@7192..7196 "\n\n  "
+        MEMBER_FIELD_METHOD@7196..7411
+          FIELD_NAME_FIXED@7196..7200
+            NAME@7196..7200
+              IDENT@7196..7200 "find"
+          PARAMS_DESC@7200..7212
+            L_PAREN@7200..7201 "("
+            PARAM@7201..7206
+              DESTRUCT_FULL@7201..7206
+                NAME@7201..7206
+                  IDENT@7201..7206 "value"
+            COMMA@7206..7207 ","
+            WHITESPACE@7207..7208 " "
+            PARAM@7208..7211
+              DESTRUCT_FULL@7208..7211
+                NAME@7208..7211
+                  IDENT@7208..7211 "arr"
+            R_PAREN@7211..7212 ")"
+          COLONCOLON@7212..7214 "::"
+          WHITESPACE@7214..7219 "\n    "
+          EXPR@7219..7411
+            EXPR_IF_THEN_ELSE@7219..7411
+              IF_KW@7219..7221 "if"
+              WHITESPACE@7221..7222 " "
+              EXPR@7222..7239
+                EXPR_UNARY@7222..7239
+                  NOT@7222..7223 "!"
+                  EXPR_VAR@7223..7226
+                    NAME@7223..7226
+                      IDENT@7223..7226 "std"
+                  SUFFIX_INDEX@7226..7234
+                    DOT@7226..7227 "."
+                    NAME@7227..7234
+                      IDENT@7227..7234 "isArray"
+                  SUFFIX_APPLY@7234..7239
+                    ARGS_DESC@7234..7239
+                      L_PAREN@7234..7235 "("
+                      ARG@7235..7238
+                        EXPR@7235..7238
+                          EXPR_VAR@7235..7238
+                            NAME@7235..7238
+                              IDENT@7235..7238 "arr"
+                      R_PAREN@7238..7239 ")"
+              WHITESPACE@7239..7240 " "
+              THEN_KW@7240..7244 "then"
+              WHITESPACE@7244..7251 "\n      "
+              TRUE_EXPR@7251..7321
+                EXPR@7251..7321
+                  EXPR_ERROR@7251..7321
+                    ERROR_KW@7251..7256 "error"
+                    WHITESPACE@7256..7257 " "
+                    EXPR@7257..7321
+                      EXPR_BINARY@7257..7321
+                        EXPR@7257..7305
+                          EXPR_STRING@7257..7305
+                            STRING_SINGLE@7257..7305 "'find second paramete ..."
+                        WHITESPACE@7305..7306 " "
+                        PLUS@7306..7307 "+"
+                        WHITESPACE@7307..7308 " "
+                        EXPR@7308..7321
+                          EXPR_VAR@7308..7311
+                            NAME@7308..7311
+                              IDENT@7308..7311 "std"
+                          SUFFIX_INDEX@7311..7316
+                            DOT@7311..7312 "."
+                            NAME@7312..7316
+                              IDENT@7312..7316 "type"
+                          SUFFIX_APPLY@7316..7321
+                            ARGS_DESC@7316..7321
+                              L_PAREN@7316..7317 "("
+                              ARG@7317..7320
+                                EXPR@7317..7320
+                                  EXPR_VAR@7317..7320
+                                    NAME@7317..7320
+                                      IDENT@7317..7320 "arr"
+                              R_PAREN@7320..7321 ")"
+              WHITESPACE@7321..7326 "\n    "
+              ELSE_KW@7326..7330 "else"
+              WHITESPACE@7330..7337 "\n      "
+              FALSE_EXPR@7337..7411
+                EXPR@7337..7411
+                  EXPR_VAR@7337..7340
+                    NAME@7337..7340
+                      IDENT@7337..7340 "std"
+                  SUFFIX_INDEX@7340..7347
+                    DOT@7340..7341 "."
+                    NAME@7341..7347
+                      IDENT@7341..7347 "filter"
+                  SUFFIX_APPLY@7347..7411
+                    ARGS_DESC@7347..7411
+                      L_PAREN@7347..7348 "("
+                      ARG@7348..7375
+                        EXPR@7348..7375
+                          EXPR_FUNCTION@7348..7375
+                            FUNCTION_KW@7348..7356 "function"
+                            PARAMS_DESC@7356..7359
+                              L_PAREN@7356..7357 "("
+                              PARAM@7357..7358
+                                DESTRUCT_FULL@7357..7358
+                                  NAME@7357..7358
+                                    IDENT@7357..7358 "i"
+                              R_PAREN@7358..7359 ")"
+                            WHITESPACE@7359..7360 " "
+                            EXPR@7360..7375
+                              EXPR_BINARY@7360..7375
+                                EXPR@7360..7363
+                                  EXPR_VAR@7360..7363
+                                    NAME@7360..7363
+                                      IDENT@7360..7363 "arr"
+                                SUFFIX_INDEX_EXPR@7363..7366
+                                  L_BRACK@7363..7364 "["
+                                  EXPR@7364..7365
+                                    EXPR_VAR@7364..7365
+                                      NAME@7364..7365
+                                        IDENT@7364..7365 "i"
+                                  R_BRACK@7365..7366 "]"
+                                WHITESPACE@7366..7367 " "
+                                EQ@7367..7369 "=="
+                                WHITESPACE@7369..7370 " "
+                                EXPR@7370..7375
+                                  EXPR_VAR@7370..7375
+                                    NAME@7370..7375
+                                      IDENT@7370..7375 "value"
+                      COMMA@7375..7376 ","
+                      WHITESPACE@7376..7377 " "
+                      ARG@7377..7410
+                        EXPR@7377..7410
+                          EXPR_VAR@7377..7380
+                            NAME@7377..7380
+                              IDENT@7377..7380 "std"
+                          SUFFIX_INDEX@7380..7386
+                            DOT@7380..7381 "."
+                            NAME@7381..7386
+                              IDENT@7381..7386 "range"
+                          SUFFIX_APPLY@7386..7410
+                            ARGS_DESC@7386..7410
+                              L_PAREN@7386..7387 "("
+                              ARG@7387..7388
+                                EXPR@7387..7388
+                                  EXPR_NUMBER@7387..7388
+                                    FLOAT@7387..7388 "0"
+                              COMMA@7388..7389 ","
+                              WHITESPACE@7389..7390 " "
+                              ARG@7390..7409
+                                EXPR@7390..7409
+                                  EXPR_BINARY@7390..7409
+                                    EXPR@7390..7393
+                                      EXPR_VAR@7390..7393
+                                        NAME@7390..7393
+                                          IDENT@7390..7393 "std"
+                                    SUFFIX_INDEX@7393..7400
+                                      DOT@7393..7394 "."
+                                      NAME@7394..7400
+                                        IDENT@7394..7400 "length"
+                                    SUFFIX_APPLY@7400..7405
+                                      ARGS_DESC@7400..7405
+                                        L_PAREN@7400..7401 "("
+                                        ARG@7401..7404
+                                          EXPR@7401..7404
+                                            EXPR_VAR@7401..7404
+                                              NAME@7401..7404
+                                                IDENT@7401..7404 "arr"
+                                        R_PAREN@7404..7405 ")"
+                                    WHITESPACE@7405..7406 " "
+                                    MINUS@7406..7407 "-"
+                                    WHITESPACE@7407..7408 " "
+                                    EXPR@7408..7409
+                                      EXPR_NUMBER@7408..7409
+                                        FLOAT@7408..7409 "1"
+                              R_PAREN@7409..7410 ")"
+                      R_PAREN@7410..7411 ")"
+        COMMA@7411..7412 ","
+        WHITESPACE@7412..7416 "\n\n  "
+        SINGLE_LINE_SLASH_COMMENT@7416..7426 "// Compat\n"
+        WHITESPACE@7426..7428 "  "
+        MEMBER_FIELD_METHOD@7428..7538
+          FIELD_NAME_FIXED@7428..7443
+            NAME@7428..7443
+              IDENT@7428..7443 "__compare_array"
+          PARAMS_DESC@7443..7455
+            L_PAREN@7443..7444 "("
+            PARAM@7444..7448
+              DESTRUCT_FULL@7444..7448
+                NAME@7444..7448
+                  IDENT@7444..7448 "arr1"
+            COMMA@7448..7449 ","
+            WHITESPACE@7449..7450 " "
+            PARAM@7450..7454
+              DESTRUCT_FULL@7450..7454
+                NAME@7450..7454
+                  IDENT@7450..7454 "arr2"
+            R_PAREN@7454..7455 ")"
+          COLONCOLON@7455..7457 "::"
+          WHITESPACE@7457..7462 "\n    "
+          EXPR@7462..7538
+            STMT_ASSERT@7462..7508
+              ASSERTION@7462..7507
+                ASSERT_KW@7462..7468 "assert"
+                WHITESPACE@7468..7469 " "
+                EXPR@7469..7507
+                  EXPR_BINARY@7469..7507
+                    EXPR@7469..7472
+                      EXPR_VAR@7469..7472
+                        NAME@7469..7472
+                          IDENT@7469..7472 "std"
+                    SUFFIX_INDEX@7472..7480
+                      DOT@7472..7473 "."
+                      NAME@7473..7480
+                        IDENT@7473..7480 "isArray"
+                    SUFFIX_APPLY@7480..7486
+                      ARGS_DESC@7480..7486
+                        L_PAREN@7480..7481 "("
+                        ARG@7481..7485
+                          EXPR@7481..7485
+                            EXPR_VAR@7481..7485
+                              NAME@7481..7485
+                                IDENT@7481..7485 "arr1"
+                        R_PAREN@7485..7486 ")"
+                    WHITESPACE@7486..7487 " "
+                    AND@7487..7489 "&&"
+                    WHITESPACE@7489..7490 " "
+                    EXPR@7490..7507
+                      EXPR_VAR@7490..7493
+                        NAME@7490..7493
+                          IDENT@7490..7493 "std"
+                      SUFFIX_INDEX@7493..7501
+                        DOT@7493..7494 "."
+                        NAME@7494..7501
+                          IDENT@7494..7501 "isArray"
+                      SUFFIX_APPLY@7501..7507
+                        ARGS_DESC@7501..7507
+                          L_PAREN@7501..7502 "("
+                          ARG@7502..7506
+                            EXPR@7502..7506
+                              EXPR_VAR@7502..7506
+                                NAME@7502..7506
+                                  IDENT@7502..7506 "arr2"
+                          R_PAREN@7506..7507 ")"
+              SEMI@7507..7508 ";"
+            WHITESPACE@7508..7513 "\n    "
+            EXPR_VAR@7513..7516
+              NAME@7513..7516
+                IDENT@7513..7516 "std"
+            SUFFIX_INDEX@7516..7526
+              DOT@7516..7517 "."
+              NAME@7517..7526
+                IDENT@7517..7526 "__compare"
+            SUFFIX_APPLY@7526..7538
+              ARGS_DESC@7526..7538
+                L_PAREN@7526..7527 "("
+                ARG@7527..7531
+                  EXPR@7527..7531
+                    EXPR_VAR@7527..7531
+                      NAME@7527..7531
+                        IDENT@7527..7531 "arr1"
+                COMMA@7531..7532 ","
+                WHITESPACE@7532..7533 " "
+                ARG@7533..7537
+                  EXPR@7533..7537
+                    EXPR_VAR@7533..7537
+                      NAME@7533..7537
+                        IDENT@7533..7537 "arr2"
+                R_PAREN@7537..7538 ")"
+        COMMA@7538..7539 ","
+        WHITESPACE@7539..7542 "\n  "
+        MEMBER_FIELD_METHOD@7542..7606
+          FIELD_NAME_FIXED@7542..7554
+            NAME@7542..7554
+              IDENT@7542..7554 "__array_less"
+          PARAMS_DESC@7554..7566
+            L_PAREN@7554..7555 "("
+            PARAM@7555..7559
+              DESTRUCT_FULL@7555..7559
+                NAME@7555..7559
+                  IDENT@7555..7559 "arr1"
+            COMMA@7559..7560 ","
+            WHITESPACE@7560..7561 " "
+            PARAM@7561..7565
+              DESTRUCT_FULL@7561..7565
+                NAME@7561..7565
+                  IDENT@7561..7565 "arr2"
+            R_PAREN@7565..7566 ")"
+          COLONCOLON@7566..7568 "::"
+          WHITESPACE@7568..7569 " "
+          EXPR@7569..7606
+            EXPR_BINARY@7569..7606
+              EXPR@7569..7572
+                EXPR_VAR@7569..7572
+                  NAME@7569..7572
+                    IDENT@7569..7572 "std"
+              SUFFIX_INDEX@7572..7588
+                DOT@7572..7573 "."
+                NAME@7573..7588
+                  IDENT@7573..7588 "__compare_array"
+              SUFFIX_APPLY@7588..7600
+                ARGS_DESC@7588..7600
+                  L_PAREN@7588..7589 "("
+                  ARG@7589..7593
+                    EXPR@7589..7593
+                      EXPR_VAR@7589..7593
+                        NAME@7589..7593
+                          IDENT@7589..7593 "arr1"
+                  COMMA@7593..7594 ","
+                  WHITESPACE@7594..7595 " "
+                  ARG@7595..7599
+                    EXPR@7595..7599
+                      EXPR_VAR@7595..7599
+                        NAME@7595..7599
+                          IDENT@7595..7599 "arr2"
+                  R_PAREN@7599..7600 ")"
+              WHITESPACE@7600..7601 " "
+              EQ@7601..7603 "=="
+              WHITESPACE@7603..7604 " "
+              EXPR@7604..7606
+                EXPR_UNARY@7604..7606
+                  MINUS@7604..7605 "-"
+                  EXPR_NUMBER@7605..7606
+                    FLOAT@7605..7606 "1"
+        COMMA@7606..7607 ","
+        WHITESPACE@7607..7610 "\n  "
+        MEMBER_FIELD_METHOD@7610..7676
+          FIELD_NAME_FIXED@7610..7625
+            NAME@7610..7625
+              IDENT@7610..7625 "__array_greater"
+          PARAMS_DESC@7625..7637
+            L_PAREN@7625..7626 "("
+            PARAM@7626..7630
+              DESTRUCT_FULL@7626..7630
+                NAME@7626..7630
+                  IDENT@7626..7630 "arr1"
+            COMMA@7630..7631 ","
+            WHITESPACE@7631..7632 " "
+            PARAM@7632..7636
+              DESTRUCT_FULL@7632..7636
+                NAME@7632..7636
+                  IDENT@7632..7636 "arr2"
+            R_PAREN@7636..7637 ")"
+          COLONCOLON@7637..7639 "::"
+          WHITESPACE@7639..7640 " "
+          EXPR@7640..7676
+            EXPR_BINARY@7640..7676
+              EXPR@7640..7643
+                EXPR_VAR@7640..7643
+                  NAME@7640..7643
+                    IDENT@7640..7643 "std"
+              SUFFIX_INDEX@7643..7659
+                DOT@7643..7644 "."
+                NAME@7644..7659
+                  IDENT@7644..7659 "__compare_array"
+              SUFFIX_APPLY@7659..7671
+                ARGS_DESC@7659..7671
+                  L_PAREN@7659..7660 "("
+                  ARG@7660..7664
+                    EXPR@7660..7664
+                      EXPR_VAR@7660..7664
+                        NAME@7660..7664
+                          IDENT@7660..7664 "arr1"
+                  COMMA@7664..7665 ","
+                  WHITESPACE@7665..7666 " "
+                  ARG@7666..7670
+                    EXPR@7666..7670
+                      EXPR_VAR@7666..7670
+                        NAME@7666..7670
+                          IDENT@7666..7670 "arr2"
+                  R_PAREN@7670..7671 ")"
+              WHITESPACE@7671..7672 " "
+              EQ@7672..7674 "=="
+              WHITESPACE@7674..7675 " "
+              EXPR@7675..7676
+                EXPR_NUMBER@7675..7676
+                  FLOAT@7675..7676 "1"
+        COMMA@7676..7677 ","
+        WHITESPACE@7677..7680 "\n  "
+        MEMBER_FIELD_METHOD@7680..7752
+          FIELD_NAME_FIXED@7680..7701
+            NAME@7680..7701
+              IDENT@7680..7701 "__array_less_or_equal"
+          PARAMS_DESC@7701..7713
+            L_PAREN@7701..7702 "("
+            PARAM@7702..7706
+              DESTRUCT_FULL@7702..7706
+                NAME@7702..7706
+                  IDENT@7702..7706 "arr1"
+            COMMA@7706..7707 ","
+            WHITESPACE@7707..7708 " "
+            PARAM@7708..7712
+              DESTRUCT_FULL@7708..7712
+                NAME@7708..7712
+                  IDENT@7708..7712 "arr2"
+            R_PAREN@7712..7713 ")"
+          COLONCOLON@7713..7715 "::"
+          WHITESPACE@7715..7716 " "
+          EXPR@7716..7752
+            EXPR_BINARY@7716..7752
+              EXPR@7716..7719
+                EXPR_VAR@7716..7719
+                  NAME@7716..7719
+                    IDENT@7716..7719 "std"
+              SUFFIX_INDEX@7719..7735
+                DOT@7719..7720 "."
+                NAME@7720..7735
+                  IDENT@7720..7735 "__compare_array"
+              SUFFIX_APPLY@7735..7747
+                ARGS_DESC@7735..7747
+                  L_PAREN@7735..7736 "("
+                  ARG@7736..7740
+                    EXPR@7736..7740
+                      EXPR_VAR@7736..7740
+                        NAME@7736..7740
+                          IDENT@7736..7740 "arr1"
+                  COMMA@7740..7741 ","
+                  WHITESPACE@7741..7742 " "
+                  ARG@7742..7746
+                    EXPR@7742..7746
+                      EXPR_VAR@7742..7746
+                        NAME@7742..7746
+                          IDENT@7742..7746 "arr2"
+                  R_PAREN@7746..7747 ")"
+              WHITESPACE@7747..7748 " "
+              LE@7748..7750 "<="
+              WHITESPACE@7750..7751 " "
+              EXPR@7751..7752
+                EXPR_NUMBER@7751..7752
+                  FLOAT@7751..7752 "0"
+        COMMA@7752..7753 ","
+        WHITESPACE@7753..7756 "\n  "
+        MEMBER_FIELD_METHOD@7756..7831
+          FIELD_NAME_FIXED@7756..7780
+            NAME@7756..7780
+              IDENT@7756..7780 "__array_greater_or_equal"
+          PARAMS_DESC@7780..7792
+            L_PAREN@7780..7781 "("
+            PARAM@7781..7785
+              DESTRUCT_FULL@7781..7785
+                NAME@7781..7785
+                  IDENT@7781..7785 "arr1"
+            COMMA@7785..7786 ","
+            WHITESPACE@7786..7787 " "
+            PARAM@7787..7791
+              DESTRUCT_FULL@7787..7791
+                NAME@7787..7791
+                  IDENT@7787..7791 "arr2"
+            R_PAREN@7791..7792 ")"
+          COLONCOLON@7792..7794 "::"
+          WHITESPACE@7794..7795 " "
+          EXPR@7795..7831
+            EXPR_BINARY@7795..7831
+              EXPR@7795..7798
+                EXPR_VAR@7795..7798
+                  NAME@7795..7798
+                    IDENT@7795..7798 "std"
+              SUFFIX_INDEX@7798..7814
+                DOT@7798..7799 "."
+                NAME@7799..7814
+                  IDENT@7799..7814 "__compare_array"
+              SUFFIX_APPLY@7814..7826
+                ARGS_DESC@7814..7826
+                  L_PAREN@7814..7815 "("
+                  ARG@7815..7819
+                    EXPR@7815..7819
+                      EXPR_VAR@7815..7819
+                        NAME@7815..7819
+                          IDENT@7815..7819 "arr1"
+                  COMMA@7819..7820 ","
+                  WHITESPACE@7820..7821 " "
+                  ARG@7821..7825
+                    EXPR@7821..7825
+                      EXPR_VAR@7821..7825
+                        NAME@7821..7825
+                          IDENT@7821..7825 "arr2"
+                  R_PAREN@7825..7826 ")"
+              WHITESPACE@7826..7827 " "
+              GE@7827..7829 ">="
+              WHITESPACE@7829..7830 " "
+              EXPR@7830..7831
+                EXPR_NUMBER@7830..7831
+                  FLOAT@7830..7831 "0"
+        COMMA@7831..7832 ","
+        WHITESPACE@7832..7833 "\n"
+        R_BRACE@7833..7834 "}"
+  WHITESPACE@7834..7835 "\n"
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_indent.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_indent.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_indent.snap
@@ -3,6 +3,6 @@
 expression: "|||\n"
 ---
 SOURCE_FILE@0..4
-  EXPR_STRING@0..4
-    ERROR_STRING_BLOCK_MISSING_INDENT@0..4 "|||\n"
-
+  EXPR@0..4
+    EXPR_STRING@0..4
+      ERROR_STRING_BLOCK_MISSING_INDENT@0..4 "|||\n"
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_indent_text.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_indent_text.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_indent_text.snap
@@ -3,6 +3,6 @@
 expression: "|||\nhello\n"
 ---
 SOURCE_FILE@0..10
-  EXPR_STRING@0..10
-    ERROR_STRING_BLOCK_MISSING_INDENT@0..10 "|||\nhello\n"
-
+  EXPR@0..10
+    EXPR_STRING@0..10
+      ERROR_STRING_BLOCK_MISSING_INDENT@0..10 "|||\nhello\n"
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_newline.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_newline.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_newline.snap
@@ -3,6 +3,6 @@
 expression: "|||hello\n"
 ---
 SOURCE_FILE@0..9
-  EXPR_STRING@0..9
-    ERROR_STRING_BLOCK_MISSING_NEW_LINE@0..9 "|||hello\n"
-
+  EXPR@0..9
+    EXPR_STRING@0..9
+      ERROR_STRING_BLOCK_MISSING_NEW_LINE@0..9 "|||hello\n"
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_termination.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_termination.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_termination.snap
@@ -3,6 +3,6 @@
 expression: "|||\n\thello\n"
 ---
 SOURCE_FILE@0..11
-  EXPR_STRING@0..11
-    ERROR_STRING_BLOCK_UNEXPECTED_END@0..11 "|||\n\thello\n"
-
+  EXPR@0..11
+    EXPR_STRING@0..11
+      ERROR_STRING_BLOCK_UNEXPECTED_END@0..11 "|||\n\thello\n"
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__unexpected_destruct.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__unexpected_destruct.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__unexpected_destruct.snap
@@ -3,22 +3,24 @@
 expression: "local * = 1;\na\n"
 ---
 SOURCE_FILE@0..15
-  STMT_LOCAL@0..12
-    LOCAL_KW@0..5 "local"
-    WHITESPACE@5..6 " "
-    BIND_DESTRUCT@6..11
-      ERROR_UNEXPECTED_TOKEN@6..7
-        MUL@6..7 "*"
-      WHITESPACE@7..8 " "
-      ASSIGN@8..9 "="
-      WHITESPACE@9..10 " "
-      EXPR_NUMBER@10..11
-        FLOAT@10..11 "1"
-    SEMI@11..12 ";"
-  WHITESPACE@12..13 "\n"
-  EXPR_VAR@13..14
-    NAME@13..14
-      IDENT@13..14 "a"
+  EXPR@0..14
+    STMT_LOCAL@0..12
+      LOCAL_KW@0..5 "local"
+      WHITESPACE@5..6 " "
+      BIND_DESTRUCT@6..11
+        ERROR_UNEXPECTED_TOKEN@6..7
+          MUL@6..7 "*"
+        WHITESPACE@7..8 " "
+        ASSIGN@8..9 "="
+        WHITESPACE@9..10 " "
+        EXPR@10..11
+          EXPR_NUMBER@10..11
+            FLOAT@10..11 "1"
+      SEMI@11..12 ";"
+    WHITESPACE@12..13 "\n"
+    EXPR_VAR@13..14
+      NAME@13..14
+        IDENT@13..14 "a"
   WHITESPACE@14..15 "\n"
 ===
 LocatedSyntaxError { error: Unexpected { expected: Named("destruction specifier"), found: MUL }, range: 6..7 }
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__wrong_field_end.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__wrong_field_end.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__wrong_field_end.snap
@@ -3,33 +3,36 @@
 expression: "{\n\ta: 1;\n\tb: 2;\n}\n"
 ---
 SOURCE_FILE@0..18
-  EXPR_OBJECT@0..17
-    OBJ_BODY_MEMBER_LIST@0..17
-      L_BRACE@0..1 "{"
-      WHITESPACE@1..3 "\n\t"
-      MEMBER_FIELD_NORMAL@3..7
-        FIELD_NAME_FIXED@3..4
-          NAME@3..4
-            IDENT@3..4 "a"
-        COLON@4..5 ":"
-        WHITESPACE@5..6 " "
-        EXPR_NUMBER@6..7
-          FLOAT@6..7 "1"
-      ERROR_UNEXPECTED_TOKEN@7..8
-        SEMI@7..8 ";"
-      WHITESPACE@8..10 "\n\t"
-      MEMBER_FIELD_NORMAL@10..14
-        FIELD_NAME_FIXED@10..11
-          NAME@10..11
-            IDENT@10..11 "b"
-        COLON@11..12 ":"
-        WHITESPACE@12..13 " "
-        EXPR_NUMBER@13..14
-          FLOAT@13..14 "2"
-      ERROR_UNEXPECTED_TOKEN@14..15
-        SEMI@14..15 ";"
-      WHITESPACE@15..16 "\n"
-      R_BRACE@16..17 "}"
+  EXPR@0..17
+    EXPR_OBJECT@0..17
+      OBJ_BODY_MEMBER_LIST@0..17
+        L_BRACE@0..1 "{"
+        WHITESPACE@1..3 "\n\t"
+        MEMBER_FIELD_NORMAL@3..7
+          FIELD_NAME_FIXED@3..4
+            NAME@3..4
+              IDENT@3..4 "a"
+          COLON@4..5 ":"
+          WHITESPACE@5..6 " "
+          EXPR@6..7
+            EXPR_NUMBER@6..7
+              FLOAT@6..7 "1"
+        ERROR_UNEXPECTED_TOKEN@7..8
+          SEMI@7..8 ";"
+        WHITESPACE@8..10 "\n\t"
+        MEMBER_FIELD_NORMAL@10..14
+          FIELD_NAME_FIXED@10..11
+            NAME@10..11
+              IDENT@10..11 "b"
+          COLON@11..12 ":"
+          WHITESPACE@12..13 " "
+          EXPR@13..14
+            EXPR_NUMBER@13..14
+              FLOAT@13..14 "2"
+        ERROR_UNEXPECTED_TOKEN@14..15
+          SEMI@14..15 ";"
+        WHITESPACE@15..16 "\n"
+        R_BRACE@16..17 "}"
   WHITESPACE@17..18 "\n"
 ===
 LocatedSyntaxError { error: Unexpected { expected: Named("comma"), found: SEMI }, range: 7..8 }
modifiedcrates/jrsonnet-rowan-parser/src/tests.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/tests.rs
+++ b/crates/jrsonnet-rowan-parser/src/tests.rs
@@ -72,7 +72,7 @@
 			styles: ThemeStyles::none(),
 		});
 
-		write!(out, "===").unwrap();
+		writeln!(out, "===").unwrap();
 		handler
 			.render_report(&mut out, &diag)
 			.expect("fmt error?..");
modifiedxtask/src/sourcegen/ast.rsdiffbeforeafterboth
--- a/xtask/src/sourcegen/ast.rs
+++ b/xtask/src/sourcegen/ast.rs
@@ -149,7 +149,7 @@
 					let mut types = HashMap::new();
 					for field in fields.iter().filter(|f| f.token_name().is_none()) {
 						if let Some(old) = types.insert(field.ty(), field.method_name(kinds)) {
-							panic!("{name}.{} has same type as {name}.{}, resolve conflict by wrapping one field: {}", old, field.method_name(kinds), field.ty());
+							// panic!("{name}.{} has same type as {name}.{}, resolve conflict by wrapping one field: {}", old, field.method_name(kinds), field.ty());
 						}
 						// TODO: check for assignable field types, i.e you can have
 						// ```
modifiedxtask/src/sourcegen/kinds.rsdiffbeforeafterboth
--- a/xtask/src/sourcegen/kinds.rs
+++ b/xtask/src/sourcegen/kinds.rs
@@ -212,6 +212,7 @@
 	let mut kinds = KindsSrc::new();
 	define_kinds![kinds =
 		"||" => "OR";
+		"??" => "NULL_COAELSE";
 		"&&" => "AND";
 		"|" => "BIT_OR";
 		"^" => "BIT_XOR";