beginCompilationUnit(@)
  beginMetadataStar(@)
    beginMetadata(@)
      handleIdentifier(A, metadataReference)
      beginTypeArguments(<)
        handleIdentifier(int, typeReference)
        handleNoTypeArguments(>)
        handleType(int, null)
      endTypeArguments(1, <, >)
      beginArguments(()
        handleLiteralInt(0)
      endArguments(1, (, ))
    endMetadata(@, null, typedef)
  endMetadataStar(1)
  beginUncategorizedTopLevelDeclaration(typedef)
    beginFunctionTypeAlias(typedef)
      handleIdentifier(F, typedefDeclaration)
      beginTypeVariables(<)
        beginMetadataStar(@)
          beginMetadata(@)
            handleIdentifier(A, metadataReference)
            beginTypeArguments(<)
              handleIdentifier(int, typeReference)
              handleNoTypeArguments(>)
              handleType(int, null)
            endTypeArguments(1, <, >)
            beginArguments(()
              handleLiteralInt(0)
            endArguments(1, (, ))
          endMetadata(@, null, T)
        endMetadataStar(1)
        handleIdentifier(T, typeVariableDeclaration)
        beginTypeVariable(T)
          handleTypeVariablesDefined(T, 1)
          handleNoType(T)
        endTypeVariable(>, 0, null, null)
      endTypeVariables(<, >)
      beginFunctionType(int)
        beginTypeVariables(<)
          beginMetadataStar(@)
            beginMetadata(@)
              handleIdentifier(A, metadataReference)
              beginTypeArguments(<)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(>)
                handleType(int, null)
              endTypeArguments(1, <, >)
              beginArguments(()
                handleLiteralInt(0)
              endArguments(1, (, ))
            endMetadata(@, null, X)
          endMetadataStar(1)
          handleIdentifier(X, typeVariableDeclaration)
          beginTypeVariable(X)
            handleTypeVariablesDefined(X, 1)
            handleNoType(X)
          endTypeVariable(>, 0, null, null)
        endTypeVariables(<, >)
        handleIdentifier(int, typeReference)
        handleNoTypeArguments(Function)
        handleType(int, null)
        beginFormalParameters((, MemberKind.GeneralizedFunctionType)
          beginMetadataStar(@)
            beginMetadata(@)
              handleIdentifier(A, metadataReference)
              beginTypeArguments(<)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(>)
                handleType(int, null)
              endTypeArguments(1, <, >)
              beginArguments(()
                handleLiteralInt(0)
              endArguments(1, (, ))
            endMetadata(@, null, int)
          endMetadataStar(1)
          beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments())
            handleType(int, null)
            handleNoName())
            handleFormalParameterWithoutValue())
          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
        endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
      endFunctionType(Function, null)
    endFunctionTypeAlias(typedef, =, ;)
  endTopLevelDeclaration(void)
  beginMetadataStar(void)
  endMetadataStar(0)
  beginTopLevelMember(void)
    beginTopLevelMethod(;, null)
      handleVoidKeyword(void)
      handleIdentifier(main, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        beginMetadataStar(@)
          beginMetadata(@)
            handleIdentifier(A, metadataReference)
            beginTypeArguments(<)
              handleIdentifier(int, typeReference)
              handleNoTypeArguments(>)
              handleType(int, null)
            endTypeArguments(1, <, >)
            beginArguments(()
              handleLiteralInt(0)
            endArguments(1, (, ))
          endMetadata(@, null, void)
        endMetadataStar(1)
        beginFunctionType(void)
          beginTypeVariables(<)
            beginMetadataStar(@)
              beginMetadata(@)
                handleIdentifier(A, metadataReference)
                beginTypeArguments(<)
                  handleIdentifier(int, typeReference)
                  handleNoTypeArguments(>)
                  handleType(int, null)
                endTypeArguments(1, <, >)
                beginArguments(()
                  handleLiteralInt(0)
                endArguments(1, (, ))
              endMetadata(@, null, X)
            endMetadataStar(1)
            handleIdentifier(X, typeVariableDeclaration)
            beginTypeVariable(X)
              handleTypeVariablesDefined(X, 1)
              handleNoType(X)
            endTypeVariable(>, 0, null, null)
          endTypeVariables(<, >)
          handleVoidKeyword(void)
          beginFormalParameters((, MemberKind.GeneralizedFunctionType)
            beginMetadataStar(@)
              beginMetadata(@)
                handleIdentifier(A, metadataReference)
                beginTypeArguments(<)
                  handleIdentifier(int, typeReference)
                  handleNoTypeArguments(>)
                  handleType(int, null)
                endTypeArguments(1, <, >)
                beginArguments(()
                  handleLiteralInt(0)
                endArguments(1, (, ))
              endMetadata(@, null, int)
            endMetadataStar(1)
            beginFormalParameter(int, MemberKind.GeneralizedFunctionType, null, null, null)
              handleIdentifier(int, typeReference)
              handleNoTypeArguments(y)
              handleType(int, null)
              handleIdentifier(y, formalParameterDeclaration)
              handleFormalParameterWithoutValue())
            endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
          endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
        endFunctionType(Function, ?)
        beginVariablesDeclaration(f, null, null)
          handleIdentifier(f, localVariableDeclaration)
          beginInitializedIdentifier(f)
            beginVariableInitializer(=)
              handleLiteralNull(null)
            endVariableInitializer(=)
          endInitializedIdentifier(f)
        endVariablesDeclaration(1, ;)
      endBlockFunctionBody(1, {, })
    endTopLevelMethod(void, null, })
  endTopLevelDeclaration()
endCompilationUnit(2, )
