/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
#mixed_content  // f.c.MixedContent; Location 1:1-18:8
    #if  // f.c.ConditionalBlock; Location 1:1-1:15
        - condition: exp  // f.c.Identifier; Location 1:6-1:8
        - AST-node subtype: "0"  // Integer
    #if  // f.c.ConditionalBlock; Location 2:1-2:16
        - condition: exp  // f.c.Identifier; Location 2:6-2:8
        - AST-node subtype: "0"  // Integer
        #text  // f.c.TextBlock; Location 2:10-2:10
            - content: "1"  // String
    #text  // f.c.TextBlock; Location 2:17-2:17
        - content: "\n"  // String
    #if  // f.c.ConditionalBlock; Location 3:1-3:20
        - condition: exp  // f.c.Identifier; Location 3:6-3:8
        - AST-node subtype: "0"  // Integer
        ${...}  // f.c.DollarVariable; Location 3:10-3:13
            - content: 1  // f.c.NumberLiteral; Location 3:12-3:12
        #text  // f.c.TextBlock; Location 3:14-3:14
            - content: "2"  // String
    #text  // f.c.TextBlock; Location 3:21-3:21
        - content: "\n"  // String
    #if-#elseif-#else-container  // f.c.IfBlock; Location 4:1-4:22
        #if  // f.c.ConditionalBlock; Location 4:1-4:9
            - condition: exp  // f.c.Identifier; Location 4:6-4:8
            - AST-node subtype: "0"  // Integer
        #else  // f.c.ConditionalBlock; Location 4:10-4:16
            - condition: null  // Null
            - AST-node subtype: "1"  // Integer
    #if-#elseif-#else-container  // f.c.IfBlock; Location 5:1-5:24
        #if  // f.c.ConditionalBlock; Location 5:1-5:10
            - condition: exp  // f.c.Identifier; Location 5:6-5:8
            - AST-node subtype: "0"  // Integer
            #text  // f.c.TextBlock; Location 5:10-5:10
                - content: "1"  // String
        #else  // f.c.ConditionalBlock; Location 5:11-5:18
            - condition: null  // Null
            - AST-node subtype: "1"  // Integer
            #text  // f.c.TextBlock; Location 5:18-5:18
                - content: "1"  // String
    #text  // f.c.TextBlock; Location 5:25-5:25
        - content: "\n"  // String
    #if-#elseif-#else-container  // f.c.IfBlock; Location 6:1-6:32
        #if  // f.c.ConditionalBlock; Location 6:1-6:14
            - condition: exp  // f.c.Identifier; Location 6:6-6:8
            - AST-node subtype: "0"  // Integer
            ${...}  // f.c.DollarVariable; Location 6:10-6:13
                - content: 1  // f.c.NumberLiteral; Location 6:12-6:12
            #text  // f.c.TextBlock; Location 6:14-6:14
                - content: "2"  // String
        #else  // f.c.ConditionalBlock; Location 6:15-6:26
            - condition: null  // Null
            - AST-node subtype: "1"  // Integer
            ${...}  // f.c.DollarVariable; Location 6:22-6:25
                - content: 1  // f.c.NumberLiteral; Location 6:24-6:24
            #text  // f.c.TextBlock; Location 6:26-6:26
                - content: "2"  // String
    #text  // f.c.TextBlock; Location 6:33-6:33
        - content: "\n"  // String
    #if-#elseif-#else-container  // f.c.IfBlock; Location 7:1-7:28
        #if  // f.c.ConditionalBlock; Location 7:1-7:9
            - condition: exp  // f.c.Identifier; Location 7:6-7:8
            - AST-node subtype: "0"  // Integer
        #elseif  // f.c.ConditionalBlock; Location 7:10-7:22
            - condition: exp  // f.c.Identifier; Location 7:19-7:21
            - AST-node subtype: "2"  // Integer
    #if-#elseif-#else-container  // f.c.IfBlock; Location 8:1-8:29
        #if  // f.c.ConditionalBlock; Location 8:1-8:9
            - condition: exp  // f.c.Identifier; Location 8:6-8:8
            - AST-node subtype: "0"  // Integer
        #elseif  // f.c.ConditionalBlock; Location 8:10-8:23
            - condition: exp  // f.c.Identifier; Location 8:19-8:21
            - AST-node subtype: "2"  // Integer
            #text  // f.c.TextBlock; Location 8:23-8:23
                - content: "1"  // String
    #text  // f.c.TextBlock; Location 8:30-8:30
        - content: "\n"  // String
    #attempt  // f.c.AttemptBlock; Location 9:1-9:31
        - error handler: #recover  // f.c.RecoveryBlock; Location 9:11-9:20
        #recover  // f.c.RecoveryBlock; Location 9:11-9:20
    #attempt  // f.c.AttemptBlock; Location 10:1-10:33
        - error handler: #recover  // f.c.RecoveryBlock; Location 10:12-10:22
            #text  // f.c.TextBlock; Location 10:22-10:22
                - content: "1"  // String
        #text  // f.c.TextBlock; Location 10:11-10:11
            - content: "1"  // String
        #recover  // f.c.RecoveryBlock; Location 10:12-10:22
            #text  // f.c.TextBlock; Location 10:22-10:22
                - content: "1"  // String
    #text  // f.c.TextBlock; Location 10:34-10:34
        - content: "\n"  // String
    #list  // f.c.IteratorBlock; Location 11:1-11:22
        - list source: s  // f.c.Identifier; Location 11:8-11:8
        - target loop variable: "i"  // String
    #list  // f.c.IteratorBlock; Location 12:1-12:23
        - list source: s  // f.c.Identifier; Location 12:8-12:8
        - target loop variable: "i"  // String
        #text  // f.c.TextBlock; Location 12:15-12:15
            - content: "1"  // String
    #text  // f.c.TextBlock; Location 12:24-12:24
        - content: "\n"  // String
    #list  // f.c.IteratorBlock; Location 13:1-13:28
        - list source: s  // f.c.Identifier; Location 13:8-13:8
        - target loop variable: "i"  // String
        #sep  // f.c.Sep; Location 13:15-13:20
    #list  // f.c.IteratorBlock; Location 14:1-14:30
        - list source: s  // f.c.Identifier; Location 14:8-14:8
        - target loop variable: "i"  // String
        #text  // f.c.TextBlock; Location 14:15-14:15
            - content: "1"  // String
        #sep  // f.c.Sep; Location 14:16-14:22
            #text  // f.c.TextBlock; Location 14:22-14:22
                - content: "1"  // String
    #text  // f.c.TextBlock; Location 14:31-14:31
        - content: "\n"  // String
    #list  // f.c.IteratorBlock; Location 15:1-15:45
        - list source: s  // f.c.Identifier; Location 15:8-15:8
        #items  // f.c.Items; Location 15:10-15:37
            - target loop variable: "i"  // String
            #sep  // f.c.Sep; Location 15:23-15:28
    #list  // f.c.IteratorBlock; Location 16:1-16:49
        - list source: s  // f.c.Identifier; Location 16:8-16:8
        #text  // f.c.TextBlock; Location 16:10-16:10
            - content: "1"  // String
        #items  // f.c.Items; Location 16:11-16:40
            - target loop variable: "i"  // String
            #text  // f.c.TextBlock; Location 16:24-16:24
                - content: "1"  // String
            #sep  // f.c.Sep; Location 16:25-16:31
                #text  // f.c.TextBlock; Location 16:31-16:31
                    - content: "1"  // String
        #text  // f.c.TextBlock; Location 16:41-16:41
            - content: "1"  // String
    #text  // f.c.TextBlock; Location 16:50-17:2
        - content: "\n1\n"  // String
    ${...}  // f.c.DollarVariable; Location 18:1-18:8
        - content: +  // f.c.AddConcatExpression; Location 18:3-18:7
            - left-hand operand: x  // f.c.Identifier; Location 18:3-18:3
            - right-hand operand: y  // f.c.Identifier; Location 18:7-18:7
