diff --git a/bin/fidl_bindings_test/test/test/conformance_test.dart b/bin/fidl_bindings_test/test/test/conformance_test.dart
index 0d786fb..bdfcc77 100644
--- a/bin/fidl_bindings_test/test/test/conformance_test.dart
+++ b/bin/fidl_bindings_test/test/test/conformance_test.dart
@@ -101,6 +101,31 @@
 
       EncodeSuccessCase.run(
           Encoders.v1,
+          'Sandwich1Case1WithHdr_v1',
+          Sandwich1Message(
+              header: TransactionHeader(
+                  txId: 0xf3f2f1f0,
+                  flags: Uint8List.fromList([0xf4, 0xf5, 0xf6]),
+                  magicNumber: 0xf7,
+                  ordinal: 0xfffefdfcfbfaf9f8),
+              body: Sandwich1(
+                  before: 0x4030201,
+                  theUnion: UnionSize8Align4.withVariant(0xc0b0a09),
+                  after: 0x8070605)),
+          kSandwich1Message_Type,
+          Uint8List.fromList([
+            0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, //
+            0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, //
+            0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, //
+            0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, //
+            0x09, 0x0a, 0x0b, 0x0c, 0x00, 0x00, 0x00, 0x00, //
+          ]));
+
+      EncodeSuccessCase.run(
+          Encoders.v1,
           'Sandwich1WithOptUnionPresent_v1',
           Sandwich1WithOptUnion(
               before: 0x4030201,
@@ -221,6 +246,67 @@
 
       EncodeSuccessCase.run(
           Encoders.v1,
+          'Sandwich4Case1WithHdr_v1',
+          Sandwich4Message(
+              header: TransactionHeader(
+                  txId: 0x0,
+                  flags: Uint8List.fromList([0x0, 0x0, 0x0]),
+                  magicNumber: 0x0,
+                  ordinal: 0x0),
+              body: Sandwich4(
+                  before: 0x4030201,
+                  theUnion: UnionSize36Align4.withVariant(Uint8List.fromList([
+                    0xa0,
+                    0xa1,
+                    0xa2,
+                    0xa3,
+                    0xa4,
+                    0xa5,
+                    0xa6,
+                    0xa7,
+                    0xa8,
+                    0xa9,
+                    0xaa,
+                    0xab,
+                    0xac,
+                    0xad,
+                    0xae,
+                    0xaf,
+                    0xb0,
+                    0xb1,
+                    0xb2,
+                    0xb3,
+                    0xb4,
+                    0xb5,
+                    0xb6,
+                    0xb7,
+                    0xb8,
+                    0xb9,
+                    0xba,
+                    0xbb,
+                    0xbc,
+                    0xbd,
+                    0xbe,
+                    0xbf
+                  ])),
+                  after: 0x8070605)),
+          kSandwich4Message_Type,
+          Uint8List.fromList([
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, //
+            0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, //
+            0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, //
+            0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, //
+            0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, //
+            0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, //
+          ]));
+
+      EncodeSuccessCase.run(
+          Encoders.v1,
           'Sandwich5Case1_v1',
           Sandwich5(
               before: 0x4030201,
@@ -242,6 +328,35 @@
 
       EncodeSuccessCase.run(
           Encoders.v1,
+          'Sandwich5Case1WithHdr_v1',
+          Sandwich5Message(
+              header: TransactionHeader(
+                  txId: 0xf3f2f1f0,
+                  flags: Uint8List.fromList([0xf4, 0xf5, 0xf6]),
+                  magicNumber: 0xf7,
+                  ordinal: 0xfffefdfcfbfaf9f8),
+              body: Sandwich5(
+                  before: 0x4030201,
+                  unionOfUnion: UnionOfUnion.withSize8align4(
+                      UnionSize8Align4.withVariant(0xc0b0a09)),
+                  after: 0x8070605)),
+          kSandwich5Message_Type,
+          Uint8List.fromList([
+            0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, //
+            0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, //
+            0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, //
+            0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, //
+            0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x09, 0x0a, 0x0b, 0x0c, 0x00, 0x00, 0x00, 0x00, //
+          ]));
+
+      EncodeSuccessCase.run(
+          Encoders.v1,
           'Sandwich5Case2_v1',
           Sandwich5(
               before: 0x4030201,
@@ -265,6 +380,37 @@
 
       EncodeSuccessCase.run(
           Encoders.v1,
+          'Sandwich5Case2WithHdr_v1',
+          Sandwich5Message(
+              header: TransactionHeader(
+                  txId: 0xf3f2f1f0,
+                  flags: Uint8List.fromList([0xf4, 0xf5, 0xf6]),
+                  magicNumber: 0xf7,
+                  ordinal: 0xfffefdfcfbfaf9f8),
+              body: Sandwich5(
+                  before: 0x4030201,
+                  unionOfUnion: UnionOfUnion.withSize24align8(
+                      UnionSize24Align8.withVariant(StructSize16Align8(
+                          f1: 0xa7a6a5a4a3a2a1a0, f2: 0xafaeadacabaaa9a8))),
+                  after: 0x8070605)),
+          kSandwich5Message_Type,
+          Uint8List.fromList([
+            0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, //
+            0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, //
+            0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, //
+            0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, //
+            0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, //
+            0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, //
+          ]));
+
+      EncodeSuccessCase.run(
+          Encoders.v1,
           'Sandwich6Case1_v1',
           Sandwich6(
               before: 0x4030201,
@@ -485,6 +631,37 @@
 
       EncodeSuccessCase.run(
           Encoders.v1,
+          'Sandwich7Case1WithHdr_v1',
+          Sandwich7Message(
+              header: TransactionHeader(
+                  txId: 0xf3f2f1f0,
+                  flags: Uint8List.fromList([0xf4, 0xf5, 0xf6]),
+                  magicNumber: 0xf7,
+                  ordinal: 0xfffefdfcfbfaf9f8),
+              body: Sandwich7(
+                  before: 0x14131211,
+                  optSandwich1: Sandwich1(
+                      before: 0x4030201,
+                      theUnion: UnionSize8Align4.withVariant(0xc0b0a09),
+                      after: 0x8070605),
+                  after: 0x24232221)),
+          kSandwich7Message_Type,
+          Uint8List.fromList([
+            0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, //
+            0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, //
+            0x11, 0x12, 0x13, 0x14, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x21, 0x22, 0x23, 0x24, 0x00, 0x00, 0x00, 0x00, //
+            0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, //
+            0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, //
+            0x09, 0x0a, 0x0b, 0x0c, 0x00, 0x00, 0x00, 0x00, //
+          ]));
+
+      EncodeSuccessCase.run(
+          Encoders.v1,
           'Sandwich7Case2_v1',
           Sandwich7(before: 0x14131211, after: 0x24232221),
           kSandwich7_Type,
@@ -496,6 +673,25 @@
 
       EncodeSuccessCase.run(
           Encoders.v1,
+          'Sandwich7Case2WithHdr_v1',
+          Sandwich7Message(
+              header: TransactionHeader(
+                  txId: 0xf3f2f1f0,
+                  flags: Uint8List.fromList([0xf4, 0xf5, 0xf6]),
+                  magicNumber: 0xf7,
+                  ordinal: 0xfffefdfcfbfaf9f8),
+              body: Sandwich7(before: 0x14131211, after: 0x24232221)),
+          kSandwich7Message_Type,
+          Uint8List.fromList([
+            0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, //
+            0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, //
+            0x11, 0x12, 0x13, 0x14, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x21, 0x22, 0x23, 0x24, 0x00, 0x00, 0x00, 0x00, //
+          ]));
+
+      EncodeSuccessCase.run(
+          Encoders.v1,
           'Regression1_v1',
           Regression1(f1: 0x1, f2: 0x2, f3: 0x3, f4: 0x4, f5: 0x5, f6: 0x6),
           kRegression1_Type,
@@ -613,6 +809,26 @@
 
       EncodeSuccessCase.run(
           Encoders.v1,
+          'Table_NoFields_v1',
+          StructTableNoFields(t: TableNoFields()),
+          kStruct_Table_NoFields_Type,
+          Uint8List.fromList([
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+          ]));
+
+      EncodeSuccessCase.run(
+          Encoders.v1,
+          'Table_TwoReservedFields_v1',
+          StructTableTwoReservedFields(t: TableTwoReservedFields()),
+          kStruct_Table_TwoReservedFields_Type,
+          Uint8List.fromList([
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+          ]));
+
+      EncodeSuccessCase.run(
+          Encoders.v1,
           'Table_StructWithReservedSandwich_v1',
           TableStructWithReservedSandwichStruct(
               table: TableStructWithReservedSandwich(
@@ -1076,6 +1292,206 @@
 
       EncodeSuccessCase.run(
           Encoders.v1,
+          'Regression5Enums_v1',
+          Regression5(
+              f1: 0x1,
+              f2: 0x3231302f,
+              f3: 0x8,
+              f4: 0x1615,
+              f5: 0x64636261605f5e5d,
+              f6: 0x8),
+          kRegression5_Type,
+          Uint8List.fromList([
+            0x01, 0x00, 0x00, 0x00, 0x2f, 0x30, 0x31, 0x32, //
+            0x08, 0x00, 0x15, 0x16, 0x00, 0x00, 0x00, 0x00, //
+            0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+          ]));
+
+      EncodeSuccessCase.run(
+          Encoders.v1,
+          'Regression6Bits_v1',
+          Regression6(
+              f1: 0x1,
+              f2: 0x3231302f,
+              f3: 0x8,
+              f4: 0x1615,
+              f5: 0x64636261605f5e5d,
+              f6: 0x8),
+          kRegression6_Type,
+          Uint8List.fromList([
+            0x01, 0x00, 0x00, 0x00, 0x2f, 0x30, 0x31, 0x32, //
+            0x08, 0x00, 0x15, 0x16, 0x00, 0x00, 0x00, 0x00, //
+            0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+          ]));
+
+      EncodeSuccessCase.run(
+          Encoders.v1,
+          'Regression7TableUnionXUnion_v1',
+          Regression7TableUnionXUnion(
+              value: TableOfUnionThenXUnionThenTableThenXUnionThenUnion(
+                  member: UnionOfXUnionThenTableThenXUnionThenUnion.withVariant(
+                      XUnionOfTableThenXUnionThenUnion.withVariant(
+                          TableOfXUnionThenUnion(
+                              member: XUnionOfUnion.withVariant(
+                                  UnionAtTheBottom.withTiny(0x8))))))),
+          kRegression7TableUnionXUnion_Type,
+          Uint8List.fromList([
+            0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x4e, 0x61, 0xb8, 0x22, 0x00, 0x00, 0x00, 0x00, //
+            0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x94, 0x05, 0x22, 0x38, 0x00, 0x00, 0x00, 0x00, //
+            0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+          ]));
+
+      EncodeSuccessCase.run(
+          Encoders.v1,
+          'Regression8OptUnionSize12Aligned4_v1',
+          Regression8OptUnionSize12Align4(
+              optUnion1: UnionSize12Align4.withVariant(
+                  Uint8List.fromList([0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6])),
+              optUnion3: UnionSize12Align4.withVariant(
+                  Uint8List.fromList([0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6]))),
+          kRegression8OptUnionSize12Align4_Type,
+          Uint8List.fromList([
+            0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0x00, 0x00, //
+            0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0x00, 0x00, //
+          ]));
+
+      EncodeSuccessCase.run(
+          Encoders.v1,
+          'Regression8VectorOfOptUnionSize12Aligned4_v1',
+          Regression8VectorOfOptUnionSize12Align4(value: [
+            null,
+            UnionSize12Align4.withVariant(
+                Uint8List.fromList([0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6])),
+            null,
+            UnionSize12Align4.withVariant(
+                Uint8List.fromList([0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6])),
+            null
+          ]),
+          kRegression8VectorOfOptUnionSize12Align4_Type,
+          Uint8List.fromList([
+            0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0x00, 0x00, //
+            0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0x00, 0x00, //
+          ]));
+
+      EncodeSuccessCase.run(
+          Encoders.v1,
+          'Regression8TableWithUnionSize12Aligned4_v1',
+          Regression8TableWithUnionSize12Align4(
+              value: TableWithUnionSize12Align4(
+                  before: 0xaa,
+                  member: UnionSize12Align4.withVariant(
+                      Uint8List.fromList([0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6])),
+                  after: 0xbb)),
+          kRegression8TableWithUnionSize12Align4_Type,
+          Uint8List.fromList([
+            0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0x00, 0x00, //
+            0xbb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+          ]));
+
+      EncodeSuccessCase.run(
+          Encoders.v1,
+          'Regression9Response_v1',
+          Regression9Message(
+              header: TransactionHeader(
+                  txId: 0x1,
+                  flags: Uint8List.fromList([0x1, 0x0, 0x0]),
+                  magicNumber: 0x1,
+                  ordinal: 0x56cbc96900000000),
+              body: Regression9Result.withOk(Regression9Value(
+                  u: StringBoolUnion.withS('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'),
+                  nullableU: StringBoolUnion.withB(false)))),
+          kRegression9Message_Type,
+          Uint8List.fromList([
+            0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, //
+            0x00, 0x00, 0x00, 0x00, 0x69, 0xc9, 0xcb, 0x56, //
+            0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, //
+            0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, //
+            0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, //
+            0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+          ]));
+
+      EncodeSuccessCase.run(
+          Encoders.v1,
           'Sandwich4Align8_v1',
           Sandwich4Align8(
               sandwich4: Sandwich4(
@@ -1290,7 +1706,36 @@
 
       EncodeSuccessCase.run(
           Encoders.v1,
-          'CreateComponentRequest_v1',
+          'StringUnionStructWrapperResponse_v1',
+          StringUnionStructWrapperResponse(
+              header: TransactionHeader(
+                  txId: 0x0,
+                  flags: Uint8List.fromList([0x1, 0x0, 0x0]),
+                  magicNumber: 0x1,
+                  ordinal: 0x32a0322500000000),
+              body: StringUnionStructWrapper(
+                  sus: StringUnionStruct(
+                      u: StringBoolUnion.withS('hello'),
+                      nullableU: StringBoolUnion.withB(true)))),
+          kStringUnionStructWrapperResponse_Type,
+          Uint8List.fromList([
+            0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, //
+            0x00, 0x00, 0x00, 0x00, 0x25, 0x32, 0xa0, 0x32, //
+            0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00, 0x00, 0x00, //
+            0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+          ]));
+
+      EncodeSuccessCase.run(
+          Encoders.v1,
+          'RegressionNoUnionLauncherCreateComponentRequest_v1',
           CreateComponentRequest(
               launchInfo: LaunchInfo(
                   url:
@@ -1330,6 +1775,105 @@
 
       EncodeSuccessCase.run(
           Encoders.v1,
+          'CompatTable_v1',
+          CompatTable(
+              value: CompatTableValue(
+                  unionMember: CompatUnion.withB(true),
+                  arrayMember:
+                      Uint32List.fromList([0x5129679d, 0x9491b48e, 0x93d21b51]),
+                  tableMember: CompatTableString(s: 'AB'),
+                  xunionMember: CompatXUnion.withS('CD')),
+              empty: ''),
+          kCompatTable_Type,
+          Uint8List.fromList([
+            0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x9d, 0x67, 0x29, 0x51, 0x8e, 0xb4, 0x91, 0x94, //
+            0x51, 0x1b, 0xd2, 0x93, 0x00, 0x00, 0x00, 0x00, //
+            0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x41, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xa8, 0xef, 0xf8, 0x5a, 0x00, 0x00, 0x00, 0x00, //
+            0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x43, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+          ]));
+
+      EncodeSuccessCase.run(
+          Encoders.v1,
+          'MixedFields_v1',
+          MixedFieldsMessage(
+              header: TransactionHeader(
+                  txId: 0xf3f2f1f0,
+                  flags: Uint8List.fromList([0xf4, 0xf5, 0xf6]),
+                  magicNumber: 0xf7,
+                  ordinal: 0xfffefdfcfbfaf9f8),
+              body: MixedFieldsBody(
+                  before: 0x4030201,
+                  firstUnion: UnionSize8Align4.withVariant(0xc0b0a09),
+                  middleStart: 0xb0a,
+                  middleEnd: 0x102030405060708,
+                  secondUnion: UnionSize8Align4.withVariant(0xc0b0a090),
+                  after: 0x8070605)),
+          kMixedFieldsMessage_Type,
+          Uint8List.fromList([
+            0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, //
+            0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, //
+            0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, //
+            0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x0a, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, //
+            0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, //
+            0x09, 0x0a, 0x0b, 0x0c, 0x00, 0x00, 0x00, 0x00, //
+            0x90, 0xa0, 0xb0, 0xc0, 0x00, 0x00, 0x00, 0x00, //
+          ]));
+
+      EncodeSuccessCase.run(
+          Encoders.v1,
+          'TableWithXUnion_v1',
+          StructOfTableWithXUnion(
+              value: TableWithXUnion(member: CompatXUnion.withS('AB'))),
+          kStructOfTableWithXUnion_Type,
+          Uint8List.fromList([
+            0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0xa8, 0xef, 0xf8, 0x5a, 0x00, 0x00, 0x00, 0x00, //
+            0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x41, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+          ]));
+
+      EncodeSuccessCase.run(
+          Encoders.v1,
           'UnionWithBoundString_v1',
           UnionWithBoundStringStruct(
               v: UnionWithBoundString.withBoundFiveStr('abcd')),
@@ -1455,6 +1999,31 @@
 
       DecodeSuccessCase.run(
           Decoders.v1,
+          'Sandwich1Case1WithHdr_v1',
+          Sandwich1Message(
+              header: TransactionHeader(
+                  txId: 0xf3f2f1f0,
+                  flags: Uint8List.fromList([0xf4, 0xf5, 0xf6]),
+                  magicNumber: 0xf7,
+                  ordinal: 0xfffefdfcfbfaf9f8),
+              body: Sandwich1(
+                  before: 0x4030201,
+                  theUnion: UnionSize8Align4.withVariant(0xc0b0a09),
+                  after: 0x8070605)),
+          kSandwich1Message_Type,
+          Uint8List.fromList([
+            0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, //
+            0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, //
+            0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, //
+            0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, //
+            0x09, 0x0a, 0x0b, 0x0c, 0x00, 0x00, 0x00, 0x00, //
+          ]));
+
+      DecodeSuccessCase.run(
+          Decoders.v1,
           'Sandwich1WithOptUnionPresent_v1',
           Sandwich1WithOptUnion(
               before: 0x4030201,
@@ -1575,6 +2144,67 @@
 
       DecodeSuccessCase.run(
           Decoders.v1,
+          'Sandwich4Case1WithHdr_v1',
+          Sandwich4Message(
+              header: TransactionHeader(
+                  txId: 0x0,
+                  flags: Uint8List.fromList([0x0, 0x0, 0x0]),
+                  magicNumber: 0x0,
+                  ordinal: 0x0),
+              body: Sandwich4(
+                  before: 0x4030201,
+                  theUnion: UnionSize36Align4.withVariant(Uint8List.fromList([
+                    0xa0,
+                    0xa1,
+                    0xa2,
+                    0xa3,
+                    0xa4,
+                    0xa5,
+                    0xa6,
+                    0xa7,
+                    0xa8,
+                    0xa9,
+                    0xaa,
+                    0xab,
+                    0xac,
+                    0xad,
+                    0xae,
+                    0xaf,
+                    0xb0,
+                    0xb1,
+                    0xb2,
+                    0xb3,
+                    0xb4,
+                    0xb5,
+                    0xb6,
+                    0xb7,
+                    0xb8,
+                    0xb9,
+                    0xba,
+                    0xbb,
+                    0xbc,
+                    0xbd,
+                    0xbe,
+                    0xbf
+                  ])),
+                  after: 0x8070605)),
+          kSandwich4Message_Type,
+          Uint8List.fromList([
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, //
+            0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, //
+            0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, //
+            0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, //
+            0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, //
+            0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, //
+          ]));
+
+      DecodeSuccessCase.run(
+          Decoders.v1,
           'Sandwich5Case1_v1',
           Sandwich5(
               before: 0x4030201,
@@ -1596,6 +2226,35 @@
 
       DecodeSuccessCase.run(
           Decoders.v1,
+          'Sandwich5Case1WithHdr_v1',
+          Sandwich5Message(
+              header: TransactionHeader(
+                  txId: 0xf3f2f1f0,
+                  flags: Uint8List.fromList([0xf4, 0xf5, 0xf6]),
+                  magicNumber: 0xf7,
+                  ordinal: 0xfffefdfcfbfaf9f8),
+              body: Sandwich5(
+                  before: 0x4030201,
+                  unionOfUnion: UnionOfUnion.withSize8align4(
+                      UnionSize8Align4.withVariant(0xc0b0a09)),
+                  after: 0x8070605)),
+          kSandwich5Message_Type,
+          Uint8List.fromList([
+            0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, //
+            0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, //
+            0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, //
+            0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, //
+            0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x09, 0x0a, 0x0b, 0x0c, 0x00, 0x00, 0x00, 0x00, //
+          ]));
+
+      DecodeSuccessCase.run(
+          Decoders.v1,
           'Sandwich5Case2_v1',
           Sandwich5(
               before: 0x4030201,
@@ -1619,6 +2278,37 @@
 
       DecodeSuccessCase.run(
           Decoders.v1,
+          'Sandwich5Case2WithHdr_v1',
+          Sandwich5Message(
+              header: TransactionHeader(
+                  txId: 0xf3f2f1f0,
+                  flags: Uint8List.fromList([0xf4, 0xf5, 0xf6]),
+                  magicNumber: 0xf7,
+                  ordinal: 0xfffefdfcfbfaf9f8),
+              body: Sandwich5(
+                  before: 0x4030201,
+                  unionOfUnion: UnionOfUnion.withSize24align8(
+                      UnionSize24Align8.withVariant(StructSize16Align8(
+                          f1: 0xa7a6a5a4a3a2a1a0, f2: 0xafaeadacabaaa9a8))),
+                  after: 0x8070605)),
+          kSandwich5Message_Type,
+          Uint8List.fromList([
+            0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, //
+            0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, //
+            0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, //
+            0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, //
+            0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, //
+            0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, //
+          ]));
+
+      DecodeSuccessCase.run(
+          Decoders.v1,
           'Sandwich6Case1_v1',
           Sandwich6(
               before: 0x4030201,
@@ -1839,6 +2529,37 @@
 
       DecodeSuccessCase.run(
           Decoders.v1,
+          'Sandwich7Case1WithHdr_v1',
+          Sandwich7Message(
+              header: TransactionHeader(
+                  txId: 0xf3f2f1f0,
+                  flags: Uint8List.fromList([0xf4, 0xf5, 0xf6]),
+                  magicNumber: 0xf7,
+                  ordinal: 0xfffefdfcfbfaf9f8),
+              body: Sandwich7(
+                  before: 0x14131211,
+                  optSandwich1: Sandwich1(
+                      before: 0x4030201,
+                      theUnion: UnionSize8Align4.withVariant(0xc0b0a09),
+                      after: 0x8070605),
+                  after: 0x24232221)),
+          kSandwich7Message_Type,
+          Uint8List.fromList([
+            0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, //
+            0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, //
+            0x11, 0x12, 0x13, 0x14, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x21, 0x22, 0x23, 0x24, 0x00, 0x00, 0x00, 0x00, //
+            0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, //
+            0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, //
+            0x09, 0x0a, 0x0b, 0x0c, 0x00, 0x00, 0x00, 0x00, //
+          ]));
+
+      DecodeSuccessCase.run(
+          Decoders.v1,
           'Sandwich7Case2_v1',
           Sandwich7(before: 0x14131211, after: 0x24232221),
           kSandwich7_Type,
@@ -1850,6 +2571,25 @@
 
       DecodeSuccessCase.run(
           Decoders.v1,
+          'Sandwich7Case2WithHdr_v1',
+          Sandwich7Message(
+              header: TransactionHeader(
+                  txId: 0xf3f2f1f0,
+                  flags: Uint8List.fromList([0xf4, 0xf5, 0xf6]),
+                  magicNumber: 0xf7,
+                  ordinal: 0xfffefdfcfbfaf9f8),
+              body: Sandwich7(before: 0x14131211, after: 0x24232221)),
+          kSandwich7Message_Type,
+          Uint8List.fromList([
+            0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, //
+            0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, //
+            0x11, 0x12, 0x13, 0x14, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x21, 0x22, 0x23, 0x24, 0x00, 0x00, 0x00, 0x00, //
+          ]));
+
+      DecodeSuccessCase.run(
+          Decoders.v1,
           'Regression1_v1',
           Regression1(f1: 0x1, f2: 0x2, f3: 0x3, f4: 0x4, f5: 0x5, f6: 0x6),
           kRegression1_Type,
@@ -1967,6 +2707,26 @@
 
       DecodeSuccessCase.run(
           Decoders.v1,
+          'Table_NoFields_v1',
+          StructTableNoFields(t: TableNoFields()),
+          kStruct_Table_NoFields_Type,
+          Uint8List.fromList([
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+          ]));
+
+      DecodeSuccessCase.run(
+          Decoders.v1,
+          'Table_TwoReservedFields_v1',
+          StructTableTwoReservedFields(t: TableTwoReservedFields()),
+          kStruct_Table_TwoReservedFields_Type,
+          Uint8List.fromList([
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+          ]));
+
+      DecodeSuccessCase.run(
+          Decoders.v1,
           'Table_StructWithReservedSandwich_v1',
           TableStructWithReservedSandwichStruct(
               table: TableStructWithReservedSandwich(
@@ -2430,6 +3190,206 @@
 
       DecodeSuccessCase.run(
           Decoders.v1,
+          'Regression5Enums_v1',
+          Regression5(
+              f1: 0x1,
+              f2: 0x3231302f,
+              f3: 0x8,
+              f4: 0x1615,
+              f5: 0x64636261605f5e5d,
+              f6: 0x8),
+          kRegression5_Type,
+          Uint8List.fromList([
+            0x01, 0x00, 0x00, 0x00, 0x2f, 0x30, 0x31, 0x32, //
+            0x08, 0x00, 0x15, 0x16, 0x00, 0x00, 0x00, 0x00, //
+            0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+          ]));
+
+      DecodeSuccessCase.run(
+          Decoders.v1,
+          'Regression6Bits_v1',
+          Regression6(
+              f1: 0x1,
+              f2: 0x3231302f,
+              f3: 0x8,
+              f4: 0x1615,
+              f5: 0x64636261605f5e5d,
+              f6: 0x8),
+          kRegression6_Type,
+          Uint8List.fromList([
+            0x01, 0x00, 0x00, 0x00, 0x2f, 0x30, 0x31, 0x32, //
+            0x08, 0x00, 0x15, 0x16, 0x00, 0x00, 0x00, 0x00, //
+            0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+          ]));
+
+      DecodeSuccessCase.run(
+          Decoders.v1,
+          'Regression7TableUnionXUnion_v1',
+          Regression7TableUnionXUnion(
+              value: TableOfUnionThenXUnionThenTableThenXUnionThenUnion(
+                  member: UnionOfXUnionThenTableThenXUnionThenUnion.withVariant(
+                      XUnionOfTableThenXUnionThenUnion.withVariant(
+                          TableOfXUnionThenUnion(
+                              member: XUnionOfUnion.withVariant(
+                                  UnionAtTheBottom.withTiny(0x8))))))),
+          kRegression7TableUnionXUnion_Type,
+          Uint8List.fromList([
+            0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x4e, 0x61, 0xb8, 0x22, 0x00, 0x00, 0x00, 0x00, //
+            0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x94, 0x05, 0x22, 0x38, 0x00, 0x00, 0x00, 0x00, //
+            0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+          ]));
+
+      DecodeSuccessCase.run(
+          Decoders.v1,
+          'Regression8OptUnionSize12Aligned4_v1',
+          Regression8OptUnionSize12Align4(
+              optUnion1: UnionSize12Align4.withVariant(
+                  Uint8List.fromList([0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6])),
+              optUnion3: UnionSize12Align4.withVariant(
+                  Uint8List.fromList([0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6]))),
+          kRegression8OptUnionSize12Align4_Type,
+          Uint8List.fromList([
+            0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0x00, 0x00, //
+            0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0x00, 0x00, //
+          ]));
+
+      DecodeSuccessCase.run(
+          Decoders.v1,
+          'Regression8VectorOfOptUnionSize12Aligned4_v1',
+          Regression8VectorOfOptUnionSize12Align4(value: [
+            null,
+            UnionSize12Align4.withVariant(
+                Uint8List.fromList([0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6])),
+            null,
+            UnionSize12Align4.withVariant(
+                Uint8List.fromList([0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6])),
+            null
+          ]),
+          kRegression8VectorOfOptUnionSize12Align4_Type,
+          Uint8List.fromList([
+            0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0x00, 0x00, //
+            0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0x00, 0x00, //
+          ]));
+
+      DecodeSuccessCase.run(
+          Decoders.v1,
+          'Regression8TableWithUnionSize12Aligned4_v1',
+          Regression8TableWithUnionSize12Align4(
+              value: TableWithUnionSize12Align4(
+                  before: 0xaa,
+                  member: UnionSize12Align4.withVariant(
+                      Uint8List.fromList([0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6])),
+                  after: 0xbb)),
+          kRegression8TableWithUnionSize12Align4_Type,
+          Uint8List.fromList([
+            0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0x00, 0x00, //
+            0xbb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+          ]));
+
+      DecodeSuccessCase.run(
+          Decoders.v1,
+          'Regression9Response_v1',
+          Regression9Message(
+              header: TransactionHeader(
+                  txId: 0x1,
+                  flags: Uint8List.fromList([0x1, 0x0, 0x0]),
+                  magicNumber: 0x1,
+                  ordinal: 0x56cbc96900000000),
+              body: Regression9Result.withOk(Regression9Value(
+                  u: StringBoolUnion.withS('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'),
+                  nullableU: StringBoolUnion.withB(false)))),
+          kRegression9Message_Type,
+          Uint8List.fromList([
+            0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, //
+            0x00, 0x00, 0x00, 0x00, 0x69, 0xc9, 0xcb, 0x56, //
+            0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, //
+            0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, //
+            0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, //
+            0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+          ]));
+
+      DecodeSuccessCase.run(
+          Decoders.v1,
           'Sandwich4Align8_v1',
           Sandwich4Align8(
               sandwich4: Sandwich4(
@@ -2644,7 +3604,36 @@
 
       DecodeSuccessCase.run(
           Decoders.v1,
-          'CreateComponentRequest_v1',
+          'StringUnionStructWrapperResponse_v1',
+          StringUnionStructWrapperResponse(
+              header: TransactionHeader(
+                  txId: 0x0,
+                  flags: Uint8List.fromList([0x1, 0x0, 0x0]),
+                  magicNumber: 0x1,
+                  ordinal: 0x32a0322500000000),
+              body: StringUnionStructWrapper(
+                  sus: StringUnionStruct(
+                      u: StringBoolUnion.withS('hello'),
+                      nullableU: StringBoolUnion.withB(true)))),
+          kStringUnionStructWrapperResponse_Type,
+          Uint8List.fromList([
+            0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, //
+            0x00, 0x00, 0x00, 0x00, 0x25, 0x32, 0xa0, 0x32, //
+            0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00, 0x00, 0x00, //
+            0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+          ]));
+
+      DecodeSuccessCase.run(
+          Decoders.v1,
+          'RegressionNoUnionLauncherCreateComponentRequest_v1',
           CreateComponentRequest(
               launchInfo: LaunchInfo(
                   url:
@@ -2684,6 +3673,105 @@
 
       DecodeSuccessCase.run(
           Decoders.v1,
+          'CompatTable_v1',
+          CompatTable(
+              value: CompatTableValue(
+                  unionMember: CompatUnion.withB(true),
+                  arrayMember:
+                      Uint32List.fromList([0x5129679d, 0x9491b48e, 0x93d21b51]),
+                  tableMember: CompatTableString(s: 'AB'),
+                  xunionMember: CompatXUnion.withS('CD')),
+              empty: ''),
+          kCompatTable_Type,
+          Uint8List.fromList([
+            0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x9d, 0x67, 0x29, 0x51, 0x8e, 0xb4, 0x91, 0x94, //
+            0x51, 0x1b, 0xd2, 0x93, 0x00, 0x00, 0x00, 0x00, //
+            0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x41, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xa8, 0xef, 0xf8, 0x5a, 0x00, 0x00, 0x00, 0x00, //
+            0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x43, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+          ]));
+
+      DecodeSuccessCase.run(
+          Decoders.v1,
+          'MixedFields_v1',
+          MixedFieldsMessage(
+              header: TransactionHeader(
+                  txId: 0xf3f2f1f0,
+                  flags: Uint8List.fromList([0xf4, 0xf5, 0xf6]),
+                  magicNumber: 0xf7,
+                  ordinal: 0xfffefdfcfbfaf9f8),
+              body: MixedFieldsBody(
+                  before: 0x4030201,
+                  firstUnion: UnionSize8Align4.withVariant(0xc0b0a09),
+                  middleStart: 0xb0a,
+                  middleEnd: 0x102030405060708,
+                  secondUnion: UnionSize8Align4.withVariant(0xc0b0a090),
+                  after: 0x8070605)),
+          kMixedFieldsMessage_Type,
+          Uint8List.fromList([
+            0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, //
+            0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, //
+            0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, //
+            0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x0a, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, //
+            0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, //
+            0x09, 0x0a, 0x0b, 0x0c, 0x00, 0x00, 0x00, 0x00, //
+            0x90, 0xa0, 0xb0, 0xc0, 0x00, 0x00, 0x00, 0x00, //
+          ]));
+
+      DecodeSuccessCase.run(
+          Decoders.v1,
+          'TableWithXUnion_v1',
+          StructOfTableWithXUnion(
+              value: TableWithXUnion(member: CompatXUnion.withS('AB'))),
+          kStructOfTableWithXUnion_Type,
+          Uint8List.fromList([
+            0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0xa8, 0xef, 0xf8, 0x5a, 0x00, 0x00, 0x00, 0x00, //
+            0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //
+            0x41, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
+          ]));
+
+      DecodeSuccessCase.run(
+          Decoders.v1,
           'UnionWithBoundString_v1',
           UnionWithBoundStringStruct(
               v: UnionWithBoundString.withBoundFiveStr('abcd')),
diff --git a/bin/fidl_bindings_test/test/test/conformance_test_types.dart b/bin/fidl_bindings_test/test/test/conformance_test_types.dart
index d2e97fc..43929c5 100644
--- a/bin/fidl_bindings_test/test/test/conformance_test_types.dart
+++ b/bin/fidl_bindings_test/test/test/conformance_test_types.dart
@@ -41,6 +41,186 @@
 // ignore_for_file: comment_references
 // ignore_for_file: avoid_unused_constructor_parameters
 
+class EnumUint32 extends $fidl.Enum {
+  factory EnumUint32(int _v) {
+    switch (_v) {
+      case 0x3231302f:
+        return member;
+      default:
+        return null;
+    }
+  }
+  static const EnumUint32 member = EnumUint32._(0x3231302f);
+
+  const EnumUint32._(this.$value);
+
+  @override
+  final int $value;
+
+  static const Map<String, EnumUint32> $valuesMap = {
+    r'member': member,
+  };
+
+  static const List<EnumUint32> $values = [
+    member,
+  ];
+
+  // TODO: remove, see: FIDL-587
+  static const List<EnumUint32> values = EnumUint32.$values;
+
+  static EnumUint32 $valueOf(String name) => $valuesMap[name];
+
+  @override
+  String toString() {
+    switch ($value) {
+      case 0x3231302f:
+        return r'EnumUint32.member';
+      default:
+        return null;
+    }
+  }
+
+  static EnumUint32 _ctor(int v) => EnumUint32(v);
+}
+
+const $fidl.EnumType<EnumUint32> kEnumUint32_Type = $fidl.EnumType<EnumUint32>(
+    type: $fidl.Uint32Type(), ctor: EnumUint32._ctor);
+
+class EnumUint8 extends $fidl.Enum {
+  factory EnumUint8(int _v) {
+    switch (_v) {
+      case 0x8:
+        return member;
+      default:
+        return null;
+    }
+  }
+  static const EnumUint8 member = EnumUint8._(0x8);
+
+  const EnumUint8._(this.$value);
+
+  @override
+  final int $value;
+
+  static const Map<String, EnumUint8> $valuesMap = {
+    r'member': member,
+  };
+
+  static const List<EnumUint8> $values = [
+    member,
+  ];
+
+  // TODO: remove, see: FIDL-587
+  static const List<EnumUint8> values = EnumUint8.$values;
+
+  static EnumUint8 $valueOf(String name) => $valuesMap[name];
+
+  @override
+  String toString() {
+    switch ($value) {
+      case 0x8:
+        return r'EnumUint8.member';
+      default:
+        return null;
+    }
+  }
+
+  static EnumUint8 _ctor(int v) => EnumUint8(v);
+}
+
+const $fidl.EnumType<EnumUint8> kEnumUint8_Type =
+    $fidl.EnumType<EnumUint8>(type: $fidl.Uint8Type(), ctor: EnumUint8._ctor);
+
+class BitsUint32 extends $fidl.Bits {
+  static const BitsUint32 memberLow1 = BitsUint32._(0x1);
+  static const BitsUint32 memberLow2 = BitsUint32._(0x2);
+  static const BitsUint32 memberHig1 = BitsUint32._(0x10000000);
+  static const BitsUint32 memberHig2 = BitsUint32._(0x20000000);
+  static const BitsUint32 $none = BitsUint32._(0);
+
+  const BitsUint32._(this.$value);
+
+  BitsUint32 operator |(BitsUint32 other) {
+    return BitsUint32._($value | other.$value);
+  }
+
+  BitsUint32 operator &(BitsUint32 other) {
+    return BitsUint32._($value & other.$value);
+  }
+
+  @override
+  final int $value;
+
+  @override
+  String toString() {
+    if ($value == null) {
+      return null;
+    }
+    List<String> parts = [];
+    if ($value & 0x1 != 0) {
+      parts.add(r'BitsUint32.memberLow1');
+    }
+    if ($value & 0x2 != 0) {
+      parts.add(r'BitsUint32.memberLow2');
+    }
+    if ($value & 0x10000000 != 0) {
+      parts.add(r'BitsUint32.memberHig1');
+    }
+    if ($value & 0x20000000 != 0) {
+      parts.add(r'BitsUint32.memberHig2');
+    }
+    if (parts.isEmpty) {
+      return r'BitsUint32.$none';
+    } else {
+      return parts.join(" | ");
+    }
+  }
+
+  static BitsUint32 _ctor(int v) => BitsUint32._(v);
+}
+
+const $fidl.BitsType<BitsUint32> kBitsUint32_Type = $fidl.BitsType<BitsUint32>(
+    type: $fidl.Uint32Type(), ctor: BitsUint32._ctor);
+
+class BitsUint8 extends $fidl.Bits {
+  static const BitsUint8 member = BitsUint8._(0x8);
+  static const BitsUint8 $none = BitsUint8._(0);
+
+  const BitsUint8._(this.$value);
+
+  BitsUint8 operator |(BitsUint8 other) {
+    return BitsUint8._($value | other.$value);
+  }
+
+  BitsUint8 operator &(BitsUint8 other) {
+    return BitsUint8._($value & other.$value);
+  }
+
+  @override
+  final int $value;
+
+  @override
+  String toString() {
+    if ($value == null) {
+      return null;
+    }
+    List<String> parts = [];
+    if ($value & 0x8 != 0) {
+      parts.add(r'BitsUint8.member');
+    }
+    if (parts.isEmpty) {
+      return r'BitsUint8.$none';
+    } else {
+      return parts.join(" | ");
+    }
+  }
+
+  static BitsUint8 _ctor(int v) => BitsUint8._(v);
+}
+
+const $fidl.BitsType<BitsUint8> kBitsUint8_Type =
+    $fidl.BitsType<BitsUint8>(type: $fidl.Uint8Type(), ctor: BitsUint8._ctor);
+
 enum IpAddressConfigTag {
   paddingSize24Align4, // 0x1
   dhcp, // 0x2
@@ -133,130 +313,6 @@
   flexible: false,
 );
 
-enum SimpleUnionTag {
-  i32, // 0x1
-  i64, // 0x2
-  s, // 0x3
-  str, // 0x4
-}
-
-const Map<int, SimpleUnionTag> _SimpleUnionTag_map = {
-  1: SimpleUnionTag.i32,
-  2: SimpleUnionTag.i64,
-  3: SimpleUnionTag.s,
-  4: SimpleUnionTag.str,
-};
-
-class SimpleUnion extends $fidl.XUnion {
-  const SimpleUnion.withI32(int value)
-      : _ordinal = 1,
-        _data = value;
-
-  const SimpleUnion.withI64(int value)
-      : _ordinal = 2,
-        _data = value;
-
-  const SimpleUnion.withS(Int64Struct value)
-      : _ordinal = 3,
-        _data = value;
-
-  const SimpleUnion.withStr(String value)
-      : _ordinal = 4,
-        _data = value;
-
-  SimpleUnion._(int ordinal, Object data)
-      : _ordinal = ordinal,
-        _data = data;
-
-  final int _ordinal;
-  final _data;
-
-  SimpleUnionTag get $tag => _SimpleUnionTag_map[_ordinal];
-
-  int get i32 {
-    if (_ordinal != 1) {
-      return null;
-    }
-    return _data;
-  }
-
-  int get i64 {
-    if (_ordinal != 2) {
-      return null;
-    }
-    return _data;
-  }
-
-  Int64Struct get s {
-    if (_ordinal != 3) {
-      return null;
-    }
-    return _data;
-  }
-
-  String get str {
-    if (_ordinal != 4) {
-      return null;
-    }
-    return _data;
-  }
-
-  @override
-  String toString() {
-    switch (_ordinal) {
-      case 1:
-        return 'SimpleUnion.i32($i32)';
-      case 2:
-        return 'SimpleUnion.i64($i64)';
-      case 3:
-        return 'SimpleUnion.s($s)';
-      case 4:
-        return 'SimpleUnion.str($str)';
-      default:
-        return null;
-    }
-  }
-
-  @override
-  int get $ordinal => _ordinal;
-
-  @override
-  Object get $data => _data;
-
-  static SimpleUnion _ctor(int ordinal, Object data) {
-    return SimpleUnion._(ordinal, data);
-  }
-}
-
-// See FIDL-308:
-// ignore: recursive_compile_time_constant
-const $fidl.XUnionType<SimpleUnion> kSimpleUnion_Type =
-    $fidl.XUnionType<SimpleUnion>(
-  members: <int, $fidl.FidlType>{
-    1: $fidl.Int32Type(),
-    2: $fidl.Int64Type(),
-    3: kInt64Struct_Type,
-    4: $fidl.StringType(maybeElementCount: null, nullable: false),
-  },
-  ctor: SimpleUnion._ctor,
-  nullable: false,
-  flexible: false,
-);
-// See FIDL-308:
-// ignore: recursive_compile_time_constant
-const $fidl.XUnionType<SimpleUnion> kSimpleUnion_OptType =
-    $fidl.XUnionType<SimpleUnion>(
-  members: <int, $fidl.FidlType>{
-    1: $fidl.Int32Type(),
-    2: $fidl.Int64Type(),
-    3: kInt64Struct_Type,
-    4: $fidl.StringType(maybeElementCount: null, nullable: false),
-  },
-  ctor: SimpleUnion._ctor,
-  nullable: true,
-  flexible: false,
-);
-
 enum UnionWithBoundStringTag {
   boundFiveStr, // 0x1
 }
@@ -1652,6 +1708,483 @@
   flexible: false,
 );
 
+enum UnionAtTheBottomTag {
+  unused1, // 0x1
+  unused2, // 0x2
+  tiny, // 0x3
+}
+
+const Map<int, UnionAtTheBottomTag> _UnionAtTheBottomTag_map = {
+  1: UnionAtTheBottomTag.unused1,
+  2: UnionAtTheBottomTag.unused2,
+  3: UnionAtTheBottomTag.tiny,
+};
+
+class UnionAtTheBottom extends $fidl.XUnion {
+  const UnionAtTheBottom.withUnused1(int value)
+      : _ordinal = 1,
+        _data = value;
+
+  const UnionAtTheBottom.withUnused2(int value)
+      : _ordinal = 2,
+        _data = value;
+
+  const UnionAtTheBottom.withTiny(int value)
+      : _ordinal = 3,
+        _data = value;
+
+  UnionAtTheBottom._(int ordinal, Object data)
+      : _ordinal = ordinal,
+        _data = data;
+
+  final int _ordinal;
+  final _data;
+
+  UnionAtTheBottomTag get $tag => _UnionAtTheBottomTag_map[_ordinal];
+
+  int get unused1 {
+    if (_ordinal != 1) {
+      return null;
+    }
+    return _data;
+  }
+
+  int get unused2 {
+    if (_ordinal != 2) {
+      return null;
+    }
+    return _data;
+  }
+
+  int get tiny {
+    if (_ordinal != 3) {
+      return null;
+    }
+    return _data;
+  }
+
+  @override
+  String toString() {
+    switch (_ordinal) {
+      case 1:
+        return 'UnionAtTheBottom.unused1($unused1)';
+      case 2:
+        return 'UnionAtTheBottom.unused2($unused2)';
+      case 3:
+        return 'UnionAtTheBottom.tiny($tiny)';
+      default:
+        return null;
+    }
+  }
+
+  @override
+  int get $ordinal => _ordinal;
+
+  @override
+  Object get $data => _data;
+
+  static UnionAtTheBottom _ctor(int ordinal, Object data) {
+    return UnionAtTheBottom._(ordinal, data);
+  }
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.XUnionType<UnionAtTheBottom> kUnionAtTheBottom_Type =
+    $fidl.XUnionType<UnionAtTheBottom>(
+  members: <int, $fidl.FidlType>{
+    1: $fidl.Uint8Type(),
+    2: $fidl.Uint8Type(),
+    3: $fidl.Uint8Type(),
+  },
+  ctor: UnionAtTheBottom._ctor,
+  nullable: false,
+  flexible: false,
+);
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.XUnionType<UnionAtTheBottom> kUnionAtTheBottom_OptType =
+    $fidl.XUnionType<UnionAtTheBottom>(
+  members: <int, $fidl.FidlType>{
+    1: $fidl.Uint8Type(),
+    2: $fidl.Uint8Type(),
+    3: $fidl.Uint8Type(),
+  },
+  ctor: UnionAtTheBottom._ctor,
+  nullable: true,
+  flexible: false,
+);
+
+enum UnionOfXUnionThenTableThenXUnionThenUnionTag {
+  unused1, // 0x1
+  variant, // 0x3
+}
+
+const Map<int, UnionOfXUnionThenTableThenXUnionThenUnionTag>
+    _UnionOfXUnionThenTableThenXUnionThenUnionTag_map = {
+  1: UnionOfXUnionThenTableThenXUnionThenUnionTag.unused1,
+  3: UnionOfXUnionThenTableThenXUnionThenUnionTag.variant,
+};
+
+class UnionOfXUnionThenTableThenXUnionThenUnion extends $fidl.XUnion {
+  const UnionOfXUnionThenTableThenXUnionThenUnion.withUnused1(int value)
+      : _ordinal = 1,
+        _data = value;
+
+  const UnionOfXUnionThenTableThenXUnionThenUnion.withVariant(
+      XUnionOfTableThenXUnionThenUnion value)
+      : _ordinal = 3,
+        _data = value;
+
+  UnionOfXUnionThenTableThenXUnionThenUnion._(int ordinal, Object data)
+      : _ordinal = ordinal,
+        _data = data;
+
+  final int _ordinal;
+  final _data;
+
+  UnionOfXUnionThenTableThenXUnionThenUnionTag get $tag =>
+      _UnionOfXUnionThenTableThenXUnionThenUnionTag_map[_ordinal];
+
+  int get unused1 {
+    if (_ordinal != 1) {
+      return null;
+    }
+    return _data;
+  }
+
+  XUnionOfTableThenXUnionThenUnion get variant {
+    if (_ordinal != 3) {
+      return null;
+    }
+    return _data;
+  }
+
+  @override
+  String toString() {
+    switch (_ordinal) {
+      case 1:
+        return 'UnionOfXUnionThenTableThenXUnionThenUnion.unused1($unused1)';
+      case 3:
+        return 'UnionOfXUnionThenTableThenXUnionThenUnion.variant($variant)';
+      default:
+        return null;
+    }
+  }
+
+  @override
+  int get $ordinal => _ordinal;
+
+  @override
+  Object get $data => _data;
+
+  static UnionOfXUnionThenTableThenXUnionThenUnion _ctor(
+      int ordinal, Object data) {
+    return UnionOfXUnionThenTableThenXUnionThenUnion._(ordinal, data);
+  }
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.XUnionType<UnionOfXUnionThenTableThenXUnionThenUnion>
+    kUnionOfXUnionThenTableThenXUnionThenUnion_Type =
+    $fidl.XUnionType<UnionOfXUnionThenTableThenXUnionThenUnion>(
+  members: <int, $fidl.FidlType>{
+    1: $fidl.Uint8Type(),
+    3: kXUnionOfTableThenXUnionThenUnion_Type,
+  },
+  ctor: UnionOfXUnionThenTableThenXUnionThenUnion._ctor,
+  nullable: false,
+  flexible: false,
+);
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.XUnionType<UnionOfXUnionThenTableThenXUnionThenUnion>
+    kUnionOfXUnionThenTableThenXUnionThenUnion_OptType =
+    $fidl.XUnionType<UnionOfXUnionThenTableThenXUnionThenUnion>(
+  members: <int, $fidl.FidlType>{
+    1: $fidl.Uint8Type(),
+    3: kXUnionOfTableThenXUnionThenUnion_Type,
+  },
+  ctor: UnionOfXUnionThenTableThenXUnionThenUnion._ctor,
+  nullable: true,
+  flexible: false,
+);
+
+enum StringBoolUnionTag {
+  s, // 0x1
+  b, // 0x2
+}
+
+const Map<int, StringBoolUnionTag> _StringBoolUnionTag_map = {
+  1: StringBoolUnionTag.s,
+  2: StringBoolUnionTag.b,
+};
+
+class StringBoolUnion extends $fidl.XUnion {
+  const StringBoolUnion.withS(String value)
+      : _ordinal = 1,
+        _data = value;
+
+  const StringBoolUnion.withB(bool value)
+      : _ordinal = 2,
+        _data = value;
+
+  StringBoolUnion._(int ordinal, Object data)
+      : _ordinal = ordinal,
+        _data = data;
+
+  final int _ordinal;
+  final _data;
+
+  StringBoolUnionTag get $tag => _StringBoolUnionTag_map[_ordinal];
+
+  String get s {
+    if (_ordinal != 1) {
+      return null;
+    }
+    return _data;
+  }
+
+  bool get b {
+    if (_ordinal != 2) {
+      return null;
+    }
+    return _data;
+  }
+
+  @override
+  String toString() {
+    switch (_ordinal) {
+      case 1:
+        return 'StringBoolUnion.s($s)';
+      case 2:
+        return 'StringBoolUnion.b($b)';
+      default:
+        return null;
+    }
+  }
+
+  @override
+  int get $ordinal => _ordinal;
+
+  @override
+  Object get $data => _data;
+
+  static StringBoolUnion _ctor(int ordinal, Object data) {
+    return StringBoolUnion._(ordinal, data);
+  }
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.XUnionType<StringBoolUnion> kStringBoolUnion_Type =
+    $fidl.XUnionType<StringBoolUnion>(
+  members: <int, $fidl.FidlType>{
+    1: $fidl.StringType(maybeElementCount: null, nullable: false),
+    2: $fidl.BoolType(),
+  },
+  ctor: StringBoolUnion._ctor,
+  nullable: false,
+  flexible: false,
+);
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.XUnionType<StringBoolUnion> kStringBoolUnion_OptType =
+    $fidl.XUnionType<StringBoolUnion>(
+  members: <int, $fidl.FidlType>{
+    1: $fidl.StringType(maybeElementCount: null, nullable: false),
+    2: $fidl.BoolType(),
+  },
+  ctor: StringBoolUnion._ctor,
+  nullable: true,
+  flexible: false,
+);
+
+enum Regression9ResultTag {
+  ok, // 0x1
+  error, // 0x2
+}
+
+const Map<int, Regression9ResultTag> _Regression9ResultTag_map = {
+  1: Regression9ResultTag.ok,
+  2: Regression9ResultTag.error,
+};
+
+class Regression9Result extends $fidl.XUnion {
+  const Regression9Result.withOk(Regression9Value value)
+      : _ordinal = 1,
+        _data = value;
+
+  const Regression9Result.withError(int value)
+      : _ordinal = 2,
+        _data = value;
+
+  Regression9Result._(int ordinal, Object data)
+      : _ordinal = ordinal,
+        _data = data;
+
+  final int _ordinal;
+  final _data;
+
+  Regression9ResultTag get $tag => _Regression9ResultTag_map[_ordinal];
+
+  Regression9Value get ok {
+    if (_ordinal != 1) {
+      return null;
+    }
+    return _data;
+  }
+
+  int get error {
+    if (_ordinal != 2) {
+      return null;
+    }
+    return _data;
+  }
+
+  @override
+  String toString() {
+    switch (_ordinal) {
+      case 1:
+        return 'Regression9Result.ok($ok)';
+      case 2:
+        return 'Regression9Result.error($error)';
+      default:
+        return null;
+    }
+  }
+
+  @override
+  int get $ordinal => _ordinal;
+
+  @override
+  Object get $data => _data;
+
+  static Regression9Result _ctor(int ordinal, Object data) {
+    return Regression9Result._(ordinal, data);
+  }
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.XUnionType<Regression9Result> kRegression9Result_Type =
+    $fidl.XUnionType<Regression9Result>(
+  members: <int, $fidl.FidlType>{
+    1: kRegression9Value_Type,
+    2: $fidl.Uint32Type(),
+  },
+  ctor: Regression9Result._ctor,
+  nullable: false,
+  flexible: false,
+);
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.XUnionType<Regression9Result> kRegression9Result_OptType =
+    $fidl.XUnionType<Regression9Result>(
+  members: <int, $fidl.FidlType>{
+    1: kRegression9Value_Type,
+    2: $fidl.Uint32Type(),
+  },
+  ctor: Regression9Result._ctor,
+  nullable: true,
+  flexible: false,
+);
+
+enum UnionWithRegression10TableTag {
+  unused, // 0x1
+  atV2, // 0x3
+}
+
+const Map<int, UnionWithRegression10TableTag>
+    _UnionWithRegression10TableTag_map = {
+  1: UnionWithRegression10TableTag.unused,
+  3: UnionWithRegression10TableTag.atV2,
+};
+
+class UnionWithRegression10Table extends $fidl.XUnion {
+  const UnionWithRegression10Table.withUnused(int value)
+      : _ordinal = 1,
+        _data = value;
+
+  const UnionWithRegression10Table.withAtV2(Regression10TableV2 value)
+      : _ordinal = 3,
+        _data = value;
+
+  UnionWithRegression10Table._(int ordinal, Object data)
+      : _ordinal = ordinal,
+        _data = data;
+
+  final int _ordinal;
+  final _data;
+
+  UnionWithRegression10TableTag get $tag =>
+      _UnionWithRegression10TableTag_map[_ordinal];
+
+  int get unused {
+    if (_ordinal != 1) {
+      return null;
+    }
+    return _data;
+  }
+
+  Regression10TableV2 get atV2 {
+    if (_ordinal != 3) {
+      return null;
+    }
+    return _data;
+  }
+
+  @override
+  String toString() {
+    switch (_ordinal) {
+      case 1:
+        return 'UnionWithRegression10Table.unused($unused)';
+      case 3:
+        return 'UnionWithRegression10Table.atV2($atV2)';
+      default:
+        return null;
+    }
+  }
+
+  @override
+  int get $ordinal => _ordinal;
+
+  @override
+  Object get $data => _data;
+
+  static UnionWithRegression10Table _ctor(int ordinal, Object data) {
+    return UnionWithRegression10Table._(ordinal, data);
+  }
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.XUnionType<UnionWithRegression10Table>
+    kUnionWithRegression10Table_Type =
+    $fidl.XUnionType<UnionWithRegression10Table>(
+  members: <int, $fidl.FidlType>{
+    1: $fidl.Uint8Type(),
+    3: kRegression10TableV2_Type,
+  },
+  ctor: UnionWithRegression10Table._ctor,
+  nullable: false,
+  flexible: false,
+);
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.XUnionType<UnionWithRegression10Table>
+    kUnionWithRegression10Table_OptType =
+    $fidl.XUnionType<UnionWithRegression10Table>(
+  members: <int, $fidl.FidlType>{
+    1: $fidl.Uint8Type(),
+    3: kRegression10TableV2_Type,
+  },
+  ctor: UnionWithRegression10Table._ctor,
+  nullable: true,
+  flexible: false,
+);
+
 enum UnionWithVectorOfVectorsTag {
   v, // 0x1
 }
@@ -1741,60 +2274,43 @@
   flexible: false,
 );
 
-enum SampleXUnionTag {
-  $unknown,
-  u, // 0x389c56b2
-  su, // 0x792f4f1d
-  st, // 0x21de8d5
+enum CompatUnionTag {
+  s, // 0x1
+  b, // 0x2
 }
 
-const Map<int, SampleXUnionTag> _SampleXUnionTag_map = {
-  949769906: SampleXUnionTag.u,
-  2033143581: SampleXUnionTag.su,
-  35514581: SampleXUnionTag.st,
+const Map<int, CompatUnionTag> _CompatUnionTag_map = {
+  1: CompatUnionTag.s,
+  2: CompatUnionTag.b,
 };
 
-class SampleXUnion extends $fidl.XUnion {
-  const SampleXUnion.withU(int value)
-      : _ordinal = 949769906,
+class CompatUnion extends $fidl.XUnion {
+  const CompatUnion.withS(String value)
+      : _ordinal = 1,
         _data = value;
 
-  const SampleXUnion.withSu(SimpleUnion value)
-      : _ordinal = 2033143581,
+  const CompatUnion.withB(bool value)
+      : _ordinal = 2,
         _data = value;
 
-  const SampleXUnion.withSt(SimpleTable value)
-      : _ordinal = 35514581,
-        _data = value;
-
-  SampleXUnion._(int ordinal, Object data)
+  CompatUnion._(int ordinal, Object data)
       : _ordinal = ordinal,
         _data = data;
 
   final int _ordinal;
   final _data;
 
-  SampleXUnionTag get $tag {
-    final SampleXUnionTag $rawtag = _SampleXUnionTag_map[_ordinal];
-    return $rawtag == null ? SampleXUnionTag.$unknown : $rawtag;
-  }
+  CompatUnionTag get $tag => _CompatUnionTag_map[_ordinal];
 
-  int get u {
-    if (_ordinal != 949769906) {
+  String get s {
+    if (_ordinal != 1) {
       return null;
     }
     return _data;
   }
 
-  SimpleUnion get su {
-    if (_ordinal != 2033143581) {
-      return null;
-    }
-    return _data;
-  }
-
-  SimpleTable get st {
-    if (_ordinal != 35514581) {
+  bool get b {
+    if (_ordinal != 2) {
       return null;
     }
     return _data;
@@ -1803,119 +2319,10 @@
   @override
   String toString() {
     switch (_ordinal) {
-      case 949769906:
-        return 'SampleXUnion.u($u)';
-      case 2033143581:
-        return 'SampleXUnion.su($su)';
-      case 35514581:
-        return 'SampleXUnion.st($st)';
-      default:
-        return 'SampleXUnion.<UNKNOWN>';
-    }
-  }
-
-  @override
-  int get $ordinal => _ordinal;
-
-  @override
-  Object get $data => _data;
-
-  static SampleXUnion _ctor(int ordinal, Object data) {
-    return SampleXUnion._(ordinal, data);
-  }
-}
-
-// See FIDL-308:
-// ignore: recursive_compile_time_constant
-const $fidl.XUnionType<SampleXUnion> kSampleXUnion_Type =
-    $fidl.XUnionType<SampleXUnion>(
-  members: <int, $fidl.FidlType>{
-    949769906: $fidl.Uint32Type(),
-    2033143581: kSimpleUnion_Type,
-    35514581: kSimpleTable_Type,
-  },
-  ctor: SampleXUnion._ctor,
-  nullable: false,
-  flexible: true,
-);
-// See FIDL-308:
-// ignore: recursive_compile_time_constant
-const $fidl.XUnionType<SampleXUnion> kSampleXUnion_OptType =
-    $fidl.XUnionType<SampleXUnion>(
-  members: <int, $fidl.FidlType>{
-    949769906: $fidl.Uint32Type(),
-    2033143581: kSimpleUnion_Type,
-    35514581: kSimpleTable_Type,
-  },
-  ctor: SampleXUnion._ctor,
-  nullable: true,
-  flexible: true,
-);
-
-enum SampleStrictXUnionTag {
-  u, // 0x8e2ea72
-  su, // 0x27f3a73b
-  st, // 0x372354ef
-}
-
-const Map<int, SampleStrictXUnionTag> _SampleStrictXUnionTag_map = {
-  149088882: SampleStrictXUnionTag.u,
-  670279483: SampleStrictXUnionTag.su,
-  925062383: SampleStrictXUnionTag.st,
-};
-
-class SampleStrictXUnion extends $fidl.XUnion {
-  const SampleStrictXUnion.withU(int value)
-      : _ordinal = 149088882,
-        _data = value;
-
-  const SampleStrictXUnion.withSu(SimpleUnion value)
-      : _ordinal = 670279483,
-        _data = value;
-
-  const SampleStrictXUnion.withSt(SimpleTable value)
-      : _ordinal = 925062383,
-        _data = value;
-
-  SampleStrictXUnion._(int ordinal, Object data)
-      : _ordinal = ordinal,
-        _data = data;
-
-  final int _ordinal;
-  final _data;
-
-  SampleStrictXUnionTag get $tag => _SampleStrictXUnionTag_map[_ordinal];
-
-  int get u {
-    if (_ordinal != 149088882) {
-      return null;
-    }
-    return _data;
-  }
-
-  SimpleUnion get su {
-    if (_ordinal != 670279483) {
-      return null;
-    }
-    return _data;
-  }
-
-  SimpleTable get st {
-    if (_ordinal != 925062383) {
-      return null;
-    }
-    return _data;
-  }
-
-  @override
-  String toString() {
-    switch (_ordinal) {
-      case 149088882:
-        return 'SampleStrictXUnion.u($u)';
-      case 670279483:
-        return 'SampleStrictXUnion.su($su)';
-      case 925062383:
-        return 'SampleStrictXUnion.st($st)';
+      case 1:
+        return 'CompatUnion.s($s)';
+      case 2:
+        return 'CompatUnion.b($b)';
       default:
         return null;
     }
@@ -1927,34 +2334,156 @@
   @override
   Object get $data => _data;
 
-  static SampleStrictXUnion _ctor(int ordinal, Object data) {
-    return SampleStrictXUnion._(ordinal, data);
+  static CompatUnion _ctor(int ordinal, Object data) {
+    return CompatUnion._(ordinal, data);
   }
 }
 
 // See FIDL-308:
 // ignore: recursive_compile_time_constant
-const $fidl.XUnionType<SampleStrictXUnion> kSampleStrictXUnion_Type =
-    $fidl.XUnionType<SampleStrictXUnion>(
+const $fidl.XUnionType<CompatUnion> kCompatUnion_Type =
+    $fidl.XUnionType<CompatUnion>(
   members: <int, $fidl.FidlType>{
-    149088882: $fidl.Uint32Type(),
-    670279483: kSimpleUnion_Type,
-    925062383: kSimpleTable_Type,
+    1: $fidl.StringType(maybeElementCount: null, nullable: false),
+    2: $fidl.BoolType(),
   },
-  ctor: SampleStrictXUnion._ctor,
+  ctor: CompatUnion._ctor,
   nullable: false,
   flexible: false,
 );
 // See FIDL-308:
 // ignore: recursive_compile_time_constant
-const $fidl.XUnionType<SampleStrictXUnion> kSampleStrictXUnion_OptType =
-    $fidl.XUnionType<SampleStrictXUnion>(
+const $fidl.XUnionType<CompatUnion> kCompatUnion_OptType =
+    $fidl.XUnionType<CompatUnion>(
   members: <int, $fidl.FidlType>{
-    149088882: $fidl.Uint32Type(),
-    670279483: kSimpleUnion_Type,
-    925062383: kSimpleTable_Type,
+    1: $fidl.StringType(maybeElementCount: null, nullable: false),
+    2: $fidl.BoolType(),
   },
-  ctor: SampleStrictXUnion._ctor,
+  ctor: CompatUnion._ctor,
+  nullable: true,
+  flexible: false,
+);
+
+enum SimpleUnionTag {
+  i32, // 0x1
+  i64, // 0x2
+  s, // 0x3
+  str, // 0x4
+}
+
+const Map<int, SimpleUnionTag> _SimpleUnionTag_map = {
+  1: SimpleUnionTag.i32,
+  2: SimpleUnionTag.i64,
+  3: SimpleUnionTag.s,
+  4: SimpleUnionTag.str,
+};
+
+class SimpleUnion extends $fidl.XUnion {
+  const SimpleUnion.withI32(int value)
+      : _ordinal = 1,
+        _data = value;
+
+  const SimpleUnion.withI64(int value)
+      : _ordinal = 2,
+        _data = value;
+
+  const SimpleUnion.withS(Int64Struct value)
+      : _ordinal = 3,
+        _data = value;
+
+  const SimpleUnion.withStr(String value)
+      : _ordinal = 4,
+        _data = value;
+
+  SimpleUnion._(int ordinal, Object data)
+      : _ordinal = ordinal,
+        _data = data;
+
+  final int _ordinal;
+  final _data;
+
+  SimpleUnionTag get $tag => _SimpleUnionTag_map[_ordinal];
+
+  int get i32 {
+    if (_ordinal != 1) {
+      return null;
+    }
+    return _data;
+  }
+
+  int get i64 {
+    if (_ordinal != 2) {
+      return null;
+    }
+    return _data;
+  }
+
+  Int64Struct get s {
+    if (_ordinal != 3) {
+      return null;
+    }
+    return _data;
+  }
+
+  String get str {
+    if (_ordinal != 4) {
+      return null;
+    }
+    return _data;
+  }
+
+  @override
+  String toString() {
+    switch (_ordinal) {
+      case 1:
+        return 'SimpleUnion.i32($i32)';
+      case 2:
+        return 'SimpleUnion.i64($i64)';
+      case 3:
+        return 'SimpleUnion.s($s)';
+      case 4:
+        return 'SimpleUnion.str($str)';
+      default:
+        return null;
+    }
+  }
+
+  @override
+  int get $ordinal => _ordinal;
+
+  @override
+  Object get $data => _data;
+
+  static SimpleUnion _ctor(int ordinal, Object data) {
+    return SimpleUnion._(ordinal, data);
+  }
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.XUnionType<SimpleUnion> kSimpleUnion_Type =
+    $fidl.XUnionType<SimpleUnion>(
+  members: <int, $fidl.FidlType>{
+    1: $fidl.Int32Type(),
+    2: $fidl.Int64Type(),
+    3: kInt64Struct_Type,
+    4: $fidl.StringType(maybeElementCount: null, nullable: false),
+  },
+  ctor: SimpleUnion._ctor,
+  nullable: false,
+  flexible: false,
+);
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.XUnionType<SimpleUnion> kSimpleUnion_OptType =
+    $fidl.XUnionType<SimpleUnion>(
+  members: <int, $fidl.FidlType>{
+    1: $fidl.Int32Type(),
+    2: $fidl.Int64Type(),
+    3: kInt64Struct_Type,
+    4: $fidl.StringType(maybeElementCount: null, nullable: false),
+  },
+  ctor: SimpleUnion._ctor,
   nullable: true,
   flexible: false,
 );
@@ -2285,6 +2814,479 @@
   flexible: true,
 );
 
+enum XUnionOfUnionTag {
+  $unknown,
+  variant, // 0x38220594
+}
+
+const Map<int, XUnionOfUnionTag> _XUnionOfUnionTag_map = {
+  941753748: XUnionOfUnionTag.variant,
+};
+
+class XUnionOfUnion extends $fidl.XUnion {
+  const XUnionOfUnion.withVariant(UnionAtTheBottom value)
+      : _ordinal = 941753748,
+        _data = value;
+
+  XUnionOfUnion._(int ordinal, Object data)
+      : _ordinal = ordinal,
+        _data = data;
+
+  final int _ordinal;
+  final _data;
+
+  XUnionOfUnionTag get $tag {
+    final XUnionOfUnionTag $rawtag = _XUnionOfUnionTag_map[_ordinal];
+    return $rawtag == null ? XUnionOfUnionTag.$unknown : $rawtag;
+  }
+
+  UnionAtTheBottom get variant {
+    if (_ordinal != 941753748) {
+      return null;
+    }
+    return _data;
+  }
+
+  @override
+  String toString() {
+    switch (_ordinal) {
+      case 941753748:
+        return 'XUnionOfUnion.variant($variant)';
+      default:
+        return 'XUnionOfUnion.<UNKNOWN>';
+    }
+  }
+
+  @override
+  int get $ordinal => _ordinal;
+
+  @override
+  Object get $data => _data;
+
+  static XUnionOfUnion _ctor(int ordinal, Object data) {
+    return XUnionOfUnion._(ordinal, data);
+  }
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.XUnionType<XUnionOfUnion> kXUnionOfUnion_Type =
+    $fidl.XUnionType<XUnionOfUnion>(
+  members: <int, $fidl.FidlType>{
+    941753748: kUnionAtTheBottom_Type,
+  },
+  ctor: XUnionOfUnion._ctor,
+  nullable: false,
+  flexible: true,
+);
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.XUnionType<XUnionOfUnion> kXUnionOfUnion_OptType =
+    $fidl.XUnionType<XUnionOfUnion>(
+  members: <int, $fidl.FidlType>{
+    941753748: kUnionAtTheBottom_Type,
+  },
+  ctor: XUnionOfUnion._ctor,
+  nullable: true,
+  flexible: true,
+);
+
+enum XUnionOfTableThenXUnionThenUnionTag {
+  $unknown,
+  variant, // 0x22b8614e
+}
+
+const Map<int, XUnionOfTableThenXUnionThenUnionTag>
+    _XUnionOfTableThenXUnionThenUnionTag_map = {
+  582508878: XUnionOfTableThenXUnionThenUnionTag.variant,
+};
+
+class XUnionOfTableThenXUnionThenUnion extends $fidl.XUnion {
+  const XUnionOfTableThenXUnionThenUnion.withVariant(
+      TableOfXUnionThenUnion value)
+      : _ordinal = 582508878,
+        _data = value;
+
+  XUnionOfTableThenXUnionThenUnion._(int ordinal, Object data)
+      : _ordinal = ordinal,
+        _data = data;
+
+  final int _ordinal;
+  final _data;
+
+  XUnionOfTableThenXUnionThenUnionTag get $tag {
+    final XUnionOfTableThenXUnionThenUnionTag $rawtag =
+        _XUnionOfTableThenXUnionThenUnionTag_map[_ordinal];
+    return $rawtag == null
+        ? XUnionOfTableThenXUnionThenUnionTag.$unknown
+        : $rawtag;
+  }
+
+  TableOfXUnionThenUnion get variant {
+    if (_ordinal != 582508878) {
+      return null;
+    }
+    return _data;
+  }
+
+  @override
+  String toString() {
+    switch (_ordinal) {
+      case 582508878:
+        return 'XUnionOfTableThenXUnionThenUnion.variant($variant)';
+      default:
+        return 'XUnionOfTableThenXUnionThenUnion.<UNKNOWN>';
+    }
+  }
+
+  @override
+  int get $ordinal => _ordinal;
+
+  @override
+  Object get $data => _data;
+
+  static XUnionOfTableThenXUnionThenUnion _ctor(int ordinal, Object data) {
+    return XUnionOfTableThenXUnionThenUnion._(ordinal, data);
+  }
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.XUnionType<XUnionOfTableThenXUnionThenUnion>
+    kXUnionOfTableThenXUnionThenUnion_Type =
+    $fidl.XUnionType<XUnionOfTableThenXUnionThenUnion>(
+  members: <int, $fidl.FidlType>{
+    582508878: kTableOfXUnionThenUnion_Type,
+  },
+  ctor: XUnionOfTableThenXUnionThenUnion._ctor,
+  nullable: false,
+  flexible: true,
+);
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.XUnionType<XUnionOfTableThenXUnionThenUnion>
+    kXUnionOfTableThenXUnionThenUnion_OptType =
+    $fidl.XUnionType<XUnionOfTableThenXUnionThenUnion>(
+  members: <int, $fidl.FidlType>{
+    582508878: kTableOfXUnionThenUnion_Type,
+  },
+  ctor: XUnionOfTableThenXUnionThenUnion._ctor,
+  nullable: true,
+  flexible: true,
+);
+
+enum CompatXUnionTag {
+  $unknown,
+  s, // 0x5af8efa8
+  b, // 0x536bc590
+}
+
+const Map<int, CompatXUnionTag> _CompatXUnionTag_map = {
+  1526263720: CompatXUnionTag.s,
+  1399571856: CompatXUnionTag.b,
+};
+
+class CompatXUnion extends $fidl.XUnion {
+  const CompatXUnion.withS(String value)
+      : _ordinal = 1526263720,
+        _data = value;
+
+  const CompatXUnion.withB(bool value)
+      : _ordinal = 1399571856,
+        _data = value;
+
+  CompatXUnion._(int ordinal, Object data)
+      : _ordinal = ordinal,
+        _data = data;
+
+  final int _ordinal;
+  final _data;
+
+  CompatXUnionTag get $tag {
+    final CompatXUnionTag $rawtag = _CompatXUnionTag_map[_ordinal];
+    return $rawtag == null ? CompatXUnionTag.$unknown : $rawtag;
+  }
+
+  String get s {
+    if (_ordinal != 1526263720) {
+      return null;
+    }
+    return _data;
+  }
+
+  bool get b {
+    if (_ordinal != 1399571856) {
+      return null;
+    }
+    return _data;
+  }
+
+  @override
+  String toString() {
+    switch (_ordinal) {
+      case 1526263720:
+        return 'CompatXUnion.s($s)';
+      case 1399571856:
+        return 'CompatXUnion.b($b)';
+      default:
+        return 'CompatXUnion.<UNKNOWN>';
+    }
+  }
+
+  @override
+  int get $ordinal => _ordinal;
+
+  @override
+  Object get $data => _data;
+
+  static CompatXUnion _ctor(int ordinal, Object data) {
+    return CompatXUnion._(ordinal, data);
+  }
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.XUnionType<CompatXUnion> kCompatXUnion_Type =
+    $fidl.XUnionType<CompatXUnion>(
+  members: <int, $fidl.FidlType>{
+    1526263720: $fidl.StringType(maybeElementCount: null, nullable: false),
+    1399571856: $fidl.BoolType(),
+  },
+  ctor: CompatXUnion._ctor,
+  nullable: false,
+  flexible: true,
+);
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.XUnionType<CompatXUnion> kCompatXUnion_OptType =
+    $fidl.XUnionType<CompatXUnion>(
+  members: <int, $fidl.FidlType>{
+    1526263720: $fidl.StringType(maybeElementCount: null, nullable: false),
+    1399571856: $fidl.BoolType(),
+  },
+  ctor: CompatXUnion._ctor,
+  nullable: true,
+  flexible: true,
+);
+
+enum SampleXUnionTag {
+  $unknown,
+  u, // 0x389c56b2
+  su, // 0x792f4f1d
+  st, // 0x21de8d5
+}
+
+const Map<int, SampleXUnionTag> _SampleXUnionTag_map = {
+  949769906: SampleXUnionTag.u,
+  2033143581: SampleXUnionTag.su,
+  35514581: SampleXUnionTag.st,
+};
+
+class SampleXUnion extends $fidl.XUnion {
+  const SampleXUnion.withU(int value)
+      : _ordinal = 949769906,
+        _data = value;
+
+  const SampleXUnion.withSu(SimpleUnion value)
+      : _ordinal = 2033143581,
+        _data = value;
+
+  const SampleXUnion.withSt(SimpleTable value)
+      : _ordinal = 35514581,
+        _data = value;
+
+  SampleXUnion._(int ordinal, Object data)
+      : _ordinal = ordinal,
+        _data = data;
+
+  final int _ordinal;
+  final _data;
+
+  SampleXUnionTag get $tag {
+    final SampleXUnionTag $rawtag = _SampleXUnionTag_map[_ordinal];
+    return $rawtag == null ? SampleXUnionTag.$unknown : $rawtag;
+  }
+
+  int get u {
+    if (_ordinal != 949769906) {
+      return null;
+    }
+    return _data;
+  }
+
+  SimpleUnion get su {
+    if (_ordinal != 2033143581) {
+      return null;
+    }
+    return _data;
+  }
+
+  SimpleTable get st {
+    if (_ordinal != 35514581) {
+      return null;
+    }
+    return _data;
+  }
+
+  @override
+  String toString() {
+    switch (_ordinal) {
+      case 949769906:
+        return 'SampleXUnion.u($u)';
+      case 2033143581:
+        return 'SampleXUnion.su($su)';
+      case 35514581:
+        return 'SampleXUnion.st($st)';
+      default:
+        return 'SampleXUnion.<UNKNOWN>';
+    }
+  }
+
+  @override
+  int get $ordinal => _ordinal;
+
+  @override
+  Object get $data => _data;
+
+  static SampleXUnion _ctor(int ordinal, Object data) {
+    return SampleXUnion._(ordinal, data);
+  }
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.XUnionType<SampleXUnion> kSampleXUnion_Type =
+    $fidl.XUnionType<SampleXUnion>(
+  members: <int, $fidl.FidlType>{
+    949769906: $fidl.Uint32Type(),
+    2033143581: kSimpleUnion_Type,
+    35514581: kSimpleTable_Type,
+  },
+  ctor: SampleXUnion._ctor,
+  nullable: false,
+  flexible: true,
+);
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.XUnionType<SampleXUnion> kSampleXUnion_OptType =
+    $fidl.XUnionType<SampleXUnion>(
+  members: <int, $fidl.FidlType>{
+    949769906: $fidl.Uint32Type(),
+    2033143581: kSimpleUnion_Type,
+    35514581: kSimpleTable_Type,
+  },
+  ctor: SampleXUnion._ctor,
+  nullable: true,
+  flexible: true,
+);
+
+enum SampleStrictXUnionTag {
+  u, // 0x8e2ea72
+  su, // 0x27f3a73b
+  st, // 0x372354ef
+}
+
+const Map<int, SampleStrictXUnionTag> _SampleStrictXUnionTag_map = {
+  149088882: SampleStrictXUnionTag.u,
+  670279483: SampleStrictXUnionTag.su,
+  925062383: SampleStrictXUnionTag.st,
+};
+
+class SampleStrictXUnion extends $fidl.XUnion {
+  const SampleStrictXUnion.withU(int value)
+      : _ordinal = 149088882,
+        _data = value;
+
+  const SampleStrictXUnion.withSu(SimpleUnion value)
+      : _ordinal = 670279483,
+        _data = value;
+
+  const SampleStrictXUnion.withSt(SimpleTable value)
+      : _ordinal = 925062383,
+        _data = value;
+
+  SampleStrictXUnion._(int ordinal, Object data)
+      : _ordinal = ordinal,
+        _data = data;
+
+  final int _ordinal;
+  final _data;
+
+  SampleStrictXUnionTag get $tag => _SampleStrictXUnionTag_map[_ordinal];
+
+  int get u {
+    if (_ordinal != 149088882) {
+      return null;
+    }
+    return _data;
+  }
+
+  SimpleUnion get su {
+    if (_ordinal != 670279483) {
+      return null;
+    }
+    return _data;
+  }
+
+  SimpleTable get st {
+    if (_ordinal != 925062383) {
+      return null;
+    }
+    return _data;
+  }
+
+  @override
+  String toString() {
+    switch (_ordinal) {
+      case 149088882:
+        return 'SampleStrictXUnion.u($u)';
+      case 670279483:
+        return 'SampleStrictXUnion.su($su)';
+      case 925062383:
+        return 'SampleStrictXUnion.st($st)';
+      default:
+        return null;
+    }
+  }
+
+  @override
+  int get $ordinal => _ordinal;
+
+  @override
+  Object get $data => _data;
+
+  static SampleStrictXUnion _ctor(int ordinal, Object data) {
+    return SampleStrictXUnion._(ordinal, data);
+  }
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.XUnionType<SampleStrictXUnion> kSampleStrictXUnion_Type =
+    $fidl.XUnionType<SampleStrictXUnion>(
+  members: <int, $fidl.FidlType>{
+    149088882: $fidl.Uint32Type(),
+    670279483: kSimpleUnion_Type,
+    925062383: kSimpleTable_Type,
+  },
+  ctor: SampleStrictXUnion._ctor,
+  nullable: false,
+  flexible: false,
+);
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.XUnionType<SampleStrictXUnion> kSampleStrictXUnion_OptType =
+    $fidl.XUnionType<SampleStrictXUnion>(
+  members: <int, $fidl.FidlType>{
+    149088882: $fidl.Uint32Type(),
+    670279483: kSimpleUnion_Type,
+    925062383: kSimpleTable_Type,
+  },
+  ctor: SampleStrictXUnion._ctor,
+  nullable: true,
+  flexible: false,
+);
+
 class TestXUnionInTable extends $fidl.Struct {
   const TestXUnionInTable({
     @required this.value,
@@ -2617,482 +3619,6 @@
   ctor: FileGetAttrResponse._ctor,
 );
 
-class StructOfSimpleTable extends $fidl.Struct {
-  const StructOfSimpleTable({
-    @required this.table,
-  });
-  StructOfSimpleTable.clone(
-    StructOfSimpleTable $orig, {
-    SimpleTable table,
-  }) : this(
-          table: table ?? $orig.table,
-        );
-
-  StructOfSimpleTable._(List<Object> argv) : table = argv[0];
-  final SimpleTable table;
-
-  @override
-  List<Object> get $fields {
-    return <Object>[
-      table,
-    ];
-  }
-
-  @override
-  String toString() {
-    // ignore: prefer_interpolation_to_compose_strings
-    return r'StructOfSimpleTable' r'(table: ' + table.toString() + r')';
-  }
-
-  static StructOfSimpleTable _ctor(List<Object> argv) =>
-      StructOfSimpleTable._(argv);
-}
-
-// See FIDL-308:
-// ignore: recursive_compile_time_constant
-const $fidl.StructType<StructOfSimpleTable> kStructOfSimpleTable_Type =
-    $fidl.StructType<StructOfSimpleTable>(
-  inlineSizeOld: 16,
-  inlineSizeV1: 16,
-  members: <$fidl.MemberType>[
-    $fidl.MemberType<SimpleTable>(
-        type: kSimpleTable_Type, offsetOld: 0, offsetV1: 0),
-  ],
-  ctor: StructOfSimpleTable._ctor,
-);
-
-class SimpleTableThenUint64 extends $fidl.Struct {
-  const SimpleTableThenUint64({
-    @required this.table,
-    @required this.number,
-  });
-  SimpleTableThenUint64.clone(
-    SimpleTableThenUint64 $orig, {
-    SimpleTable table,
-    int number,
-  }) : this(
-          table: table ?? $orig.table,
-          number: number ?? $orig.number,
-        );
-
-  SimpleTableThenUint64._(List<Object> argv)
-      : table = argv[0],
-        number = argv[1];
-  final SimpleTable table;
-  final int number;
-
-  @override
-  List<Object> get $fields {
-    return <Object>[
-      table,
-      number,
-    ];
-  }
-
-  @override
-  String toString() {
-    // ignore: prefer_interpolation_to_compose_strings
-    return r'SimpleTableThenUint64' r'(table: ' +
-        table.toString() +
-        r', number: ' +
-        number.toString() +
-        r')';
-  }
-
-  static SimpleTableThenUint64 _ctor(List<Object> argv) =>
-      SimpleTableThenUint64._(argv);
-}
-
-// See FIDL-308:
-// ignore: recursive_compile_time_constant
-const $fidl.StructType<SimpleTableThenUint64> kSimpleTableThenUint64_Type =
-    $fidl.StructType<SimpleTableThenUint64>(
-  inlineSizeOld: 24,
-  inlineSizeV1: 24,
-  members: <$fidl.MemberType>[
-    $fidl.MemberType<SimpleTable>(
-        type: kSimpleTable_Type, offsetOld: 0, offsetV1: 0),
-    $fidl.MemberType<int>(
-        type: $fidl.Uint64Type(), offsetOld: 16, offsetV1: 16),
-  ],
-  ctor: SimpleTableThenUint64._ctor,
-);
-
-class StructOfTableWithStringAndVector extends $fidl.Struct {
-  const StructOfTableWithStringAndVector({
-    @required this.table,
-  });
-  StructOfTableWithStringAndVector.clone(
-    StructOfTableWithStringAndVector $orig, {
-    TableWithStringAndVector table,
-  }) : this(
-          table: table ?? $orig.table,
-        );
-
-  StructOfTableWithStringAndVector._(List<Object> argv) : table = argv[0];
-  final TableWithStringAndVector table;
-
-  @override
-  List<Object> get $fields {
-    return <Object>[
-      table,
-    ];
-  }
-
-  @override
-  String toString() {
-    // ignore: prefer_interpolation_to_compose_strings
-    return r'StructOfTableWithStringAndVector' r'(table: ' +
-        table.toString() +
-        r')';
-  }
-
-  static StructOfTableWithStringAndVector _ctor(List<Object> argv) =>
-      StructOfTableWithStringAndVector._(argv);
-}
-
-// See FIDL-308:
-// ignore: recursive_compile_time_constant
-const $fidl.StructType<StructOfTableWithStringAndVector>
-    kStructOfTableWithStringAndVector_Type =
-    $fidl.StructType<StructOfTableWithStringAndVector>(
-  inlineSizeOld: 16,
-  inlineSizeV1: 16,
-  members: <$fidl.MemberType>[
-    $fidl.MemberType<TableWithStringAndVector>(
-        type: kTableWithStringAndVector_Type, offsetOld: 0, offsetV1: 0),
-  ],
-  ctor: StructOfTableWithStringAndVector._ctor,
-);
-
-class StructOfReverseOrdinalTable extends $fidl.Struct {
-  const StructOfReverseOrdinalTable({
-    @required this.table,
-  });
-  StructOfReverseOrdinalTable.clone(
-    StructOfReverseOrdinalTable $orig, {
-    ReverseOrdinalTable table,
-  }) : this(
-          table: table ?? $orig.table,
-        );
-
-  StructOfReverseOrdinalTable._(List<Object> argv) : table = argv[0];
-  final ReverseOrdinalTable table;
-
-  @override
-  List<Object> get $fields {
-    return <Object>[
-      table,
-    ];
-  }
-
-  @override
-  String toString() {
-    // ignore: prefer_interpolation_to_compose_strings
-    return r'StructOfReverseOrdinalTable' r'(table: ' + table.toString() + r')';
-  }
-
-  static StructOfReverseOrdinalTable _ctor(List<Object> argv) =>
-      StructOfReverseOrdinalTable._(argv);
-}
-
-// See FIDL-308:
-// ignore: recursive_compile_time_constant
-const $fidl.StructType<StructOfReverseOrdinalTable>
-    kStructOfReverseOrdinalTable_Type =
-    $fidl.StructType<StructOfReverseOrdinalTable>(
-  inlineSizeOld: 16,
-  inlineSizeV1: 16,
-  members: <$fidl.MemberType>[
-    $fidl.MemberType<ReverseOrdinalTable>(
-        type: kReverseOrdinalTable_Type, offsetOld: 0, offsetV1: 0),
-  ],
-  ctor: StructOfReverseOrdinalTable._ctor,
-);
-
-class Int64Struct extends $fidl.Struct {
-  const Int64Struct({
-    @required this.x,
-  });
-  Int64Struct.clone(
-    Int64Struct $orig, {
-    int x,
-  }) : this(
-          x: x ?? $orig.x,
-        );
-
-  Int64Struct._(List<Object> argv) : x = argv[0];
-  final int x;
-
-  @override
-  List<Object> get $fields {
-    return <Object>[
-      x,
-    ];
-  }
-
-  @override
-  String toString() {
-    // ignore: prefer_interpolation_to_compose_strings
-    return r'Int64Struct' r'(x: ' + x.toString() + r')';
-  }
-
-  static Int64Struct _ctor(List<Object> argv) => Int64Struct._(argv);
-}
-
-// See FIDL-308:
-// ignore: recursive_compile_time_constant
-const $fidl.StructType<Int64Struct> kInt64Struct_Type =
-    $fidl.StructType<Int64Struct>(
-  inlineSizeOld: 8,
-  inlineSizeV1: 8,
-  members: <$fidl.MemberType>[
-    $fidl.MemberType<int>(type: $fidl.Int64Type(), offsetOld: 0, offsetV1: 0),
-  ],
-  ctor: Int64Struct._ctor,
-);
-
-class TestInlineXUnionInStruct extends $fidl.Struct {
-  const TestInlineXUnionInStruct({
-    @required this.before,
-    @required this.xu,
-    @required this.after,
-  });
-  TestInlineXUnionInStruct.clone(
-    TestInlineXUnionInStruct $orig, {
-    String before,
-    SampleXUnion xu,
-    String after,
-  }) : this(
-          before: before ?? $orig.before,
-          xu: xu ?? $orig.xu,
-          after: after ?? $orig.after,
-        );
-
-  TestInlineXUnionInStruct._(List<Object> argv)
-      : before = argv[0],
-        xu = argv[1],
-        after = argv[2];
-  final String before;
-  final SampleXUnion xu;
-  final String after;
-
-  @override
-  List<Object> get $fields {
-    return <Object>[
-      before,
-      xu,
-      after,
-    ];
-  }
-
-  @override
-  String toString() {
-    // ignore: prefer_interpolation_to_compose_strings
-    return r'TestInlineXUnionInStruct' r'(before: ' +
-        before.toString() +
-        r', xu: ' +
-        xu.toString() +
-        r', after: ' +
-        after.toString() +
-        r')';
-  }
-
-  static TestInlineXUnionInStruct _ctor(List<Object> argv) =>
-      TestInlineXUnionInStruct._(argv);
-}
-
-// See FIDL-308:
-// ignore: recursive_compile_time_constant
-const $fidl.StructType<TestInlineXUnionInStruct>
-    kTestInlineXUnionInStruct_Type = $fidl.StructType<TestInlineXUnionInStruct>(
-  inlineSizeOld: 56,
-  inlineSizeV1: 56,
-  members: <$fidl.MemberType>[
-    $fidl.MemberType<String>(
-        type: $fidl.StringType(maybeElementCount: null, nullable: false),
-        offsetOld: 0,
-        offsetV1: 0),
-    $fidl.MemberType<SampleXUnion>(
-        type: kSampleXUnion_Type, offsetOld: 16, offsetV1: 16),
-    $fidl.MemberType<String>(
-        type: $fidl.StringType(maybeElementCount: null, nullable: false),
-        offsetOld: 40,
-        offsetV1: 40),
-  ],
-  ctor: TestInlineXUnionInStruct._ctor,
-);
-
-class TestOptionalXUnionInStruct extends $fidl.Struct {
-  const TestOptionalXUnionInStruct({
-    @required this.before,
-    this.xu,
-    @required this.after,
-  });
-  TestOptionalXUnionInStruct.clone(
-    TestOptionalXUnionInStruct $orig, {
-    String before,
-    SampleXUnion xu,
-    String after,
-  }) : this(
-          before: before ?? $orig.before,
-          xu: xu ?? $orig.xu,
-          after: after ?? $orig.after,
-        );
-
-  TestOptionalXUnionInStruct.cloneWithout(
-    TestOptionalXUnionInStruct $orig, {
-    bool xu,
-  }) : this(
-          before: $orig.before,
-          xu: xu ? null : $orig.xu,
-          after: $orig.after,
-        );
-
-  TestOptionalXUnionInStruct._(List<Object> argv)
-      : before = argv[0],
-        xu = argv[1],
-        after = argv[2];
-  final String before;
-  final SampleXUnion xu;
-  final String after;
-
-  @override
-  List<Object> get $fields {
-    return <Object>[
-      before,
-      xu,
-      after,
-    ];
-  }
-
-  @override
-  String toString() {
-    // ignore: prefer_interpolation_to_compose_strings
-    return r'TestOptionalXUnionInStruct' r'(before: ' +
-        before.toString() +
-        r', xu: ' +
-        xu.toString() +
-        r', after: ' +
-        after.toString() +
-        r')';
-  }
-
-  static TestOptionalXUnionInStruct _ctor(List<Object> argv) =>
-      TestOptionalXUnionInStruct._(argv);
-}
-
-// See FIDL-308:
-// ignore: recursive_compile_time_constant
-const $fidl.StructType<TestOptionalXUnionInStruct>
-    kTestOptionalXUnionInStruct_Type =
-    $fidl.StructType<TestOptionalXUnionInStruct>(
-  inlineSizeOld: 56,
-  inlineSizeV1: 56,
-  members: <$fidl.MemberType>[
-    $fidl.MemberType<String>(
-        type: $fidl.StringType(maybeElementCount: null, nullable: false),
-        offsetOld: 0,
-        offsetV1: 0),
-    $fidl.MemberType<SampleXUnion>(
-        type: kSampleXUnion_OptType, offsetOld: 16, offsetV1: 16),
-    $fidl.MemberType<String>(
-        type: $fidl.StringType(maybeElementCount: null, nullable: false),
-        offsetOld: 40,
-        offsetV1: 40),
-  ],
-  ctor: TestOptionalXUnionInStruct._ctor,
-);
-
-class TestStrictXUnionInStruct extends $fidl.Struct {
-  const TestStrictXUnionInStruct({
-    @required this.xu,
-  });
-  TestStrictXUnionInStruct.clone(
-    TestStrictXUnionInStruct $orig, {
-    SampleStrictXUnion xu,
-  }) : this(
-          xu: xu ?? $orig.xu,
-        );
-
-  TestStrictXUnionInStruct._(List<Object> argv) : xu = argv[0];
-  final SampleStrictXUnion xu;
-
-  @override
-  List<Object> get $fields {
-    return <Object>[
-      xu,
-    ];
-  }
-
-  @override
-  String toString() {
-    // ignore: prefer_interpolation_to_compose_strings
-    return r'TestStrictXUnionInStruct' r'(xu: ' + xu.toString() + r')';
-  }
-
-  static TestStrictXUnionInStruct _ctor(List<Object> argv) =>
-      TestStrictXUnionInStruct._(argv);
-}
-
-// See FIDL-308:
-// ignore: recursive_compile_time_constant
-const $fidl.StructType<TestStrictXUnionInStruct>
-    kTestStrictXUnionInStruct_Type = $fidl.StructType<TestStrictXUnionInStruct>(
-  inlineSizeOld: 24,
-  inlineSizeV1: 24,
-  members: <$fidl.MemberType>[
-    $fidl.MemberType<SampleStrictXUnion>(
-        type: kSampleStrictXUnion_Type, offsetOld: 0, offsetV1: 0),
-  ],
-  ctor: TestStrictXUnionInStruct._ctor,
-);
-
-class TestFlexibleXUnionInStruct extends $fidl.Struct {
-  const TestFlexibleXUnionInStruct({
-    @required this.xu,
-  });
-  TestFlexibleXUnionInStruct.clone(
-    TestFlexibleXUnionInStruct $orig, {
-    SampleXUnion xu,
-  }) : this(
-          xu: xu ?? $orig.xu,
-        );
-
-  TestFlexibleXUnionInStruct._(List<Object> argv) : xu = argv[0];
-  final SampleXUnion xu;
-
-  @override
-  List<Object> get $fields {
-    return <Object>[
-      xu,
-    ];
-  }
-
-  @override
-  String toString() {
-    // ignore: prefer_interpolation_to_compose_strings
-    return r'TestFlexibleXUnionInStruct' r'(xu: ' + xu.toString() + r')';
-  }
-
-  static TestFlexibleXUnionInStruct _ctor(List<Object> argv) =>
-      TestFlexibleXUnionInStruct._(argv);
-}
-
-// See FIDL-308:
-// ignore: recursive_compile_time_constant
-const $fidl.StructType<TestFlexibleXUnionInStruct>
-    kTestFlexibleXUnionInStruct_Type =
-    $fidl.StructType<TestFlexibleXUnionInStruct>(
-  inlineSizeOld: 24,
-  inlineSizeV1: 24,
-  members: <$fidl.MemberType>[
-    $fidl.MemberType<SampleXUnion>(
-        type: kSampleXUnion_Type, offsetOld: 0, offsetV1: 0),
-  ],
-  ctor: TestFlexibleXUnionInStruct._ctor,
-);
-
 class UnionWithBoundStringStruct extends $fidl.Struct {
   const UnionWithBoundStringStruct({
     @required this.v,
@@ -3888,128 +4414,628 @@
   ctor: StringWrapper._ctor,
 );
 
-class StructWithOptionals extends $fidl.Struct {
-  const StructWithOptionals({
-    @required this.s,
-    this.s2,
-    @required this.t,
-    @required this.xu,
-    this.xu2,
-    @required this.u,
-    this.u2,
+class StructOfSimpleTable extends $fidl.Struct {
+  const StructOfSimpleTable({
+    @required this.table,
   });
-  StructWithOptionals.clone(
-    StructWithOptionals $orig, {
-    EmptyStruct s,
-    EmptyStruct s2,
-    TableWithEmptyStruct t,
-    XUnionWithEmptyStruct xu,
-    XUnionWithEmptyStruct xu2,
-    UnionWithEmptyStruct u,
-    UnionWithEmptyStruct u2,
+  StructOfSimpleTable.clone(
+    StructOfSimpleTable $orig, {
+    SimpleTable table,
   }) : this(
-          s: s ?? $orig.s,
-          s2: s2 ?? $orig.s2,
-          t: t ?? $orig.t,
-          xu: xu ?? $orig.xu,
-          xu2: xu2 ?? $orig.xu2,
-          u: u ?? $orig.u,
-          u2: u2 ?? $orig.u2,
+          table: table ?? $orig.table,
         );
 
-  StructWithOptionals.cloneWithout(
-    StructWithOptionals $orig, {
-    bool s2,
-    bool xu2,
-    bool u2,
-  }) : this(
-          s: $orig.s,
-          s2: s2 ? null : $orig.s2,
-          t: $orig.t,
-          xu: $orig.xu,
-          xu2: xu2 ? null : $orig.xu2,
-          u: $orig.u,
-          u2: u2 ? null : $orig.u2,
-        );
-
-  StructWithOptionals._(List<Object> argv)
-      : s = argv[0],
-        s2 = argv[1],
-        t = argv[2],
-        xu = argv[3],
-        xu2 = argv[4],
-        u = argv[5],
-        u2 = argv[6];
-  final EmptyStruct s;
-  final EmptyStruct s2;
-  final TableWithEmptyStruct t;
-  final XUnionWithEmptyStruct xu;
-  final XUnionWithEmptyStruct xu2;
-  final UnionWithEmptyStruct u;
-  final UnionWithEmptyStruct u2;
+  StructOfSimpleTable._(List<Object> argv) : table = argv[0];
+  final SimpleTable table;
 
   @override
   List<Object> get $fields {
     return <Object>[
-      s,
-      s2,
-      t,
-      xu,
-      xu2,
-      u,
-      u2,
+      table,
     ];
   }
 
   @override
   String toString() {
     // ignore: prefer_interpolation_to_compose_strings
-    return r'StructWithOptionals' r'(s: ' +
-        s.toString() +
-        r', s2: ' +
-        s2.toString() +
-        r', t: ' +
-        t.toString() +
-        r', xu: ' +
-        xu.toString() +
-        r', xu2: ' +
-        xu2.toString() +
-        r', u: ' +
-        u.toString() +
-        r', u2: ' +
-        u2.toString() +
-        r')';
+    return r'StructOfSimpleTable' r'(table: ' + table.toString() + r')';
   }
 
-  static StructWithOptionals _ctor(List<Object> argv) =>
-      StructWithOptionals._(argv);
+  static StructOfSimpleTable _ctor(List<Object> argv) =>
+      StructOfSimpleTable._(argv);
 }
 
 // See FIDL-308:
 // ignore: recursive_compile_time_constant
-const $fidl.StructType<StructWithOptionals> kStructWithOptionals_Type =
-    $fidl.StructType<StructWithOptionals>(
-  inlineSizeOld: 104,
-  inlineSizeV1: 128,
+const $fidl.StructType<StructOfSimpleTable> kStructOfSimpleTable_Type =
+    $fidl.StructType<StructOfSimpleTable>(
+  inlineSizeOld: 16,
+  inlineSizeV1: 16,
   members: <$fidl.MemberType>[
-    $fidl.MemberType<EmptyStruct>(
-        type: kEmptyStruct_Type, offsetOld: 0, offsetV1: 0),
-    $fidl.MemberType<EmptyStruct>(
-        type: $fidl.PointerType<EmptyStruct>(element: kEmptyStruct_Type),
-        offsetOld: 8,
-        offsetV1: 8),
-    $fidl.MemberType<TableWithEmptyStruct>(
-        type: kTableWithEmptyStruct_Type, offsetOld: 16, offsetV1: 16),
-    $fidl.MemberType<XUnionWithEmptyStruct>(
-        type: kXUnionWithEmptyStruct_Type, offsetOld: 32, offsetV1: 32),
-    $fidl.MemberType<XUnionWithEmptyStruct>(
-        type: kXUnionWithEmptyStruct_OptType, offsetOld: 56, offsetV1: 56),
-    $fidl.MemberType<UnionWithEmptyStruct>(
-        type: kUnionWithEmptyStruct_Type, offsetOld: 80, offsetV1: 80),
-    $fidl.MemberType<UnionWithEmptyStruct>(
-        type: kUnionWithEmptyStruct_OptType, offsetOld: 96, offsetV1: 104),
+    $fidl.MemberType<SimpleTable>(
+        type: kSimpleTable_Type, offsetOld: 0, offsetV1: 0),
   ],
-  ctor: StructWithOptionals._ctor,
+  ctor: StructOfSimpleTable._ctor,
+);
+
+class SimpleTableThenUint64 extends $fidl.Struct {
+  const SimpleTableThenUint64({
+    @required this.table,
+    @required this.number,
+  });
+  SimpleTableThenUint64.clone(
+    SimpleTableThenUint64 $orig, {
+    SimpleTable table,
+    int number,
+  }) : this(
+          table: table ?? $orig.table,
+          number: number ?? $orig.number,
+        );
+
+  SimpleTableThenUint64._(List<Object> argv)
+      : table = argv[0],
+        number = argv[1];
+  final SimpleTable table;
+  final int number;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      table,
+      number,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'SimpleTableThenUint64' r'(table: ' +
+        table.toString() +
+        r', number: ' +
+        number.toString() +
+        r')';
+  }
+
+  static SimpleTableThenUint64 _ctor(List<Object> argv) =>
+      SimpleTableThenUint64._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<SimpleTableThenUint64> kSimpleTableThenUint64_Type =
+    $fidl.StructType<SimpleTableThenUint64>(
+  inlineSizeOld: 24,
+  inlineSizeV1: 24,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<SimpleTable>(
+        type: kSimpleTable_Type, offsetOld: 0, offsetV1: 0),
+    $fidl.MemberType<int>(
+        type: $fidl.Uint64Type(), offsetOld: 16, offsetV1: 16),
+  ],
+  ctor: SimpleTableThenUint64._ctor,
+);
+
+class StructOfTableWithStringAndVector extends $fidl.Struct {
+  const StructOfTableWithStringAndVector({
+    @required this.table,
+  });
+  StructOfTableWithStringAndVector.clone(
+    StructOfTableWithStringAndVector $orig, {
+    TableWithStringAndVector table,
+  }) : this(
+          table: table ?? $orig.table,
+        );
+
+  StructOfTableWithStringAndVector._(List<Object> argv) : table = argv[0];
+  final TableWithStringAndVector table;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      table,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'StructOfTableWithStringAndVector' r'(table: ' +
+        table.toString() +
+        r')';
+  }
+
+  static StructOfTableWithStringAndVector _ctor(List<Object> argv) =>
+      StructOfTableWithStringAndVector._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<StructOfTableWithStringAndVector>
+    kStructOfTableWithStringAndVector_Type =
+    $fidl.StructType<StructOfTableWithStringAndVector>(
+  inlineSizeOld: 16,
+  inlineSizeV1: 16,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<TableWithStringAndVector>(
+        type: kTableWithStringAndVector_Type, offsetOld: 0, offsetV1: 0),
+  ],
+  ctor: StructOfTableWithStringAndVector._ctor,
+);
+
+class StructOfReverseOrdinalTable extends $fidl.Struct {
+  const StructOfReverseOrdinalTable({
+    @required this.table,
+  });
+  StructOfReverseOrdinalTable.clone(
+    StructOfReverseOrdinalTable $orig, {
+    ReverseOrdinalTable table,
+  }) : this(
+          table: table ?? $orig.table,
+        );
+
+  StructOfReverseOrdinalTable._(List<Object> argv) : table = argv[0];
+  final ReverseOrdinalTable table;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      table,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'StructOfReverseOrdinalTable' r'(table: ' + table.toString() + r')';
+  }
+
+  static StructOfReverseOrdinalTable _ctor(List<Object> argv) =>
+      StructOfReverseOrdinalTable._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<StructOfReverseOrdinalTable>
+    kStructOfReverseOrdinalTable_Type =
+    $fidl.StructType<StructOfReverseOrdinalTable>(
+  inlineSizeOld: 16,
+  inlineSizeV1: 16,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<ReverseOrdinalTable>(
+        type: kReverseOrdinalTable_Type, offsetOld: 0, offsetV1: 0),
+  ],
+  ctor: StructOfReverseOrdinalTable._ctor,
+);
+
+class ThreeByte extends $fidl.Struct {
+  const ThreeByte({
+    @required this.elem1,
+    @required this.elem2,
+    @required this.elem3,
+  });
+  ThreeByte.clone(
+    ThreeByte $orig, {
+    int elem1,
+    int elem2,
+    int elem3,
+  }) : this(
+          elem1: elem1 ?? $orig.elem1,
+          elem2: elem2 ?? $orig.elem2,
+          elem3: elem3 ?? $orig.elem3,
+        );
+
+  ThreeByte._(List<Object> argv)
+      : elem1 = argv[0],
+        elem2 = argv[1],
+        elem3 = argv[2];
+  final int elem1;
+  final int elem2;
+  final int elem3;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      elem1,
+      elem2,
+      elem3,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'ThreeByte' r'(elem1: ' +
+        elem1.toString() +
+        r', elem2: ' +
+        elem2.toString() +
+        r', elem3: ' +
+        elem3.toString() +
+        r')';
+  }
+
+  static ThreeByte _ctor(List<Object> argv) => ThreeByte._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<ThreeByte> kThreeByte_Type = $fidl.StructType<ThreeByte>(
+  inlineSizeOld: 3,
+  inlineSizeV1: 3,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<int>(type: $fidl.Uint8Type(), offsetOld: 0, offsetV1: 0),
+    $fidl.MemberType<int>(type: $fidl.Uint8Type(), offsetOld: 1, offsetV1: 1),
+    $fidl.MemberType<int>(type: $fidl.Uint8Type(), offsetOld: 2, offsetV1: 2),
+  ],
+  ctor: ThreeByte._ctor,
+);
+
+class FiveByte extends $fidl.Struct {
+  const FiveByte({
+    @required this.elem1,
+    @required this.elem2,
+  });
+  FiveByte.clone(
+    FiveByte $orig, {
+    int elem1,
+    int elem2,
+  }) : this(
+          elem1: elem1 ?? $orig.elem1,
+          elem2: elem2 ?? $orig.elem2,
+        );
+
+  FiveByte._(List<Object> argv)
+      : elem1 = argv[0],
+        elem2 = argv[1];
+  final int elem1;
+  final int elem2;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      elem1,
+      elem2,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'FiveByte' r'(elem1: ' +
+        elem1.toString() +
+        r', elem2: ' +
+        elem2.toString() +
+        r')';
+  }
+
+  static FiveByte _ctor(List<Object> argv) => FiveByte._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<FiveByte> kFiveByte_Type = $fidl.StructType<FiveByte>(
+  inlineSizeOld: 8,
+  inlineSizeV1: 8,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<int>(type: $fidl.Uint32Type(), offsetOld: 0, offsetV1: 0),
+    $fidl.MemberType<int>(type: $fidl.Uint8Type(), offsetOld: 4, offsetV1: 4),
+  ],
+  ctor: FiveByte._ctor,
+);
+
+class ThreeByteInStruct extends $fidl.Struct {
+  const ThreeByteInStruct({
+    @required this.elem1,
+    @required this.elem2,
+    @required this.elem3,
+  });
+  ThreeByteInStruct.clone(
+    ThreeByteInStruct $orig, {
+    ThreeByte elem1,
+    ThreeByte elem2,
+    ThreeByte elem3,
+  }) : this(
+          elem1: elem1 ?? $orig.elem1,
+          elem2: elem2 ?? $orig.elem2,
+          elem3: elem3 ?? $orig.elem3,
+        );
+
+  ThreeByteInStruct._(List<Object> argv)
+      : elem1 = argv[0],
+        elem2 = argv[1],
+        elem3 = argv[2];
+  final ThreeByte elem1;
+  final ThreeByte elem2;
+  final ThreeByte elem3;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      elem1,
+      elem2,
+      elem3,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'ThreeByteInStruct' r'(elem1: ' +
+        elem1.toString() +
+        r', elem2: ' +
+        elem2.toString() +
+        r', elem3: ' +
+        elem3.toString() +
+        r')';
+  }
+
+  static ThreeByteInStruct _ctor(List<Object> argv) =>
+      ThreeByteInStruct._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<ThreeByteInStruct> kThreeByteInStruct_Type =
+    $fidl.StructType<ThreeByteInStruct>(
+  inlineSizeOld: 9,
+  inlineSizeV1: 9,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<ThreeByte>(
+        type: kThreeByte_Type, offsetOld: 0, offsetV1: 0),
+    $fidl.MemberType<ThreeByte>(
+        type: kThreeByte_Type, offsetOld: 3, offsetV1: 3),
+    $fidl.MemberType<ThreeByte>(
+        type: kThreeByte_Type, offsetOld: 6, offsetV1: 6),
+  ],
+  ctor: ThreeByteInStruct._ctor,
+);
+
+class FiveByteInStruct extends $fidl.Struct {
+  const FiveByteInStruct({
+    @required this.elem1,
+    @required this.elem2,
+    @required this.elem3,
+  });
+  FiveByteInStruct.clone(
+    FiveByteInStruct $orig, {
+    FiveByte elem1,
+    FiveByte elem2,
+    FiveByte elem3,
+  }) : this(
+          elem1: elem1 ?? $orig.elem1,
+          elem2: elem2 ?? $orig.elem2,
+          elem3: elem3 ?? $orig.elem3,
+        );
+
+  FiveByteInStruct._(List<Object> argv)
+      : elem1 = argv[0],
+        elem2 = argv[1],
+        elem3 = argv[2];
+  final FiveByte elem1;
+  final FiveByte elem2;
+  final FiveByte elem3;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      elem1,
+      elem2,
+      elem3,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'FiveByteInStruct' r'(elem1: ' +
+        elem1.toString() +
+        r', elem2: ' +
+        elem2.toString() +
+        r', elem3: ' +
+        elem3.toString() +
+        r')';
+  }
+
+  static FiveByteInStruct _ctor(List<Object> argv) => FiveByteInStruct._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<FiveByteInStruct> kFiveByteInStruct_Type =
+    $fidl.StructType<FiveByteInStruct>(
+  inlineSizeOld: 24,
+  inlineSizeV1: 24,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<FiveByte>(type: kFiveByte_Type, offsetOld: 0, offsetV1: 0),
+    $fidl.MemberType<FiveByte>(type: kFiveByte_Type, offsetOld: 8, offsetV1: 8),
+    $fidl.MemberType<FiveByte>(
+        type: kFiveByte_Type, offsetOld: 16, offsetV1: 16),
+  ],
+  ctor: FiveByteInStruct._ctor,
+);
+
+class ThreeByteInVector extends $fidl.Struct {
+  const ThreeByteInVector({
+    @required this.elems,
+  });
+  ThreeByteInVector.clone(
+    ThreeByteInVector $orig, {
+    List<ThreeByte> elems,
+  }) : this(
+          elems: elems ?? $orig.elems,
+        );
+
+  ThreeByteInVector._(List<Object> argv) : elems = argv[0];
+  final List<ThreeByte> elems;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      elems,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'ThreeByteInVector' r'(elems: ' + elems.toString() + r')';
+  }
+
+  static ThreeByteInVector _ctor(List<Object> argv) =>
+      ThreeByteInVector._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<ThreeByteInVector> kThreeByteInVector_Type =
+    $fidl.StructType<ThreeByteInVector>(
+  inlineSizeOld: 16,
+  inlineSizeV1: 16,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<List<ThreeByte>>(
+        type: $fidl.VectorType<List<ThreeByte>>(
+            element: kThreeByte_Type, maybeElementCount: null, nullable: false),
+        offsetOld: 0,
+        offsetV1: 0),
+  ],
+  ctor: ThreeByteInVector._ctor,
+);
+
+class FiveByteInVector extends $fidl.Struct {
+  const FiveByteInVector({
+    @required this.elems,
+  });
+  FiveByteInVector.clone(
+    FiveByteInVector $orig, {
+    List<FiveByte> elems,
+  }) : this(
+          elems: elems ?? $orig.elems,
+        );
+
+  FiveByteInVector._(List<Object> argv) : elems = argv[0];
+  final List<FiveByte> elems;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      elems,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'FiveByteInVector' r'(elems: ' + elems.toString() + r')';
+  }
+
+  static FiveByteInVector _ctor(List<Object> argv) => FiveByteInVector._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<FiveByteInVector> kFiveByteInVector_Type =
+    $fidl.StructType<FiveByteInVector>(
+  inlineSizeOld: 16,
+  inlineSizeV1: 16,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<List<FiveByte>>(
+        type: $fidl.VectorType<List<FiveByte>>(
+            element: kFiveByte_Type, maybeElementCount: null, nullable: false),
+        offsetOld: 0,
+        offsetV1: 0),
+  ],
+  ctor: FiveByteInVector._ctor,
+);
+
+class ThreeByteInArray extends $fidl.Struct {
+  const ThreeByteInArray({
+    @required this.elems,
+  });
+  ThreeByteInArray.clone(
+    ThreeByteInArray $orig, {
+    List<ThreeByte> elems,
+  }) : this(
+          elems: elems ?? $orig.elems,
+        );
+
+  ThreeByteInArray._(List<Object> argv) : elems = argv[0];
+  final List<ThreeByte> elems;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      elems,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'ThreeByteInArray' r'(elems: ' + elems.toString() + r')';
+  }
+
+  static ThreeByteInArray _ctor(List<Object> argv) => ThreeByteInArray._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<ThreeByteInArray> kThreeByteInArray_Type =
+    $fidl.StructType<ThreeByteInArray>(
+  inlineSizeOld: 9,
+  inlineSizeV1: 9,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<List<ThreeByte>>(
+        type: $fidl.ArrayType<List<ThreeByte>>(
+            element: kThreeByte_Type, elementCount: 3),
+        offsetOld: 0,
+        offsetV1: 0),
+  ],
+  ctor: ThreeByteInArray._ctor,
+);
+
+class FiveByteInArray extends $fidl.Struct {
+  const FiveByteInArray({
+    @required this.elems,
+  });
+  FiveByteInArray.clone(
+    FiveByteInArray $orig, {
+    List<FiveByte> elems,
+  }) : this(
+          elems: elems ?? $orig.elems,
+        );
+
+  FiveByteInArray._(List<Object> argv) : elems = argv[0];
+  final List<FiveByte> elems;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      elems,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'FiveByteInArray' r'(elems: ' + elems.toString() + r')';
+  }
+
+  static FiveByteInArray _ctor(List<Object> argv) => FiveByteInArray._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<FiveByteInArray> kFiveByteInArray_Type =
+    $fidl.StructType<FiveByteInArray>(
+  inlineSizeOld: 24,
+  inlineSizeV1: 24,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<List<FiveByte>>(
+        type: $fidl.ArrayType<List<FiveByte>>(
+            element: kFiveByte_Type, elementCount: 3),
+        offsetOld: 0,
+        offsetV1: 0),
+  ],
+  ctor: FiveByteInArray._ctor,
 );
 
 class MyBool extends $fidl.Struct {
@@ -4506,435 +5532,205 @@
   ctor: MyFloat64._ctor,
 );
 
-class ThreeByte extends $fidl.Struct {
-  const ThreeByte({
-    @required this.elem1,
-    @required this.elem2,
-    @required this.elem3,
+class StructWithOptionals extends $fidl.Struct {
+  const StructWithOptionals({
+    @required this.s,
+    this.s2,
+    @required this.t,
+    @required this.xu,
+    this.xu2,
+    @required this.u,
+    this.u2,
   });
-  ThreeByte.clone(
-    ThreeByte $orig, {
-    int elem1,
-    int elem2,
-    int elem3,
+  StructWithOptionals.clone(
+    StructWithOptionals $orig, {
+    EmptyStruct s,
+    EmptyStruct s2,
+    TableWithEmptyStruct t,
+    XUnionWithEmptyStruct xu,
+    XUnionWithEmptyStruct xu2,
+    UnionWithEmptyStruct u,
+    UnionWithEmptyStruct u2,
   }) : this(
-          elem1: elem1 ?? $orig.elem1,
-          elem2: elem2 ?? $orig.elem2,
-          elem3: elem3 ?? $orig.elem3,
+          s: s ?? $orig.s,
+          s2: s2 ?? $orig.s2,
+          t: t ?? $orig.t,
+          xu: xu ?? $orig.xu,
+          xu2: xu2 ?? $orig.xu2,
+          u: u ?? $orig.u,
+          u2: u2 ?? $orig.u2,
         );
 
-  ThreeByte._(List<Object> argv)
-      : elem1 = argv[0],
-        elem2 = argv[1],
-        elem3 = argv[2];
-  final int elem1;
-  final int elem2;
-  final int elem3;
+  StructWithOptionals.cloneWithout(
+    StructWithOptionals $orig, {
+    bool s2,
+    bool xu2,
+    bool u2,
+  }) : this(
+          s: $orig.s,
+          s2: s2 ? null : $orig.s2,
+          t: $orig.t,
+          xu: $orig.xu,
+          xu2: xu2 ? null : $orig.xu2,
+          u: $orig.u,
+          u2: u2 ? null : $orig.u2,
+        );
+
+  StructWithOptionals._(List<Object> argv)
+      : s = argv[0],
+        s2 = argv[1],
+        t = argv[2],
+        xu = argv[3],
+        xu2 = argv[4],
+        u = argv[5],
+        u2 = argv[6];
+  final EmptyStruct s;
+  final EmptyStruct s2;
+  final TableWithEmptyStruct t;
+  final XUnionWithEmptyStruct xu;
+  final XUnionWithEmptyStruct xu2;
+  final UnionWithEmptyStruct u;
+  final UnionWithEmptyStruct u2;
 
   @override
   List<Object> get $fields {
     return <Object>[
-      elem1,
-      elem2,
-      elem3,
+      s,
+      s2,
+      t,
+      xu,
+      xu2,
+      u,
+      u2,
     ];
   }
 
   @override
   String toString() {
     // ignore: prefer_interpolation_to_compose_strings
-    return r'ThreeByte' r'(elem1: ' +
-        elem1.toString() +
-        r', elem2: ' +
-        elem2.toString() +
-        r', elem3: ' +
-        elem3.toString() +
+    return r'StructWithOptionals' r'(s: ' +
+        s.toString() +
+        r', s2: ' +
+        s2.toString() +
+        r', t: ' +
+        t.toString() +
+        r', xu: ' +
+        xu.toString() +
+        r', xu2: ' +
+        xu2.toString() +
+        r', u: ' +
+        u.toString() +
+        r', u2: ' +
+        u2.toString() +
         r')';
   }
 
-  static ThreeByte _ctor(List<Object> argv) => ThreeByte._(argv);
+  static StructWithOptionals _ctor(List<Object> argv) =>
+      StructWithOptionals._(argv);
 }
 
 // See FIDL-308:
 // ignore: recursive_compile_time_constant
-const $fidl.StructType<ThreeByte> kThreeByte_Type = $fidl.StructType<ThreeByte>(
-  inlineSizeOld: 3,
-  inlineSizeV1: 3,
+const $fidl.StructType<StructWithOptionals> kStructWithOptionals_Type =
+    $fidl.StructType<StructWithOptionals>(
+  inlineSizeOld: 104,
+  inlineSizeV1: 128,
   members: <$fidl.MemberType>[
-    $fidl.MemberType<int>(type: $fidl.Uint8Type(), offsetOld: 0, offsetV1: 0),
-    $fidl.MemberType<int>(type: $fidl.Uint8Type(), offsetOld: 1, offsetV1: 1),
-    $fidl.MemberType<int>(type: $fidl.Uint8Type(), offsetOld: 2, offsetV1: 2),
+    $fidl.MemberType<EmptyStruct>(
+        type: kEmptyStruct_Type, offsetOld: 0, offsetV1: 0),
+    $fidl.MemberType<EmptyStruct>(
+        type: $fidl.PointerType<EmptyStruct>(element: kEmptyStruct_Type),
+        offsetOld: 8,
+        offsetV1: 8),
+    $fidl.MemberType<TableWithEmptyStruct>(
+        type: kTableWithEmptyStruct_Type, offsetOld: 16, offsetV1: 16),
+    $fidl.MemberType<XUnionWithEmptyStruct>(
+        type: kXUnionWithEmptyStruct_Type, offsetOld: 32, offsetV1: 32),
+    $fidl.MemberType<XUnionWithEmptyStruct>(
+        type: kXUnionWithEmptyStruct_OptType, offsetOld: 56, offsetV1: 56),
+    $fidl.MemberType<UnionWithEmptyStruct>(
+        type: kUnionWithEmptyStruct_Type, offsetOld: 80, offsetV1: 80),
+    $fidl.MemberType<UnionWithEmptyStruct>(
+        type: kUnionWithEmptyStruct_OptType, offsetOld: 96, offsetV1: 104),
   ],
-  ctor: ThreeByte._ctor,
+  ctor: StructWithOptionals._ctor,
 );
 
-class FiveByte extends $fidl.Struct {
-  const FiveByte({
-    @required this.elem1,
-    @required this.elem2,
+class TransactionHeader extends $fidl.Struct {
+  const TransactionHeader({
+    @required this.txId,
+    @required this.flags,
+    @required this.magicNumber,
+    @required this.ordinal,
   });
-  FiveByte.clone(
-    FiveByte $orig, {
-    int elem1,
-    int elem2,
+  TransactionHeader.clone(
+    TransactionHeader $orig, {
+    int txId,
+    Uint8List flags,
+    int magicNumber,
+    int ordinal,
   }) : this(
-          elem1: elem1 ?? $orig.elem1,
-          elem2: elem2 ?? $orig.elem2,
+          txId: txId ?? $orig.txId,
+          flags: flags ?? $orig.flags,
+          magicNumber: magicNumber ?? $orig.magicNumber,
+          ordinal: ordinal ?? $orig.ordinal,
         );
 
-  FiveByte._(List<Object> argv)
-      : elem1 = argv[0],
-        elem2 = argv[1];
-  final int elem1;
-  final int elem2;
+  TransactionHeader._(List<Object> argv)
+      : txId = argv[0],
+        flags = argv[1],
+        magicNumber = argv[2],
+        ordinal = argv[3];
+  final int txId;
+  final Uint8List flags;
+  final int magicNumber;
+  final int ordinal;
 
   @override
   List<Object> get $fields {
     return <Object>[
-      elem1,
-      elem2,
+      txId,
+      flags,
+      magicNumber,
+      ordinal,
     ];
   }
 
   @override
   String toString() {
     // ignore: prefer_interpolation_to_compose_strings
-    return r'FiveByte' r'(elem1: ' +
-        elem1.toString() +
-        r', elem2: ' +
-        elem2.toString() +
+    return r'TransactionHeader' r'(txId: ' +
+        txId.toString() +
+        r', flags: ' +
+        flags.toString() +
+        r', magicNumber: ' +
+        magicNumber.toString() +
+        r', ordinal: ' +
+        ordinal.toString() +
         r')';
   }
 
-  static FiveByte _ctor(List<Object> argv) => FiveByte._(argv);
+  static TransactionHeader _ctor(List<Object> argv) =>
+      TransactionHeader._(argv);
 }
 
 // See FIDL-308:
 // ignore: recursive_compile_time_constant
-const $fidl.StructType<FiveByte> kFiveByte_Type = $fidl.StructType<FiveByte>(
-  inlineSizeOld: 8,
-  inlineSizeV1: 8,
+const $fidl.StructType<TransactionHeader> kTransactionHeader_Type =
+    $fidl.StructType<TransactionHeader>(
+  inlineSizeOld: 16,
+  inlineSizeV1: 16,
   members: <$fidl.MemberType>[
     $fidl.MemberType<int>(type: $fidl.Uint32Type(), offsetOld: 0, offsetV1: 0),
-    $fidl.MemberType<int>(type: $fidl.Uint8Type(), offsetOld: 4, offsetV1: 4),
+    $fidl.MemberType<Uint8List>(
+        type: $fidl.ArrayType<Uint8List>(
+            element: $fidl.Uint8Type(), elementCount: 3),
+        offsetOld: 4,
+        offsetV1: 4),
+    $fidl.MemberType<int>(type: $fidl.Uint8Type(), offsetOld: 7, offsetV1: 7),
+    $fidl.MemberType<int>(type: $fidl.Uint64Type(), offsetOld: 8, offsetV1: 8),
   ],
-  ctor: FiveByte._ctor,
-);
-
-class ThreeByteInStruct extends $fidl.Struct {
-  const ThreeByteInStruct({
-    @required this.elem1,
-    @required this.elem2,
-    @required this.elem3,
-  });
-  ThreeByteInStruct.clone(
-    ThreeByteInStruct $orig, {
-    ThreeByte elem1,
-    ThreeByte elem2,
-    ThreeByte elem3,
-  }) : this(
-          elem1: elem1 ?? $orig.elem1,
-          elem2: elem2 ?? $orig.elem2,
-          elem3: elem3 ?? $orig.elem3,
-        );
-
-  ThreeByteInStruct._(List<Object> argv)
-      : elem1 = argv[0],
-        elem2 = argv[1],
-        elem3 = argv[2];
-  final ThreeByte elem1;
-  final ThreeByte elem2;
-  final ThreeByte elem3;
-
-  @override
-  List<Object> get $fields {
-    return <Object>[
-      elem1,
-      elem2,
-      elem3,
-    ];
-  }
-
-  @override
-  String toString() {
-    // ignore: prefer_interpolation_to_compose_strings
-    return r'ThreeByteInStruct' r'(elem1: ' +
-        elem1.toString() +
-        r', elem2: ' +
-        elem2.toString() +
-        r', elem3: ' +
-        elem3.toString() +
-        r')';
-  }
-
-  static ThreeByteInStruct _ctor(List<Object> argv) =>
-      ThreeByteInStruct._(argv);
-}
-
-// See FIDL-308:
-// ignore: recursive_compile_time_constant
-const $fidl.StructType<ThreeByteInStruct> kThreeByteInStruct_Type =
-    $fidl.StructType<ThreeByteInStruct>(
-  inlineSizeOld: 9,
-  inlineSizeV1: 9,
-  members: <$fidl.MemberType>[
-    $fidl.MemberType<ThreeByte>(
-        type: kThreeByte_Type, offsetOld: 0, offsetV1: 0),
-    $fidl.MemberType<ThreeByte>(
-        type: kThreeByte_Type, offsetOld: 3, offsetV1: 3),
-    $fidl.MemberType<ThreeByte>(
-        type: kThreeByte_Type, offsetOld: 6, offsetV1: 6),
-  ],
-  ctor: ThreeByteInStruct._ctor,
-);
-
-class FiveByteInStruct extends $fidl.Struct {
-  const FiveByteInStruct({
-    @required this.elem1,
-    @required this.elem2,
-    @required this.elem3,
-  });
-  FiveByteInStruct.clone(
-    FiveByteInStruct $orig, {
-    FiveByte elem1,
-    FiveByte elem2,
-    FiveByte elem3,
-  }) : this(
-          elem1: elem1 ?? $orig.elem1,
-          elem2: elem2 ?? $orig.elem2,
-          elem3: elem3 ?? $orig.elem3,
-        );
-
-  FiveByteInStruct._(List<Object> argv)
-      : elem1 = argv[0],
-        elem2 = argv[1],
-        elem3 = argv[2];
-  final FiveByte elem1;
-  final FiveByte elem2;
-  final FiveByte elem3;
-
-  @override
-  List<Object> get $fields {
-    return <Object>[
-      elem1,
-      elem2,
-      elem3,
-    ];
-  }
-
-  @override
-  String toString() {
-    // ignore: prefer_interpolation_to_compose_strings
-    return r'FiveByteInStruct' r'(elem1: ' +
-        elem1.toString() +
-        r', elem2: ' +
-        elem2.toString() +
-        r', elem3: ' +
-        elem3.toString() +
-        r')';
-  }
-
-  static FiveByteInStruct _ctor(List<Object> argv) => FiveByteInStruct._(argv);
-}
-
-// See FIDL-308:
-// ignore: recursive_compile_time_constant
-const $fidl.StructType<FiveByteInStruct> kFiveByteInStruct_Type =
-    $fidl.StructType<FiveByteInStruct>(
-  inlineSizeOld: 24,
-  inlineSizeV1: 24,
-  members: <$fidl.MemberType>[
-    $fidl.MemberType<FiveByte>(type: kFiveByte_Type, offsetOld: 0, offsetV1: 0),
-    $fidl.MemberType<FiveByte>(type: kFiveByte_Type, offsetOld: 8, offsetV1: 8),
-    $fidl.MemberType<FiveByte>(
-        type: kFiveByte_Type, offsetOld: 16, offsetV1: 16),
-  ],
-  ctor: FiveByteInStruct._ctor,
-);
-
-class ThreeByteInVector extends $fidl.Struct {
-  const ThreeByteInVector({
-    @required this.elems,
-  });
-  ThreeByteInVector.clone(
-    ThreeByteInVector $orig, {
-    List<ThreeByte> elems,
-  }) : this(
-          elems: elems ?? $orig.elems,
-        );
-
-  ThreeByteInVector._(List<Object> argv) : elems = argv[0];
-  final List<ThreeByte> elems;
-
-  @override
-  List<Object> get $fields {
-    return <Object>[
-      elems,
-    ];
-  }
-
-  @override
-  String toString() {
-    // ignore: prefer_interpolation_to_compose_strings
-    return r'ThreeByteInVector' r'(elems: ' + elems.toString() + r')';
-  }
-
-  static ThreeByteInVector _ctor(List<Object> argv) =>
-      ThreeByteInVector._(argv);
-}
-
-// See FIDL-308:
-// ignore: recursive_compile_time_constant
-const $fidl.StructType<ThreeByteInVector> kThreeByteInVector_Type =
-    $fidl.StructType<ThreeByteInVector>(
-  inlineSizeOld: 16,
-  inlineSizeV1: 16,
-  members: <$fidl.MemberType>[
-    $fidl.MemberType<List<ThreeByte>>(
-        type: $fidl.VectorType<List<ThreeByte>>(
-            element: kThreeByte_Type, maybeElementCount: null, nullable: false),
-        offsetOld: 0,
-        offsetV1: 0),
-  ],
-  ctor: ThreeByteInVector._ctor,
-);
-
-class FiveByteInVector extends $fidl.Struct {
-  const FiveByteInVector({
-    @required this.elems,
-  });
-  FiveByteInVector.clone(
-    FiveByteInVector $orig, {
-    List<FiveByte> elems,
-  }) : this(
-          elems: elems ?? $orig.elems,
-        );
-
-  FiveByteInVector._(List<Object> argv) : elems = argv[0];
-  final List<FiveByte> elems;
-
-  @override
-  List<Object> get $fields {
-    return <Object>[
-      elems,
-    ];
-  }
-
-  @override
-  String toString() {
-    // ignore: prefer_interpolation_to_compose_strings
-    return r'FiveByteInVector' r'(elems: ' + elems.toString() + r')';
-  }
-
-  static FiveByteInVector _ctor(List<Object> argv) => FiveByteInVector._(argv);
-}
-
-// See FIDL-308:
-// ignore: recursive_compile_time_constant
-const $fidl.StructType<FiveByteInVector> kFiveByteInVector_Type =
-    $fidl.StructType<FiveByteInVector>(
-  inlineSizeOld: 16,
-  inlineSizeV1: 16,
-  members: <$fidl.MemberType>[
-    $fidl.MemberType<List<FiveByte>>(
-        type: $fidl.VectorType<List<FiveByte>>(
-            element: kFiveByte_Type, maybeElementCount: null, nullable: false),
-        offsetOld: 0,
-        offsetV1: 0),
-  ],
-  ctor: FiveByteInVector._ctor,
-);
-
-class ThreeByteInArray extends $fidl.Struct {
-  const ThreeByteInArray({
-    @required this.elems,
-  });
-  ThreeByteInArray.clone(
-    ThreeByteInArray $orig, {
-    List<ThreeByte> elems,
-  }) : this(
-          elems: elems ?? $orig.elems,
-        );
-
-  ThreeByteInArray._(List<Object> argv) : elems = argv[0];
-  final List<ThreeByte> elems;
-
-  @override
-  List<Object> get $fields {
-    return <Object>[
-      elems,
-    ];
-  }
-
-  @override
-  String toString() {
-    // ignore: prefer_interpolation_to_compose_strings
-    return r'ThreeByteInArray' r'(elems: ' + elems.toString() + r')';
-  }
-
-  static ThreeByteInArray _ctor(List<Object> argv) => ThreeByteInArray._(argv);
-}
-
-// See FIDL-308:
-// ignore: recursive_compile_time_constant
-const $fidl.StructType<ThreeByteInArray> kThreeByteInArray_Type =
-    $fidl.StructType<ThreeByteInArray>(
-  inlineSizeOld: 9,
-  inlineSizeV1: 9,
-  members: <$fidl.MemberType>[
-    $fidl.MemberType<List<ThreeByte>>(
-        type: $fidl.ArrayType<List<ThreeByte>>(
-            element: kThreeByte_Type, elementCount: 3),
-        offsetOld: 0,
-        offsetV1: 0),
-  ],
-  ctor: ThreeByteInArray._ctor,
-);
-
-class FiveByteInArray extends $fidl.Struct {
-  const FiveByteInArray({
-    @required this.elems,
-  });
-  FiveByteInArray.clone(
-    FiveByteInArray $orig, {
-    List<FiveByte> elems,
-  }) : this(
-          elems: elems ?? $orig.elems,
-        );
-
-  FiveByteInArray._(List<Object> argv) : elems = argv[0];
-  final List<FiveByte> elems;
-
-  @override
-  List<Object> get $fields {
-    return <Object>[
-      elems,
-    ];
-  }
-
-  @override
-  String toString() {
-    // ignore: prefer_interpolation_to_compose_strings
-    return r'FiveByteInArray' r'(elems: ' + elems.toString() + r')';
-  }
-
-  static FiveByteInArray _ctor(List<Object> argv) => FiveByteInArray._(argv);
-}
-
-// See FIDL-308:
-// ignore: recursive_compile_time_constant
-const $fidl.StructType<FiveByteInArray> kFiveByteInArray_Type =
-    $fidl.StructType<FiveByteInArray>(
-  inlineSizeOld: 24,
-  inlineSizeV1: 24,
-  members: <$fidl.MemberType>[
-    $fidl.MemberType<List<FiveByte>>(
-        type: $fidl.ArrayType<List<FiveByte>>(
-            element: kFiveByte_Type, elementCount: 3),
-        offsetOld: 0,
-        offsetV1: 0),
-  ],
-  ctor: FiveByteInArray._ctor,
+  ctor: TransactionHeader._ctor,
 );
 
 class StructSize16Align8 extends $fidl.Struct {
@@ -5056,6 +5852,62 @@
   ctor: Sandwich1._ctor,
 );
 
+class Sandwich1Message extends $fidl.Struct {
+  const Sandwich1Message({
+    @required this.header,
+    @required this.body,
+  });
+  Sandwich1Message.clone(
+    Sandwich1Message $orig, {
+    TransactionHeader header,
+    Sandwich1 body,
+  }) : this(
+          header: header ?? $orig.header,
+          body: body ?? $orig.body,
+        );
+
+  Sandwich1Message._(List<Object> argv)
+      : header = argv[0],
+        body = argv[1];
+  final TransactionHeader header;
+  final Sandwich1 body;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      header,
+      body,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'Sandwich1Message' r'(header: ' +
+        header.toString() +
+        r', body: ' +
+        body.toString() +
+        r')';
+  }
+
+  static Sandwich1Message _ctor(List<Object> argv) => Sandwich1Message._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<Sandwich1Message> kSandwich1Message_Type =
+    $fidl.StructType<Sandwich1Message>(
+  inlineSizeOld: 32,
+  inlineSizeV1: 56,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<TransactionHeader>(
+        type: kTransactionHeader_Type, offsetOld: 0, offsetV1: 0),
+    $fidl.MemberType<Sandwich1>(
+        type: kSandwich1_Type, offsetOld: 16, offsetV1: 16),
+  ],
+  ctor: Sandwich1Message._ctor,
+);
+
 class Sandwich1WithOptUnion extends $fidl.Struct {
   const Sandwich1WithOptUnion({
     @required this.before,
@@ -5323,6 +6175,62 @@
   ctor: Sandwich4._ctor,
 );
 
+class Sandwich4Message extends $fidl.Struct {
+  const Sandwich4Message({
+    @required this.header,
+    @required this.body,
+  });
+  Sandwich4Message.clone(
+    Sandwich4Message $orig, {
+    TransactionHeader header,
+    Sandwich4 body,
+  }) : this(
+          header: header ?? $orig.header,
+          body: body ?? $orig.body,
+        );
+
+  Sandwich4Message._(List<Object> argv)
+      : header = argv[0],
+        body = argv[1];
+  final TransactionHeader header;
+  final Sandwich4 body;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      header,
+      body,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'Sandwich4Message' r'(header: ' +
+        header.toString() +
+        r', body: ' +
+        body.toString() +
+        r')';
+  }
+
+  static Sandwich4Message _ctor(List<Object> argv) => Sandwich4Message._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<Sandwich4Message> kSandwich4Message_Type =
+    $fidl.StructType<Sandwich4Message>(
+  inlineSizeOld: 64,
+  inlineSizeV1: 56,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<TransactionHeader>(
+        type: kTransactionHeader_Type, offsetOld: 0, offsetV1: 0),
+    $fidl.MemberType<Sandwich4>(
+        type: kSandwich4_Type, offsetOld: 16, offsetV1: 16),
+  ],
+  ctor: Sandwich4Message._ctor,
+);
+
 class Sandwich5 extends $fidl.Struct {
   const Sandwich5({
     @required this.before,
@@ -5387,6 +6295,62 @@
   ctor: Sandwich5._ctor,
 );
 
+class Sandwich5Message extends $fidl.Struct {
+  const Sandwich5Message({
+    @required this.header,
+    @required this.body,
+  });
+  Sandwich5Message.clone(
+    Sandwich5Message $orig, {
+    TransactionHeader header,
+    Sandwich5 body,
+  }) : this(
+          header: header ?? $orig.header,
+          body: body ?? $orig.body,
+        );
+
+  Sandwich5Message._(List<Object> argv)
+      : header = argv[0],
+        body = argv[1];
+  final TransactionHeader header;
+  final Sandwich5 body;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      header,
+      body,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'Sandwich5Message' r'(header: ' +
+        header.toString() +
+        r', body: ' +
+        body.toString() +
+        r')';
+  }
+
+  static Sandwich5Message _ctor(List<Object> argv) => Sandwich5Message._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<Sandwich5Message> kSandwich5Message_Type =
+    $fidl.StructType<Sandwich5Message>(
+  inlineSizeOld: 64,
+  inlineSizeV1: 56,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<TransactionHeader>(
+        type: kTransactionHeader_Type, offsetOld: 0, offsetV1: 0),
+    $fidl.MemberType<Sandwich5>(
+        type: kSandwich5_Type, offsetOld: 16, offsetV1: 16),
+  ],
+  ctor: Sandwich5Message._ctor,
+);
+
 class StructSize3Align1 extends $fidl.Struct {
   const StructSize3Align1({
     @required this.threeBytes,
@@ -5628,6 +6592,62 @@
   ctor: Sandwich7._ctor,
 );
 
+class Sandwich7Message extends $fidl.Struct {
+  const Sandwich7Message({
+    @required this.header,
+    @required this.body,
+  });
+  Sandwich7Message.clone(
+    Sandwich7Message $orig, {
+    TransactionHeader header,
+    Sandwich7 body,
+  }) : this(
+          header: header ?? $orig.header,
+          body: body ?? $orig.body,
+        );
+
+  Sandwich7Message._(List<Object> argv)
+      : header = argv[0],
+        body = argv[1];
+  final TransactionHeader header;
+  final Sandwich7 body;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      header,
+      body,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'Sandwich7Message' r'(header: ' +
+        header.toString() +
+        r', body: ' +
+        body.toString() +
+        r')';
+  }
+
+  static Sandwich7Message _ctor(List<Object> argv) => Sandwich7Message._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<Sandwich7Message> kSandwich7Message_Type =
+    $fidl.StructType<Sandwich7Message>(
+  inlineSizeOld: 40,
+  inlineSizeV1: 40,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<TransactionHeader>(
+        type: kTransactionHeader_Type, offsetOld: 0, offsetV1: 0),
+    $fidl.MemberType<Sandwich7>(
+        type: kSandwich7_Type, offsetOld: 16, offsetV1: 16),
+  ],
+  ctor: Sandwich7Message._ctor,
+);
+
 class Sandwich8 extends $fidl.Struct {
   const Sandwich8({
     @required this.before,
@@ -5891,6 +6911,95 @@
   ctor: Regression3._ctor,
 );
 
+class StructTableNoFields extends $fidl.Struct {
+  const StructTableNoFields({
+    @required this.t,
+  });
+  StructTableNoFields.clone(
+    StructTableNoFields $orig, {
+    TableNoFields t,
+  }) : this(
+          t: t ?? $orig.t,
+        );
+
+  StructTableNoFields._(List<Object> argv) : t = argv[0];
+  final TableNoFields t;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      t,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'StructTableNoFields' r'(t: ' + t.toString() + r')';
+  }
+
+  static StructTableNoFields _ctor(List<Object> argv) =>
+      StructTableNoFields._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<StructTableNoFields> kStruct_Table_NoFields_Type =
+    $fidl.StructType<StructTableNoFields>(
+  inlineSizeOld: 16,
+  inlineSizeV1: 16,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<TableNoFields>(
+        type: kTable_NoFields_Type, offsetOld: 0, offsetV1: 0),
+  ],
+  ctor: StructTableNoFields._ctor,
+);
+
+class StructTableTwoReservedFields extends $fidl.Struct {
+  const StructTableTwoReservedFields({
+    @required this.t,
+  });
+  StructTableTwoReservedFields.clone(
+    StructTableTwoReservedFields $orig, {
+    TableTwoReservedFields t,
+  }) : this(
+          t: t ?? $orig.t,
+        );
+
+  StructTableTwoReservedFields._(List<Object> argv) : t = argv[0];
+  final TableTwoReservedFields t;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      t,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'StructTableTwoReservedFields' r'(t: ' + t.toString() + r')';
+  }
+
+  static StructTableTwoReservedFields _ctor(List<Object> argv) =>
+      StructTableTwoReservedFields._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<StructTableTwoReservedFields>
+    kStruct_Table_TwoReservedFields_Type =
+    $fidl.StructType<StructTableTwoReservedFields>(
+  inlineSizeOld: 16,
+  inlineSizeV1: 16,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<TableTwoReservedFields>(
+        type: kTable_TwoReservedFields_Type, offsetOld: 0, offsetV1: 0),
+  ],
+  ctor: StructTableTwoReservedFields._ctor,
+);
+
 class TableStructWithReservedSandwichStruct extends $fidl.Struct {
   const TableStructWithReservedSandwichStruct({
     @required this.table,
@@ -7113,6 +8222,876 @@
   ctor: Regression4._ctor,
 );
 
+class Regression5 extends $fidl.Struct {
+  const Regression5({
+    @required this.f1,
+    @required this.f2,
+    @required this.f3,
+    @required this.f4,
+    @required this.f5,
+    @required this.f6,
+  });
+  Regression5.clone(
+    Regression5 $orig, {
+    int f1,
+    int f2,
+    int f3,
+    int f4,
+    int f5,
+    int f6,
+  }) : this(
+          f1: f1 ?? $orig.f1,
+          f2: f2 ?? $orig.f2,
+          f3: f3 ?? $orig.f3,
+          f4: f4 ?? $orig.f4,
+          f5: f5 ?? $orig.f5,
+          f6: f6 ?? $orig.f6,
+        );
+
+  Regression5._(List<Object> argv)
+      : f1 = argv[0],
+        f2 = argv[1],
+        f3 = argv[2],
+        f4 = argv[3],
+        f5 = argv[4],
+        f6 = argv[5];
+  final int f1;
+  final int f2;
+  final int f3;
+  final int f4;
+  final int f5;
+  final int f6;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      f1,
+      f2,
+      f3,
+      f4,
+      f5,
+      f6,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'Regression5' r'(f1: ' +
+        f1.toString() +
+        r', f2: ' +
+        f2.toString() +
+        r', f3: ' +
+        f3.toString() +
+        r', f4: ' +
+        f4.toString() +
+        r', f5: ' +
+        f5.toString() +
+        r', f6: ' +
+        f6.toString() +
+        r')';
+  }
+
+  static Regression5 _ctor(List<Object> argv) => Regression5._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<Regression5> kRegression5_Type =
+    $fidl.StructType<Regression5>(
+  inlineSizeOld: 32,
+  inlineSizeV1: 32,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<int>(type: $fidl.Uint8Type(), offsetOld: 0, offsetV1: 0),
+    $fidl.MemberType<int>(type: $fidl.Uint32Type(), offsetOld: 4, offsetV1: 4),
+    $fidl.MemberType<int>(type: $fidl.Uint8Type(), offsetOld: 8, offsetV1: 8),
+    $fidl.MemberType<int>(
+        type: $fidl.Uint16Type(), offsetOld: 10, offsetV1: 10),
+    $fidl.MemberType<int>(
+        type: $fidl.Uint64Type(), offsetOld: 16, offsetV1: 16),
+    $fidl.MemberType<int>(type: $fidl.Uint8Type(), offsetOld: 24, offsetV1: 24),
+  ],
+  ctor: Regression5._ctor,
+);
+
+class Regression6 extends $fidl.Struct {
+  const Regression6({
+    @required this.f1,
+    @required this.f2,
+    @required this.f3,
+    @required this.f4,
+    @required this.f5,
+    @required this.f6,
+  });
+  Regression6.clone(
+    Regression6 $orig, {
+    int f1,
+    int f2,
+    int f3,
+    int f4,
+    int f5,
+    int f6,
+  }) : this(
+          f1: f1 ?? $orig.f1,
+          f2: f2 ?? $orig.f2,
+          f3: f3 ?? $orig.f3,
+          f4: f4 ?? $orig.f4,
+          f5: f5 ?? $orig.f5,
+          f6: f6 ?? $orig.f6,
+        );
+
+  Regression6._(List<Object> argv)
+      : f1 = argv[0],
+        f2 = argv[1],
+        f3 = argv[2],
+        f4 = argv[3],
+        f5 = argv[4],
+        f6 = argv[5];
+  final int f1;
+  final int f2;
+  final int f3;
+  final int f4;
+  final int f5;
+  final int f6;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      f1,
+      f2,
+      f3,
+      f4,
+      f5,
+      f6,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'Regression6' r'(f1: ' +
+        f1.toString() +
+        r', f2: ' +
+        f2.toString() +
+        r', f3: ' +
+        f3.toString() +
+        r', f4: ' +
+        f4.toString() +
+        r', f5: ' +
+        f5.toString() +
+        r', f6: ' +
+        f6.toString() +
+        r')';
+  }
+
+  static Regression6 _ctor(List<Object> argv) => Regression6._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<Regression6> kRegression6_Type =
+    $fidl.StructType<Regression6>(
+  inlineSizeOld: 32,
+  inlineSizeV1: 32,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<int>(type: $fidl.Uint8Type(), offsetOld: 0, offsetV1: 0),
+    $fidl.MemberType<int>(type: $fidl.Uint32Type(), offsetOld: 4, offsetV1: 4),
+    $fidl.MemberType<int>(type: $fidl.Uint8Type(), offsetOld: 8, offsetV1: 8),
+    $fidl.MemberType<int>(
+        type: $fidl.Uint16Type(), offsetOld: 10, offsetV1: 10),
+    $fidl.MemberType<int>(
+        type: $fidl.Uint64Type(), offsetOld: 16, offsetV1: 16),
+    $fidl.MemberType<int>(type: $fidl.Uint8Type(), offsetOld: 24, offsetV1: 24),
+  ],
+  ctor: Regression6._ctor,
+);
+
+class Regression7TableUnionXUnion extends $fidl.Struct {
+  const Regression7TableUnionXUnion({
+    @required this.value,
+  });
+  Regression7TableUnionXUnion.clone(
+    Regression7TableUnionXUnion $orig, {
+    TableOfUnionThenXUnionThenTableThenXUnionThenUnion value,
+  }) : this(
+          value: value ?? $orig.value,
+        );
+
+  Regression7TableUnionXUnion._(List<Object> argv) : value = argv[0];
+  final TableOfUnionThenXUnionThenTableThenXUnionThenUnion value;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      value,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'Regression7TableUnionXUnion' r'(value: ' + value.toString() + r')';
+  }
+
+  static Regression7TableUnionXUnion _ctor(List<Object> argv) =>
+      Regression7TableUnionXUnion._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<Regression7TableUnionXUnion>
+    kRegression7TableUnionXUnion_Type =
+    $fidl.StructType<Regression7TableUnionXUnion>(
+  inlineSizeOld: 16,
+  inlineSizeV1: 16,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<TableOfUnionThenXUnionThenTableThenXUnionThenUnion>(
+        type: kTableOfUnionThenXUnionThenTableThenXUnionThenUnion_Type,
+        offsetOld: 0,
+        offsetV1: 0),
+  ],
+  ctor: Regression7TableUnionXUnion._ctor,
+);
+
+class Regression8OptUnionSize12Align4 extends $fidl.Struct {
+  const Regression8OptUnionSize12Align4({
+    this.optUnion1,
+    this.optUnion2,
+    this.optUnion3,
+  });
+  Regression8OptUnionSize12Align4.clone(
+    Regression8OptUnionSize12Align4 $orig, {
+    UnionSize12Align4 optUnion1,
+    UnionSize12Align4 optUnion2,
+    UnionSize12Align4 optUnion3,
+  }) : this(
+          optUnion1: optUnion1 ?? $orig.optUnion1,
+          optUnion2: optUnion2 ?? $orig.optUnion2,
+          optUnion3: optUnion3 ?? $orig.optUnion3,
+        );
+
+  Regression8OptUnionSize12Align4.cloneWithout(
+    Regression8OptUnionSize12Align4 $orig, {
+    bool optUnion1,
+    bool optUnion2,
+    bool optUnion3,
+  }) : this(
+          optUnion1: optUnion1 ? null : $orig.optUnion1,
+          optUnion2: optUnion2 ? null : $orig.optUnion2,
+          optUnion3: optUnion3 ? null : $orig.optUnion3,
+        );
+
+  Regression8OptUnionSize12Align4._(List<Object> argv)
+      : optUnion1 = argv[0],
+        optUnion2 = argv[1],
+        optUnion3 = argv[2];
+  final UnionSize12Align4 optUnion1;
+  final UnionSize12Align4 optUnion2;
+  final UnionSize12Align4 optUnion3;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      optUnion1,
+      optUnion2,
+      optUnion3,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'Regression8OptUnionSize12Align4' r'(optUnion1: ' +
+        optUnion1.toString() +
+        r', optUnion2: ' +
+        optUnion2.toString() +
+        r', optUnion3: ' +
+        optUnion3.toString() +
+        r')';
+  }
+
+  static Regression8OptUnionSize12Align4 _ctor(List<Object> argv) =>
+      Regression8OptUnionSize12Align4._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<Regression8OptUnionSize12Align4>
+    kRegression8OptUnionSize12Align4_Type =
+    $fidl.StructType<Regression8OptUnionSize12Align4>(
+  inlineSizeOld: 24,
+  inlineSizeV1: 72,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<UnionSize12Align4>(
+        type: kUnionSize12Align4_OptType, offsetOld: 0, offsetV1: 0),
+    $fidl.MemberType<UnionSize12Align4>(
+        type: kUnionSize12Align4_OptType, offsetOld: 8, offsetV1: 24),
+    $fidl.MemberType<UnionSize12Align4>(
+        type: kUnionSize12Align4_OptType, offsetOld: 16, offsetV1: 48),
+  ],
+  ctor: Regression8OptUnionSize12Align4._ctor,
+);
+
+class Regression8VectorOfOptUnionSize12Align4 extends $fidl.Struct {
+  const Regression8VectorOfOptUnionSize12Align4({
+    @required this.value,
+  });
+  Regression8VectorOfOptUnionSize12Align4.clone(
+    Regression8VectorOfOptUnionSize12Align4 $orig, {
+    List<UnionSize12Align4> value,
+  }) : this(
+          value: value ?? $orig.value,
+        );
+
+  Regression8VectorOfOptUnionSize12Align4._(List<Object> argv)
+      : value = argv[0];
+  final List<UnionSize12Align4> value;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      value,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'Regression8VectorOfOptUnionSize12Align4' r'(value: ' +
+        value.toString() +
+        r')';
+  }
+
+  static Regression8VectorOfOptUnionSize12Align4 _ctor(List<Object> argv) =>
+      Regression8VectorOfOptUnionSize12Align4._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<Regression8VectorOfOptUnionSize12Align4>
+    kRegression8VectorOfOptUnionSize12Align4_Type =
+    $fidl.StructType<Regression8VectorOfOptUnionSize12Align4>(
+  inlineSizeOld: 16,
+  inlineSizeV1: 16,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<List<UnionSize12Align4>>(
+        type: $fidl.VectorType<List<UnionSize12Align4>>(
+            element: kUnionSize12Align4_OptType,
+            maybeElementCount: null,
+            nullable: false),
+        offsetOld: 0,
+        offsetV1: 0),
+  ],
+  ctor: Regression8VectorOfOptUnionSize12Align4._ctor,
+);
+
+class Regression8TableWithUnionSize12Align4 extends $fidl.Struct {
+  const Regression8TableWithUnionSize12Align4({
+    @required this.value,
+  });
+  Regression8TableWithUnionSize12Align4.clone(
+    Regression8TableWithUnionSize12Align4 $orig, {
+    TableWithUnionSize12Align4 value,
+  }) : this(
+          value: value ?? $orig.value,
+        );
+
+  Regression8TableWithUnionSize12Align4._(List<Object> argv) : value = argv[0];
+  final TableWithUnionSize12Align4 value;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      value,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'Regression8TableWithUnionSize12Align4' r'(value: ' +
+        value.toString() +
+        r')';
+  }
+
+  static Regression8TableWithUnionSize12Align4 _ctor(List<Object> argv) =>
+      Regression8TableWithUnionSize12Align4._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<Regression8TableWithUnionSize12Align4>
+    kRegression8TableWithUnionSize12Align4_Type =
+    $fidl.StructType<Regression8TableWithUnionSize12Align4>(
+  inlineSizeOld: 16,
+  inlineSizeV1: 16,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<TableWithUnionSize12Align4>(
+        type: kTableWithUnionSize12Align4_Type, offsetOld: 0, offsetV1: 0),
+  ],
+  ctor: Regression8TableWithUnionSize12Align4._ctor,
+);
+
+class StringUnionStruct extends $fidl.Struct {
+  const StringUnionStruct({
+    @required this.u,
+    this.nullableU,
+  });
+  StringUnionStruct.clone(
+    StringUnionStruct $orig, {
+    StringBoolUnion u,
+    StringBoolUnion nullableU,
+  }) : this(
+          u: u ?? $orig.u,
+          nullableU: nullableU ?? $orig.nullableU,
+        );
+
+  StringUnionStruct.cloneWithout(
+    StringUnionStruct $orig, {
+    bool nullableU,
+  }) : this(
+          u: $orig.u,
+          nullableU: nullableU ? null : $orig.nullableU,
+        );
+
+  StringUnionStruct._(List<Object> argv)
+      : u = argv[0],
+        nullableU = argv[1];
+  final StringBoolUnion u;
+  final StringBoolUnion nullableU;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      u,
+      nullableU,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'StringUnionStruct' r'(u: ' +
+        u.toString() +
+        r', nullableU: ' +
+        nullableU.toString() +
+        r')';
+  }
+
+  static StringUnionStruct _ctor(List<Object> argv) =>
+      StringUnionStruct._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<StringUnionStruct> kStringUnionStruct_Type =
+    $fidl.StructType<StringUnionStruct>(
+  inlineSizeOld: 32,
+  inlineSizeV1: 48,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<StringBoolUnion>(
+        type: kStringBoolUnion_Type, offsetOld: 0, offsetV1: 0),
+    $fidl.MemberType<StringBoolUnion>(
+        type: kStringBoolUnion_OptType, offsetOld: 24, offsetV1: 24),
+  ],
+  ctor: StringUnionStruct._ctor,
+);
+
+class StringUnionStructWrapper extends $fidl.Struct {
+  const StringUnionStructWrapper({
+    @required this.sus,
+  });
+  StringUnionStructWrapper.clone(
+    StringUnionStructWrapper $orig, {
+    StringUnionStruct sus,
+  }) : this(
+          sus: sus ?? $orig.sus,
+        );
+
+  StringUnionStructWrapper._(List<Object> argv) : sus = argv[0];
+  final StringUnionStruct sus;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      sus,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'StringUnionStructWrapper' r'(sus: ' + sus.toString() + r')';
+  }
+
+  static StringUnionStructWrapper _ctor(List<Object> argv) =>
+      StringUnionStructWrapper._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<StringUnionStructWrapper>
+    kStringUnionStructWrapper_Type = $fidl.StructType<StringUnionStructWrapper>(
+  inlineSizeOld: 32,
+  inlineSizeV1: 48,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<StringUnionStruct>(
+        type: kStringUnionStruct_Type, offsetOld: 0, offsetV1: 0),
+  ],
+  ctor: StringUnionStructWrapper._ctor,
+);
+
+class StringUnionStructWrapperResponse extends $fidl.Struct {
+  const StringUnionStructWrapperResponse({
+    @required this.header,
+    @required this.body,
+  });
+  StringUnionStructWrapperResponse.clone(
+    StringUnionStructWrapperResponse $orig, {
+    TransactionHeader header,
+    StringUnionStructWrapper body,
+  }) : this(
+          header: header ?? $orig.header,
+          body: body ?? $orig.body,
+        );
+
+  StringUnionStructWrapperResponse._(List<Object> argv)
+      : header = argv[0],
+        body = argv[1];
+  final TransactionHeader header;
+  final StringUnionStructWrapper body;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      header,
+      body,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'StringUnionStructWrapperResponse' r'(header: ' +
+        header.toString() +
+        r', body: ' +
+        body.toString() +
+        r')';
+  }
+
+  static StringUnionStructWrapperResponse _ctor(List<Object> argv) =>
+      StringUnionStructWrapperResponse._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<StringUnionStructWrapperResponse>
+    kStringUnionStructWrapperResponse_Type =
+    $fidl.StructType<StringUnionStructWrapperResponse>(
+  inlineSizeOld: 48,
+  inlineSizeV1: 64,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<TransactionHeader>(
+        type: kTransactionHeader_Type, offsetOld: 0, offsetV1: 0),
+    $fidl.MemberType<StringUnionStructWrapper>(
+        type: kStringUnionStructWrapper_Type, offsetOld: 16, offsetV1: 16),
+  ],
+  ctor: StringUnionStructWrapperResponse._ctor,
+);
+
+class Regression9Value extends $fidl.Struct {
+  const Regression9Value({
+    @required this.u,
+    this.nullableU,
+  });
+  Regression9Value.clone(
+    Regression9Value $orig, {
+    StringBoolUnion u,
+    StringBoolUnion nullableU,
+  }) : this(
+          u: u ?? $orig.u,
+          nullableU: nullableU ?? $orig.nullableU,
+        );
+
+  Regression9Value.cloneWithout(
+    Regression9Value $orig, {
+    bool nullableU,
+  }) : this(
+          u: $orig.u,
+          nullableU: nullableU ? null : $orig.nullableU,
+        );
+
+  Regression9Value._(List<Object> argv)
+      : u = argv[0],
+        nullableU = argv[1];
+  final StringBoolUnion u;
+  final StringBoolUnion nullableU;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      u,
+      nullableU,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'Regression9Value' r'(u: ' +
+        u.toString() +
+        r', nullableU: ' +
+        nullableU.toString() +
+        r')';
+  }
+
+  static Regression9Value _ctor(List<Object> argv) => Regression9Value._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<Regression9Value> kRegression9Value_Type =
+    $fidl.StructType<Regression9Value>(
+  inlineSizeOld: 32,
+  inlineSizeV1: 48,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<StringBoolUnion>(
+        type: kStringBoolUnion_Type, offsetOld: 0, offsetV1: 0),
+    $fidl.MemberType<StringBoolUnion>(
+        type: kStringBoolUnion_OptType, offsetOld: 24, offsetV1: 24),
+  ],
+  ctor: Regression9Value._ctor,
+);
+
+class Regression9Message extends $fidl.Struct {
+  const Regression9Message({
+    @required this.header,
+    @required this.body,
+  });
+  Regression9Message.clone(
+    Regression9Message $orig, {
+    TransactionHeader header,
+    Regression9Result body,
+  }) : this(
+          header: header ?? $orig.header,
+          body: body ?? $orig.body,
+        );
+
+  Regression9Message._(List<Object> argv)
+      : header = argv[0],
+        body = argv[1];
+  final TransactionHeader header;
+  final Regression9Result body;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      header,
+      body,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'Regression9Message' r'(header: ' +
+        header.toString() +
+        r', body: ' +
+        body.toString() +
+        r')';
+  }
+
+  static Regression9Message _ctor(List<Object> argv) =>
+      Regression9Message._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<Regression9Message> kRegression9Message_Type =
+    $fidl.StructType<Regression9Message>(
+  inlineSizeOld: 56,
+  inlineSizeV1: 40,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<TransactionHeader>(
+        type: kTransactionHeader_Type, offsetOld: 0, offsetV1: 0),
+    $fidl.MemberType<Regression9Result>(
+        type: kRegression9Result_Type, offsetOld: 16, offsetV1: 16),
+  ],
+  ctor: Regression9Message._ctor,
+);
+
+class Regression10V1 extends $fidl.Struct {
+  const Regression10V1({
+    @required this.table,
+  });
+  Regression10V1.clone(
+    Regression10V1 $orig, {
+    Regression10TableV1 table,
+  }) : this(
+          table: table ?? $orig.table,
+        );
+
+  Regression10V1._(List<Object> argv) : table = argv[0];
+  final Regression10TableV1 table;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      table,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'Regression10V1' r'(table: ' + table.toString() + r')';
+  }
+
+  static Regression10V1 _ctor(List<Object> argv) => Regression10V1._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<Regression10V1> kRegression10V1_Type =
+    $fidl.StructType<Regression10V1>(
+  inlineSizeOld: 16,
+  inlineSizeV1: 16,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<Regression10TableV1>(
+        type: kRegression10TableV1_Type, offsetOld: 0, offsetV1: 0),
+  ],
+  ctor: Regression10V1._ctor,
+);
+
+class Regression10V2 extends $fidl.Struct {
+  const Regression10V2({
+    @required this.table,
+  });
+  Regression10V2.clone(
+    Regression10V2 $orig, {
+    Regression10TableV2 table,
+  }) : this(
+          table: table ?? $orig.table,
+        );
+
+  Regression10V2._(List<Object> argv) : table = argv[0];
+  final Regression10TableV2 table;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      table,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'Regression10V2' r'(table: ' + table.toString() + r')';
+  }
+
+  static Regression10V2 _ctor(List<Object> argv) => Regression10V2._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<Regression10V2> kRegression10V2_Type =
+    $fidl.StructType<Regression10V2>(
+  inlineSizeOld: 16,
+  inlineSizeV1: 16,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<Regression10TableV2>(
+        type: kRegression10TableV2_Type, offsetOld: 0, offsetV1: 0),
+  ],
+  ctor: Regression10V2._ctor,
+);
+
+class Regression10V3 extends $fidl.Struct {
+  const Regression10V3({
+    @required this.table,
+  });
+  Regression10V3.clone(
+    Regression10V3 $orig, {
+    Regression10TableV3 table,
+  }) : this(
+          table: table ?? $orig.table,
+        );
+
+  Regression10V3._(List<Object> argv) : table = argv[0];
+  final Regression10TableV3 table;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      table,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'Regression10V3' r'(table: ' + table.toString() + r')';
+  }
+
+  static Regression10V3 _ctor(List<Object> argv) => Regression10V3._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<Regression10V3> kRegression10V3_Type =
+    $fidl.StructType<Regression10V3>(
+  inlineSizeOld: 16,
+  inlineSizeV1: 16,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<Regression10TableV3>(
+        type: kRegression10TableV3_Type, offsetOld: 0, offsetV1: 0),
+  ],
+  ctor: Regression10V3._ctor,
+);
+
+class Regression11 extends $fidl.Struct {
+  const Regression11({
+    @required this.tableOfTable,
+  });
+  Regression11.clone(
+    Regression11 $orig, {
+    UnionWithRegression10Table tableOfTable,
+  }) : this(
+          tableOfTable: tableOfTable ?? $orig.tableOfTable,
+        );
+
+  Regression11._(List<Object> argv) : tableOfTable = argv[0];
+  final UnionWithRegression10Table tableOfTable;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      tableOfTable,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'Regression11' r'(tableOfTable: ' + tableOfTable.toString() + r')';
+  }
+
+  static Regression11 _ctor(List<Object> argv) => Regression11._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<Regression11> kRegression11_Type =
+    $fidl.StructType<Regression11>(
+  inlineSizeOld: 24,
+  inlineSizeV1: 24,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<UnionWithRegression10Table>(
+        type: kUnionWithRegression10Table_Type, offsetOld: 0, offsetV1: 0),
+  ],
+  ctor: Regression11._ctor,
+);
+
 class Sandwich4Align8 extends $fidl.Struct {
   const Sandwich4Align8({
     @required this.sandwich4,
@@ -7602,6 +9581,543 @@
   ctor: CreateComponentRequest._ctor,
 );
 
+class CompatTable extends $fidl.Struct {
+  const CompatTable({
+    @required this.value,
+    @required this.empty,
+  });
+  CompatTable.clone(
+    CompatTable $orig, {
+    CompatTableValue value,
+    String empty,
+  }) : this(
+          value: value ?? $orig.value,
+          empty: empty ?? $orig.empty,
+        );
+
+  CompatTable._(List<Object> argv)
+      : value = argv[0],
+        empty = argv[1];
+  final CompatTableValue value;
+  final String empty;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      value,
+      empty,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'CompatTable' r'(value: ' +
+        value.toString() +
+        r', empty: ' +
+        empty.toString() +
+        r')';
+  }
+
+  static CompatTable _ctor(List<Object> argv) => CompatTable._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<CompatTable> kCompatTable_Type =
+    $fidl.StructType<CompatTable>(
+  inlineSizeOld: 32,
+  inlineSizeV1: 32,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<CompatTableValue>(
+        type: kCompatTableValue_Type, offsetOld: 0, offsetV1: 0),
+    $fidl.MemberType<String>(
+        type: $fidl.StringType(maybeElementCount: null, nullable: false),
+        offsetOld: 16,
+        offsetV1: 16),
+  ],
+  ctor: CompatTable._ctor,
+);
+
+class MixedFieldsBody extends $fidl.Struct {
+  const MixedFieldsBody({
+    @required this.before,
+    @required this.firstUnion,
+    @required this.middleStart,
+    @required this.middleEnd,
+    @required this.secondUnion,
+    @required this.after,
+  });
+  MixedFieldsBody.clone(
+    MixedFieldsBody $orig, {
+    int before,
+    UnionSize8Align4 firstUnion,
+    int middleStart,
+    int middleEnd,
+    UnionSize8Align4 secondUnion,
+    int after,
+  }) : this(
+          before: before ?? $orig.before,
+          firstUnion: firstUnion ?? $orig.firstUnion,
+          middleStart: middleStart ?? $orig.middleStart,
+          middleEnd: middleEnd ?? $orig.middleEnd,
+          secondUnion: secondUnion ?? $orig.secondUnion,
+          after: after ?? $orig.after,
+        );
+
+  MixedFieldsBody._(List<Object> argv)
+      : before = argv[0],
+        firstUnion = argv[1],
+        middleStart = argv[2],
+        middleEnd = argv[3],
+        secondUnion = argv[4],
+        after = argv[5];
+  final int before;
+  final UnionSize8Align4 firstUnion;
+  final int middleStart;
+  final int middleEnd;
+  final UnionSize8Align4 secondUnion;
+  final int after;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      before,
+      firstUnion,
+      middleStart,
+      middleEnd,
+      secondUnion,
+      after,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'MixedFieldsBody' r'(before: ' +
+        before.toString() +
+        r', firstUnion: ' +
+        firstUnion.toString() +
+        r', middleStart: ' +
+        middleStart.toString() +
+        r', middleEnd: ' +
+        middleEnd.toString() +
+        r', secondUnion: ' +
+        secondUnion.toString() +
+        r', after: ' +
+        after.toString() +
+        r')';
+  }
+
+  static MixedFieldsBody _ctor(List<Object> argv) => MixedFieldsBody._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<MixedFieldsBody> kMixedFieldsBody_Type =
+    $fidl.StructType<MixedFieldsBody>(
+  inlineSizeOld: 40,
+  inlineSizeV1: 80,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<int>(type: $fidl.Uint32Type(), offsetOld: 0, offsetV1: 0),
+    $fidl.MemberType<UnionSize8Align4>(
+        type: kUnionSize8Align4_Type, offsetOld: 4, offsetV1: 8),
+    $fidl.MemberType<int>(
+        type: $fidl.Uint16Type(), offsetOld: 12, offsetV1: 32),
+    $fidl.MemberType<int>(
+        type: $fidl.Uint64Type(), offsetOld: 16, offsetV1: 40),
+    $fidl.MemberType<UnionSize8Align4>(
+        type: kUnionSize8Align4_Type, offsetOld: 24, offsetV1: 48),
+    $fidl.MemberType<int>(
+        type: $fidl.Uint32Type(), offsetOld: 32, offsetV1: 72),
+  ],
+  ctor: MixedFieldsBody._ctor,
+);
+
+class MixedFieldsMessage extends $fidl.Struct {
+  const MixedFieldsMessage({
+    @required this.header,
+    @required this.body,
+  });
+  MixedFieldsMessage.clone(
+    MixedFieldsMessage $orig, {
+    TransactionHeader header,
+    MixedFieldsBody body,
+  }) : this(
+          header: header ?? $orig.header,
+          body: body ?? $orig.body,
+        );
+
+  MixedFieldsMessage._(List<Object> argv)
+      : header = argv[0],
+        body = argv[1];
+  final TransactionHeader header;
+  final MixedFieldsBody body;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      header,
+      body,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'MixedFieldsMessage' r'(header: ' +
+        header.toString() +
+        r', body: ' +
+        body.toString() +
+        r')';
+  }
+
+  static MixedFieldsMessage _ctor(List<Object> argv) =>
+      MixedFieldsMessage._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<MixedFieldsMessage> kMixedFieldsMessage_Type =
+    $fidl.StructType<MixedFieldsMessage>(
+  inlineSizeOld: 56,
+  inlineSizeV1: 96,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<TransactionHeader>(
+        type: kTransactionHeader_Type, offsetOld: 0, offsetV1: 0),
+    $fidl.MemberType<MixedFieldsBody>(
+        type: kMixedFieldsBody_Type, offsetOld: 16, offsetV1: 16),
+  ],
+  ctor: MixedFieldsMessage._ctor,
+);
+
+class StructOfTableWithXUnion extends $fidl.Struct {
+  const StructOfTableWithXUnion({
+    @required this.value,
+  });
+  StructOfTableWithXUnion.clone(
+    StructOfTableWithXUnion $orig, {
+    TableWithXUnion value,
+  }) : this(
+          value: value ?? $orig.value,
+        );
+
+  StructOfTableWithXUnion._(List<Object> argv) : value = argv[0];
+  final TableWithXUnion value;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      value,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'StructOfTableWithXUnion' r'(value: ' + value.toString() + r')';
+  }
+
+  static StructOfTableWithXUnion _ctor(List<Object> argv) =>
+      StructOfTableWithXUnion._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<StructOfTableWithXUnion> kStructOfTableWithXUnion_Type =
+    $fidl.StructType<StructOfTableWithXUnion>(
+  inlineSizeOld: 16,
+  inlineSizeV1: 16,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<TableWithXUnion>(
+        type: kTableWithXUnion_Type, offsetOld: 0, offsetV1: 0),
+  ],
+  ctor: StructOfTableWithXUnion._ctor,
+);
+
+class Int64Struct extends $fidl.Struct {
+  const Int64Struct({
+    @required this.x,
+  });
+  Int64Struct.clone(
+    Int64Struct $orig, {
+    int x,
+  }) : this(
+          x: x ?? $orig.x,
+        );
+
+  Int64Struct._(List<Object> argv) : x = argv[0];
+  final int x;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      x,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'Int64Struct' r'(x: ' + x.toString() + r')';
+  }
+
+  static Int64Struct _ctor(List<Object> argv) => Int64Struct._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<Int64Struct> kInt64Struct_Type =
+    $fidl.StructType<Int64Struct>(
+  inlineSizeOld: 8,
+  inlineSizeV1: 8,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<int>(type: $fidl.Int64Type(), offsetOld: 0, offsetV1: 0),
+  ],
+  ctor: Int64Struct._ctor,
+);
+
+class TestInlineXUnionInStruct extends $fidl.Struct {
+  const TestInlineXUnionInStruct({
+    @required this.before,
+    @required this.xu,
+    @required this.after,
+  });
+  TestInlineXUnionInStruct.clone(
+    TestInlineXUnionInStruct $orig, {
+    String before,
+    SampleXUnion xu,
+    String after,
+  }) : this(
+          before: before ?? $orig.before,
+          xu: xu ?? $orig.xu,
+          after: after ?? $orig.after,
+        );
+
+  TestInlineXUnionInStruct._(List<Object> argv)
+      : before = argv[0],
+        xu = argv[1],
+        after = argv[2];
+  final String before;
+  final SampleXUnion xu;
+  final String after;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      before,
+      xu,
+      after,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'TestInlineXUnionInStruct' r'(before: ' +
+        before.toString() +
+        r', xu: ' +
+        xu.toString() +
+        r', after: ' +
+        after.toString() +
+        r')';
+  }
+
+  static TestInlineXUnionInStruct _ctor(List<Object> argv) =>
+      TestInlineXUnionInStruct._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<TestInlineXUnionInStruct>
+    kTestInlineXUnionInStruct_Type = $fidl.StructType<TestInlineXUnionInStruct>(
+  inlineSizeOld: 56,
+  inlineSizeV1: 56,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<String>(
+        type: $fidl.StringType(maybeElementCount: null, nullable: false),
+        offsetOld: 0,
+        offsetV1: 0),
+    $fidl.MemberType<SampleXUnion>(
+        type: kSampleXUnion_Type, offsetOld: 16, offsetV1: 16),
+    $fidl.MemberType<String>(
+        type: $fidl.StringType(maybeElementCount: null, nullable: false),
+        offsetOld: 40,
+        offsetV1: 40),
+  ],
+  ctor: TestInlineXUnionInStruct._ctor,
+);
+
+class TestOptionalXUnionInStruct extends $fidl.Struct {
+  const TestOptionalXUnionInStruct({
+    @required this.before,
+    this.xu,
+    @required this.after,
+  });
+  TestOptionalXUnionInStruct.clone(
+    TestOptionalXUnionInStruct $orig, {
+    String before,
+    SampleXUnion xu,
+    String after,
+  }) : this(
+          before: before ?? $orig.before,
+          xu: xu ?? $orig.xu,
+          after: after ?? $orig.after,
+        );
+
+  TestOptionalXUnionInStruct.cloneWithout(
+    TestOptionalXUnionInStruct $orig, {
+    bool xu,
+  }) : this(
+          before: $orig.before,
+          xu: xu ? null : $orig.xu,
+          after: $orig.after,
+        );
+
+  TestOptionalXUnionInStruct._(List<Object> argv)
+      : before = argv[0],
+        xu = argv[1],
+        after = argv[2];
+  final String before;
+  final SampleXUnion xu;
+  final String after;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      before,
+      xu,
+      after,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'TestOptionalXUnionInStruct' r'(before: ' +
+        before.toString() +
+        r', xu: ' +
+        xu.toString() +
+        r', after: ' +
+        after.toString() +
+        r')';
+  }
+
+  static TestOptionalXUnionInStruct _ctor(List<Object> argv) =>
+      TestOptionalXUnionInStruct._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<TestOptionalXUnionInStruct>
+    kTestOptionalXUnionInStruct_Type =
+    $fidl.StructType<TestOptionalXUnionInStruct>(
+  inlineSizeOld: 56,
+  inlineSizeV1: 56,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<String>(
+        type: $fidl.StringType(maybeElementCount: null, nullable: false),
+        offsetOld: 0,
+        offsetV1: 0),
+    $fidl.MemberType<SampleXUnion>(
+        type: kSampleXUnion_OptType, offsetOld: 16, offsetV1: 16),
+    $fidl.MemberType<String>(
+        type: $fidl.StringType(maybeElementCount: null, nullable: false),
+        offsetOld: 40,
+        offsetV1: 40),
+  ],
+  ctor: TestOptionalXUnionInStruct._ctor,
+);
+
+class TestStrictXUnionInStruct extends $fidl.Struct {
+  const TestStrictXUnionInStruct({
+    @required this.xu,
+  });
+  TestStrictXUnionInStruct.clone(
+    TestStrictXUnionInStruct $orig, {
+    SampleStrictXUnion xu,
+  }) : this(
+          xu: xu ?? $orig.xu,
+        );
+
+  TestStrictXUnionInStruct._(List<Object> argv) : xu = argv[0];
+  final SampleStrictXUnion xu;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      xu,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'TestStrictXUnionInStruct' r'(xu: ' + xu.toString() + r')';
+  }
+
+  static TestStrictXUnionInStruct _ctor(List<Object> argv) =>
+      TestStrictXUnionInStruct._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<TestStrictXUnionInStruct>
+    kTestStrictXUnionInStruct_Type = $fidl.StructType<TestStrictXUnionInStruct>(
+  inlineSizeOld: 24,
+  inlineSizeV1: 24,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<SampleStrictXUnion>(
+        type: kSampleStrictXUnion_Type, offsetOld: 0, offsetV1: 0),
+  ],
+  ctor: TestStrictXUnionInStruct._ctor,
+);
+
+class TestFlexibleXUnionInStruct extends $fidl.Struct {
+  const TestFlexibleXUnionInStruct({
+    @required this.xu,
+  });
+  TestFlexibleXUnionInStruct.clone(
+    TestFlexibleXUnionInStruct $orig, {
+    SampleXUnion xu,
+  }) : this(
+          xu: xu ?? $orig.xu,
+        );
+
+  TestFlexibleXUnionInStruct._(List<Object> argv) : xu = argv[0];
+  final SampleXUnion xu;
+
+  @override
+  List<Object> get $fields {
+    return <Object>[
+      xu,
+    ];
+  }
+
+  @override
+  String toString() {
+    // ignore: prefer_interpolation_to_compose_strings
+    return r'TestFlexibleXUnionInStruct' r'(xu: ' + xu.toString() + r')';
+  }
+
+  static TestFlexibleXUnionInStruct _ctor(List<Object> argv) =>
+      TestFlexibleXUnionInStruct._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.StructType<TestFlexibleXUnionInStruct>
+    kTestFlexibleXUnionInStruct_Type =
+    $fidl.StructType<TestFlexibleXUnionInStruct>(
+  inlineSizeOld: 24,
+  inlineSizeV1: 24,
+  members: <$fidl.MemberType>[
+    $fidl.MemberType<SampleXUnion>(
+        type: kSampleXUnion_Type, offsetOld: 0, offsetV1: 0),
+  ],
+  ctor: TestFlexibleXUnionInStruct._ctor,
+);
+
 class XUnionInTable extends $fidl.Table {
   const XUnionInTable({
     this.before,
@@ -7795,6 +10311,53 @@
   ctor: TableWithEmptyStruct._ctor,
 );
 
+class TableNoFields extends $fidl.Table {
+  const TableNoFields();
+
+  TableNoFields._(Map<int, dynamic> argv);
+
+  @override
+  Map<int, dynamic> get $fields {
+    return {};
+  }
+
+  static TableNoFields _ctor(Map<int, dynamic> argv) => TableNoFields._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.TableType<TableNoFields> kTable_NoFields_Type =
+    $fidl.TableType<TableNoFields>(
+  inlineSizeOld: 16,
+  inlineSizeV1: 16,
+  members: <int, $fidl.FidlType>{},
+  ctor: TableNoFields._ctor,
+);
+
+class TableTwoReservedFields extends $fidl.Table {
+  const TableTwoReservedFields();
+
+  TableTwoReservedFields._(Map<int, dynamic> argv);
+
+  @override
+  Map<int, dynamic> get $fields {
+    return {};
+  }
+
+  static TableTwoReservedFields _ctor(Map<int, dynamic> argv) =>
+      TableTwoReservedFields._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.TableType<TableTwoReservedFields> kTable_TwoReservedFields_Type =
+    $fidl.TableType<TableTwoReservedFields>(
+  inlineSizeOld: 16,
+  inlineSizeV1: 16,
+  members: <int, $fidl.FidlType>{},
+  ctor: TableTwoReservedFields._ctor,
+);
+
 class TableStructWithReservedSandwich extends $fidl.Table {
   const TableStructWithReservedSandwich({
     this.s1,
@@ -7956,6 +10519,224 @@
   ctor: TableUnionWithVectorStructSandwich._ctor,
 );
 
+class TableOfXUnionThenUnion extends $fidl.Table {
+  const TableOfXUnionThenUnion({
+    this.member,
+  });
+
+  TableOfXUnionThenUnion._(Map<int, dynamic> argv) : member = argv[2];
+  final XUnionOfUnion member;
+
+  @override
+  Map<int, dynamic> get $fields {
+    return {
+      2: member,
+    };
+  }
+
+  static TableOfXUnionThenUnion _ctor(Map<int, dynamic> argv) =>
+      TableOfXUnionThenUnion._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.TableType<TableOfXUnionThenUnion> kTableOfXUnionThenUnion_Type =
+    $fidl.TableType<TableOfXUnionThenUnion>(
+  inlineSizeOld: 16,
+  inlineSizeV1: 16,
+  members: <int, $fidl.FidlType>{
+    2: kXUnionOfUnion_Type,
+  },
+  ctor: TableOfXUnionThenUnion._ctor,
+);
+
+class TableOfUnionThenXUnionThenTableThenXUnionThenUnion extends $fidl.Table {
+  const TableOfUnionThenXUnionThenTableThenXUnionThenUnion({
+    this.member,
+  });
+
+  TableOfUnionThenXUnionThenTableThenXUnionThenUnion._(Map<int, dynamic> argv)
+      : member = argv[3];
+  final UnionOfXUnionThenTableThenXUnionThenUnion member;
+
+  @override
+  Map<int, dynamic> get $fields {
+    return {
+      3: member,
+    };
+  }
+
+  static TableOfUnionThenXUnionThenTableThenXUnionThenUnion _ctor(
+          Map<int, dynamic> argv) =>
+      TableOfUnionThenXUnionThenTableThenXUnionThenUnion._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.TableType<TableOfUnionThenXUnionThenTableThenXUnionThenUnion>
+    kTableOfUnionThenXUnionThenTableThenXUnionThenUnion_Type =
+    $fidl.TableType<TableOfUnionThenXUnionThenTableThenXUnionThenUnion>(
+  inlineSizeOld: 16,
+  inlineSizeV1: 16,
+  members: <int, $fidl.FidlType>{
+    3: kUnionOfXUnionThenTableThenXUnionThenUnion_Type,
+  },
+  ctor: TableOfUnionThenXUnionThenTableThenXUnionThenUnion._ctor,
+);
+
+class TableWithUnionSize12Align4 extends $fidl.Table {
+  const TableWithUnionSize12Align4({
+    this.before,
+    this.member,
+    this.after,
+  });
+
+  TableWithUnionSize12Align4._(Map<int, dynamic> argv)
+      : before = argv[1],
+        member = argv[3],
+        after = argv[5];
+  final int before;
+  final UnionSize12Align4 member;
+  final int after;
+
+  @override
+  Map<int, dynamic> get $fields {
+    return {
+      1: before,
+      3: member,
+      5: after,
+    };
+  }
+
+  static TableWithUnionSize12Align4 _ctor(Map<int, dynamic> argv) =>
+      TableWithUnionSize12Align4._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.TableType<TableWithUnionSize12Align4>
+    kTableWithUnionSize12Align4_Type =
+    $fidl.TableType<TableWithUnionSize12Align4>(
+  inlineSizeOld: 16,
+  inlineSizeV1: 16,
+  members: <int, $fidl.FidlType>{
+    1: $fidl.Uint8Type(),
+    3: kUnionSize12Align4_Type,
+    5: $fidl.Uint8Type(),
+  },
+  ctor: TableWithUnionSize12Align4._ctor,
+);
+
+class Regression10TableV1 extends $fidl.Table {
+  const Regression10TableV1({
+    this.member1,
+  });
+
+  Regression10TableV1._(Map<int, dynamic> argv) : member1 = argv[1];
+  final int member1;
+
+  @override
+  Map<int, dynamic> get $fields {
+    return {
+      1: member1,
+    };
+  }
+
+  static Regression10TableV1 _ctor(Map<int, dynamic> argv) =>
+      Regression10TableV1._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.TableType<Regression10TableV1> kRegression10TableV1_Type =
+    $fidl.TableType<Regression10TableV1>(
+  inlineSizeOld: 16,
+  inlineSizeV1: 16,
+  members: <int, $fidl.FidlType>{
+    1: $fidl.Uint64Type(),
+  },
+  ctor: Regression10TableV1._ctor,
+);
+
+class Regression10TableV2 extends $fidl.Table {
+  const Regression10TableV2({
+    this.member1,
+    this.member2,
+  });
+
+  Regression10TableV2._(Map<int, dynamic> argv)
+      : member1 = argv[1],
+        member2 = argv[5];
+  final int member1;
+  final int member2;
+
+  @override
+  Map<int, dynamic> get $fields {
+    return {
+      1: member1,
+      5: member2,
+    };
+  }
+
+  static Regression10TableV2 _ctor(Map<int, dynamic> argv) =>
+      Regression10TableV2._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.TableType<Regression10TableV2> kRegression10TableV2_Type =
+    $fidl.TableType<Regression10TableV2>(
+  inlineSizeOld: 16,
+  inlineSizeV1: 16,
+  members: <int, $fidl.FidlType>{
+    1: $fidl.Uint64Type(),
+    5: $fidl.Uint64Type(),
+  },
+  ctor: Regression10TableV2._ctor,
+);
+
+class Regression10TableV3 extends $fidl.Table {
+  const Regression10TableV3({
+    this.x,
+    this.y,
+    this.z,
+  });
+
+  Regression10TableV3._(Map<int, dynamic> argv)
+      : x = argv[1],
+        y = argv[5],
+        z = argv[6];
+  final int x;
+  final int y;
+  final int z;
+
+  @override
+  Map<int, dynamic> get $fields {
+    return {
+      1: x,
+      5: y,
+      6: z,
+    };
+  }
+
+  static Regression10TableV3 _ctor(Map<int, dynamic> argv) =>
+      Regression10TableV3._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.TableType<Regression10TableV3> kRegression10TableV3_Type =
+    $fidl.TableType<Regression10TableV3>(
+  inlineSizeOld: 16,
+  inlineSizeV1: 16,
+  members: <int, $fidl.FidlType>{
+    1: $fidl.Int64Type(),
+    5: $fidl.Int64Type(),
+    6: $fidl.Int64Type(),
+  },
+  ctor: Regression10TableV3._ctor,
+);
+
 class TransformerSimpleTable extends $fidl.Table {
   const TransformerSimpleTable({
     this.value,
@@ -7987,6 +10768,116 @@
   ctor: TransformerSimpleTable._ctor,
 );
 
+class CompatTableString extends $fidl.Table {
+  const CompatTableString({
+    this.s,
+  });
+
+  CompatTableString._(Map<int, dynamic> argv) : s = argv[1];
+  final String s;
+
+  @override
+  Map<int, dynamic> get $fields {
+    return {
+      1: s,
+    };
+  }
+
+  static CompatTableString _ctor(Map<int, dynamic> argv) =>
+      CompatTableString._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.TableType<CompatTableString> kCompatTableString_Type =
+    $fidl.TableType<CompatTableString>(
+  inlineSizeOld: 16,
+  inlineSizeV1: 16,
+  members: <int, $fidl.FidlType>{
+    1: $fidl.StringType(maybeElementCount: null, nullable: false),
+  },
+  ctor: CompatTableString._ctor,
+);
+
+class CompatTableValue extends $fidl.Table {
+  const CompatTableValue({
+    this.unionMember,
+    this.arrayMember,
+    this.tableMember,
+    this.xunionMember,
+  });
+
+  CompatTableValue._(Map<int, dynamic> argv)
+      : unionMember = argv[1],
+        arrayMember = argv[2],
+        tableMember = argv[3],
+        xunionMember = argv[4];
+  final CompatUnion unionMember;
+  final Uint32List arrayMember;
+  final CompatTableString tableMember;
+  final CompatXUnion xunionMember;
+
+  @override
+  Map<int, dynamic> get $fields {
+    return {
+      1: unionMember,
+      2: arrayMember,
+      3: tableMember,
+      4: xunionMember,
+    };
+  }
+
+  static CompatTableValue _ctor(Map<int, dynamic> argv) =>
+      CompatTableValue._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.TableType<CompatTableValue> kCompatTableValue_Type =
+    $fidl.TableType<CompatTableValue>(
+  inlineSizeOld: 16,
+  inlineSizeV1: 16,
+  members: <int, $fidl.FidlType>{
+    1: kCompatUnion_Type,
+    2: $fidl.ArrayType<Uint32List>(
+        element: $fidl.Uint32Type(), elementCount: 3),
+    3: kCompatTableString_Type,
+    4: kCompatXUnion_Type,
+  },
+  ctor: CompatTableValue._ctor,
+);
+
+class TableWithXUnion extends $fidl.Table {
+  const TableWithXUnion({
+    this.member,
+  });
+
+  TableWithXUnion._(Map<int, dynamic> argv) : member = argv[1];
+  final CompatXUnion member;
+
+  @override
+  Map<int, dynamic> get $fields {
+    return {
+      1: member,
+    };
+  }
+
+  static TableWithXUnion _ctor(Map<int, dynamic> argv) =>
+      TableWithXUnion._(argv);
+}
+
+// See FIDL-308:
+// ignore: recursive_compile_time_constant
+const $fidl.TableType<TableWithXUnion> kTableWithXUnion_Type =
+    $fidl.TableType<TableWithXUnion>(
+  inlineSizeOld: 16,
+  inlineSizeV1: 16,
+  members: <int, $fidl.FidlType>{
+    1: kCompatXUnion_Type,
+  },
+  ctor: TableWithXUnion._ctor,
+);
+
 // ignore: unused_element, avoid_private_typedef_functions
 typedef _VoidCallback = void Function();
 
