beginCompilationUnit(class)
  beginMetadataStar(class)
  endMetadataStar(0)
  beginClassOrMixinOrNamedMixinApplicationPrelude(class)
    handleIdentifier(Class, classOrMixinDeclaration)
    handleNoTypeVariables({)
    beginClassDeclaration(class, null, null, null, Class)
      handleNoType(Class)
      handleClassExtends(null, 1)
      handleClassNoWithClause()
      handleImplements(null, 0)
      handleClassHeader(class, class, null)
      beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, augment, null, null, null, null, null, method)
            handleNoType(augment)
            handleIdentifier(method, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
            endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
            endBlockFunctionBody(0, {, })
          endClassMethod(null, augment, (, null, })
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, augment, null, null, null, null, null, method)
            handleVoidKeyword(void)
            handleIdentifier(method, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
            endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
            endBlockFunctionBody(0, {, })
          endClassMethod(null, augment, (, null, })
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, augment, null, null, null, null, get, getter)
            handleNoType(augment)
            handleIdentifier(getter, methodDeclaration)
            handleNoTypeVariables(=>)
            handleNoFormalParameters(=>, MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            handleLiteralNull(null)
            handleExpressionFunctionBody(=>, ;)
          endClassMethod(get, augment, =>, null, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, augment, null, null, null, null, get, getter)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(get)
            handleType(int, null)
            handleIdentifier(getter, methodDeclaration)
            handleNoTypeVariables(=>)
            handleNoFormalParameters(=>, MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            handleLiteralInt(0)
            handleExpressionFunctionBody(=>, ;)
          endClassMethod(get, augment, =>, null, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, augment, null, null, null, null, set, setter)
            handleNoType(augment)
            handleIdentifier(setter, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
              beginMetadataStar(value)
              endMetadataStar(0)
              beginFormalParameter(value, MemberKind.NonStaticMethod, null, null, null)
                handleNoType(()
                handleIdentifier(value, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, null, value, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
            endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
            endBlockFunctionBody(0, {, })
          endClassMethod(set, augment, (, null, })
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, augment, null, null, null, null, set, setter)
            handleVoidKeyword(void)
            handleIdentifier(setter, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
              beginMetadataStar(value)
              endMetadataStar(0)
              beginFormalParameter(value, MemberKind.NonStaticMethod, null, null, null)
                handleNoType(()
                handleIdentifier(value, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, null, value, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
            endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
            endBlockFunctionBody(0, {, })
          endClassMethod(set, augment, (, null, })
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Class, null, augment, null, null, null, null, var, })
            handleNoType(var)
            handleIdentifier(field, fieldDeclaration)
            handleNoFieldInitializer(;)
          endClassFields(null, augment, null, null, null, null, var, 1, augment, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Class, null, augment, null, null, null, null, final, ;)
            handleNoType(final)
            handleIdentifier(field, fieldDeclaration)
            beginFieldInitializer(=)
              handleLiteralInt(0)
            endFieldInitializer(=, ;)
          endClassFields(null, augment, null, null, null, null, final, 1, augment, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Class, null, augment, null, null, null, null, const, ;)
            handleNoType(const)
            handleIdentifier(field, fieldDeclaration)
            beginFieldInitializer(=)
              handleLiteralInt(0)
            endFieldInitializer(=, ;)
          endClassFields(null, augment, null, null, null, null, const, 1, augment, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Class, null, augment, null, null, null, null, null, ;)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(field)
            handleType(int, null)
            handleIdentifier(field, fieldDeclaration)
            handleNoFieldInitializer(;)
          endClassFields(null, augment, null, null, null, null, null, 1, augment, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Class, null, augment, null, null, null, late, var, ;)
            handleNoType(var)
            handleIdentifier(field, fieldDeclaration)
            handleNoFieldInitializer(;)
          endClassFields(null, augment, null, null, null, late, var, 1, augment, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Class, null, augment, null, null, null, late, final, ;)
            handleNoType(final)
            handleIdentifier(field, fieldDeclaration)
            handleNoFieldInitializer(;)
          endClassFields(null, augment, null, null, null, late, final, 1, augment, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Class, null, augment, null, null, null, late, null, ;)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(field)
            handleType(int, null)
            handleIdentifier(field, fieldDeclaration)
            handleNoFieldInitializer(;)
          endClassFields(null, augment, null, null, null, late, null, 1, augment, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, augment, null, static, null, null, null, method)
            handleNoType(static)
            handleIdentifier(method, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.StaticMethod)
            endFormalParameters(0, (, ), MemberKind.StaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
            endBlockFunctionBody(0, {, })
          endClassMethod(null, augment, (, null, })
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, augment, null, static, null, null, null, method)
            handleVoidKeyword(void)
            handleIdentifier(method, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.StaticMethod)
            endFormalParameters(0, (, ), MemberKind.StaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
            endBlockFunctionBody(0, {, })
          endClassMethod(null, augment, (, null, })
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, augment, null, static, null, null, get, getter)
            handleNoType(static)
            handleIdentifier(getter, methodDeclaration)
            handleNoTypeVariables(=>)
            handleNoFormalParameters(=>, MemberKind.StaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            handleLiteralNull(null)
            handleExpressionFunctionBody(=>, ;)
          endClassMethod(get, augment, =>, null, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, augment, null, static, null, null, get, getter)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(get)
            handleType(int, null)
            handleIdentifier(getter, methodDeclaration)
            handleNoTypeVariables(=>)
            handleNoFormalParameters(=>, MemberKind.StaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            handleLiteralInt(0)
            handleExpressionFunctionBody(=>, ;)
          endClassMethod(get, augment, =>, null, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, augment, null, static, null, null, set, setter)
            handleNoType(static)
            handleIdentifier(setter, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.StaticMethod)
              beginMetadataStar(value)
              endMetadataStar(0)
              beginFormalParameter(value, MemberKind.StaticMethod, null, null, null)
                handleNoType(()
                handleIdentifier(value, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, null, value, null, null, FormalParameterKind.mandatory, MemberKind.StaticMethod)
            endFormalParameters(1, (, ), MemberKind.StaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
            endBlockFunctionBody(0, {, })
          endClassMethod(set, augment, (, null, })
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, augment, null, static, null, null, set, setter)
            handleVoidKeyword(void)
            handleIdentifier(setter, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.StaticMethod)
              beginMetadataStar(value)
              endMetadataStar(0)
              beginFormalParameter(value, MemberKind.StaticMethod, null, null, null)
                handleNoType(()
                handleIdentifier(value, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, null, value, null, null, FormalParameterKind.mandatory, MemberKind.StaticMethod)
            endFormalParameters(1, (, ), MemberKind.StaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
            endBlockFunctionBody(0, {, })
          endClassMethod(set, augment, (, null, })
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Class, null, augment, null, static, null, null, var, })
            handleNoType(var)
            handleIdentifier(field, fieldDeclaration)
            handleNoFieldInitializer(;)
          endClassFields(null, augment, null, static, null, null, var, 1, augment, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Class, null, augment, null, static, null, null, final, ;)
            handleNoType(final)
            handleIdentifier(field, fieldDeclaration)
            beginFieldInitializer(=)
              handleLiteralInt(0)
            endFieldInitializer(=, ;)
          endClassFields(null, augment, null, static, null, null, final, 1, augment, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Class, null, augment, null, static, null, null, const, ;)
            handleNoType(const)
            handleIdentifier(field, fieldDeclaration)
            beginFieldInitializer(=)
              handleLiteralInt(0)
            endFieldInitializer(=, ;)
          endClassFields(null, augment, null, static, null, null, const, 1, augment, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Class, null, augment, null, static, null, null, null, ;)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(field)
            handleType(int, null)
            handleIdentifier(field, fieldDeclaration)
            handleNoFieldInitializer(;)
          endClassFields(null, augment, null, static, null, null, null, 1, augment, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Class, null, augment, null, static, null, late, var, ;)
            handleNoType(var)
            handleIdentifier(field, fieldDeclaration)
            handleNoFieldInitializer(;)
          endClassFields(null, augment, null, static, null, late, var, 1, augment, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Class, null, augment, null, static, null, late, final, ;)
            handleNoType(final)
            handleIdentifier(field, fieldDeclaration)
            handleNoFieldInitializer(;)
          endClassFields(null, augment, null, static, null, late, final, 1, augment, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Class, null, augment, null, static, null, late, null, ;)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(field)
            handleType(int, null)
            handleIdentifier(field, fieldDeclaration)
            handleNoFieldInitializer(;)
          endClassFields(null, augment, null, static, null, late, null, 1, augment, ;)
        endMember()
      endClassOrMixinOrExtensionBody(DeclarationKind.Class, 26, {, })
    endClassDeclaration(class, })
  endTopLevelDeclaration(mixin)
  beginMetadataStar(mixin)
  endMetadataStar(0)
  beginClassOrMixinOrNamedMixinApplicationPrelude(mixin)
    handleIdentifier(Mixin, classOrMixinDeclaration)
    handleNoTypeVariables({)
    beginMixinDeclaration(null, mixin, Mixin)
      handleMixinOn(null, 0)
      handleImplements(null, 0)
      handleMixinHeader(mixin)
      beginClassOrMixinOrExtensionBody(DeclarationKind.Mixin, {)
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Mixin, augment, null, null, null, null, null, method)
            handleNoType(augment)
            handleIdentifier(method, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
            endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
            endBlockFunctionBody(0, {, })
          endMixinMethod(null, augment, (, null, })
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Mixin, augment, null, null, null, null, null, method)
            handleVoidKeyword(void)
            handleIdentifier(method, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
            endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
            endBlockFunctionBody(0, {, })
          endMixinMethod(null, augment, (, null, })
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Mixin, augment, null, null, null, null, get, getter)
            handleNoType(augment)
            handleIdentifier(getter, methodDeclaration)
            handleNoTypeVariables(=>)
            handleNoFormalParameters(=>, MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            handleLiteralNull(null)
            handleExpressionFunctionBody(=>, ;)
          endMixinMethod(get, augment, =>, null, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Mixin, augment, null, null, null, null, get, getter)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(get)
            handleType(int, null)
            handleIdentifier(getter, methodDeclaration)
            handleNoTypeVariables(=>)
            handleNoFormalParameters(=>, MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            handleLiteralInt(0)
            handleExpressionFunctionBody(=>, ;)
          endMixinMethod(get, augment, =>, null, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Mixin, augment, null, null, null, null, set, setter)
            handleNoType(augment)
            handleIdentifier(setter, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
              beginMetadataStar(value)
              endMetadataStar(0)
              beginFormalParameter(value, MemberKind.NonStaticMethod, null, null, null)
                handleNoType(()
                handleIdentifier(value, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, null, value, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
            endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
            endBlockFunctionBody(0, {, })
          endMixinMethod(set, augment, (, null, })
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Mixin, augment, null, null, null, null, set, setter)
            handleVoidKeyword(void)
            handleIdentifier(setter, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
              beginMetadataStar(value)
              endMetadataStar(0)
              beginFormalParameter(value, MemberKind.NonStaticMethod, null, null, null)
                handleNoType(()
                handleIdentifier(value, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, null, value, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
            endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
            endBlockFunctionBody(0, {, })
          endMixinMethod(set, augment, (, null, })
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Mixin, null, augment, null, null, null, null, var, })
            handleNoType(var)
            handleIdentifier(field, fieldDeclaration)
            handleNoFieldInitializer(;)
          endMixinFields(null, augment, null, null, null, null, var, 1, augment, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Mixin, null, augment, null, null, null, null, final, ;)
            handleNoType(final)
            handleIdentifier(field, fieldDeclaration)
            beginFieldInitializer(=)
              handleLiteralInt(0)
            endFieldInitializer(=, ;)
          endMixinFields(null, augment, null, null, null, null, final, 1, augment, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Mixin, null, augment, null, null, null, null, const, ;)
            handleNoType(const)
            handleIdentifier(field, fieldDeclaration)
            beginFieldInitializer(=)
              handleLiteralInt(0)
            endFieldInitializer(=, ;)
          endMixinFields(null, augment, null, null, null, null, const, 1, augment, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Mixin, null, augment, null, null, null, null, null, ;)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(field)
            handleType(int, null)
            handleIdentifier(field, fieldDeclaration)
            handleNoFieldInitializer(;)
          endMixinFields(null, augment, null, null, null, null, null, 1, augment, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Mixin, null, augment, null, null, null, late, var, ;)
            handleNoType(var)
            handleIdentifier(field, fieldDeclaration)
            handleNoFieldInitializer(;)
          endMixinFields(null, augment, null, null, null, late, var, 1, augment, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Mixin, null, augment, null, null, null, late, final, ;)
            handleNoType(final)
            handleIdentifier(field, fieldDeclaration)
            handleNoFieldInitializer(;)
          endMixinFields(null, augment, null, null, null, late, final, 1, augment, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Mixin, null, augment, null, null, null, late, null, ;)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(field)
            handleType(int, null)
            handleIdentifier(field, fieldDeclaration)
            handleNoFieldInitializer(;)
          endMixinFields(null, augment, null, null, null, late, null, 1, augment, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Mixin, augment, null, static, null, null, null, method)
            handleNoType(static)
            handleIdentifier(method, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.StaticMethod)
            endFormalParameters(0, (, ), MemberKind.StaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
            endBlockFunctionBody(0, {, })
          endMixinMethod(null, augment, (, null, })
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Mixin, augment, null, static, null, null, null, method)
            handleVoidKeyword(void)
            handleIdentifier(method, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.StaticMethod)
            endFormalParameters(0, (, ), MemberKind.StaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
            endBlockFunctionBody(0, {, })
          endMixinMethod(null, augment, (, null, })
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Mixin, augment, null, static, null, null, get, getter)
            handleNoType(static)
            handleIdentifier(getter, methodDeclaration)
            handleNoTypeVariables(=>)
            handleNoFormalParameters(=>, MemberKind.StaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            handleLiteralNull(null)
            handleExpressionFunctionBody(=>, ;)
          endMixinMethod(get, augment, =>, null, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Mixin, augment, null, static, null, null, get, getter)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(get)
            handleType(int, null)
            handleIdentifier(getter, methodDeclaration)
            handleNoTypeVariables(=>)
            handleNoFormalParameters(=>, MemberKind.StaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            handleLiteralInt(0)
            handleExpressionFunctionBody(=>, ;)
          endMixinMethod(get, augment, =>, null, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Mixin, augment, null, static, null, null, set, setter)
            handleNoType(static)
            handleIdentifier(setter, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.StaticMethod)
              beginMetadataStar(value)
              endMetadataStar(0)
              beginFormalParameter(value, MemberKind.StaticMethod, null, null, null)
                handleNoType(()
                handleIdentifier(value, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, null, value, null, null, FormalParameterKind.mandatory, MemberKind.StaticMethod)
            endFormalParameters(1, (, ), MemberKind.StaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
            endBlockFunctionBody(0, {, })
          endMixinMethod(set, augment, (, null, })
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Mixin, augment, null, static, null, null, set, setter)
            handleVoidKeyword(void)
            handleIdentifier(setter, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.StaticMethod)
              beginMetadataStar(value)
              endMetadataStar(0)
              beginFormalParameter(value, MemberKind.StaticMethod, null, null, null)
                handleNoType(()
                handleIdentifier(value, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, null, value, null, null, FormalParameterKind.mandatory, MemberKind.StaticMethod)
            endFormalParameters(1, (, ), MemberKind.StaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
            endBlockFunctionBody(0, {, })
          endMixinMethod(set, augment, (, null, })
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Mixin, null, augment, null, static, null, null, var, })
            handleNoType(var)
            handleIdentifier(field, fieldDeclaration)
            handleNoFieldInitializer(;)
          endMixinFields(null, augment, null, static, null, null, var, 1, augment, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Mixin, null, augment, null, static, null, null, final, ;)
            handleNoType(final)
            handleIdentifier(field, fieldDeclaration)
            beginFieldInitializer(=)
              handleLiteralInt(0)
            endFieldInitializer(=, ;)
          endMixinFields(null, augment, null, static, null, null, final, 1, augment, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Mixin, null, augment, null, static, null, null, const, ;)
            handleNoType(const)
            handleIdentifier(field, fieldDeclaration)
            beginFieldInitializer(=)
              handleLiteralInt(0)
            endFieldInitializer(=, ;)
          endMixinFields(null, augment, null, static, null, null, const, 1, augment, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Mixin, null, augment, null, static, null, null, null, ;)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(field)
            handleType(int, null)
            handleIdentifier(field, fieldDeclaration)
            handleNoFieldInitializer(;)
          endMixinFields(null, augment, null, static, null, null, null, 1, augment, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Mixin, null, augment, null, static, null, late, var, ;)
            handleNoType(var)
            handleIdentifier(field, fieldDeclaration)
            handleNoFieldInitializer(;)
          endMixinFields(null, augment, null, static, null, late, var, 1, augment, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Mixin, null, augment, null, static, null, late, final, ;)
            handleNoType(final)
            handleIdentifier(field, fieldDeclaration)
            handleNoFieldInitializer(;)
          endMixinFields(null, augment, null, static, null, late, final, 1, augment, ;)
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Mixin, null, augment, null, static, null, late, null, ;)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(field)
            handleType(int, null)
            handleIdentifier(field, fieldDeclaration)
            handleNoFieldInitializer(;)
          endMixinFields(null, augment, null, static, null, late, null, 1, augment, ;)
        endMember()
      endClassOrMixinOrExtensionBody(DeclarationKind.Mixin, 26, {, })
    endMixinDeclaration(mixin, })
  endTopLevelDeclaration()
endCompilationUnit(2, )
