/*
 * 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
    #text  // f.c.TextBlock
        - content: "1. "  // String
    @  // f.c.UnifiedCall
        - callee: m  // f.c.Identifier
        - argument name: "x"  // String
        - argument value: dynamic "..."  // f.c.StringLiteral
            - value part: ${...}  // f.c.DollarVariable
                - content: e1  // f.c.Identifier
        - argument name: "y"  // String
        - argument value: "$\\{e2}"  // f.c.StringLiteral
    #text  // f.c.TextBlock
        - content: "\n2. "  // String
    ${...}  // f.c.DollarVariable
        - content: dynamic "..."  // f.c.StringLiteral
            - value part: "a"  // String
            - value part: ${...}  // f.c.DollarVariable
                - content: x  // f.c.Identifier
            - value part: "b"  // String
            - value part: ${...}  // f.c.DollarVariable
                - content: x  // f.c.Identifier
            - value part: "c"  // String
    #text  // f.c.TextBlock
        - content: "\n3. "  // String
    ${...}  // f.c.DollarVariable
        - content: dynamic "..."  // f.c.StringLiteral
            - value part: ${...}  // f.c.DollarVariable
                - content: x  // f.c.Identifier
            - value part: "b"  // String
    #text  // f.c.TextBlock
        - content: "\n4. "  // String
    ${...}  // f.c.DollarVariable
        - content: dynamic "..."  // f.c.StringLiteral
            - value part: "a"  // String
            - value part: ${...}  // f.c.DollarVariable
                - content: x  // f.c.Identifier
    #text  // f.c.TextBlock
        - content: "\n5. "  // String
    ${...}  // f.c.DollarVariable
        - content: dynamic "..."  // f.c.StringLiteral
            - value part: ${...}  // f.c.DollarVariable
                - content: x  // f.c.Identifier
            - value part: #{...}  // f.c.NumericalOutput
                - content: y  // f.c.Identifier
                - minimum decimals: "0"  // Integer
                - maximum decimals: "0"  // Integer
    #text  // f.c.TextBlock
        - content: "\n6. "  // String
    ${...}  // f.c.DollarVariable
        - content: dynamic "..."  // f.c.StringLiteral
            - value part: "a b "  // String
            - value part: ${...}  // f.c.DollarVariable
                - content: x  // f.c.Identifier
            - value part: " c d"  // String
    #text  // f.c.TextBlock
        - content: "\n7. "  // String
    ${...}  // f.c.DollarVariable
        - content: dynamic "..."  // f.c.StringLiteral
            - value part: ${...}  // f.c.DollarVariable
                - content: x  // f.c.Identifier
            - value part: " a b "  // String
            - value part: ${...}  // f.c.DollarVariable
                - content: y  // f.c.Identifier
            - value part: " c$d"  // String
