// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// GENERATED FILE: Do not edit!
//
// To rebuild this file, invoke third_party/go/regen-fidl.

// +build fuchsia

package bindingstest

import (
	_zx "syscall/zx"
	_bindings "syscall/zx/fidl"
)

const (
	KMaxBuf uint64 = 8192
)

type TestSimple struct {
	_ struct{} `fidl:"s,8,8" fidl_size_v1_no_ee:"8" fidl_alignment_v1_no_ee:"8"`
	X int64    `fidl:"0"`
}

var _mTestSimple = _bindings.CreateLazyMarshaler(TestSimple{})

func (msg *TestSimple) Marshaler() _bindings.Marshaler {
	return _mTestSimple
}

type TestSimpleBool struct {
	_ struct{} `fidl:"s,1,1" fidl_size_v1_no_ee:"1" fidl_alignment_v1_no_ee:"1"`
	X bool     `fidl:"0"`
}

var _mTestSimpleBool = _bindings.CreateLazyMarshaler(TestSimpleBool{})

func (msg *TestSimpleBool) Marshaler() _bindings.Marshaler {
	return _mTestSimpleBool
}

type TestAlignment1 struct {
	_ struct{} `fidl:"s,8,4" fidl_size_v1_no_ee:"8" fidl_alignment_v1_no_ee:"4"`
	X int8     `fidl:"0"`
	Y int8     `fidl:"1"`
	Z uint32   `fidl:"4"`
}

var _mTestAlignment1 = _bindings.CreateLazyMarshaler(TestAlignment1{})

func (msg *TestAlignment1) Marshaler() _bindings.Marshaler {
	return _mTestAlignment1
}

type TestAlignment2 struct {
	_ struct{} `fidl:"s,20,4" fidl_size_v1_no_ee:"20" fidl_alignment_v1_no_ee:"4"`
	A uint32   `fidl:"0"`
	B uint32   `fidl:"4"`
	C int8     `fidl:"8"`
	D int8     `fidl:"9"`
	E int8     `fidl:"10"`
	F uint8    `fidl:"11"`
	G uint32   `fidl:"12"`
	H uint16   `fidl:"16"`
	I uint16   `fidl:"18"`
}

var _mTestAlignment2 = _bindings.CreateLazyMarshaler(TestAlignment2{})

func (msg *TestAlignment2) Marshaler() _bindings.Marshaler {
	return _mTestAlignment2
}

type TestFloat1 struct {
	_ struct{} `fidl:"s,4,4" fidl_size_v1_no_ee:"4" fidl_alignment_v1_no_ee:"4"`
	A float32  `fidl:"0"`
}

var _mTestFloat1 = _bindings.CreateLazyMarshaler(TestFloat1{})

func (msg *TestFloat1) Marshaler() _bindings.Marshaler {
	return _mTestFloat1
}

type TestFloat2 struct {
	_ struct{} `fidl:"s,8,8" fidl_size_v1_no_ee:"8" fidl_alignment_v1_no_ee:"8"`
	A float64  `fidl:"0"`
}

var _mTestFloat2 = _bindings.CreateLazyMarshaler(TestFloat2{})

func (msg *TestFloat2) Marshaler() _bindings.Marshaler {
	return _mTestFloat2
}

type TestFloat3 struct {
	_ struct{} `fidl:"s,32,8" fidl_size_v1_no_ee:"32" fidl_alignment_v1_no_ee:"8"`
	A float32  `fidl:"0"`
	B float64  `fidl:"8"`
	C uint64   `fidl:"16"`
	D float32  `fidl:"24"`
}

var _mTestFloat3 = _bindings.CreateLazyMarshaler(TestFloat3{})

func (msg *TestFloat3) Marshaler() _bindings.Marshaler {
	return _mTestFloat3
}

type TestArray1 struct {
	_ struct{} `fidl:"s,5,1" fidl_size_v1_no_ee:"5" fidl_alignment_v1_no_ee:"1"`
	A [5]int8  `fidl:"0"`
}

var _mTestArray1 = _bindings.CreateLazyMarshaler(TestArray1{})

func (msg *TestArray1) Marshaler() _bindings.Marshaler {
	return _mTestArray1
}

type TestArray2 struct {
	_ struct{}   `fidl:"s,16,8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	A float64    `fidl:"0"`
	B [1]float32 `fidl:"8"`
}

var _mTestArray2 = _bindings.CreateLazyMarshaler(TestArray2{})

func (msg *TestArray2) Marshaler() _bindings.Marshaler {
	return _mTestArray2
}

type TestArray3 struct {
	_ struct{}  `fidl:"s,24,8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	A int32     `fidl:"0"`
	B [3]uint16 `fidl:"4"`
	C uint64    `fidl:"16"`
}

var _mTestArray3 = _bindings.CreateLazyMarshaler(TestArray3{})

func (msg *TestArray3) Marshaler() _bindings.Marshaler {
	return _mTestArray3
}

type TestArray4 struct {
	_ struct{} `fidl:"s,9,1" fidl_size_v1_no_ee:"9" fidl_alignment_v1_no_ee:"1"`
	A [9]bool  `fidl:"0"`
}

var _mTestArray4 = _bindings.CreateLazyMarshaler(TestArray4{})

func (msg *TestArray4) Marshaler() _bindings.Marshaler {
	return _mTestArray4
}

type TestString1 struct {
	_ struct{} `fidl:"s,32,8" fidl_size_v1_no_ee:"32" fidl_alignment_v1_no_ee:"8"`
	A string   `fidl:"0,"`
	B *string  `fidl:"16,"`
}

var _mTestString1 = _bindings.CreateLazyMarshaler(TestString1{})

func (msg *TestString1) Marshaler() _bindings.Marshaler {
	return _mTestString1
}

type TestString2 struct {
	_ struct{}  `fidl:"s,32,8" fidl_size_v1_no_ee:"32" fidl_alignment_v1_no_ee:"8"`
	A [2]string `fidl:"0,"`
}

var _mTestString2 = _bindings.CreateLazyMarshaler(TestString2{})

func (msg *TestString2) Marshaler() _bindings.Marshaler {
	return _mTestString2
}

type TestString3 struct {
	_ struct{}   `fidl:"s,64,8" fidl_size_v1_no_ee:"64" fidl_alignment_v1_no_ee:"8"`
	A [2]string  `fidl:"0,4" fidl2:"4"`
	B [2]*string `fidl:"32,4" fidl2:"4"`
}

var _mTestString3 = _bindings.CreateLazyMarshaler(TestString3{})

func (msg *TestString3) Marshaler() _bindings.Marshaler {
	return _mTestString3
}

type TestStringWithBound struct {
	_ struct{} `fidl:"s,16,8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	A string   `fidl:"0,8" fidl2:"8"`
}

var _mTestStringWithBound = _bindings.CreateLazyMarshaler(TestStringWithBound{})

func (msg *TestStringWithBound) Marshaler() _bindings.Marshaler {
	return _mTestStringWithBound
}

type TestOptStringWithBound struct {
	_ struct{} `fidl:"s,16,8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	A *string  `fidl:"0,8" fidl2:"8"`
}

var _mTestOptStringWithBound = _bindings.CreateLazyMarshaler(TestOptStringWithBound{})

func (msg *TestOptStringWithBound) Marshaler() _bindings.Marshaler {
	return _mTestOptStringWithBound
}

type TestVector1 struct {
	_ struct{} `fidl:"s,64,8" fidl_size_v1_no_ee:"64" fidl_alignment_v1_no_ee:"8"`
	A []int8   `fidl:"0,"`
	B *[]int16 `fidl:"16,"`
	C []int32  `fidl:"32,2" fidl2:"2"`
	D *[]int64 `fidl:"48,2" fidl2:"2"`
}

var _mTestVector1 = _bindings.CreateLazyMarshaler(TestVector1{})

func (msg *TestVector1) Marshaler() _bindings.Marshaler {
	return _mTestVector1
}

type TestVector2 struct {
	_ struct{}    `fidl:"s,64,8" fidl_size_v1_no_ee:"64" fidl_alignment_v1_no_ee:"8"`
	A [2][]int8   `fidl:"0,"`
	B [][]int8    `fidl:"32,2," fidl2:"2,"`
	C []*[]string `fidl:"48,2,2,5" fidl2:"2,2,5"`
}

var _mTestVector2 = _bindings.CreateLazyMarshaler(TestVector2{})

func (msg *TestVector2) Marshaler() _bindings.Marshaler {
	return _mTestVector2
}

type TestStruct1 struct {
	_ struct{}    `fidl:"s,16,8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	A TestSimple  `fidl:"0"`
	B *TestSimple `fidl:"8"`
}

var _mTestStruct1 = _bindings.CreateLazyMarshaler(TestStruct1{})

func (msg *TestStruct1) Marshaler() _bindings.Marshaler {
	return _mTestStruct1
}

type TestStruct2 struct {
	_ struct{}     `fidl:"s,88,8" fidl_size_v1_no_ee:"88" fidl_alignment_v1_no_ee:"8"`
	A TestArray1   `fidl:"0"`
	B TestFloat1   `fidl:"8"`
	C TestVector1  `fidl:"16"`
	D *TestString1 `fidl:"80"`
}

var _mTestStruct2 = _bindings.CreateLazyMarshaler(TestStruct2{})

func (msg *TestStruct2) Marshaler() _bindings.Marshaler {
	return _mTestStruct2
}

type EmptyStruct struct {
	_ struct{} `fidl:"s,1,1" fidl_size_v1_no_ee:"1" fidl_alignment_v1_no_ee:"1"`
}

var _mEmptyStruct = _bindings.CreateLazyMarshaler(EmptyStruct{})

func (msg *EmptyStruct) Marshaler() _bindings.Marshaler {
	return _mEmptyStruct
}

type TestUnion1 struct {
	_ struct{} `fidl:"s,24,8" fidl_size_v1_no_ee:"32" fidl_alignment_v1_no_ee:"8"`
	A Union1   `fidl:"0"`
	B *Union1  `fidl:"16"`
}

var _mTestUnion1 = _bindings.CreateLazyMarshaler(TestUnion1{})

func (msg *TestUnion1) Marshaler() _bindings.Marshaler {
	return _mTestUnion1
}

type TestUnion2 struct {
	_ struct{}  `fidl:"s,32,8" fidl_size_v1_no_ee:"32" fidl_alignment_v1_no_ee:"8"`
	A []Union1  `fidl:"0,"`
	B []*Union1 `fidl:"16,"`
}

var _mTestUnion2 = _bindings.CreateLazyMarshaler(TestUnion2{})

func (msg *TestUnion2) Marshaler() _bindings.Marshaler {
	return _mTestUnion2
}

type XUnion1Struct struct {
	_  struct{} `fidl:"s,24,8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Xu XUnion1  `fidl:"0"`
}

var _mXUnion1Struct = _bindings.CreateLazyMarshaler(XUnion1Struct{})

func (msg *XUnion1Struct) Marshaler() _bindings.Marshaler {
	return _mXUnion1Struct
}

type XUnion1AsUnionStruct struct {
	_    struct{}       `fidl:"s,16,8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Xuau XUnion1AsUnion `fidl:"0"`
}

var _mXUnion1AsUnionStruct = _bindings.CreateLazyMarshaler(XUnion1AsUnionStruct{})

func (msg *XUnion1AsUnionStruct) Marshaler() _bindings.Marshaler {
	return _mXUnion1AsUnionStruct
}

type UnionInsideUnionStruct struct {
	_ struct{}         `fidl:"s,24,8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	U UnionInsideUnion `fidl:"0"`
}

var _mUnionInsideUnionStruct = _bindings.CreateLazyMarshaler(UnionInsideUnionStruct{})

func (msg *UnionInsideUnionStruct) Marshaler() _bindings.Marshaler {
	return _mUnionInsideUnionStruct
}

type XUnionInsideXUnionStruct struct {
	_ struct{}           `fidl:"s,24,8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	U XUnionInsideXUnion `fidl:"0"`
}

var _mXUnionInsideXUnionStruct = _bindings.CreateLazyMarshaler(XUnionInsideXUnionStruct{})

func (msg *XUnionInsideXUnionStruct) Marshaler() _bindings.Marshaler {
	return _mXUnionInsideXUnionStruct
}

type TestXUnion1 struct {
	_ struct{} `fidl:"s,48,8" fidl_size_v1_no_ee:"48" fidl_alignment_v1_no_ee:"8"`
	A XUnion1  `fidl:"0"`
	B *XUnion1 `fidl:"24"`
}

var _mTestXUnion1 = _bindings.CreateLazyMarshaler(TestXUnion1{})

func (msg *TestXUnion1) Marshaler() _bindings.Marshaler {
	return _mTestXUnion1
}

type TestXUnion2 struct {
	_ struct{}   `fidl:"s,32,8" fidl_size_v1_no_ee:"32" fidl_alignment_v1_no_ee:"8"`
	A []XUnion1  `fidl:"0,"`
	B []*XUnion1 `fidl:"16,"`
}

var _mTestXUnion2 = _bindings.CreateLazyMarshaler(TestXUnion2{})

func (msg *TestXUnion2) Marshaler() _bindings.Marshaler {
	return _mTestXUnion2
}

type StrictXUnion1Struct struct {
	_  struct{}      `fidl:"s,24,8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Xu StrictXUnion1 `fidl:"0"`
}

var _mStrictXUnion1Struct = _bindings.CreateLazyMarshaler(StrictXUnion1Struct{})

func (msg *StrictXUnion1Struct) Marshaler() _bindings.Marshaler {
	return _mStrictXUnion1Struct
}

type TestStrictXUnion1 struct {
	_ struct{}       `fidl:"s,48,8" fidl_size_v1_no_ee:"48" fidl_alignment_v1_no_ee:"8"`
	A StrictXUnion1  `fidl:"0"`
	B *StrictXUnion1 `fidl:"24"`
}

var _mTestStrictXUnion1 = _bindings.CreateLazyMarshaler(TestStrictXUnion1{})

func (msg *TestStrictXUnion1) Marshaler() _bindings.Marshaler {
	return _mTestStrictXUnion1
}

type TestStrictXUnion2 struct {
	_ struct{}         `fidl:"s,32,8" fidl_size_v1_no_ee:"32" fidl_alignment_v1_no_ee:"8"`
	A []StrictXUnion1  `fidl:"0,"`
	B []*StrictXUnion1 `fidl:"16,"`
}

var _mTestStrictXUnion2 = _bindings.CreateLazyMarshaler(TestStrictXUnion2{})

func (msg *TestStrictXUnion2) Marshaler() _bindings.Marshaler {
	return _mTestStrictXUnion2
}

type TestHandle1 struct {
	_ struct{}   `fidl:"s,16,4" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"4"`
	A _zx.Handle `fidl:"0,0" fidl2:"0"`
	B _zx.Handle `fidl:"4,1" fidl2:"1"`
	C _zx.VMO    `fidl:"8,0" fidl2:"0"`
	D _zx.VMO    `fidl:"12,1" fidl2:"1"`
}

var _mTestHandle1 = _bindings.CreateLazyMarshaler(TestHandle1{})

func (msg *TestHandle1) Marshaler() _bindings.Marshaler {
	return _mTestHandle1
}

type TestHandle2 struct {
	_ struct{}     `fidl:"s,32,8" fidl_size_v1_no_ee:"32" fidl_alignment_v1_no_ee:"8"`
	A []_zx.Handle `fidl:"0,1,0" fidl2:"1,0"`
	B []_zx.VMO    `fidl:"16,1,1" fidl2:"1,1"`
}

var _mTestHandle2 = _bindings.CreateLazyMarshaler(TestHandle2{})

func (msg *TestHandle2) Marshaler() _bindings.Marshaler {
	return _mTestHandle2
}

type TestInterface1 struct {
	_ struct{}              `fidl:"s,16,4" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"4"`
	A Test1Interface        `fidl:"0"`
	B Test1Interface        `fidl:"4"`
	C Test1InterfaceRequest `fidl:"8,0" fidl2:"0"`
	D Test1InterfaceRequest `fidl:"12,1" fidl2:"1"`
}

var _mTestInterface1 = _bindings.CreateLazyMarshaler(TestInterface1{})

func (msg *TestInterface1) Marshaler() _bindings.Marshaler {
	return _mTestInterface1
}

type TestSimpleTable struct {
	_     struct{}    `fidl:"s,16,8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Table SimpleTable `fidl:"0"`
}

var _mTestSimpleTable = _bindings.CreateLazyMarshaler(TestSimpleTable{})

func (msg *TestSimpleTable) Marshaler() _bindings.Marshaler {
	return _mTestSimpleTable
}

type TestOlderSimpleTable struct {
	_     struct{}         `fidl:"s,16,8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Table OlderSimpleTable `fidl:"0"`
}

var _mTestOlderSimpleTable = _bindings.CreateLazyMarshaler(TestOlderSimpleTable{})

func (msg *TestOlderSimpleTable) Marshaler() _bindings.Marshaler {
	return _mTestOlderSimpleTable
}

type TestNewerSimpleTable struct {
	_     struct{}         `fidl:"s,16,8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	Table NewerSimpleTable `fidl:"0"`
}

var _mTestNewerSimpleTable = _bindings.CreateLazyMarshaler(TestNewerSimpleTable{})

func (msg *TestNewerSimpleTable) Marshaler() _bindings.Marshaler {
	return _mTestNewerSimpleTable
}

type TestWithTableAndInt struct {
	_     struct{}    `fidl:"s,24,8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Table SimpleTable `fidl:"0"`
	Foo   uint64      `fidl:"16"`
}

var _mTestWithTableAndInt = _bindings.CreateLazyMarshaler(TestWithTableAndInt{})

func (msg *TestWithTableAndInt) Marshaler() _bindings.Marshaler {
	return _mTestWithTableAndInt
}

type Int64Struct struct {
	_ struct{} `fidl:"s,8,8" fidl_size_v1_no_ee:"8" fidl_alignment_v1_no_ee:"8"`
	X int64    `fidl:"0"`
}

var _mInt64Struct = _bindings.CreateLazyMarshaler(Int64Struct{})

func (msg *Int64Struct) Marshaler() _bindings.Marshaler {
	return _mInt64Struct
}

type TestFuchsiaIoReadAtResponse struct {
	_    struct{} `fidl:"s,24,8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	S    int32    `fidl:"0"`
	Data []uint8  `fidl:"8,8192" fidl2:"8192"`
}

var _mTestFuchsiaIoReadAtResponse = _bindings.CreateLazyMarshaler(TestFuchsiaIoReadAtResponse{})

func (msg *TestFuchsiaIoReadAtResponse) Marshaler() _bindings.Marshaler {
	return _mTestFuchsiaIoReadAtResponse
}

type TestFuchsiaIoWriteAtRequest struct {
	_      struct{} `fidl:"s,24,8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	Data   []uint8  `fidl:"0,8192" fidl2:"8192"`
	Offset uint64   `fidl:"16"`
}

var _mTestFuchsiaIoWriteAtRequest = _bindings.CreateLazyMarshaler(TestFuchsiaIoWriteAtRequest{})

func (msg *TestFuchsiaIoWriteAtRequest) Marshaler() _bindings.Marshaler {
	return _mTestFuchsiaIoWriteAtRequest
}

type InterfaceConfig struct {
	_               struct{}        `fidl:"s,48,8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	Name            string          `fidl:"0,"`
	IpAddressConfig IpAddressConfig `fidl:"16"`
}

var _mInterfaceConfig = _bindings.CreateLazyMarshaler(InterfaceConfig{})

func (msg *InterfaceConfig) Marshaler() _bindings.Marshaler {
	return _mInterfaceConfig
}

type TestAddEthernetDeviceRequest struct {
	_               struct{}                `fidl:"s,72,8" fidl_size_v1_no_ee:"64" fidl_alignment_v1_no_ee:"8"`
	TopologicalPath string                  `fidl:"0,"`
	Config          InterfaceConfig         `fidl:"16"`
	Device          EthernetDeviceInterface `fidl:"64"`
}

var _mTestAddEthernetDeviceRequest = _bindings.CreateLazyMarshaler(TestAddEthernetDeviceRequest{})

func (msg *TestAddEthernetDeviceRequest) Marshaler() _bindings.Marshaler {
	return _mTestAddEthernetDeviceRequest
}

type TestPackageResolverResolveRequest struct {
	_            struct{}                       `fidl:"s,40,8" fidl_size_v1_no_ee:"40" fidl_alignment_v1_no_ee:"8"`
	PackageUrl   string                         `fidl:"0,"`
	Selectors    []string                       `fidl:"16,,"`
	UpdatePolicy UpdatePolicy                   `fidl:"32"`
	Dir          EthernetDeviceInterfaceRequest `fidl:"36,0" fidl2:"0"`
}

var _mTestPackageResolverResolveRequest = _bindings.CreateLazyMarshaler(TestPackageResolverResolveRequest{})

func (msg *TestPackageResolverResolveRequest) Marshaler() _bindings.Marshaler {
	return _mTestPackageResolverResolveRequest
}

type UpdatePolicy struct {
	_                struct{} `fidl:"s,2,1" fidl_size_v1_no_ee:"2" fidl_alignment_v1_no_ee:"1"`
	FetchIfAbsent    bool     `fidl:"0"`
	AllowOldVersions bool     `fidl:"1"`
}

var _mUpdatePolicy = _bindings.CreateLazyMarshaler(UpdatePolicy{})

func (msg *UpdatePolicy) Marshaler() _bindings.Marshaler {
	return _mUpdatePolicy
}

type I_union1Tag uint32

const (
	_ I_union1Tag = iota
	Union1A
	Union1B
	Union1C
	Union1D
)

type Union1 struct {
	I_union1Tag `fidl:"u,16,8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	A           [3]int8     `fidl:"1140208200"`
	B           TestSimple  `fidl:"1101191659"`
	C           *TestSimple `fidl:"310804024"`
	D           float32     `fidl:"1193101976"`
}

func (u *Union1) Which() I_union1Tag {
	return u.I_union1Tag
}

func (u *Union1) SetA(a [3]int8) {
	u.I_union1Tag = Union1A
	u.A = a
}

func Union1WithA(a [3]int8) Union1 {
	var _u Union1
	_u.SetA(a)
	return _u
}

func (u *Union1) SetB(b TestSimple) {
	u.I_union1Tag = Union1B
	u.B = b
}

func Union1WithB(b TestSimple) Union1 {
	var _u Union1
	_u.SetB(b)
	return _u
}

func (u *Union1) SetC(c *TestSimple) {
	u.I_union1Tag = Union1C
	u.C = c
}

func Union1WithC(c *TestSimple) Union1 {
	var _u Union1
	_u.SetC(c)
	return _u
}

func (u *Union1) SetD(d float32) {
	u.I_union1Tag = Union1D
	u.D = d
}

func Union1WithD(d float32) Union1 {
	var _u Union1
	_u.SetD(d)
	return _u
}

type I_xUnion1AsUnionTag uint32

const (
	_ I_xUnion1AsUnionTag = iota
	XUnion1AsUnionA
	XUnion1AsUnionB
	XUnion1AsUnionD
)

type XUnion1AsUnion struct {
	I_xUnion1AsUnionTag `fidl:"u,16,8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	A                   [3]int8    `fidl:"1815116267"`
	B                   TestSimple `fidl:"219568201"`
	D                   float32    `fidl:"1047172132"`
}

func (u *XUnion1AsUnion) Which() I_xUnion1AsUnionTag {
	return u.I_xUnion1AsUnionTag
}

func (u *XUnion1AsUnion) SetA(a [3]int8) {
	u.I_xUnion1AsUnionTag = XUnion1AsUnionA
	u.A = a
}

func XUnion1AsUnionWithA(a [3]int8) XUnion1AsUnion {
	var _u XUnion1AsUnion
	_u.SetA(a)
	return _u
}

func (u *XUnion1AsUnion) SetB(b TestSimple) {
	u.I_xUnion1AsUnionTag = XUnion1AsUnionB
	u.B = b
}

func XUnion1AsUnionWithB(b TestSimple) XUnion1AsUnion {
	var _u XUnion1AsUnion
	_u.SetB(b)
	return _u
}

func (u *XUnion1AsUnion) SetD(d float32) {
	u.I_xUnion1AsUnionTag = XUnion1AsUnionD
	u.D = d
}

func XUnion1AsUnionWithD(d float32) XUnion1AsUnion {
	var _u XUnion1AsUnion
	_u.SetD(d)
	return _u
}

type I_unionInsideUnionTag uint32

const (
	_ I_unionInsideUnionTag = iota
	UnionInsideUnionA
	UnionInsideUnionB
)

type UnionInsideUnion struct {
	I_unionInsideUnionTag `fidl:"u,24,8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	A                     float32        `fidl:"1274799307"`
	B                     XUnion1AsUnion `fidl:"340650192"`
}

func (u *UnionInsideUnion) Which() I_unionInsideUnionTag {
	return u.I_unionInsideUnionTag
}

func (u *UnionInsideUnion) SetA(a float32) {
	u.I_unionInsideUnionTag = UnionInsideUnionA
	u.A = a
}

func UnionInsideUnionWithA(a float32) UnionInsideUnion {
	var _u UnionInsideUnion
	_u.SetA(a)
	return _u
}

func (u *UnionInsideUnion) SetB(b XUnion1AsUnion) {
	u.I_unionInsideUnionTag = UnionInsideUnionB
	u.B = b
}

func UnionInsideUnionWithB(b XUnion1AsUnion) UnionInsideUnion {
	var _u UnionInsideUnion
	_u.SetB(b)
	return _u
}

type I_simpleUnionTag uint32

const (
	_ I_simpleUnionTag = iota
	SimpleUnionI32
	SimpleUnionI64
	SimpleUnionS
	SimpleUnionOs
	SimpleUnionStr
)

type SimpleUnion struct {
	I_simpleUnionTag `fidl:"u,24,8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	I32              int32        `fidl:"2133387115"`
	I64              int64        `fidl:"809723265"`
	S                Int64Struct  `fidl:"1133668882"`
	Os               *Int64Struct `fidl:"1823223580"`
	Str              string       `fidl:"1886911784,"`
}

func (u *SimpleUnion) Which() I_simpleUnionTag {
	return u.I_simpleUnionTag
}

func (u *SimpleUnion) SetI32(i32 int32) {
	u.I_simpleUnionTag = SimpleUnionI32
	u.I32 = i32
}

func SimpleUnionWithI32(i32 int32) SimpleUnion {
	var _u SimpleUnion
	_u.SetI32(i32)
	return _u
}

func (u *SimpleUnion) SetI64(i64 int64) {
	u.I_simpleUnionTag = SimpleUnionI64
	u.I64 = i64
}

func SimpleUnionWithI64(i64 int64) SimpleUnion {
	var _u SimpleUnion
	_u.SetI64(i64)
	return _u
}

func (u *SimpleUnion) SetS(s Int64Struct) {
	u.I_simpleUnionTag = SimpleUnionS
	u.S = s
}

func SimpleUnionWithS(s Int64Struct) SimpleUnion {
	var _u SimpleUnion
	_u.SetS(s)
	return _u
}

func (u *SimpleUnion) SetOs(os *Int64Struct) {
	u.I_simpleUnionTag = SimpleUnionOs
	u.Os = os
}

func SimpleUnionWithOs(os *Int64Struct) SimpleUnion {
	var _u SimpleUnion
	_u.SetOs(os)
	return _u
}

func (u *SimpleUnion) SetStr(str string) {
	u.I_simpleUnionTag = SimpleUnionStr
	u.Str = str
}

func SimpleUnionWithStr(str string) SimpleUnion {
	var _u SimpleUnion
	_u.SetStr(str)
	return _u
}

type I_ipAddressConfigTag uint32

const (
	_ I_ipAddressConfigTag = iota
	IpAddressConfigPaddingSize24Align4
	IpAddressConfigDhcp
)

type IpAddressConfig struct {
	I_ipAddressConfigTag `fidl:"u,28,4" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	PaddingSize24Align4  [6]uint32 `fidl:"1850696643"`
	Dhcp                 bool      `fidl:"500027731"`
}

func (u *IpAddressConfig) Which() I_ipAddressConfigTag {
	return u.I_ipAddressConfigTag
}

func (u *IpAddressConfig) SetPaddingSize24Align4(paddingSize24Align4 [6]uint32) {
	u.I_ipAddressConfigTag = IpAddressConfigPaddingSize24Align4
	u.PaddingSize24Align4 = paddingSize24Align4
}

func IpAddressConfigWithPaddingSize24Align4(paddingSize24Align4 [6]uint32) IpAddressConfig {
	var _u IpAddressConfig
	_u.SetPaddingSize24Align4(paddingSize24Align4)
	return _u
}

func (u *IpAddressConfig) SetDhcp(dhcp bool) {
	u.I_ipAddressConfigTag = IpAddressConfigDhcp
	u.Dhcp = dhcp
}

func IpAddressConfigWithDhcp(dhcp bool) IpAddressConfig {
	var _u IpAddressConfig
	_u.SetDhcp(dhcp)
	return _u
}

type I_xUnion1Tag uint32

const (
	XUnion1_unknownData = 0          // 0x00000000
	XUnion1A            = 416714395  // 0x18d68e9b
	XUnion1B            = 863456686  // 0x33774dae
	XUnion1D            = 1912225229 // 0x71fa3dcd
)

type XUnion1 struct {
	I_xUnion1Tag  `fidl:"x,24,8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	I_unknownData []byte
	A             [3]int8    `fidl:"416714395" fidl2:"416714395"`
	B             TestSimple `fidl:"863456686" fidl2:"863456686"`
	D             float32    `fidl:"1912225229" fidl2:"1912225229"`
}

func (_m *XUnion1) Which() I_xUnion1Tag {
	switch _m.I_xUnion1Tag {
	case 416714395:
		return XUnion1A
	case 863456686:
		return XUnion1B
	case 1912225229:
		return XUnion1D
	default:
		return XUnion1_unknownData
	}
}

func (_m *XUnion1) Ordinal() uint32 {
	return uint32(_m.I_xUnion1Tag)
}

func (_m *XUnion1) SetA(a [3]int8) {
	_m.I_xUnion1Tag = XUnion1A
	_m.A = a
}

func XUnion1WithA(a [3]int8) XUnion1 {
	var _u XUnion1
	_u.SetA(a)
	return _u
}

func (_m *XUnion1) SetB(b TestSimple) {
	_m.I_xUnion1Tag = XUnion1B
	_m.B = b
}

func XUnion1WithB(b TestSimple) XUnion1 {
	var _u XUnion1
	_u.SetB(b)
	return _u
}

func (_m *XUnion1) SetD(d float32) {
	_m.I_xUnion1Tag = XUnion1D
	_m.D = d
}

func XUnion1WithD(d float32) XUnion1 {
	var _u XUnion1
	_u.SetD(d)
	return _u
}

type I_xUnionInsideXUnionTag uint32

const (
	XUnionInsideXUnion_unknownData = 0          // 0x00000000
	XUnionInsideXUnionA            = 1100463121 // 0x4197bc11
	XUnionInsideXUnionB            = 796211677  // 0x2f7539dd
)

type XUnionInsideXUnion struct {
	I_xUnionInsideXUnionTag `fidl:"x,24,8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	I_unknownData           []byte
	A                       float32 `fidl:"1100463121" fidl2:"1100463121"`
	B                       XUnion1 `fidl:"796211677" fidl2:"796211677"`
}

func (_m *XUnionInsideXUnion) Which() I_xUnionInsideXUnionTag {
	switch _m.I_xUnionInsideXUnionTag {
	case 1100463121:
		return XUnionInsideXUnionA
	case 796211677:
		return XUnionInsideXUnionB
	default:
		return XUnionInsideXUnion_unknownData
	}
}

func (_m *XUnionInsideXUnion) Ordinal() uint32 {
	return uint32(_m.I_xUnionInsideXUnionTag)
}

func (_m *XUnionInsideXUnion) SetA(a float32) {
	_m.I_xUnionInsideXUnionTag = XUnionInsideXUnionA
	_m.A = a
}

func XUnionInsideXUnionWithA(a float32) XUnionInsideXUnion {
	var _u XUnionInsideXUnion
	_u.SetA(a)
	return _u
}

func (_m *XUnionInsideXUnion) SetB(b XUnion1) {
	_m.I_xUnionInsideXUnionTag = XUnionInsideXUnionB
	_m.B = b
}

func XUnionInsideXUnionWithB(b XUnion1) XUnionInsideXUnion {
	var _u XUnionInsideXUnion
	_u.SetB(b)
	return _u
}

type I_strictXUnion1Tag uint32

const (
	StrictXUnion1A = 1988029217 // 0x767eeb21
	StrictXUnion1B = 1259078458 // 0x4b0c033a
	StrictXUnion1D = 881204552  // 0x34861d48
)

type StrictXUnion1 struct {
	I_strictXUnion1Tag `fidl:"x!,24,8" fidl_size_v1_no_ee:"24" fidl_alignment_v1_no_ee:"8"`
	A                  [3]int8    `fidl:"1988029217" fidl2:"1988029217"`
	B                  TestSimple `fidl:"1259078458" fidl2:"1259078458"`
	D                  float32    `fidl:"881204552" fidl2:"881204552"`
}

func (_m *StrictXUnion1) Which() I_strictXUnion1Tag {
	return _m.I_strictXUnion1Tag
}

func (_m *StrictXUnion1) Ordinal() uint32 {
	return uint32(_m.I_strictXUnion1Tag)
}

func (_m *StrictXUnion1) SetA(a [3]int8) {
	_m.I_strictXUnion1Tag = StrictXUnion1A
	_m.A = a
}

func StrictXUnion1WithA(a [3]int8) StrictXUnion1 {
	var _u StrictXUnion1
	_u.SetA(a)
	return _u
}

func (_m *StrictXUnion1) SetB(b TestSimple) {
	_m.I_strictXUnion1Tag = StrictXUnion1B
	_m.B = b
}

func StrictXUnion1WithB(b TestSimple) StrictXUnion1 {
	var _u StrictXUnion1
	_u.SetB(b)
	return _u
}

func (_m *StrictXUnion1) SetD(d float32) {
	_m.I_strictXUnion1Tag = StrictXUnion1D
	_m.D = d
}

func StrictXUnion1WithD(d float32) StrictXUnion1 {
	var _u StrictXUnion1
	_u.SetD(d)
	return _u
}

type SimpleTable struct {
	_        struct{} `fidl:"t,16,8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	X        int64    `fidl:"1" fidl2:"1"`
	XPresent bool
	Y        int64 `fidl:"5" fidl2:"5"`
	YPresent bool
}

func (u *SimpleTable) SetX(x int64) {
	u.X = x
	u.XPresent = true
}

func (u *SimpleTable) GetX() int64 {
	return u.X
}

func (u *SimpleTable) GetXWithDefault(_default int64) int64 {
	if !u.HasX() {
		return _default
	}
	return u.X
}

func (u *SimpleTable) HasX() bool {
	return u.XPresent
}

func (u *SimpleTable) ClearX() {
	u.XPresent = false
}

func (u *SimpleTable) SetY(y int64) {
	u.Y = y
	u.YPresent = true
}

func (u *SimpleTable) GetY() int64 {
	return u.Y
}

func (u *SimpleTable) GetYWithDefault(_default int64) int64 {
	if !u.HasY() {
		return _default
	}
	return u.Y
}

func (u *SimpleTable) HasY() bool {
	return u.YPresent
}

func (u *SimpleTable) ClearY() {
	u.YPresent = false
}

type OlderSimpleTable struct {
	_        struct{} `fidl:"t,16,8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	X        int64    `fidl:"1" fidl2:"1"`
	XPresent bool
}

func (u *OlderSimpleTable) SetX(x int64) {
	u.X = x
	u.XPresent = true
}

func (u *OlderSimpleTable) GetX() int64 {
	return u.X
}

func (u *OlderSimpleTable) GetXWithDefault(_default int64) int64 {
	if !u.HasX() {
		return _default
	}
	return u.X
}

func (u *OlderSimpleTable) HasX() bool {
	return u.XPresent
}

func (u *OlderSimpleTable) ClearX() {
	u.XPresent = false
}

type NewerSimpleTable struct {
	_        struct{} `fidl:"t,16,8" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"8"`
	X        int64    `fidl:"1" fidl2:"1"`
	XPresent bool
	Y        int64 `fidl:"5" fidl2:"5"`
	YPresent bool
	Z        int64 `fidl:"6" fidl2:"6"`
	ZPresent bool
}

func (u *NewerSimpleTable) SetX(x int64) {
	u.X = x
	u.XPresent = true
}

func (u *NewerSimpleTable) GetX() int64 {
	return u.X
}

func (u *NewerSimpleTable) GetXWithDefault(_default int64) int64 {
	if !u.HasX() {
		return _default
	}
	return u.X
}

func (u *NewerSimpleTable) HasX() bool {
	return u.XPresent
}

func (u *NewerSimpleTable) ClearX() {
	u.XPresent = false
}

func (u *NewerSimpleTable) SetY(y int64) {
	u.Y = y
	u.YPresent = true
}

func (u *NewerSimpleTable) GetY() int64 {
	return u.Y
}

func (u *NewerSimpleTable) GetYWithDefault(_default int64) int64 {
	if !u.HasY() {
		return _default
	}
	return u.Y
}

func (u *NewerSimpleTable) HasY() bool {
	return u.YPresent
}

func (u *NewerSimpleTable) ClearY() {
	u.YPresent = false
}

func (u *NewerSimpleTable) SetZ(z int64) {
	u.Z = z
	u.ZPresent = true
}

func (u *NewerSimpleTable) GetZ() int64 {
	return u.Z
}

func (u *NewerSimpleTable) GetZWithDefault(_default int64) int64 {
	if !u.HasZ() {
		return _default
	}
	return u.Z
}

func (u *NewerSimpleTable) HasZ() bool {
	return u.ZPresent
}

func (u *NewerSimpleTable) ClearZ() {
	u.ZPresent = false
}

const (
	Test1EchoOrdinal             uint64 = 0x4a4939ff00000000
	Test1EchoGenOrdinal          uint64 = 0x4adc92c9e871ae62
	Test1NoResponseOrdinal       uint64 = 0x7e0c050500000000
	Test1NoResponseGenOrdinal    uint64 = 0x584f4d438578f337
	Test1EmptyResponseOrdinal    uint64 = 0x648de0d00000000
	Test1EmptyResponseGenOrdinal uint64 = 0x12ee80a1f8a85427
	Test1SurpriseOrdinal         uint64 = 0x4bd66e7200000000
	Test1SurpriseGenOrdinal      uint64 = 0xf93fd4731796fd9
)

type test1EchoRequest struct {
	_  struct{} `fidl:"s,16,0" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"0"`
	In *string  `fidl:"0,"`
}

var _mtest1EchoRequest = _bindings.CreateLazyMarshaler(test1EchoRequest{})

func (msg *test1EchoRequest) Marshaler() _bindings.Marshaler {
	return _mtest1EchoRequest
}

type test1EchoResponse struct {
	_   struct{} `fidl:"s,16,0" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"0"`
	Out *string  `fidl:"0,"`
}

var _mtest1EchoResponse = _bindings.CreateLazyMarshaler(test1EchoResponse{})

func (msg *test1EchoResponse) Marshaler() _bindings.Marshaler {
	return _mtest1EchoResponse
}

type test1SurpriseResponse struct {
	_   struct{} `fidl:"s,16,0" fidl_size_v1_no_ee:"16" fidl_alignment_v1_no_ee:"0"`
	Foo string   `fidl:"0,"`
}

var _mtest1SurpriseResponse = _bindings.CreateLazyMarshaler(test1SurpriseResponse{})

func (msg *test1SurpriseResponse) Marshaler() _bindings.Marshaler {
	return _mtest1SurpriseResponse
}

type Test1Interface _bindings.ChannelProxy

func (p *Test1Interface) Echo(in *string) (*string, error) {
	req_ := &test1EchoRequest{
		In: in,
	}
	resp_ := &test1EchoResponse{}
	err := ((*_bindings.ChannelProxy)(p)).Call(Test1EchoOrdinal, req_, resp_, Test1EchoOrdinal, Test1EchoGenOrdinal)
	return resp_.Out, err
}

func (p *Test1Interface) NoResponse() error {
	var req_ _bindings.Message
	err := ((*_bindings.ChannelProxy)(p)).Send(Test1NoResponseOrdinal, req_)
	return err
}

func (p *Test1Interface) EmptyResponse() error {
	var req_ _bindings.Message
	var resp_ _bindings.Message
	err := ((*_bindings.ChannelProxy)(p)).Call(Test1EmptyResponseOrdinal, req_, resp_, Test1EmptyResponseOrdinal, Test1EmptyResponseGenOrdinal)
	return err
}

func (p *Test1Interface) ExpectSurprise() (string, error) {
	resp_ := &test1SurpriseResponse{}
	err := ((*_bindings.ChannelProxy)(p)).Recv(Test1SurpriseOrdinal, resp_, Test1SurpriseGenOrdinal)
	return resp_.Foo, err
}

type Test1 interface {
	Echo(in *string) (*string, error)
	NoResponse() error
	EmptyResponse() error
}

type Test1TransitionalBase struct{}

type Test1InterfaceRequest _bindings.InterfaceRequest

func NewTest1InterfaceRequest() (Test1InterfaceRequest, *Test1Interface, error) {
	req, cli, err := _bindings.NewInterfaceRequest()
	return Test1InterfaceRequest(req), (*Test1Interface)(cli), err
}

type Test1Stub struct {
	Impl Test1
}

func (s_ *Test1Stub) DispatchImpl(ordinal_ uint64, data_ []byte, handles_ []_zx.Handle) (_bindings.Message, bool, error) {
	switch ordinal_ {
	case Test1EchoOrdinal:
		fallthrough
	case Test1EchoGenOrdinal:
		in_ := test1EchoRequest{}
		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
			return nil, false, err_
		}
		out, err_ := s_.Impl.Echo(in_.In)
		out_ := test1EchoResponse{}
		out_.Out = out
		return &out_, true, err_
	case Test1NoResponseOrdinal:
		fallthrough
	case Test1NoResponseGenOrdinal:
		err_ := s_.Impl.NoResponse()
		return nil, false, err_
	case Test1EmptyResponseOrdinal:
		fallthrough
	case Test1EmptyResponseGenOrdinal:
		err_ := s_.Impl.EmptyResponse()
		return nil, true, err_
	}
	return nil, false, _bindings.ErrUnknownOrdinal
}

type Test1Service struct {
	_bindings.BindingSet
}

func (s *Test1Service) Add(impl Test1, c _zx.Channel, onError func(error)) (_bindings.BindingKey, error) {
	return s.BindingSet.Add(&Test1Stub{Impl: impl}, c, onError)
}

func (s *Test1Service) EventProxyFor(key _bindings.BindingKey) (*Test1EventProxy, bool) {
	pxy, err := s.BindingSet.ProxyFor(key)
	return (*Test1EventProxy)(pxy), err
}

type Test1EventProxy _bindings.ChannelProxy

func (p *Test1EventProxy) Surprise(foo string) error {
	event_ := &test1SurpriseResponse{
		Foo: foo,
	}
	return ((*_bindings.ChannelProxy)(p)).Send(Test1SurpriseOrdinal, event_)
}

type EthernetDeviceInterface _bindings.ChannelProxy

type EthernetDevice interface {
}

type EthernetDeviceTransitionalBase struct{}

type EthernetDeviceInterfaceRequest _bindings.InterfaceRequest

func NewEthernetDeviceInterfaceRequest() (EthernetDeviceInterfaceRequest, *EthernetDeviceInterface, error) {
	req, cli, err := _bindings.NewInterfaceRequest()
	return EthernetDeviceInterfaceRequest(req), (*EthernetDeviceInterface)(cli), err
}

type EthernetDeviceStub struct {
	Impl EthernetDevice
}

func (s_ *EthernetDeviceStub) DispatchImpl(ordinal_ uint64, data_ []byte, handles_ []_zx.Handle) (_bindings.Message, bool, error) {
	switch ordinal_ {
	}
	return nil, false, _bindings.ErrUnknownOrdinal
}

type EthernetDeviceService struct {
	_bindings.BindingSet
}

func (s *EthernetDeviceService) Add(impl EthernetDevice, c _zx.Channel, onError func(error)) (_bindings.BindingKey, error) {
	return s.BindingSet.Add(&EthernetDeviceStub{Impl: impl}, c, onError)
}

func (s *EthernetDeviceService) EventProxyFor(key _bindings.BindingKey) (*EthernetDeviceEventProxy, bool) {
	pxy, err := s.BindingSet.ProxyFor(key)
	return (*EthernetDeviceEventProxy)(pxy), err
}

type EthernetDeviceEventProxy _bindings.ChannelProxy
