소스 검색

Initial support for services and extensions. Incomplete, but enough to get generated unit test files to compile.

Jon Skeet 17 년 전
부모
커밋
575083ae9c
37개의 변경된 파일16089개의 추가작업 그리고 296개의 파일을 삭제
  1. 6 0
      csharp/ProtocolBuffers.Test/ProtocolBuffers.Test.csproj
  2. 372 0
      csharp/ProtocolBuffers.Test/TestProtos/UnitTestEmbedOptimizeForProtoFile.cs
  3. 268 0
      csharp/ProtocolBuffers.Test/TestProtos/UnitTestImportProtoFile.cs
  4. 1415 0
      csharp/ProtocolBuffers.Test/TestProtos/UnitTestMessageSetProtoFile.cs
  5. 243 0
      csharp/ProtocolBuffers.Test/TestProtos/UnitTestOptimizeForProtoFile.cs
  6. 13140 0
      csharp/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs
  7. 32 0
      csharp/ProtocolBuffers.Test/TestUtil.cs
  8. 5 3
      csharp/ProtocolBuffers/CodedInputStream.cs
  9. 9 6
      csharp/ProtocolBuffers/CodedOutputStream.cs
  10. 156 181
      csharp/ProtocolBuffers/DescriptorProtos/DescriptorProtoFile.cs
  11. 2 1
      csharp/ProtocolBuffers/Descriptors/EnumDescriptorIndexAttribute.cs
  12. 11 0
      csharp/ProtocolBuffers/DynamicMessage.cs
  13. 165 0
      csharp/ProtocolBuffers/ExtendableMessage.cs
  14. 11 0
      csharp/ProtocolBuffers/FieldSet.cs
  15. 14 3
      csharp/ProtocolBuffers/GeneratedBuilder.cs
  16. 68 2
      csharp/ProtocolBuffers/GeneratedExtension.cs
  17. 9 4
      csharp/ProtocolBuffers/GeneratedMessage.cs
  18. 14 0
      csharp/ProtocolBuffers/IRpcChannel.cs
  19. 8 0
      csharp/ProtocolBuffers/IRpcController.cs
  20. 9 0
      csharp/ProtocolBuffers/IService.cs
  21. 6 0
      csharp/ProtocolBuffers/ProtocolBuffers.csproj
  22. 35 0
      csharp/ProtocolBuffers/RpcUtil.cs
  23. 5 13
      csharp/ProtocolBuffers/TextFormat.cs
  24. 2 2
      csharp/ProtocolBuffers/UnknownField.cs
  25. 2 1
      src/google/protobuf/compiler/csharp/csharp_enum.cc
  26. 8 8
      src/google/protobuf/compiler/csharp/csharp_enum_field.cc
  27. 6 16
      src/google/protobuf/compiler/csharp/csharp_extension.cc
  28. 3 1
      src/google/protobuf/compiler/csharp/csharp_file.cc
  29. 12 4
      src/google/protobuf/compiler/csharp/csharp_helpers.cc
  30. 1 0
      src/google/protobuf/compiler/csharp/csharp_helpers.h
  31. 6 6
      src/google/protobuf/compiler/csharp/csharp_message.cc
  32. 31 44
      src/google/protobuf/compiler/csharp/csharp_service.cc
  33. 2 0
      src/google/protobuf/unittest.proto
  34. 3 0
      src/google/protobuf/unittest_embed_optimize_for.proto
  35. 4 1
      src/google/protobuf/unittest_import.proto
  36. 3 0
      src/google/protobuf/unittest_mset.proto
  37. 3 0
      src/google/protobuf/unittest_optimize_for.proto

+ 6 - 0
csharp/ProtocolBuffers.Test/ProtocolBuffers.Test.csproj

@@ -48,6 +48,12 @@
     <Compile Include="CodedInputStreamTest.cs" />
     <Compile Include="CodedOutputStreamTest.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="TestProtos\UnitTestEmbedOptimizeForProtoFile.cs" />
+    <Compile Include="TestProtos\UnitTestImportProtoFile.cs" />
+    <Compile Include="TestProtos\UnitTestMessageSetProtoFile.cs" />
+    <Compile Include="TestProtos\UnitTestOptimizeForProtoFile.cs" />
+    <Compile Include="TestProtos\UnitTestProtoFile.cs" />
+    <Compile Include="TestUtil.cs" />
     <Compile Include="WireFormatTest.cs" />
   </ItemGroup>
   <ItemGroup>

+ 372 - 0
csharp/ProtocolBuffers.Test/TestProtos/UnitTestEmbedOptimizeForProtoFile.cs

@@ -0,0 +1,372 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+
+using pb = global::Google.ProtocolBuffers;
+using pbc = global::Google.ProtocolBuffers.Collections;
+using pbd = global::Google.ProtocolBuffers.Descriptors;
+using scg = global::System.Collections.Generic;
+using self = global::Google.ProtocolBuffers.TestProtos;
+
+namespace Google.ProtocolBuffers.TestProtos {
+  
+  public static partial class UnitTestEmbedOptimizeForProtoFile {
+  
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+        get { return descriptor; }
+    }
+    private static readonly pbd::FileDescriptor descriptor = pbd::FileDescriptor.InternalBuildGeneratedFileFrom (
+        new byte[] {
+            0x0a, 0x31, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x75, 0x6e, 
+            0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 
+            0x65, 0x5f, 0x66, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 
+            0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 
+            0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x6f, 0x70, 0x74, 
+            0x69, 0x6d, 0x69, 0x7a, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa1, 0x01, 0x0a, 0x19, 
+            0x54, 0x65, 0x73, 0x74, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x46, 0x6f, 
+            0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x41, 0x0a, 0x10, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x6d, 0x65, 
+            0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 
+            0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 
+            0x6d, 0x69, 0x7a, 0x65, 0x64, 0x46, 0x6f, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x41, 0x0a, 0x10, 0x72, 0x65, 0x70, 0x65, 
+            0x61, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 
+            0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 
+            0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x46, 0x6f, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x42, 
+            0x4a, 0x48, 0x01, 0xc2, 0x3e, 0x21, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 
+            0x6c, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0xca, 
+            0x3e, 0x21, 0x55, 0x6e, 0x69, 0x74, 0x54, 0x65, 0x73, 0x74, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 
+            0x69, 0x7a, 0x65, 0x46, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 
+        }, new pbd::FileDescriptor[] {
+                self::UnitTestOptimizeForProtoFile.Descriptor,
+        });
+    #endregion
+    
+    #region Extensions
+    /**/
+    #endregion
+    
+    #region Static variables
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestEmbedOptimizedForSize__Descriptor 
+        = Descriptor.MessageTypes[0];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestEmbedOptimizedForSize__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestEmbedOptimizedForSize__Descriptor,
+            new string[] { "OptionalMessage", "RepeatedMessage", },
+            typeof (self::TestEmbedOptimizedForSize),
+            typeof (self::TestEmbedOptimizedForSize.Builder));
+    #endregion
+    
+  }
+  
+  #region Enums
+  #endregion
+  
+  #region Messages
+  public sealed partial class TestEmbedOptimizedForSize : pb::GeneratedMessage<TestEmbedOptimizedForSize, TestEmbedOptimizedForSize.Builder> {
+    // Use TestEmbedOptimizedForSize.CreateBuilder() to construct.
+    private TestEmbedOptimizedForSize() {}
+    
+    private static readonly TestEmbedOptimizedForSize defaultInstance = new TestEmbedOptimizedForSize();
+    public static TestEmbedOptimizedForSize DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestEmbedOptimizedForSize DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestEmbedOptimizeForProtoFile.internal__static_protobuf_unittest_TestEmbedOptimizedForSize__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestEmbedOptimizeForProtoFile.internal__static_protobuf_unittest_TestEmbedOptimizedForSize__FieldAccessorTable; }
+    }
+    
+    // optional .protobuf_unittest.TestOptimizedForSize optional_message = 1;
+    private bool hasOptionalMessage;
+    private self::TestOptimizedForSize optionalMessage_ = self::TestOptimizedForSize.DefaultInstance;
+    public bool HasOptionalMessage {
+      get { return hasOptionalMessage; }
+    }
+    public self::TestOptimizedForSize OptionalMessage {
+      get { return optionalMessage_; }
+    }
+    
+    // repeated .protobuf_unittest.TestOptimizedForSize repeated_message = 2;
+    private scg::IList<self::TestOptimizedForSize> repeatedMessage_ = pbc::Lists<self::TestOptimizedForSize>.Empty;
+    public scg::IList<self::TestOptimizedForSize> RepeatedMessageList {
+      get { return repeatedMessage_; } 
+    }
+    public int RepeatedMessageCount
+      { get { return repeatedMessage_.Count; }
+    }
+    public self::TestOptimizedForSize GetRepeatedMessage(int index) {
+      return repeatedMessage_ [index];
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (HasOptionalMessage) {
+          if (!OptionalMessage.IsInitialized) return false;
+        }
+        foreach (self::TestOptimizedForSize element in RepeatedMessageList) {
+          if (!element.IsInitialized) return false;
+        }
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasOptionalMessage) {
+        output.WriteMessage(1, OptionalMessage);
+      }
+      foreach (self::TestOptimizedForSize element in RepeatedMessageList) {
+        output.WriteMessage(2, element);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasOptionalMessage) {
+          size += pb::CodedOutputStream.ComputeMessageSize(1, OptionalMessage);
+        }
+        foreach (self::TestOptimizedForSize element in RepeatedMessageList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(2, element);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestEmbedOptimizedForSize ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestEmbedOptimizedForSize ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestEmbedOptimizedForSize ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestEmbedOptimizedForSize parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestEmbedOptimizedForSize ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestEmbedOptimizedForSize ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestEmbedOptimizedForSize ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestEmbedOptimizedForSize ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestEmbedOptimizedForSize> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestEmbedOptimizedForSize prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestEmbedOptimizedForSize, Builder> {
+      // Construct using self::TestEmbedOptimizedForSize.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestEmbedOptimizedForSize result = new self::TestEmbedOptimizedForSize();
+      
+      protected override self::TestEmbedOptimizedForSize MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestEmbedOptimizedForSize> Clear() {
+        result = new self::TestEmbedOptimizedForSize();
+        return this;
+      }
+      
+      public override IBuilder<self::TestEmbedOptimizedForSize> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestEmbedOptimizedForSize.Descriptor; }
+      }
+      
+      public override self::TestEmbedOptimizedForSize DefaultInstanceForType {
+        get { return self::TestEmbedOptimizedForSize.DefaultInstance; }
+      }
+      
+      public override self::TestEmbedOptimizedForSize BuildPartial() {
+        if (result.repeatedMessage_ != pbc::Lists<self::TestOptimizedForSize>.Empty) {
+          result.repeatedMessage_ = pbc::Lists<self::TestOptimizedForSize>.AsReadOnly(result.repeatedMessage_);
+        }
+        self::TestEmbedOptimizedForSize returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestEmbedOptimizedForSize) {
+          return MergeFrom((self::TestEmbedOptimizedForSize) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestEmbedOptimizedForSize> MergeFrom(self::TestEmbedOptimizedForSize other) {
+        if (other == self::TestEmbedOptimizedForSize.DefaultInstance) return this;
+        if (other.HasOptionalMessage) {
+          MergeOptionalMessage(other.OptionalMessage);
+        }
+        if (other.repeatedMessage_.Count != 0) {
+          if (result.repeatedMessage_.Count == 0) {
+            result.repeatedMessage_ = new scg::List<self::TestOptimizedForSize>();
+          }
+          base.AddRange(other.repeatedMessage_, result.repeatedMessage_);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestEmbedOptimizedForSize> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestEmbedOptimizedForSize> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 10: {
+              self::TestOptimizedForSize.Builder subBuilder = self::TestOptimizedForSize.CreateBuilder();
+              if (HasOptionalMessage) {
+                subBuilder.MergeFrom(OptionalMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              OptionalMessage = subBuilder.BuildPartial();
+              break;
+            }
+            case 18: {
+              self::TestOptimizedForSize.Builder subBuilder = self::TestOptimizedForSize.CreateBuilder();
+              input.ReadMessage(subBuilder, extensionRegistry);
+              AddRepeatedMessage(subBuilder.BuildPartial());
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional .protobuf_unittest.TestOptimizedForSize optional_message = 1;
+      public bool HasOptionalMessage {
+        get { return result.HasOptionalMessage; }
+      }
+      public self::TestOptimizedForSize OptionalMessage {
+        get { return result.OptionalMessage; }
+        set { SetOptionalMessage(value); }
+      }
+      public Builder SetOptionalMessage(self::TestOptimizedForSize value) {
+        result.hasOptionalMessage = true;
+        result.optionalMessage_ = value;
+        return this;
+      }
+      public Builder SetOptionalMessage(self::TestOptimizedForSize.Builder builderForValue) {
+        result.hasOptionalMessage = true;
+        result.optionalMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalMessage(self::TestOptimizedForSize value) {
+        if (result.HasOptionalMessage &&
+            result.optionalMessage_ != self::TestOptimizedForSize.DefaultInstance) {
+          result.optionalMessage_ =
+            self::TestOptimizedForSize.CreateBuilder(result.optionalMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalMessage_ = value;
+        }
+        result.hasOptionalMessage = true;
+        return this;
+      }
+      public Builder ClearOptionalMessage() {
+        result.hasOptionalMessage = false;
+        result.optionalMessage_ = self::TestOptimizedForSize.DefaultInstance;
+        return this;
+      }
+      
+      // repeated .protobuf_unittest.TestOptimizedForSize repeated_message = 2;
+      public scg::IList<self::TestOptimizedForSize> RepeatedMessageList {
+        get { return pbc::Lists.AsReadOnly(result.repeatedMessage_); }
+      }
+      public int RepeatedMessageCount {
+        get { return result.RepeatedMessageCount; }
+      }
+      public self::TestOptimizedForSize GetRepeatedMessage(int index) {
+        return result.GetRepeatedMessage(index);
+      }
+      public Builder SetRepeatedMessage(int index, self::TestOptimizedForSize value) {
+        result.repeatedMessage_[index] = value;
+        return this;
+      }
+      public Builder SetRepeatedMessage(int index, self::TestOptimizedForSize.Builder builderForValue) {
+        result.repeatedMessage_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRepeatedMessage(self::TestOptimizedForSize value) {
+        if (result.repeatedMessage_ == pbc::Lists<self::TestOptimizedForSize>.Empty) {
+          result.repeatedMessage_ = new scg::List<self::TestOptimizedForSize>();
+        }
+        result.repeatedMessage_.Add(value);
+        return this;
+      }
+      public Builder AddRepeatedMessage(self::TestOptimizedForSize.Builder builderForValue) {
+        if (result.repeatedMessage_ == pbc::Lists<self::TestOptimizedForSize>.Empty) {
+          result.repeatedMessage_ = new scg::List<self::TestOptimizedForSize>();
+        }
+        result.repeatedMessage_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRepeatedMessage(scg::IEnumerable<self::TestOptimizedForSize> values) {
+        if (result.repeatedMessage_ == pbc::Lists<self::TestOptimizedForSize>.Empty) {
+          result.repeatedMessage_ = new scg::List<self::TestOptimizedForSize>();
+        }
+        base.AddRange(values, result.repeatedMessage_);
+        return this;
+      }
+      public Builder ClearRepeatedMessage() {
+        result.repeatedMessage_ = pbc::Lists<self::TestOptimizedForSize>.Empty;
+        return this;
+      }
+    }
+  }
+  
+  #endregion
+  
+  #region Services
+  #endregion
+}

+ 268 - 0
csharp/ProtocolBuffers.Test/TestProtos/UnitTestImportProtoFile.cs

@@ -0,0 +1,268 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+
+using pb = global::Google.ProtocolBuffers;
+using pbc = global::Google.ProtocolBuffers.Collections;
+using pbd = global::Google.ProtocolBuffers.Descriptors;
+using scg = global::System.Collections.Generic;
+using self = global::Google.ProtocolBuffers.TestProtos;
+
+namespace Google.ProtocolBuffers.TestProtos {
+  
+  public static partial class UnitTestImportProtoFile {
+  
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+        get { return descriptor; }
+    }
+    private static readonly pbd::FileDescriptor descriptor = pbd::FileDescriptor.InternalBuildGeneratedFileFrom (
+        new byte[] {
+            0x0a, 0x25, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x75, 0x6e, 
+            0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 
+            0x18, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 
+            0x6d, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x1a, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 
+            0x67, 0x65, 0x12, 0x09, 0x0a, 0x01, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x2a, 0x3c, 0x0a, 0x0a, 0x49, 0x6d, 0x70, 
+            0x6f, 0x72, 0x74, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x46, 0x4f, 
+            0x4f, 0x10, 0x07, 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x42, 0x41, 0x52, 0x10, 0x08, 0x12, 
+            0x0e, 0x0a, 0x0a, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x42, 0x41, 0x5a, 0x10, 0x09, 0x42, 0x5a, 0x0a, 0x18, 0x63, 
+            0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x74, 
+            0x65, 0x73, 0x74, 0x48, 0x01, 0xc2, 0x3e, 0x21, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 
+            0x63, 0x6f, 0x6c, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 
+            0x73, 0xca, 0x3e, 0x17, 0x55, 0x6e, 0x69, 0x74, 0x54, 0x65, 0x73, 0x74, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 
+            0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 
+        }, new pbd::FileDescriptor[] {
+        });
+    #endregion
+    
+    #region Extensions
+    /**/
+    #endregion
+    
+    #region Static variables
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_import_ImportMessage__Descriptor 
+        = Descriptor.MessageTypes[0];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_import_ImportMessage__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_import_ImportMessage__Descriptor,
+            new string[] { "D", },
+            typeof (self::ImportMessage),
+            typeof (self::ImportMessage.Builder));
+    #endregion
+    
+  }
+  
+  #region Enums
+  public enum ImportEnum {
+    IMPORT_FOO = 7,
+    IMPORT_BAR = 8,
+    IMPORT_BAZ = 9,
+  }
+  
+  #endregion
+  
+  #region Messages
+  public sealed partial class ImportMessage : pb::GeneratedMessage<ImportMessage, ImportMessage.Builder> {
+    // Use ImportMessage.CreateBuilder() to construct.
+    private ImportMessage() {}
+    
+    private static readonly ImportMessage defaultInstance = new ImportMessage();
+    public static ImportMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override ImportMessage DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestImportProtoFile.internal__static_protobuf_unittest_import_ImportMessage__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestImportProtoFile.internal__static_protobuf_unittest_import_ImportMessage__FieldAccessorTable; }
+    }
+    
+    // optional int32 d = 1;
+    private bool hasD;
+    private int d_ = 0;
+    public bool HasD {
+      get { return hasD; }
+    }
+    public int D {
+      get { return d_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasD) {
+        output.WriteInt32(1, D);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasD) {
+          size += pb::CodedOutputStream.ComputeInt32Size(1, D);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::ImportMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::ImportMessage ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::ImportMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::ImportMessage parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::ImportMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::ImportMessage ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::ImportMessage ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::ImportMessage ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::ImportMessage> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::ImportMessage prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::ImportMessage, Builder> {
+      // Construct using self::ImportMessage.CreateBuilder()
+      internal Builder() {}
+      
+      self::ImportMessage result = new self::ImportMessage();
+      
+      protected override self::ImportMessage MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::ImportMessage> Clear() {
+        result = new self::ImportMessage();
+        return this;
+      }
+      
+      public override IBuilder<self::ImportMessage> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::ImportMessage.Descriptor; }
+      }
+      
+      public override self::ImportMessage DefaultInstanceForType {
+        get { return self::ImportMessage.DefaultInstance; }
+      }
+      
+      public override self::ImportMessage BuildPartial() {
+        self::ImportMessage returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::ImportMessage) {
+          return MergeFrom((self::ImportMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::ImportMessage> MergeFrom(self::ImportMessage other) {
+        if (other == self::ImportMessage.DefaultInstance) return this;
+        if (other.HasD) {
+          D = other.D;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::ImportMessage> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::ImportMessage> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 8: {
+              D = input.ReadInt32();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional int32 d = 1;
+      public bool HasD {
+        get { return result.HasD; }
+      }
+      public int D {
+        get { return result.D; }
+        set { SetD(value); }
+      }
+      public Builder SetD(int value) {
+        result.hasD = true;
+        result.d_ = value;
+        return this;
+      }
+      public Builder ClearD() {
+        result.hasD = false;
+        result.d_ = 0;
+        return this;
+      }
+    }
+  }
+  
+  #endregion
+  
+  #region Services
+  #endregion
+}

+ 1415 - 0
csharp/ProtocolBuffers.Test/TestProtos/UnitTestMessageSetProtoFile.cs

@@ -0,0 +1,1415 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+
+using pb = global::Google.ProtocolBuffers;
+using pbc = global::Google.ProtocolBuffers.Collections;
+using pbd = global::Google.ProtocolBuffers.Descriptors;
+using scg = global::System.Collections.Generic;
+using self = global::Google.ProtocolBuffers.TestProtos;
+
+namespace Google.ProtocolBuffers.TestProtos {
+  
+  public static partial class UnitTestMessageSetProtoFile {
+  
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+        get { return descriptor; }
+    }
+    private static readonly pbd::FileDescriptor descriptor = pbd::FileDescriptor.InternalBuildGeneratedFileFrom (
+        new byte[] {
+            0x0a, 0x23, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x75, 0x6e, 
+            0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x6d, 0x73, 0x65, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x70, 
+            0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x22, 0x1e, 0x0a, 0x0e, 
+            0x54, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x2a, 0x08, 0x08, 0x04, 0x10, 0x80, 
+            0x80, 0x80, 0x80, 0x02, 0x3a, 0x02, 0x08, 0x01, 0x22, 0x51, 0x0a, 0x17, 0x54, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 
+            0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x0b, 0x6d, 
+            0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 
+            0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 
+            0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x22, 0x96, 0x01, 0x0a, 0x18, 0x54, 0x65, 0x73, 0x74, 
+            0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x31, 
+            0x12, 0x09, 0x0a, 0x01, 0x69, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x32, 0x6f, 0x0a, 0x15, 0x6d, 0x65, 0x73, 0x73, 0x61, 
+            0x67, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x70, 
+            0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 
+            0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x18, 0xb0, 0xa6, 0x5e, 0x20, 0x01, 0x28, 0x0b, 0x32, 
+            0x2b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 
+            0x54, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 
+            0x69, 0x6f, 0x6e, 0x31, 0x22, 0x98, 0x01, 0x0a, 0x18, 0x54, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 
+            0x53, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x32, 0x12, 0x0b, 0x0a, 0x03, 0x73, 0x74, 0x72, 
+            0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x32, 0x6f, 0x0a, 0x15, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 
+            0x74, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 
+            0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 
+            0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x18, 0xf9, 0xbb, 0x5e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x72, 0x6f, 
+            0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x4d, 
+            0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x32, 0x22, 
+            0x6e, 0x0a, 0x0d, 0x52, 0x61, 0x77, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x12, 0x33, 0x0a, 0x04, 
+            0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0a, 0x32, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 
+            0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x52, 0x61, 0x77, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 
+            0x65, 0x53, 0x65, 0x74, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x1a, 0x28, 0x0a, 0x04, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x0f, 0x0a, 
+            0x07, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x02, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x6d, 0x65, 
+            0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x02, 0x28, 0x0c, 0x42, 0x44, 0x48, 0x01, 0xc2, 0x3e, 0x21, 0x47, 0x6f, 
+            0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 
+            0x2e, 0x54, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0xca, 0x3e, 0x1b, 0x55, 0x6e, 0x69, 0x74, 0x54, 0x65, 
+            0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 
+            0x65, 
+        }, new pbd::FileDescriptor[] {
+        });
+    #endregion
+    
+    #region Extensions
+    /**/
+    #endregion
+    
+    #region Static variables
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestMessageSet__Descriptor 
+        = Descriptor.MessageTypes[0];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMessageSet__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestMessageSet__Descriptor,
+            new string[] { },
+            typeof (self::TestMessageSet),
+            typeof (self::TestMessageSet.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestMessageSetContainer__Descriptor 
+        = Descriptor.MessageTypes[1];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMessageSetContainer__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestMessageSetContainer__Descriptor,
+            new string[] { "MessageSet", },
+            typeof (self::TestMessageSetContainer),
+            typeof (self::TestMessageSetContainer.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestMessageSetExtension1__Descriptor 
+        = Descriptor.MessageTypes[2];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMessageSetExtension1__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestMessageSetExtension1__Descriptor,
+            new string[] { "I", },
+            typeof (self::TestMessageSetExtension1),
+            typeof (self::TestMessageSetExtension1.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestMessageSetExtension2__Descriptor 
+        = Descriptor.MessageTypes[3];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMessageSetExtension2__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestMessageSetExtension2__Descriptor,
+            new string[] { "Str", },
+            typeof (self::TestMessageSetExtension2),
+            typeof (self::TestMessageSetExtension2.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_RawMessageSet__Descriptor 
+        = Descriptor.MessageTypes[4];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_RawMessageSet__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_RawMessageSet__Descriptor,
+            new string[] { "Item", },
+            typeof (self::RawMessageSet),
+            typeof (self::RawMessageSet.Builder));
+    internal static readonly pbd::MessageDescriptor  internal__static_protobuf_unittest_RawMessageSet_Item__Descriptor 
+        = internal__static_protobuf_unittest_RawMessageSet__Descriptor.NestedTypes[0];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_RawMessageSet_Item__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_RawMessageSet_Item__Descriptor,
+            new string[] { "TypeId", "Message", },
+            typeof (self::RawMessageSet.Types.Item),
+            typeof (self::RawMessageSet.Types.Item.Builder));
+    #endregion
+    
+  }
+  
+  #region Enums
+  #endregion
+  
+  #region Messages
+  public sealed partial class TestMessageSet : pb::ExtendableMessage<TestMessageSet, TestMessageSet.Builder> {
+    // Use TestMessageSet.CreateBuilder() to construct.
+    private TestMessageSet() {}
+    
+    private static readonly TestMessageSet defaultInstance = new TestMessageSet();
+    public static TestMessageSet DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestMessageSet DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSet__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSet__FieldAccessorTable; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (!ExtensionsAreInitialized) return false;
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      pb::ExtendableMessage<TestMessageSet, TestMessageSet.Builder>.ExtensionWriter extensionWriter = CreateExtensionWriter(this);
+      extensionWriter.WriteUntil(536870912, output);
+      UnknownFields.WriteAsMessageSetTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        size += ExtensionsSerializedSize;
+        size += UnknownFields.SerializedSizeAsMessageSet;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestMessageSet ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestMessageSet ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMessageSet ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestMessageSet parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMessageSet ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestMessageSet ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMessageSet ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestMessageSet ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestMessageSet> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestMessageSet prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestMessageSet, self::TestMessageSet.Builder>.ExtendableBuilder {
+      // Construct using self::TestMessageSet.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestMessageSet result = new self::TestMessageSet();
+      
+      protected override self::TestMessageSet MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestMessageSet> Clear() {
+        result = new self::TestMessageSet();
+        return this;
+      }
+      
+      public override IBuilder<self::TestMessageSet> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestMessageSet.Descriptor; }
+      }
+      
+      public override self::TestMessageSet DefaultInstanceForType {
+        get { return self::TestMessageSet.DefaultInstance; }
+      }
+      
+      public override self::TestMessageSet BuildPartial() {
+        self::TestMessageSet returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestMessageSet) {
+          return MergeFrom((self::TestMessageSet) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestMessageSet> MergeFrom(self::TestMessageSet other) {
+        if (other == self::TestMessageSet.DefaultInstance) return this;
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestMessageSet> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestMessageSet> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+          }
+        }
+      }
+      
+    }
+  }
+  
+  public sealed partial class TestMessageSetContainer : pb::GeneratedMessage<TestMessageSetContainer, TestMessageSetContainer.Builder> {
+    // Use TestMessageSetContainer.CreateBuilder() to construct.
+    private TestMessageSetContainer() {}
+    
+    private static readonly TestMessageSetContainer defaultInstance = new TestMessageSetContainer();
+    public static TestMessageSetContainer DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestMessageSetContainer DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSetContainer__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSetContainer__FieldAccessorTable; }
+    }
+    
+    // optional .protobuf_unittest.TestMessageSet message_set = 1;
+    private bool hasMessageSet;
+    private self::TestMessageSet messageSet_ = self::TestMessageSet.DefaultInstance;
+    public bool HasMessageSet {
+      get { return hasMessageSet; }
+    }
+    public self::TestMessageSet MessageSet {
+      get { return messageSet_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (HasMessageSet) {
+          if (!MessageSet.IsInitialized) return false;
+        }
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasMessageSet) {
+        output.WriteMessage(1, MessageSet);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasMessageSet) {
+          size += pb::CodedOutputStream.ComputeMessageSize(1, MessageSet);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestMessageSetContainer ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestMessageSetContainer ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMessageSetContainer ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestMessageSetContainer parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMessageSetContainer ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestMessageSetContainer ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMessageSetContainer ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestMessageSetContainer ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestMessageSetContainer> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestMessageSetContainer prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestMessageSetContainer, Builder> {
+      // Construct using self::TestMessageSetContainer.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestMessageSetContainer result = new self::TestMessageSetContainer();
+      
+      protected override self::TestMessageSetContainer MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestMessageSetContainer> Clear() {
+        result = new self::TestMessageSetContainer();
+        return this;
+      }
+      
+      public override IBuilder<self::TestMessageSetContainer> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestMessageSetContainer.Descriptor; }
+      }
+      
+      public override self::TestMessageSetContainer DefaultInstanceForType {
+        get { return self::TestMessageSetContainer.DefaultInstance; }
+      }
+      
+      public override self::TestMessageSetContainer BuildPartial() {
+        self::TestMessageSetContainer returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestMessageSetContainer) {
+          return MergeFrom((self::TestMessageSetContainer) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestMessageSetContainer> MergeFrom(self::TestMessageSetContainer other) {
+        if (other == self::TestMessageSetContainer.DefaultInstance) return this;
+        if (other.HasMessageSet) {
+          MergeMessageSet(other.MessageSet);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestMessageSetContainer> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestMessageSetContainer> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 10: {
+              self::TestMessageSet.Builder subBuilder = self::TestMessageSet.CreateBuilder();
+              if (HasMessageSet) {
+                subBuilder.MergeFrom(MessageSet);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              MessageSet = subBuilder.BuildPartial();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional .protobuf_unittest.TestMessageSet message_set = 1;
+      public bool HasMessageSet {
+        get { return result.HasMessageSet; }
+      }
+      public self::TestMessageSet MessageSet {
+        get { return result.MessageSet; }
+        set { SetMessageSet(value); }
+      }
+      public Builder SetMessageSet(self::TestMessageSet value) {
+        result.hasMessageSet = true;
+        result.messageSet_ = value;
+        return this;
+      }
+      public Builder SetMessageSet(self::TestMessageSet.Builder builderForValue) {
+        result.hasMessageSet = true;
+        result.messageSet_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeMessageSet(self::TestMessageSet value) {
+        if (result.HasMessageSet &&
+            result.messageSet_ != self::TestMessageSet.DefaultInstance) {
+          result.messageSet_ =
+            self::TestMessageSet.CreateBuilder(result.messageSet_).MergeFrom(value).BuildPartial();
+        } else {
+          result.messageSet_ = value;
+        }
+        result.hasMessageSet = true;
+        return this;
+      }
+      public Builder ClearMessageSet() {
+        result.hasMessageSet = false;
+        result.messageSet_ = self::TestMessageSet.DefaultInstance;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class TestMessageSetExtension1 : pb::GeneratedMessage<TestMessageSetExtension1, TestMessageSetExtension1.Builder> {
+    // Use TestMessageSetExtension1.CreateBuilder() to construct.
+    private TestMessageSetExtension1() {}
+    
+    private static readonly TestMessageSetExtension1 defaultInstance = new TestMessageSetExtension1();
+    public static TestMessageSetExtension1 DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestMessageSetExtension1 DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSetExtension1__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSetExtension1__FieldAccessorTable; }
+    }
+    
+    #region Nested types
+    public static class Types {
+      public static readonly pb::GeneratedExtension<self::TestMessageSet, self::TestMessageSetExtension1> MessageSetExtension =
+            pb::GeneratedExtension.CreateExtension<self::TestMessageSet, self::TestMessageSetExtension1>(Descriptor.Extensions[0]);
+    }
+    #endregion
+    
+    // optional int32 i = 15;
+    private bool hasI;
+    private int i_ = 0;
+    public bool HasI {
+      get { return hasI; }
+    }
+    public int I {
+      get { return i_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasI) {
+        output.WriteInt32(15, I);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasI) {
+          size += pb::CodedOutputStream.ComputeInt32Size(15, I);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestMessageSetExtension1 ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestMessageSetExtension1 ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMessageSetExtension1 ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestMessageSetExtension1 parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMessageSetExtension1 ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestMessageSetExtension1 ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMessageSetExtension1 ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestMessageSetExtension1 ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestMessageSetExtension1> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestMessageSetExtension1 prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestMessageSetExtension1, Builder> {
+      // Construct using self::TestMessageSetExtension1.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestMessageSetExtension1 result = new self::TestMessageSetExtension1();
+      
+      protected override self::TestMessageSetExtension1 MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestMessageSetExtension1> Clear() {
+        result = new self::TestMessageSetExtension1();
+        return this;
+      }
+      
+      public override IBuilder<self::TestMessageSetExtension1> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestMessageSetExtension1.Descriptor; }
+      }
+      
+      public override self::TestMessageSetExtension1 DefaultInstanceForType {
+        get { return self::TestMessageSetExtension1.DefaultInstance; }
+      }
+      
+      public override self::TestMessageSetExtension1 BuildPartial() {
+        self::TestMessageSetExtension1 returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestMessageSetExtension1) {
+          return MergeFrom((self::TestMessageSetExtension1) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestMessageSetExtension1> MergeFrom(self::TestMessageSetExtension1 other) {
+        if (other == self::TestMessageSetExtension1.DefaultInstance) return this;
+        if (other.HasI) {
+          I = other.I;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestMessageSetExtension1> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestMessageSetExtension1> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 120: {
+              I = input.ReadInt32();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional int32 i = 15;
+      public bool HasI {
+        get { return result.HasI; }
+      }
+      public int I {
+        get { return result.I; }
+        set { SetI(value); }
+      }
+      public Builder SetI(int value) {
+        result.hasI = true;
+        result.i_ = value;
+        return this;
+      }
+      public Builder ClearI() {
+        result.hasI = false;
+        result.i_ = 0;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class TestMessageSetExtension2 : pb::GeneratedMessage<TestMessageSetExtension2, TestMessageSetExtension2.Builder> {
+    // Use TestMessageSetExtension2.CreateBuilder() to construct.
+    private TestMessageSetExtension2() {}
+    
+    private static readonly TestMessageSetExtension2 defaultInstance = new TestMessageSetExtension2();
+    public static TestMessageSetExtension2 DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestMessageSetExtension2 DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSetExtension2__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSetExtension2__FieldAccessorTable; }
+    }
+    
+    #region Nested types
+    public static class Types {
+      public static readonly pb::GeneratedExtension<self::TestMessageSet, self::TestMessageSetExtension2> MessageSetExtension =
+            pb::GeneratedExtension.CreateExtension<self::TestMessageSet, self::TestMessageSetExtension2>(Descriptor.Extensions[0]);
+    }
+    #endregion
+    
+    // optional string str = 25;
+    private bool hasStr;
+    private string str_ = "";
+    public bool HasStr {
+      get { return hasStr; }
+    }
+    public string Str {
+      get { return str_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasStr) {
+        output.WriteString(25, Str);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasStr) {
+          size += pb::CodedOutputStream.ComputeStringSize(25, Str);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestMessageSetExtension2 ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestMessageSetExtension2 ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMessageSetExtension2 ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestMessageSetExtension2 parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMessageSetExtension2 ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestMessageSetExtension2 ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMessageSetExtension2 ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestMessageSetExtension2 ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestMessageSetExtension2> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestMessageSetExtension2 prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestMessageSetExtension2, Builder> {
+      // Construct using self::TestMessageSetExtension2.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestMessageSetExtension2 result = new self::TestMessageSetExtension2();
+      
+      protected override self::TestMessageSetExtension2 MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestMessageSetExtension2> Clear() {
+        result = new self::TestMessageSetExtension2();
+        return this;
+      }
+      
+      public override IBuilder<self::TestMessageSetExtension2> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestMessageSetExtension2.Descriptor; }
+      }
+      
+      public override self::TestMessageSetExtension2 DefaultInstanceForType {
+        get { return self::TestMessageSetExtension2.DefaultInstance; }
+      }
+      
+      public override self::TestMessageSetExtension2 BuildPartial() {
+        self::TestMessageSetExtension2 returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestMessageSetExtension2) {
+          return MergeFrom((self::TestMessageSetExtension2) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestMessageSetExtension2> MergeFrom(self::TestMessageSetExtension2 other) {
+        if (other == self::TestMessageSetExtension2.DefaultInstance) return this;
+        if (other.HasStr) {
+          Str = other.Str;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestMessageSetExtension2> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestMessageSetExtension2> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 202: {
+              Str = input.ReadString();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional string str = 25;
+      public bool HasStr {
+        get { return result.HasStr; }
+      }
+      public string Str {
+        get { return result.Str; }
+        set { SetStr(value); }
+      }
+      public Builder SetStr(string value) {
+        result.hasStr = true;
+        result.str_ = value;
+        return this;
+      }
+      public Builder ClearStr() {
+        result.hasStr = false;
+        result.str_ = "";
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class RawMessageSet : pb::GeneratedMessage<RawMessageSet, RawMessageSet.Builder> {
+    // Use RawMessageSet.CreateBuilder() to construct.
+    private RawMessageSet() {}
+    
+    private static readonly RawMessageSet defaultInstance = new RawMessageSet();
+    public static RawMessageSet DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override RawMessageSet DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_RawMessageSet__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_RawMessageSet__FieldAccessorTable; }
+    }
+    
+    #region Nested types
+    public static class Types {
+      public sealed partial class Item : pb::GeneratedMessage<Item, Item.Builder> {
+        // Use Item.CreateBuilder() to construct.
+        private Item() {}
+        
+        private static readonly Item defaultInstance = new Item();
+        public static Item DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override Item DefaultInstanceForType {
+          get { return defaultInstance; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return self::UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_RawMessageSet_Item__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+          get { return self::UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_RawMessageSet_Item__FieldAccessorTable; }
+        }
+        
+        // required int32 type_id = 2;
+        private bool hasTypeId;
+        private int typeId_ = 0;
+        public bool HasTypeId {
+          get { return hasTypeId; }
+        }
+        public int TypeId {
+          get { return typeId_; }
+        }
+        
+        // required bytes message = 3;
+        private bool hasMessage;
+        private pb::ByteString message_ = pb::ByteString.Empty;
+        public bool HasMessage {
+          get { return hasMessage; }
+        }
+        public pb::ByteString Message {
+          get { return message_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasTypeId) return false;
+            if (!hasMessage) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::CodedOutputStream output) {
+          if (HasTypeId) {
+            output.WriteInt32(2, TypeId);
+          }
+          if (HasMessage) {
+            output.WriteBytes(3, Message);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (HasTypeId) {
+              size += pb::CodedOutputStream.ComputeInt32Size(2, TypeId);
+            }
+            if (HasMessage) {
+              size += pb::CodedOutputStream.ComputeBytesSize(3, Message);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static self::RawMessageSet.Types.Item ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static self::RawMessageSet.Types.Item ParseFrom(pb::ByteString data,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::RawMessageSet.Types.Item ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static self::RawMessageSet.Types.Item parseFrom(byte[] data,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::RawMessageSet.Types.Item ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static self::RawMessageSet.Types.Item ParseFrom(
+            global::System.IO.Stream input,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::RawMessageSet.Types.Item ParseFrom(pb::CodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static self::RawMessageSet.Types.Item ParseFrom(pb::CodedInputStream input,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+                   .BuildParsed();
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override IBuilder<self::RawMessageSet.Types.Item> CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(self::RawMessageSet.Types.Item prototype) {
+          return (Builder) new Builder().MergeFrom(prototype);
+        }
+        
+        public sealed partial class Builder : pb::GeneratedBuilder<self::RawMessageSet.Types.Item, Builder> {
+          // Construct using self::RawMessageSet.Types.Item.CreateBuilder()
+          internal Builder() {}
+          
+          self::RawMessageSet.Types.Item result = new self::RawMessageSet.Types.Item();
+          
+          protected override self::RawMessageSet.Types.Item MessageBeingBuilt {
+            get { return result; }
+          }
+          
+          public override IBuilder<self::RawMessageSet.Types.Item> Clear() {
+            result = new self::RawMessageSet.Types.Item();
+            return this;
+          }
+          
+          public override IBuilder<self::RawMessageSet.Types.Item> Clone() {
+            return new Builder().MergeFrom(result);
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return self::RawMessageSet.Types.Item.Descriptor; }
+          }
+          
+          public override self::RawMessageSet.Types.Item DefaultInstanceForType {
+            get { return self::RawMessageSet.Types.Item.DefaultInstance; }
+          }
+          
+          public override self::RawMessageSet.Types.Item BuildPartial() {
+            self::RawMessageSet.Types.Item returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public override IBuilder MergeFrom(pb::IMessage other) {
+            if (other is self::RawMessageSet.Types.Item) {
+              return MergeFrom((self::RawMessageSet.Types.Item) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override IBuilder<self::RawMessageSet.Types.Item> MergeFrom(self::RawMessageSet.Types.Item other) {
+            if (other == self::RawMessageSet.Types.Item.DefaultInstance) return this;
+            if (other.HasTypeId) {
+              TypeId = other.TypeId;
+            }
+            if (other.HasMessage) {
+              Message = other.Message;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override IBuilder<self::RawMessageSet.Types.Item> MergeFrom(pb::CodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override IBuilder<self::RawMessageSet.Types.Item> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            pb::UnknownFieldSet.Builder unknownFields =
+              pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+            while (true) {
+              uint tag = input.ReadTag();
+              switch (tag) {
+                case 0:
+                  this.UnknownFields = unknownFields.Build();
+                  return this;
+                default: {
+                  if (!ParseUnknownField(input, unknownFields,
+                                         extensionRegistry, tag)) {
+                    this.UnknownFields = unknownFields.Build();
+                    return this;
+                  }
+                  break;
+                }
+                case 16: {
+                  TypeId = input.ReadInt32();
+                  break;
+                }
+                case 26: {
+                  Message = input.ReadBytes();
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          // required int32 type_id = 2;
+          public bool HasTypeId {
+            get { return result.HasTypeId; }
+          }
+          public int TypeId {
+            get { return result.TypeId; }
+            set { SetTypeId(value); }
+          }
+          public Builder SetTypeId(int value) {
+            result.hasTypeId = true;
+            result.typeId_ = value;
+            return this;
+          }
+          public Builder ClearTypeId() {
+            result.hasTypeId = false;
+            result.typeId_ = 0;
+            return this;
+          }
+          
+          // required bytes message = 3;
+          public bool HasMessage {
+            get { return result.HasMessage; }
+          }
+          public pb::ByteString Message {
+            get { return result.Message; }
+            set { SetMessage(value); }
+          }
+          public Builder SetMessage(pb::ByteString value) {
+            result.hasMessage = true;
+            result.message_ = value;
+            return this;
+          }
+          public Builder ClearMessage() {
+            result.hasMessage = false;
+            result.message_ = pb::ByteString.Empty;
+            return this;
+          }
+        }
+      }
+      
+    }
+    #endregion
+    
+    // repeated group Item = 1 {
+    private scg::IList<self::RawMessageSet.Types.Item> item_ = pbc::Lists<self::RawMessageSet.Types.Item>.Empty;
+    public scg::IList<self::RawMessageSet.Types.Item> ItemList {
+      get { return item_; } 
+    }
+    public int ItemCount
+      { get { return item_.Count; }
+    }
+    public self::RawMessageSet.Types.Item GetItem(int index) {
+      return item_ [index];
+    }
+    
+    public override bool IsInitialized {
+      get {
+        foreach (self::RawMessageSet.Types.Item element in ItemList) {
+          if (!element.IsInitialized) return false;
+        }
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      foreach (self::RawMessageSet.Types.Item element in ItemList) {
+        output.WriteGroup(1, element);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        foreach (self::RawMessageSet.Types.Item element in ItemList) {
+          size += pb::CodedOutputStream.ComputeGroupSize(1, element);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::RawMessageSet ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::RawMessageSet ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::RawMessageSet ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::RawMessageSet parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::RawMessageSet ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::RawMessageSet ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::RawMessageSet ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::RawMessageSet ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::RawMessageSet> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::RawMessageSet prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::RawMessageSet, Builder> {
+      // Construct using self::RawMessageSet.CreateBuilder()
+      internal Builder() {}
+      
+      self::RawMessageSet result = new self::RawMessageSet();
+      
+      protected override self::RawMessageSet MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::RawMessageSet> Clear() {
+        result = new self::RawMessageSet();
+        return this;
+      }
+      
+      public override IBuilder<self::RawMessageSet> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::RawMessageSet.Descriptor; }
+      }
+      
+      public override self::RawMessageSet DefaultInstanceForType {
+        get { return self::RawMessageSet.DefaultInstance; }
+      }
+      
+      public override self::RawMessageSet BuildPartial() {
+        if (result.item_ != pbc::Lists<self::RawMessageSet.Types.Item>.Empty) {
+          result.item_ = pbc::Lists<self::RawMessageSet.Types.Item>.AsReadOnly(result.item_);
+        }
+        self::RawMessageSet returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::RawMessageSet) {
+          return MergeFrom((self::RawMessageSet) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::RawMessageSet> MergeFrom(self::RawMessageSet other) {
+        if (other == self::RawMessageSet.DefaultInstance) return this;
+        if (other.item_.Count != 0) {
+          if (result.item_.Count == 0) {
+            result.item_ = new scg::List<self::RawMessageSet.Types.Item>();
+          }
+          base.AddRange(other.item_, result.item_);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::RawMessageSet> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::RawMessageSet> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 11: {
+              self::RawMessageSet.Types.Item.Builder subBuilder = self::RawMessageSet.Types.Item.CreateBuilder();
+              input.ReadGroup(1, subBuilder, extensionRegistry);
+              AddItem(subBuilder.BuildPartial());
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // repeated group Item = 1 {
+      public scg::IList<self::RawMessageSet.Types.Item> ItemList {
+        get { return pbc::Lists.AsReadOnly(result.item_); }
+      }
+      public int ItemCount {
+        get { return result.ItemCount; }
+      }
+      public self::RawMessageSet.Types.Item GetItem(int index) {
+        return result.GetItem(index);
+      }
+      public Builder SetItem(int index, self::RawMessageSet.Types.Item value) {
+        result.item_[index] = value;
+        return this;
+      }
+      public Builder SetItem(int index, self::RawMessageSet.Types.Item.Builder builderForValue) {
+        result.item_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddItem(self::RawMessageSet.Types.Item value) {
+        if (result.item_ == pbc::Lists<self::RawMessageSet.Types.Item>.Empty) {
+          result.item_ = new scg::List<self::RawMessageSet.Types.Item>();
+        }
+        result.item_.Add(value);
+        return this;
+      }
+      public Builder AddItem(self::RawMessageSet.Types.Item.Builder builderForValue) {
+        if (result.item_ == pbc::Lists<self::RawMessageSet.Types.Item>.Empty) {
+          result.item_ = new scg::List<self::RawMessageSet.Types.Item>();
+        }
+        result.item_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeItem(scg::IEnumerable<self::RawMessageSet.Types.Item> values) {
+        if (result.item_ == pbc::Lists<self::RawMessageSet.Types.Item>.Empty) {
+          result.item_ = new scg::List<self::RawMessageSet.Types.Item>();
+        }
+        base.AddRange(values, result.item_);
+        return this;
+      }
+      public Builder ClearItem() {
+        result.item_ = pbc::Lists<self::RawMessageSet.Types.Item>.Empty;
+        return this;
+      }
+    }
+  }
+  
+  #endregion
+  
+  #region Services
+  #endregion
+}

+ 243 - 0
csharp/ProtocolBuffers.Test/TestProtos/UnitTestOptimizeForProtoFile.cs

@@ -0,0 +1,243 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+
+using pb = global::Google.ProtocolBuffers;
+using pbc = global::Google.ProtocolBuffers.Collections;
+using pbd = global::Google.ProtocolBuffers.Descriptors;
+using scg = global::System.Collections.Generic;
+using self = global::Google.ProtocolBuffers.TestProtos;
+
+namespace Google.ProtocolBuffers.TestProtos {
+  
+  public static partial class UnitTestOptimizeForProtoFile {
+  
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+        get { return descriptor; }
+    }
+    private static readonly pbd::FileDescriptor descriptor = pbd::FileDescriptor.InternalBuildGeneratedFileFrom (
+        new byte[] {
+            0x0a, 0x2b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x75, 0x6e, 
+            0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x2e, 
+            0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 
+            0x74, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 
+            0x66, 0x2f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x9e, 0x01, 0x0a, 
+            0x14, 0x54, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x46, 0x6f, 0x72, 0x53, 0x69, 0x7a, 
+            0x65, 0x12, 0x09, 0x0a, 0x01, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x12, 0x2e, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 
+            0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 
+            0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 
+            0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x32, 0x40, 0x0a, 0x0e, 0x74, 0x65, 0x73, 0x74, 0x5f, 
+            0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 
+            0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 
+            0x7a, 0x65, 0x64, 0x46, 0x6f, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0xd2, 0x09, 0x20, 0x01, 0x28, 0x05, 0x42, 0x45, 0x48, 
+            0x02, 0xc2, 0x3e, 0x21, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x42, 
+            0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0xca, 0x3e, 0x1c, 
+            0x55, 0x6e, 0x69, 0x74, 0x54, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x46, 0x6f, 0x72, 0x50, 
+            0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 
+        }, new pbd::FileDescriptor[] {
+                self::UnitTestProtoFile.Descriptor,
+        });
+    #endregion
+    
+    #region Extensions
+    /**/
+    #endregion
+    
+    #region Static variables
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestOptimizedForSize__Descriptor 
+        = Descriptor.MessageTypes[0];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestOptimizedForSize__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestOptimizedForSize__Descriptor,
+            new string[] { "I", "Msg", },
+            typeof (self::TestOptimizedForSize),
+            typeof (self::TestOptimizedForSize.Builder));
+    #endregion
+    
+  }
+  
+  #region Enums
+  #endregion
+  
+  #region Messages
+  public sealed partial class TestOptimizedForSize : pb::ExtendableMessage<TestOptimizedForSize, TestOptimizedForSize.Builder> {
+    // Use TestOptimizedForSize.CreateBuilder() to construct.
+    private TestOptimizedForSize() {}
+    
+    private static readonly TestOptimizedForSize defaultInstance = new TestOptimizedForSize();
+    public static TestOptimizedForSize DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestOptimizedForSize DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestOptimizeForProtoFile.internal__static_protobuf_unittest_TestOptimizedForSize__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestOptimizeForProtoFile.internal__static_protobuf_unittest_TestOptimizedForSize__FieldAccessorTable; }
+    }
+    
+    #region Nested types
+    public static class Types {
+      public static readonly pb::GeneratedExtension<self::TestOptimizedForSize, int> TestExtension =
+            pb::GeneratedExtension.CreateExtension<self::TestOptimizedForSize, int>(Descriptor.Extensions[0]);
+    }
+    #endregion
+    
+    // optional int32 i = 1;
+    private bool hasI;
+    private int i_ = 0;
+    public bool HasI {
+      get { return hasI; }
+    }
+    public int I {
+      get { return i_; }
+    }
+    
+    // optional .protobuf_unittest.ForeignMessage msg = 19;
+    private bool hasMsg;
+    private self::ForeignMessage msg_ = self::ForeignMessage.DefaultInstance;
+    public bool HasMsg {
+      get { return hasMsg; }
+    }
+    public self::ForeignMessage Msg {
+      get { return msg_; }
+    }
+    
+    public static self::TestOptimizedForSize ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestOptimizedForSize ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestOptimizedForSize ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestOptimizedForSize parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestOptimizedForSize ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestOptimizedForSize ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestOptimizedForSize ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestOptimizedForSize ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestOptimizedForSize> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestOptimizedForSize prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestOptimizedForSize, self::TestOptimizedForSize.Builder>.ExtendableBuilder {
+      // Construct using self::TestOptimizedForSize.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestOptimizedForSize result = new self::TestOptimizedForSize();
+      
+      protected override self::TestOptimizedForSize MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestOptimizedForSize> Clear() {
+        result = new self::TestOptimizedForSize();
+        return this;
+      }
+      
+      public override IBuilder<self::TestOptimizedForSize> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestOptimizedForSize.Descriptor; }
+      }
+      
+      public override self::TestOptimizedForSize DefaultInstanceForType {
+        get { return self::TestOptimizedForSize.DefaultInstance; }
+      }
+      
+      public override self::TestOptimizedForSize BuildPartial() {
+        self::TestOptimizedForSize returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      
+      // optional int32 i = 1;
+      public bool HasI {
+        get { return result.HasI; }
+      }
+      public int I {
+        get { return result.I; }
+        set { SetI(value); }
+      }
+      public Builder SetI(int value) {
+        result.hasI = true;
+        result.i_ = value;
+        return this;
+      }
+      public Builder ClearI() {
+        result.hasI = false;
+        result.i_ = 0;
+        return this;
+      }
+      
+      // optional .protobuf_unittest.ForeignMessage msg = 19;
+      public bool HasMsg {
+        get { return result.HasMsg; }
+      }
+      public self::ForeignMessage Msg {
+        get { return result.Msg; }
+        set { SetMsg(value); }
+      }
+      public Builder SetMsg(self::ForeignMessage value) {
+        result.hasMsg = true;
+        result.msg_ = value;
+        return this;
+      }
+      public Builder SetMsg(self::ForeignMessage.Builder builderForValue) {
+        result.hasMsg = true;
+        result.msg_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeMsg(self::ForeignMessage value) {
+        if (result.HasMsg &&
+            result.msg_ != self::ForeignMessage.DefaultInstance) {
+          result.msg_ =
+            self::ForeignMessage.CreateBuilder(result.msg_).MergeFrom(value).BuildPartial();
+        } else {
+          result.msg_ = value;
+        }
+        result.hasMsg = true;
+        return this;
+      }
+      public Builder ClearMsg() {
+        result.hasMsg = false;
+        result.msg_ = self::ForeignMessage.DefaultInstance;
+        return this;
+      }
+    }
+  }
+  
+  #endregion
+  
+  #region Services
+  #endregion
+}

+ 13140 - 0
csharp/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs

@@ -0,0 +1,13140 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+
+using pb = global::Google.ProtocolBuffers;
+using pbc = global::Google.ProtocolBuffers.Collections;
+using pbd = global::Google.ProtocolBuffers.Descriptors;
+using scg = global::System.Collections.Generic;
+using self = global::Google.ProtocolBuffers.TestProtos;
+
+namespace Google.ProtocolBuffers.TestProtos {
+  
+  public static partial class UnitTestProtoFile {
+  
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+        get { return descriptor; }
+    }
+    private static readonly pbd::FileDescriptor descriptor = pbd::FileDescriptor.InternalBuildGeneratedFileFrom (
+        new byte[] {
+            0x0a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x75, 0x6e, 
+            0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 
+            0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 
+            0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6d, 
+            0x70, 0x6f, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xbb, 0x15, 0x0a, 0x0c, 0x54, 0x65, 0x73, 0x74, 0x41, 
+            0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x0e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 
+            0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x12, 0x16, 0x0a, 0x0e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 
+            0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x12, 0x17, 0x0a, 0x0f, 0x6f, 
+            0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 
+            0x12, 0x17, 0x0a, 0x0f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 
+            0x04, 0x20, 0x01, 0x28, 0x04, 0x12, 0x17, 0x0a, 0x0f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x69, 
+            0x6e, 0x74, 0x33, 0x32, 0x18, 0x05, 0x20, 0x01, 0x28, 0x11, 0x12, 0x17, 0x0a, 0x0f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 
+            0x61, 0x6c, 0x5f, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x06, 0x20, 0x01, 0x28, 0x12, 0x12, 0x18, 0x0a, 0x10, 0x6f, 
+            0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x18, 0x07, 0x20, 0x01, 0x28, 
+            0x07, 0x12, 0x18, 0x0a, 0x10, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 
+            0x34, 0x18, 0x08, 0x20, 0x01, 0x28, 0x06, 0x12, 0x19, 0x0a, 0x11, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 
+            0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0f, 0x12, 0x19, 0x0a, 0x11, 0x6f, 0x70, 
+            0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x18, 0x0a, 0x20, 0x01, 0x28, 
+            0x10, 0x12, 0x16, 0x0a, 0x0e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18, 
+            0x0b, 0x20, 0x01, 0x28, 0x02, 0x12, 0x17, 0x0a, 0x0f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x6f, 
+            0x75, 0x62, 0x6c, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x01, 0x12, 0x15, 0x0a, 0x0d, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 
+            0x61, 0x6c, 0x5f, 0x62, 0x6f, 0x6f, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x12, 0x17, 0x0a, 0x0f, 0x6f, 0x70, 0x74, 
+            0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x12, 0x16, 
+            0x0a, 0x0e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x01, 
+            0x28, 0x0c, 0x12, 0x44, 0x0a, 0x0d, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 
+            0x10, 0x20, 0x01, 0x28, 0x0a, 0x32, 0x2d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 
+            0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4f, 
+            0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x4e, 0x0a, 0x17, 0x6f, 0x70, 0x74, 0x69, 
+            0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 
+            0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 
+            0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4e, 
+            0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x43, 0x0a, 0x18, 0x6f, 0x70, 0x74, 0x69, 
+            0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 
+            0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 
+            0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 
+            0x65, 0x12, 0x48, 0x0a, 0x17, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 
+            0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x72, 0x6f, 
+            0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 
+            0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x48, 0x0a, 0x14, 0x6f, 
+            0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 
+            0x15, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 
+            0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4e, 
+            0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x3d, 0x0a, 0x15, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 
+            0x6c, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0e, 
+            0x32, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 
+            0x2e, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x42, 0x0a, 0x14, 0x6f, 0x70, 0x74, 0x69, 
+            0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x17, 0x20, 0x01, 
+            0x28, 0x0e, 0x32, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 
+            0x73, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x45, 0x6e, 0x75, 0x6d, 
+            0x12, 0x21, 0x0a, 0x15, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 
+            0x70, 0x69, 0x65, 0x63, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x08, 0x02, 0x12, 0x19, 0x0a, 0x0d, 0x6f, 
+            0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 
+            0x08, 0x01, 0x12, 0x16, 0x0a, 0x0e, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x33, 0x32, 
+            0x18, 0x1f, 0x20, 0x03, 0x28, 0x05, 0x12, 0x16, 0x0a, 0x0e, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x69, 
+            0x6e, 0x74, 0x36, 0x34, 0x18, 0x20, 0x20, 0x03, 0x28, 0x03, 0x12, 0x17, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 
+            0x65, 0x64, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x21, 0x20, 0x03, 0x28, 0x0d, 0x12, 0x17, 0x0a, 0x0f, 0x72, 
+            0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x22, 0x20, 0x03, 0x28, 0x04, 
+            0x12, 0x17, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 
+            0x23, 0x20, 0x03, 0x28, 0x11, 0x12, 0x17, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x69, 
+            0x6e, 0x74, 0x36, 0x34, 0x18, 0x24, 0x20, 0x03, 0x28, 0x12, 0x12, 0x18, 0x0a, 0x10, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 
+            0x65, 0x64, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x18, 0x25, 0x20, 0x03, 0x28, 0x07, 0x12, 0x18, 0x0a, 0x10, 
+            0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x18, 0x26, 0x20, 0x03, 
+            0x28, 0x06, 0x12, 0x19, 0x0a, 0x11, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x66, 0x69, 0x78, 0x65, 
+            0x64, 0x33, 0x32, 0x18, 0x27, 0x20, 0x03, 0x28, 0x0f, 0x12, 0x19, 0x0a, 0x11, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 
+            0x64, 0x5f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x18, 0x28, 0x20, 0x03, 0x28, 0x10, 0x12, 0x16, 0x0a, 0x0e, 
+            0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18, 0x29, 0x20, 0x03, 0x28, 0x02, 
+            0x12, 0x17, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x18, 
+            0x2a, 0x20, 0x03, 0x28, 0x01, 0x12, 0x15, 0x0a, 0x0d, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x6f, 
+            0x6f, 0x6c, 0x18, 0x2b, 0x20, 0x03, 0x28, 0x08, 0x12, 0x17, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 
+            0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x2c, 0x20, 0x03, 0x28, 0x09, 0x12, 0x16, 0x0a, 0x0e, 0x72, 0x65, 0x70, 
+            0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x2d, 0x20, 0x03, 0x28, 0x0c, 0x12, 0x44, 0x0a, 
+            0x0d, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x2e, 0x20, 0x03, 0x28, 0x0a, 
+            0x32, 0x2d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 
+            0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 
+            0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x4e, 0x0a, 0x17, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 
+            0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x30, 0x20, 0x03, 0x28, 0x0b, 
+            0x32, 0x2d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 
+            0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 
+            0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x43, 0x0a, 0x18, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 
+            0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x31, 0x20, 0x03, 0x28, 
+            0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 
+            0x74, 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x48, 0x0a, 0x17, 
+            0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73, 
+            0x61, 0x67, 0x65, 0x18, 0x32, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 
+            0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6d, 0x70, 
+            0x6f, 0x72, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x48, 0x0a, 0x14, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 
+            0x65, 0x64, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x33, 0x20, 0x03, 0x28, 0x0e, 
+            0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 
+            0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 
+            0x45, 0x6e, 0x75, 0x6d, 0x12, 0x3d, 0x0a, 0x15, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x6f, 0x72, 
+            0x65, 0x69, 0x67, 0x6e, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x34, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x70, 0x72, 
+            0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x6f, 0x72, 0x65, 
+            0x69, 0x67, 0x6e, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x42, 0x0a, 0x14, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 
+            0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x35, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x24, 0x2e, 
+            0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6d, 
+            0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x21, 0x0a, 0x15, 0x72, 
+            0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x69, 0x65, 0x63, 0x65, 
+            0x18, 0x36, 0x20, 0x03, 0x28, 0x09, 0x42, 0x02, 0x08, 0x02, 0x12, 0x19, 0x0a, 0x0d, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 
+            0x65, 0x64, 0x5f, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x37, 0x20, 0x03, 0x28, 0x09, 0x42, 0x02, 0x08, 0x01, 0x12, 0x19, 0x0a, 
+            0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x05, 
+            0x3a, 0x02, 0x34, 0x31, 0x12, 0x19, 0x0a, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x36, 
+            0x34, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x03, 0x3a, 0x02, 0x34, 0x32, 0x12, 0x1a, 0x0a, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 
+            0x6c, 0x74, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x0d, 0x3a, 0x02, 0x34, 0x33, 0x12, 
+            0x1a, 0x0a, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x40, 0x20, 
+            0x01, 0x28, 0x04, 0x3a, 0x02, 0x34, 0x34, 0x12, 0x1b, 0x0a, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x73, 
+            0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x41, 0x20, 0x01, 0x28, 0x11, 0x3a, 0x03, 0x2d, 0x34, 0x35, 0x12, 0x1a, 0x0a, 0x0e, 
+            0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x42, 0x20, 0x01, 0x28, 0x12, 
+            0x3a, 0x02, 0x34, 0x36, 0x12, 0x1b, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x66, 0x69, 0x78, 0x65, 
+            0x64, 0x33, 0x32, 0x18, 0x43, 0x20, 0x01, 0x28, 0x07, 0x3a, 0x02, 0x34, 0x37, 0x12, 0x1b, 0x0a, 0x0f, 0x64, 0x65, 0x66, 
+            0x61, 0x75, 0x6c, 0x74, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x18, 0x44, 0x20, 0x01, 0x28, 0x06, 0x3a, 0x02, 
+            0x34, 0x38, 0x12, 0x1c, 0x0a, 0x10, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 
+            0x33, 0x32, 0x18, 0x45, 0x20, 0x01, 0x28, 0x0f, 0x3a, 0x02, 0x34, 0x39, 0x12, 0x1d, 0x0a, 0x10, 0x64, 0x65, 0x66, 0x61, 
+            0x75, 0x6c, 0x74, 0x5f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x18, 0x46, 0x20, 0x01, 0x28, 0x10, 0x3a, 0x03, 
+            0x2d, 0x35, 0x30, 0x12, 0x1b, 0x0a, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 
+            0x18, 0x47, 0x20, 0x01, 0x28, 0x02, 0x3a, 0x04, 0x35, 0x31, 0x2e, 0x35, 0x12, 0x1d, 0x0a, 0x0e, 0x64, 0x65, 0x66, 0x61, 
+            0x75, 0x6c, 0x74, 0x5f, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x18, 0x48, 0x20, 0x01, 0x28, 0x01, 0x3a, 0x05, 0x35, 0x32, 
+            0x30, 0x30, 0x30, 0x12, 0x1a, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x62, 0x6f, 0x6f, 0x6c, 0x18, 
+            0x49, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x12, 0x1d, 0x0a, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 
+            0x6c, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x4a, 0x20, 0x01, 0x28, 0x09, 0x3a, 0x05, 0x68, 0x65, 0x6c, 
+            0x6c, 0x6f, 0x12, 0x1c, 0x0a, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 
+            0x4b, 0x20, 0x01, 0x28, 0x0c, 0x3a, 0x05, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x12, 0x4c, 0x0a, 0x13, 0x64, 0x65, 0x66, 0x61, 
+            0x75, 0x6c, 0x74, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x51, 0x20, 0x01, 0x28, 
+            0x0e, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 
+            0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 
+            0x64, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x03, 0x42, 0x41, 0x52, 0x12, 0x49, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 
+            0x74, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x52, 0x20, 0x01, 0x28, 0x0e, 
+            0x32, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 
+            0x2e, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x0b, 0x46, 0x4f, 0x52, 0x45, 0x49, 0x47, 
+            0x4e, 0x5f, 0x42, 0x41, 0x52, 0x12, 0x4d, 0x0a, 0x13, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x69, 0x6d, 0x70, 
+            0x6f, 0x72, 0x74, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x53, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x70, 0x72, 0x6f, 
+            0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 
+            0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x0a, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 
+            0x5f, 0x42, 0x41, 0x52, 0x12, 0x25, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x69, 
+            0x6e, 0x67, 0x5f, 0x70, 0x69, 0x65, 0x63, 0x65, 0x18, 0x54, 0x20, 0x01, 0x28, 0x09, 0x3a, 0x03, 0x61, 0x62, 0x63, 0x42, 
+            0x02, 0x08, 0x02, 0x12, 0x1d, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x63, 0x6f, 0x72, 0x64, 0x18, 
+            0x55, 0x20, 0x01, 0x28, 0x09, 0x3a, 0x03, 0x31, 0x32, 0x33, 0x42, 0x02, 0x08, 0x01, 0x1a, 0x1b, 0x0a, 0x0d, 0x4e, 0x65, 
+            0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0a, 0x0a, 0x02, 0x62, 0x62, 0x18, 0x01, 0x20, 
+            0x01, 0x28, 0x05, 0x1a, 0x1a, 0x0a, 0x0d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, 
+            0x12, 0x09, 0x0a, 0x01, 0x61, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x1a, 0x1a, 0x0a, 0x0d, 0x52, 0x65, 0x70, 0x65, 0x61, 
+            0x74, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x09, 0x0a, 0x01, 0x61, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x05, 0x22, 
+            0x27, 0x0a, 0x0a, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x4f, 0x4f, 
+            0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x42, 0x41, 0x52, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x42, 0x41, 0x5a, 0x10, 0x03, 
+            0x22, 0x1b, 0x0a, 0x0e, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x09, 
+            0x0a, 0x01, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x22, 0x1d, 0x0a, 0x11, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 
+            0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2a, 0x08, 0x08, 0x01, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 
+            0x22, 0x24, 0x0a, 0x17, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x65, 0x78, 
+            0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x01, 0x61, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x22, 0x24, 
+            0x0a, 0x17, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x65, 0x78, 0x74, 0x65, 
+            0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x01, 0x61, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x05, 0x22, 0xd5, 0x05, 0x0a, 
+            0x0c, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x09, 0x0a, 0x01, 0x61, 0x18, 0x01, 
+            0x20, 0x02, 0x28, 0x05, 0x12, 0x0e, 0x0a, 0x06, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x32, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 
+            0x12, 0x09, 0x0a, 0x01, 0x62, 0x18, 0x03, 0x20, 0x02, 0x28, 0x05, 0x12, 0x0e, 0x0a, 0x06, 0x64, 0x75, 0x6d, 0x6d, 0x79, 
+            0x34, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0e, 0x0a, 0x06, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x35, 0x18, 0x05, 0x20, 
+            0x01, 0x28, 0x05, 0x12, 0x0e, 0x0a, 0x06, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x36, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x12, 
+            0x0e, 0x0a, 0x06, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x37, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0e, 0x0a, 0x06, 0x64, 
+            0x75, 0x6d, 0x6d, 0x79, 0x38, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0e, 0x0a, 0x06, 0x64, 0x75, 0x6d, 0x6d, 0x79, 
+            0x39, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x31, 0x30, 0x18, 0x0a, 
+            0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x31, 0x31, 0x18, 0x0b, 0x20, 0x01, 0x28, 
+            0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x31, 0x32, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 
+            0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x31, 0x33, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 
+            0x75, 0x6d, 0x6d, 0x79, 0x31, 0x34, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 
+            0x79, 0x31, 0x35, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x31, 0x36, 
+            0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x31, 0x37, 0x18, 0x11, 0x20, 
+            0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x31, 0x38, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 
+            0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x31, 0x39, 0x18, 0x13, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 
+            0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x32, 0x30, 0x18, 0x14, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 
+            0x6d, 0x6d, 0x79, 0x32, 0x31, 0x18, 0x15, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 
+            0x32, 0x32, 0x18, 0x16, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x32, 0x33, 0x18, 
+            0x17, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x32, 0x34, 0x18, 0x18, 0x20, 0x01, 
+            0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x32, 0x35, 0x18, 0x19, 0x20, 0x01, 0x28, 0x05, 0x12, 
+            0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x32, 0x36, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 
+            0x64, 0x75, 0x6d, 0x6d, 0x79, 0x32, 0x37, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 
+            0x6d, 0x79, 0x32, 0x38, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x32, 
+            0x39, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x33, 0x30, 0x18, 0x1e, 
+            0x20, 0x01, 0x28, 0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x33, 0x31, 0x18, 0x1f, 0x20, 0x01, 0x28, 
+            0x05, 0x12, 0x0f, 0x0a, 0x07, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x33, 0x32, 0x18, 0x20, 0x20, 0x01, 0x28, 0x05, 0x12, 0x09, 
+            0x0a, 0x01, 0x63, 0x18, 0x21, 0x20, 0x02, 0x28, 0x05, 0x32, 0x56, 0x0a, 0x06, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x12, 
+            0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 
+            0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xe8, 0x07, 
+            0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 
+            0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x32, 0x55, 0x0a, 
+            0x05, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 
+            0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 
+            0x69, 0x6f, 0x6e, 0x73, 0x18, 0xe9, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 
+            0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 
+            0x69, 0x72, 0x65, 0x64, 0x22, 0x9a, 0x01, 0x0a, 0x13, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 
+            0x64, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x12, 0x39, 0x0a, 0x10, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 
+            0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 
+            0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 
+            0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x10, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 
+            0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 
+            0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 
+            0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x0d, 0x0a, 0x05, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 
+            0x05, 0x22, 0x5a, 0x0a, 0x11, 0x54, 0x65, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4e, 0x65, 0x73, 0x74, 
+            0x65, 0x64, 0x12, 0x45, 0x0a, 0x0e, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 
+            0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 
+            0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 
+            0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x12, 0x0a, 0x10, 0x54, 0x65, 0x73, 
+            0x74, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x2a, 0x0a, 0x1e, 0x54, 0x65, 0x73, 
+            0x74, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x57, 0x69, 0x74, 0x68, 0x45, 0x78, 0x74, 
+            0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2a, 0x08, 0x08, 0x01, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0x34, 0x0a, 
+            0x18, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x61, 0x6c, 0x6c, 0x79, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x54, 0x61, 0x67, 0x4e, 
+            0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x09, 0x0a, 0x01, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0d, 0x0a, 0x02, 
+            0x62, 0x62, 0x18, 0xff, 0xff, 0xff, 0x7f, 0x20, 0x01, 0x28, 0x05, 0x22, 0x55, 0x0a, 0x14, 0x54, 0x65, 0x73, 0x74, 0x52, 
+            0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x32, 0x0a, 0x01, 0x61, 
+            0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 
+            0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 
+            0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x09, 0x0a, 0x01, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x22, 0x4b, 
+            0x0a, 0x14, 0x54, 0x65, 0x73, 0x74, 0x4d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x6f, 
+            0x6e, 0x41, 0x12, 0x33, 0x0a, 0x02, 0x62, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x72, 0x6f, 
+            0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x4d, 
+            0x75, 0x74, 0x75, 0x61, 0x6c, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x22, 0x62, 0x0a, 0x14, 0x54, 
+            0x65, 0x73, 0x74, 0x4d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x12, 
+            0x32, 0x0a, 0x01, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 
+            0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x4d, 0x75, 0x74, 0x75, 0x61, 
+            0x6c, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x12, 0x16, 0x0a, 0x0e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 
+            0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x22, 0xb3, 0x01, 0x0a, 0x12, 
+            0x54, 0x65, 0x73, 0x74, 0x44, 0x75, 0x70, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x09, 
+            0x0a, 0x01, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x12, 0x36, 0x0a, 0x03, 0x66, 0x6f, 0x6f, 0x18, 0x02, 0x20, 0x01, 
+            0x28, 0x0a, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 
+            0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x44, 0x75, 0x70, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x65, 
+            0x72, 0x2e, 0x46, 0x6f, 0x6f, 0x12, 0x36, 0x0a, 0x03, 0x62, 0x61, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0a, 0x32, 0x29, 
+            0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 
+            0x65, 0x73, 0x74, 0x44, 0x75, 0x70, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x42, 0x61, 
+            0x72, 0x1a, 0x10, 0x0a, 0x03, 0x46, 0x6f, 0x6f, 0x12, 0x09, 0x0a, 0x01, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x1a, 
+            0x10, 0x0a, 0x03, 0x42, 0x61, 0x72, 0x12, 0x09, 0x0a, 0x01, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x22, 0x80, 0x02, 
+            0x0a, 0x18, 0x54, 0x65, 0x73, 0x74, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 
+            0x61, 0x73, 0x42, 0x69, 0x74, 0x73, 0x12, 0x5a, 0x0a, 0x17, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x6e, 
+            0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 
+            0x39, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 
+            0x54, 0x65, 0x73, 0x74, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x48, 0x61, 0x73, 
+            0x42, 0x69, 0x74, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x87, 
+            0x01, 0x0a, 0x0d, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x1c, 
+            0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 
+            0x65, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x12, 0x50, 0x0a, 0x25, 0x6e, 0x65, 
+            0x73, 0x74, 0x65, 0x64, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 
+            0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 
+            0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 
+            0x74, 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xe5, 0x03, 0x0a, 
+            0x17, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x6d, 0x65, 0x6c, 0x43, 0x61, 0x73, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 
+            0x61, 0x6d, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x0e, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x46, 0x69, 0x65, 
+            0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x12, 0x13, 0x0a, 0x0b, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, 0x69, 
+            0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x12, 0x31, 0x0a, 0x09, 0x45, 0x6e, 0x75, 0x6d, 0x46, 0x69, 0x65, 
+            0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 
+            0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x45, 0x6e, 0x75, 0x6d, 
+            0x12, 0x37, 0x0a, 0x0c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 
+            0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 
+            0x73, 0x74, 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 
+            0x10, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x69, 0x65, 0x63, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x05, 0x20, 
+            0x01, 0x28, 0x09, 0x42, 0x02, 0x08, 0x02, 0x12, 0x15, 0x0a, 0x09, 0x43, 0x6f, 0x72, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 
+            0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x08, 0x01, 0x12, 0x1e, 0x0a, 0x16, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 
+            0x65, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x03, 
+            0x28, 0x05, 0x12, 0x1b, 0x0a, 0x13, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 
+            0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x12, 0x39, 0x0a, 0x11, 0x52, 0x65, 0x70, 0x65, 0x61, 
+            0x74, 0x65, 0x64, 0x45, 0x6e, 0x75, 0x6d, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1e, 
+            0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x46, 
+            0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x3f, 0x0a, 0x14, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 
+            0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 
+            0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 
+            0x2e, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x18, 0x52, 
+            0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x69, 0x65, 0x63, 0x65, 0x46, 0x69, 
+            0x65, 0x6c, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x42, 0x02, 0x08, 0x02, 0x12, 0x1d, 0x0a, 0x11, 0x52, 0x65, 0x70, 
+            0x65, 0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x72, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 
+            0x42, 0x02, 0x08, 0x01, 0x22, 0x55, 0x0a, 0x12, 0x54, 0x65, 0x73, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x72, 0x64, 
+            0x65, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x11, 0x0a, 0x09, 0x6d, 0x79, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 
+            0x0b, 0x20, 0x01, 0x28, 0x09, 0x12, 0x0e, 0x0a, 0x06, 0x6d, 0x79, 0x5f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 
+            0x03, 0x12, 0x10, 0x0a, 0x08, 0x6d, 0x79, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x02, 0x2a, 
+            0x04, 0x08, 0x02, 0x10, 0x0b, 0x2a, 0x04, 0x08, 0x0c, 0x10, 0x65, 0x22, 0x90, 0x02, 0x0a, 0x18, 0x54, 0x65, 0x73, 0x74, 
+            0x45, 0x78, 0x74, 0x72, 0x65, 0x6d, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 
+            0x12, 0x3f, 0x0a, 0x0d, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 
+            0x01, 0x28, 0x0c, 0x3a, 0x28, 0x5c, 0x30, 0x30, 0x30, 0x5c, 0x30, 0x30, 0x31, 0x5c, 0x30, 0x30, 0x37, 0x5c, 0x30, 0x31, 
+            0x30, 0x5c, 0x30, 0x31, 0x34, 0x5c, 0x6e, 0x5c, 0x72, 0x5c, 0x74, 0x5c, 0x30, 0x31, 0x33, 0x5c, 0x5c, 0x5c, 0x27, 0x5c, 
+            0x22, 0x5c, 0x33, 0x37, 0x36, 0x12, 0x20, 0x0a, 0x0c, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x33, 
+            0x32, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x3a, 0x0a, 0x34, 0x32, 0x39, 0x34, 0x39, 0x36, 0x37, 0x32, 0x39, 0x35, 0x12, 
+            0x2a, 0x0a, 0x0c, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x03, 0x20, 0x01, 0x28, 
+            0x04, 0x3a, 0x14, 0x31, 0x38, 0x34, 0x34, 0x36, 0x37, 0x34, 0x34, 0x30, 0x37, 0x33, 0x37, 0x30, 0x39, 0x35, 0x35, 0x31, 
+            0x36, 0x31, 0x35, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x04, 
+            0x20, 0x01, 0x28, 0x05, 0x3a, 0x0b, 0x2d, 0x32, 0x31, 0x34, 0x37, 0x34, 0x38, 0x33, 0x36, 0x34, 0x37, 0x12, 0x29, 0x0a, 
+            0x0b, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x3a, 0x14, 
+            0x2d, 0x39, 0x32, 0x32, 0x33, 0x33, 0x37, 0x32, 0x30, 0x33, 0x36, 0x38, 0x35, 0x34, 0x37, 0x37, 0x35, 0x38, 0x30, 0x37, 
+            0x12, 0x18, 0x0a, 0x0b, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 
+            0x09, 0x3a, 0x03, 0xe1, 0x88, 0xb4, 0x22, 0x0c, 0x0a, 0x0a, 0x46, 0x6f, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 
+            0x22, 0x0d, 0x0a, 0x0b, 0x46, 0x6f, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0x0a, 0x0a, 0x42, 
+            0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x0d, 0x0a, 0x0b, 0x42, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 
+            0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x40, 0x0a, 0x0b, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x45, 0x6e, 0x75, 0x6d, 0x12, 
+            0x0f, 0x0a, 0x0b, 0x46, 0x4f, 0x52, 0x45, 0x49, 0x47, 0x4e, 0x5f, 0x46, 0x4f, 0x4f, 0x10, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 
+            0x46, 0x4f, 0x52, 0x45, 0x49, 0x47, 0x4e, 0x5f, 0x42, 0x41, 0x52, 0x10, 0x05, 0x12, 0x0f, 0x0a, 0x0b, 0x46, 0x4f, 0x52, 
+            0x45, 0x49, 0x47, 0x4e, 0x5f, 0x42, 0x41, 0x5a, 0x10, 0x06, 0x2a, 0x47, 0x0a, 0x14, 0x54, 0x65, 0x73, 0x74, 0x45, 0x6e, 
+            0x75, 0x6d, 0x57, 0x69, 0x74, 0x68, 0x44, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x4f, 
+            0x4f, 0x31, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x41, 0x52, 0x31, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x42, 0x41, 
+            0x5a, 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x4f, 0x4f, 0x32, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x41, 0x52, 
+            0x32, 0x10, 0x02, 0x2a, 0x89, 0x01, 0x0a, 0x0e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x70, 0x61, 0x72, 0x73, 0x65, 0x45, 0x6e, 
+            0x75, 0x6d, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x50, 0x41, 0x52, 0x53, 0x45, 0x5f, 0x41, 0x10, 0x7b, 0x12, 0x0e, 0x0a, 0x08, 
+            0x53, 0x50, 0x41, 0x52, 0x53, 0x45, 0x5f, 0x42, 0x10, 0xa6, 0xe7, 0x03, 0x12, 0x0f, 0x0a, 0x08, 0x53, 0x50, 0x41, 0x52, 
+            0x53, 0x45, 0x5f, 0x43, 0x10, 0xb2, 0xb1, 0x80, 0x06, 0x12, 0x15, 0x0a, 0x08, 0x53, 0x50, 0x41, 0x52, 0x53, 0x45, 0x5f, 
+            0x44, 0x10, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x15, 0x0a, 0x08, 0x53, 0x50, 0x41, 0x52, 
+            0x53, 0x45, 0x5f, 0x45, 0x10, 0xb4, 0xde, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x53, 
+            0x50, 0x41, 0x52, 0x53, 0x45, 0x5f, 0x46, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x50, 0x41, 0x52, 0x53, 0x45, 0x5f, 
+            0x47, 0x10, 0x02, 0x32, 0x99, 0x01, 0x0a, 0x0b, 0x54, 0x65, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 
+            0x44, 0x0a, 0x03, 0x46, 0x6f, 0x6f, 0x12, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 
+            0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x6f, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 
+            0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x6f, 
+            0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x03, 0x42, 0x61, 0x72, 0x12, 0x1d, 0x2e, 0x70, 
+            0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x42, 0x61, 0x72, 
+            0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 
+            0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x42, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3a, 
+            0x46, 0x0a, 0x18, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x65, 0x78, 
+            0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 
+            0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 
+            0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x3a, 0x46, 0x0a, 0x18, 0x6f, 0x70, 0x74, 0x69, 0x6f, 
+            0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 
+            0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 
+            0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 
+            0x01, 0x28, 0x03, 0x3a, 0x47, 0x0a, 0x19, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x75, 0x69, 0x6e, 0x74, 
+            0x33, 0x32, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 
+            0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 
+            0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x3a, 0x47, 0x0a, 0x19, 
+            0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x65, 0x78, 0x74, 0x65, 
+            0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 
+            0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 
+            0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x3a, 0x47, 0x0a, 0x19, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 
+            0x6c, 0x5f, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 
+            0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 
+            0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 
+            0x28, 0x11, 0x3a, 0x47, 0x0a, 0x19, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x6e, 0x74, 0x36, 
+            0x34, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 
+            0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 
+            0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x12, 0x3a, 0x48, 0x0a, 0x1a, 0x6f, 
+            0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x65, 0x78, 0x74, 0x65, 
+            0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 
+            0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 
+            0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x07, 0x3a, 0x48, 0x0a, 0x1a, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 
+            0x6c, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 
+            0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 
+            0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 
+            0x01, 0x28, 0x06, 0x3a, 0x49, 0x0a, 0x1b, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x66, 0x69, 0x78, 
+            0x65, 0x64, 0x33, 0x32, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 
+            0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 
+            0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0f, 0x3a, 0x49, 
+            0x0a, 0x1b, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 
+            0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 
+            0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 
+            0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x10, 0x3a, 0x46, 0x0a, 0x18, 0x6f, 0x70, 0x74, 
+            0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 
+            0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 
+            0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 
+            0x0b, 0x20, 0x01, 0x28, 0x02, 0x3a, 0x47, 0x0a, 0x19, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x6f, 
+            0x75, 0x62, 0x6c, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 
+            0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 
+            0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x01, 0x3a, 0x45, 
+            0x0a, 0x17, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x65, 0x78, 0x74, 0x65, 
+            0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 
+            0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 
+            0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x47, 0x0a, 0x19, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 
+            0x6c, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 
+            0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 
+            0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0e, 0x20, 0x01, 
+            0x28, 0x09, 0x3a, 0x46, 0x0a, 0x18, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 
+            0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 
+            0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 
+            0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0c, 0x3a, 0x71, 0x0a, 0x17, 0x6f, 0x70, 
+            0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 
+            0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 
+            0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 
+            0x10, 0x20, 0x01, 0x28, 0x0a, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 
+            0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x5f, 
+            0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x7e, 0x0a, 0x21, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 
+            0x6c, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x65, 0x78, 0x74, 
+            0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 
+            0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 
+            0x69, 0x6f, 0x6e, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 
+            0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x79, 
+            0x70, 0x65, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x73, 0x0a, 
+            0x22, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6d, 0x65, 
+            0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 
+            0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 
+            0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 
+            0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 
+            0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x78, 0x0a, 0x21, 0x6f, 0x70, 
+            0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 
+            0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 
+            0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 
+            0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x72, 
+            0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 
+            0x72, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x78, 0x0a, 0x1e, 
+            0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 
+            0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 
+            0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 
+            0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 
+            0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 
+            0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x6d, 
+            0x0a, 0x1f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x65, 
+            0x6e, 0x75, 0x6d, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 
+            0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 
+            0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 
+            0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x6f, 
+            0x72, 0x65, 0x69, 0x67, 0x6e, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x72, 0x0a, 0x1e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 
+            0x6c, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 
+            0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 
+            0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 
+            0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 
+            0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 
+            0x74, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x51, 0x0a, 0x1f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x74, 
+            0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x69, 0x65, 0x63, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 
+            0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 
+            0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x18, 
+            0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x08, 0x02, 0x3a, 0x49, 0x0a, 0x17, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 
+            0x5f, 0x63, 0x6f, 0x72, 0x64, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 
+            0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 
+            0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x42, 
+            0x02, 0x08, 0x01, 0x3a, 0x46, 0x0a, 0x18, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x33, 
+            0x32, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 
+            0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 
+            0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x1f, 0x20, 0x03, 0x28, 0x05, 0x3a, 0x46, 0x0a, 0x18, 0x72, 
+            0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 
+            0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 
+            0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 
+            0x73, 0x18, 0x20, 0x20, 0x03, 0x28, 0x03, 0x3a, 0x47, 0x0a, 0x19, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 
+            0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 
+            0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 
+            0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x21, 0x20, 0x03, 0x28, 0x0d, 
+            0x3a, 0x47, 0x0a, 0x19, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 
+            0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 
+            0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 
+            0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x22, 0x20, 0x03, 0x28, 0x04, 0x3a, 0x47, 0x0a, 0x19, 0x72, 0x65, 0x70, 
+            0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 
+            0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 
+            0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 
+            0x18, 0x23, 0x20, 0x03, 0x28, 0x11, 0x3a, 0x47, 0x0a, 0x19, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 
+            0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 
+            0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 
+            0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x24, 0x20, 0x03, 0x28, 0x12, 0x3a, 
+            0x48, 0x0a, 0x1a, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 
+            0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 
+            0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 
+            0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x25, 0x20, 0x03, 0x28, 0x07, 0x3a, 0x48, 0x0a, 0x1a, 0x72, 0x65, 0x70, 
+            0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 
+            0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 
+            0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 
+            0x73, 0x18, 0x26, 0x20, 0x03, 0x28, 0x06, 0x3a, 0x49, 0x0a, 0x1b, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 
+            0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 
+            0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 
+            0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x27, 0x20, 0x03, 
+            0x28, 0x0f, 0x3a, 0x49, 0x0a, 0x1b, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x66, 0x69, 0x78, 0x65, 
+            0x64, 0x36, 0x34, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 
+            0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 
+            0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x28, 0x20, 0x03, 0x28, 0x10, 0x3a, 0x46, 0x0a, 
+            0x18, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x65, 
+            0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 
+            0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 
+            0x6f, 0x6e, 0x73, 0x18, 0x29, 0x20, 0x03, 0x28, 0x02, 0x3a, 0x47, 0x0a, 0x19, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 
+            0x64, 0x5f, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 
+            0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 
+            0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x2a, 0x20, 0x03, 
+            0x28, 0x01, 0x3a, 0x45, 0x0a, 0x17, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 
+            0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 
+            0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 
+            0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x2b, 0x20, 0x03, 0x28, 0x08, 0x3a, 0x47, 0x0a, 0x19, 0x72, 0x65, 0x70, 
+            0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 
+            0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 
+            0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 
+            0x18, 0x2c, 0x20, 0x03, 0x28, 0x09, 0x3a, 0x46, 0x0a, 0x18, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 
+            0x79, 0x74, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 
+            0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 
+            0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x2d, 0x20, 0x03, 0x28, 0x0c, 0x3a, 0x71, 
+            0x0a, 0x17, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x65, 0x78, 0x74, 0x65, 
+            0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 
+            0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 
+            0x6f, 0x6e, 0x73, 0x18, 0x2e, 0x20, 0x03, 0x28, 0x0a, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 
+            0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x47, 0x72, 
+            0x6f, 0x75, 0x70, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x7e, 0x0a, 0x21, 0x72, 0x65, 0x70, 
+            0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 
+            0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 
+            0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 
+            0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x30, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x72, 0x6f, 
+            0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 
+            0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 
+            0x65, 0x3a, 0x73, 0x0a, 0x22, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 
+            0x6e, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 
+            0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 
+            0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x31, 0x20, 
+            0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 
+            0x65, 0x73, 0x74, 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x78, 
+            0x0a, 0x21, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6d, 0x65, 
+            0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 
+            0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 
+            0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x32, 0x20, 0x03, 0x28, 0x0b, 0x32, 
+            0x27, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 
+            0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 
+            0x3a, 0x78, 0x0a, 0x1e, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 
+            0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 
+            0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 
+            0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x33, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x2a, 
+            0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 
+            0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x6e, 
+            0x75, 0x6d, 0x3a, 0x6d, 0x0a, 0x1f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 
+            0x67, 0x6e, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 
+            0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 
+            0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x34, 0x20, 0x03, 0x28, 
+            0x0e, 0x32, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 
+            0x74, 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x72, 0x0a, 0x1e, 0x72, 0x65, 0x70, 
+            0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x65, 0x78, 
+            0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 
+            0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 
+            0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x35, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 
+            0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 
+            0x6d, 0x70, 0x6f, 0x72, 0x74, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x51, 0x0a, 0x1f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 
+            0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x69, 0x65, 0x63, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 
+            0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 
+            0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 
+            0x6e, 0x73, 0x18, 0x36, 0x20, 0x03, 0x28, 0x09, 0x42, 0x02, 0x08, 0x02, 0x3a, 0x49, 0x0a, 0x17, 0x72, 0x65, 0x70, 0x65, 
+            0x61, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x72, 0x64, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 
+            0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 
+            0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x37, 0x20, 
+            0x03, 0x28, 0x09, 0x42, 0x02, 0x08, 0x01, 0x3a, 0x49, 0x0a, 0x17, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x69, 
+            0x6e, 0x74, 0x33, 0x32, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 
+            0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 
+            0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x05, 0x3a, 0x02, 
+            0x34, 0x31, 0x3a, 0x49, 0x0a, 0x17, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 
+            0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 
+            0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 
+            0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x03, 0x3a, 0x02, 0x34, 0x32, 0x3a, 0x4a, 0x0a, 
+            0x18, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x65, 0x78, 0x74, 0x65, 
+            0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 
+            0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 
+            0x6f, 0x6e, 0x73, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x0d, 0x3a, 0x02, 0x34, 0x33, 0x3a, 0x4a, 0x0a, 0x18, 0x64, 0x65, 0x66, 
+            0x61, 0x75, 0x6c, 0x74, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 
+            0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 
+            0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 
+            0x40, 0x20, 0x01, 0x28, 0x04, 0x3a, 0x02, 0x34, 0x34, 0x3a, 0x4b, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 
+            0x5f, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 
+            0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 
+            0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x41, 0x20, 0x01, 0x28, 
+            0x11, 0x3a, 0x03, 0x2d, 0x34, 0x35, 0x3a, 0x4a, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x73, 0x69, 
+            0x6e, 0x74, 0x36, 0x34, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 
+            0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 
+            0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x42, 0x20, 0x01, 0x28, 0x12, 0x3a, 0x02, 
+            0x34, 0x36, 0x3a, 0x4b, 0x0a, 0x19, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 
+            0x32, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 
+            0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 
+            0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x43, 0x20, 0x01, 0x28, 0x07, 0x3a, 0x02, 0x34, 0x37, 0x3a, 
+            0x4b, 0x0a, 0x19, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x65, 
+            0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 
+            0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 
+            0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x44, 0x20, 0x01, 0x28, 0x06, 0x3a, 0x02, 0x34, 0x38, 0x3a, 0x4c, 0x0a, 0x1a, 
+            0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x65, 0x78, 0x74, 
+            0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 
+            0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 
+            0x69, 0x6f, 0x6e, 0x73, 0x18, 0x45, 0x20, 0x01, 0x28, 0x0f, 0x3a, 0x02, 0x34, 0x39, 0x3a, 0x4d, 0x0a, 0x1a, 0x64, 0x65, 
+            0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 
+            0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 
+            0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 
+            0x6e, 0x73, 0x18, 0x46, 0x20, 0x01, 0x28, 0x10, 0x3a, 0x03, 0x2d, 0x35, 0x30, 0x3a, 0x4b, 0x0a, 0x17, 0x64, 0x65, 0x66, 
+            0x61, 0x75, 0x6c, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 
+            0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 
+            0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x47, 
+            0x20, 0x01, 0x28, 0x02, 0x3a, 0x04, 0x35, 0x31, 0x2e, 0x35, 0x3a, 0x4d, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 
+            0x74, 0x5f, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 
+            0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 
+            0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x48, 0x20, 0x01, 
+            0x28, 0x01, 0x3a, 0x05, 0x35, 0x32, 0x30, 0x30, 0x30, 0x3a, 0x4a, 0x0a, 0x16, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 
+            0x5f, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 
+            0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 
+            0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x49, 0x20, 0x01, 0x28, 0x08, 0x3a, 
+            0x04, 0x74, 0x72, 0x75, 0x65, 0x3a, 0x4d, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x73, 0x74, 0x72, 
+            0x69, 0x6e, 0x67, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 
+            0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 
+            0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x4a, 0x20, 0x01, 0x28, 0x09, 0x3a, 0x05, 0x68, 
+            0x65, 0x6c, 0x6c, 0x6f, 0x3a, 0x4c, 0x0a, 0x17, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 
+            0x73, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 
+            0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 
+            0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x4b, 0x20, 0x01, 0x28, 0x0c, 0x3a, 0x05, 0x77, 0x6f, 0x72, 
+            0x6c, 0x64, 0x3a, 0x7c, 0x0a, 0x1d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 
+            0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 
+            0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 
+            0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0e, 0x32, 
+            0x2a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 
+            0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 
+            0x6e, 0x75, 0x6d, 0x3a, 0x03, 0x42, 0x41, 0x52, 0x3a, 0x79, 0x0a, 0x1e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 
+            0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 
+            0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 
+            0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 
+            0x18, 0x52, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 
+            0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x0b, 
+            0x46, 0x4f, 0x52, 0x45, 0x49, 0x47, 0x4e, 0x5f, 0x42, 0x41, 0x52, 0x3a, 0x7d, 0x0a, 0x1d, 0x64, 0x65, 0x66, 0x61, 0x75, 
+            0x6c, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 
+            0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 
+            0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 
+            0x6e, 0x73, 0x18, 0x53, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 
+            0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 
+            0x72, 0x74, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x0a, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x42, 0x41, 0x52, 0x3a, 0x55, 
+            0x0a, 0x1e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x69, 0x65, 
+            0x63, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 
+            0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 
+            0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x54, 0x20, 0x01, 0x28, 0x09, 0x3a, 0x03, 0x61, 0x62, 
+            0x63, 0x42, 0x02, 0x08, 0x02, 0x3a, 0x4d, 0x0a, 0x16, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x63, 0x6f, 0x72, 
+            0x64, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 
+            0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x45, 
+            0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x55, 0x20, 0x01, 0x28, 0x09, 0x3a, 0x03, 0x31, 0x32, 0x33, 
+            0x42, 0x02, 0x08, 0x01, 0x3a, 0x42, 0x0a, 0x13, 0x6d, 0x79, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 
+            0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x75, 
+            0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x72, 0x64, 
+            0x65, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, 0x09, 0x3a, 0x3f, 0x0a, 0x10, 0x6d, 0x79, 0x5f, 0x65, 
+            0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x12, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 
+            0x62, 0x75, 0x66, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x46, 0x69, 0x65, 
+            0x6c, 0x64, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x42, 0x49, 0x42, 
+            0x0d, 0x55, 0x6e, 0x69, 0x74, 0x74, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x48, 0x01, 0xc2, 0x3e, 0x21, 0x47, 
+            0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 
+            0x73, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0xca, 0x3e, 0x11, 0x55, 0x6e, 0x69, 0x74, 0x54, 
+            0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 
+        }, new pbd::FileDescriptor[] {
+                self::UnitTestImportProtoFile.Descriptor,
+        });
+    #endregion
+    
+    #region Extensions
+    /*public static readonly pb::GeneratedExtension<self::TestAllExtensions, int> OptionalInt32Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, int>(Descriptor.Extensions[0]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, long> OptionalInt64Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, long>(Descriptor.Extensions[1]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, uint> OptionalUint32Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, uint>(Descriptor.Extensions[2]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, ulong> OptionalUint64Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, ulong>(Descriptor.Extensions[3]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, int> OptionalSint32Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, int>(Descriptor.Extensions[4]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, long> OptionalSint64Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, long>(Descriptor.Extensions[5]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, uint> OptionalFixed32Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, uint>(Descriptor.Extensions[6]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, ulong> OptionalFixed64Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, ulong>(Descriptor.Extensions[7]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, int> OptionalSfixed32Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, int>(Descriptor.Extensions[8]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, long> OptionalSfixed64Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, long>(Descriptor.Extensions[9]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, float> OptionalFloatExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, float>(Descriptor.Extensions[10]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, double> OptionalDoubleExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, double>(Descriptor.Extensions[11]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, bool> OptionalBoolExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, bool>(Descriptor.Extensions[12]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, string> OptionalStringExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, string>(Descriptor.Extensions[13]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, pb::ByteString> OptionalBytesExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, pb::ByteString>(Descriptor.Extensions[14]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, self::OptionalGroup_extension> OptionalGroupExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, self::OptionalGroup_extension>(Descriptor.Extensions[15]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, self::TestAllTypes.Types.NestedMessage> OptionalNestedMessageExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, self::TestAllTypes.Types.NestedMessage>(Descriptor.Extensions[16]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, self::ForeignMessage> OptionalForeignMessageExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, self::ForeignMessage>(Descriptor.Extensions[17]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, self::ImportMessage> OptionalImportMessageExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, self::ImportMessage>(Descriptor.Extensions[18]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, self::TestAllTypes.Types.NestedEnum> OptionalNestedEnumExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, self::TestAllTypes.Types.NestedEnum>(Descriptor.Extensions[19]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, self::ForeignEnum> OptionalForeignEnumExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, self::ForeignEnum>(Descriptor.Extensions[20]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, self::ImportEnum> OptionalImportEnumExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, self::ImportEnum>(Descriptor.Extensions[21]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, string> OptionalStringPieceExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, string>(Descriptor.Extensions[22]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, string> OptionalCordExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, string>(Descriptor.Extensions[23]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<int>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, int>(Descriptor.Extensions[24]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<long>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, long>(Descriptor.Extensions[25]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<uint>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, uint>(Descriptor.Extensions[26]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<ulong>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, ulong>(Descriptor.Extensions[27]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<int>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, int>(Descriptor.Extensions[28]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<long>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, long>(Descriptor.Extensions[29]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<uint>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, uint>(Descriptor.Extensions[30]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<ulong>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, ulong>(Descriptor.Extensions[31]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<int>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, int>(Descriptor.Extensions[32]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<long>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, long>(Descriptor.Extensions[33]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<float>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, float>(Descriptor.Extensions[34]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<double>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, double>(Descriptor.Extensions[35]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<bool>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, bool>(Descriptor.Extensions[36]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<string>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, string>(Descriptor.Extensions[37]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<pb::ByteString>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, pb::ByteString>(Descriptor.Extensions[38]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<self::RepeatedGroup_extension>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, self::RepeatedGroup_extension>(Descriptor.Extensions[39]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<self::TestAllTypes.Types.NestedMessage>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, self::TestAllTypes.Types.NestedMessage>(Descriptor.Extensions[40]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<self::ForeignMessage>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, self::ForeignMessage>(Descriptor.Extensions[41]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<self::ImportMessage>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, self::ImportMessage>(Descriptor.Extensions[42]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<self::TestAllTypes.Types.NestedEnum>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, self::TestAllTypes.Types.NestedEnum>(Descriptor.Extensions[43]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<self::ForeignEnum>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, self::ForeignEnum>(Descriptor.Extensions[44]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<self::ImportEnum>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, self::ImportEnum>(Descriptor.Extensions[45]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<string>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, string>(Descriptor.Extensions[46]);
+    public static readonly
+      pb::GeneratedExtension<self::TestAllExtensions, scg::IList<string>> name =
+          pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, string>(Descriptor.Extensions[47]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, int> DefaultInt32Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, int>(Descriptor.Extensions[48]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, long> DefaultInt64Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, long>(Descriptor.Extensions[49]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, uint> DefaultUint32Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, uint>(Descriptor.Extensions[50]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, ulong> DefaultUint64Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, ulong>(Descriptor.Extensions[51]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, int> DefaultSint32Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, int>(Descriptor.Extensions[52]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, long> DefaultSint64Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, long>(Descriptor.Extensions[53]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, uint> DefaultFixed32Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, uint>(Descriptor.Extensions[54]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, ulong> DefaultFixed64Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, ulong>(Descriptor.Extensions[55]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, int> DefaultSfixed32Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, int>(Descriptor.Extensions[56]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, long> DefaultSfixed64Extension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, long>(Descriptor.Extensions[57]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, float> DefaultFloatExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, float>(Descriptor.Extensions[58]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, double> DefaultDoubleExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, double>(Descriptor.Extensions[59]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, bool> DefaultBoolExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, bool>(Descriptor.Extensions[60]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, string> DefaultStringExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, string>(Descriptor.Extensions[61]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, pb::ByteString> DefaultBytesExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, pb::ByteString>(Descriptor.Extensions[62]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, self::TestAllTypes.Types.NestedEnum> DefaultNestedEnumExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, self::TestAllTypes.Types.NestedEnum>(Descriptor.Extensions[63]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, self::ForeignEnum> DefaultForeignEnumExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, self::ForeignEnum>(Descriptor.Extensions[64]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, self::ImportEnum> DefaultImportEnumExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, self::ImportEnum>(Descriptor.Extensions[65]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, string> DefaultStringPieceExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, string>(Descriptor.Extensions[66]);
+    public static readonly pb::GeneratedExtension<self::TestAllExtensions, string> DefaultCordExtension =
+          pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, string>(Descriptor.Extensions[67]);
+    public static readonly pb::GeneratedExtension<self::TestFieldOrderings, string> MyExtensionString =
+          pb::GeneratedExtension.CreateExtension<self::TestFieldOrderings, string>(Descriptor.Extensions[68]);
+    public static readonly pb::GeneratedExtension<self::TestFieldOrderings, int> MyExtensionInt =
+          pb::GeneratedExtension.CreateExtension<self::TestFieldOrderings, int>(Descriptor.Extensions[69]);
+    */
+    #endregion
+    
+    #region Static variables
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestAllTypes__Descriptor 
+        = Descriptor.MessageTypes[0];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestAllTypes__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestAllTypes__Descriptor,
+            new string[] { "OptionalInt32", "OptionalInt64", "OptionalUint32", "OptionalUint64", "OptionalSint32", "OptionalSint64", "OptionalFixed32", "OptionalFixed64", "OptionalSfixed32", "OptionalSfixed64", "OptionalFloat", "OptionalDouble", "OptionalBool", "OptionalString", "OptionalBytes", "OptionalGroup", "OptionalNestedMessage", "OptionalForeignMessage", "OptionalImportMessage", "OptionalNestedEnum", "OptionalForeignEnum", "OptionalImportEnum", "OptionalStringPiece", "OptionalCord", "RepeatedInt32", "RepeatedInt64", "RepeatedUint32", "RepeatedUint64", "RepeatedSint32", "RepeatedSint64", "RepeatedFixed32", "RepeatedFixed64", "RepeatedSfixed32", "RepeatedSfixed64", "RepeatedFloat", "RepeatedDouble", "RepeatedBool", "RepeatedString", "RepeatedBytes", "RepeatedGroup", "RepeatedNestedMessage", "RepeatedForeignMessage", "RepeatedImportMessage", "RepeatedNestedEnum", "RepeatedForeignEnum", "RepeatedImportEnum", "RepeatedStringPiece", "RepeatedCord", "DefaultInt32", "DefaultInt64", "DefaultUint32", "DefaultUint64", "DefaultSint32", "DefaultSint64", "DefaultFixed32", "DefaultFixed64", "DefaultSfixed32", "DefaultSfixed64", "DefaultFloat", "DefaultDouble", "DefaultBool", "DefaultString", "DefaultBytes", "DefaultNestedEnum", "DefaultForeignEnum", "DefaultImportEnum", "DefaultStringPiece", "DefaultCord", },
+            typeof (self::TestAllTypes),
+            typeof (self::TestAllTypes.Builder));
+    internal static readonly pbd::MessageDescriptor  internal__static_protobuf_unittest_TestAllTypes_NestedMessage__Descriptor 
+        = internal__static_protobuf_unittest_TestAllTypes__Descriptor.NestedTypes[0];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestAllTypes_NestedMessage__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestAllTypes_NestedMessage__Descriptor,
+            new string[] { "Bb", },
+            typeof (self::TestAllTypes.Types.NestedMessage),
+            typeof (self::TestAllTypes.Types.NestedMessage.Builder));
+    internal static readonly pbd::MessageDescriptor  internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__Descriptor 
+        = internal__static_protobuf_unittest_TestAllTypes__Descriptor.NestedTypes[1];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__Descriptor,
+            new string[] { "A", },
+            typeof (self::TestAllTypes.Types.OptionalGroup),
+            typeof (self::TestAllTypes.Types.OptionalGroup.Builder));
+    internal static readonly pbd::MessageDescriptor  internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__Descriptor 
+        = internal__static_protobuf_unittest_TestAllTypes__Descriptor.NestedTypes[2];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__Descriptor,
+            new string[] { "A", },
+            typeof (self::TestAllTypes.Types.RepeatedGroup),
+            typeof (self::TestAllTypes.Types.RepeatedGroup.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_ForeignMessage__Descriptor 
+        = Descriptor.MessageTypes[1];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_ForeignMessage__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_ForeignMessage__Descriptor,
+            new string[] { "C", },
+            typeof (self::ForeignMessage),
+            typeof (self::ForeignMessage.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestAllExtensions__Descriptor 
+        = Descriptor.MessageTypes[2];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestAllExtensions__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestAllExtensions__Descriptor,
+            new string[] { },
+            typeof (self::TestAllExtensions),
+            typeof (self::TestAllExtensions.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_OptionalGroup_extension__Descriptor 
+        = Descriptor.MessageTypes[3];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_OptionalGroup_extension__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_OptionalGroup_extension__Descriptor,
+            new string[] { "A", },
+            typeof (self::OptionalGroup_extension),
+            typeof (self::OptionalGroup_extension.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_RepeatedGroup_extension__Descriptor 
+        = Descriptor.MessageTypes[4];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_RepeatedGroup_extension__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_RepeatedGroup_extension__Descriptor,
+            new string[] { "A", },
+            typeof (self::RepeatedGroup_extension),
+            typeof (self::RepeatedGroup_extension.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestRequired__Descriptor 
+        = Descriptor.MessageTypes[5];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestRequired__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestRequired__Descriptor,
+            new string[] { "A", "Dummy2", "B", "Dummy4", "Dummy5", "Dummy6", "Dummy7", "Dummy8", "Dummy9", "Dummy10", "Dummy11", "Dummy12", "Dummy13", "Dummy14", "Dummy15", "Dummy16", "Dummy17", "Dummy18", "Dummy19", "Dummy20", "Dummy21", "Dummy22", "Dummy23", "Dummy24", "Dummy25", "Dummy26", "Dummy27", "Dummy28", "Dummy29", "Dummy30", "Dummy31", "Dummy32", "C", },
+            typeof (self::TestRequired),
+            typeof (self::TestRequired.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestRequiredForeign__Descriptor 
+        = Descriptor.MessageTypes[6];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestRequiredForeign__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestRequiredForeign__Descriptor,
+            new string[] { "OptionalMessage", "RepeatedMessage", "Dummy", },
+            typeof (self::TestRequiredForeign),
+            typeof (self::TestRequiredForeign.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestForeignNested__Descriptor 
+        = Descriptor.MessageTypes[7];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestForeignNested__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestForeignNested__Descriptor,
+            new string[] { "ForeignNested", },
+            typeof (self::TestForeignNested),
+            typeof (self::TestForeignNested.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestEmptyMessage__Descriptor 
+        = Descriptor.MessageTypes[8];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestEmptyMessage__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestEmptyMessage__Descriptor,
+            new string[] { },
+            typeof (self::TestEmptyMessage),
+            typeof (self::TestEmptyMessage.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__Descriptor 
+        = Descriptor.MessageTypes[9];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__Descriptor,
+            new string[] { },
+            typeof (self::TestEmptyMessageWithExtensions),
+            typeof (self::TestEmptyMessageWithExtensions.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestReallyLargeTagNumber__Descriptor 
+        = Descriptor.MessageTypes[10];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestReallyLargeTagNumber__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestReallyLargeTagNumber__Descriptor,
+            new string[] { "A", "Bb", },
+            typeof (self::TestReallyLargeTagNumber),
+            typeof (self::TestReallyLargeTagNumber.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestRecursiveMessage__Descriptor 
+        = Descriptor.MessageTypes[11];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestRecursiveMessage__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestRecursiveMessage__Descriptor,
+            new string[] { "A", "I", },
+            typeof (self::TestRecursiveMessage),
+            typeof (self::TestRecursiveMessage.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestMutualRecursionA__Descriptor 
+        = Descriptor.MessageTypes[12];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMutualRecursionA__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestMutualRecursionA__Descriptor,
+            new string[] { "Bb", },
+            typeof (self::TestMutualRecursionA),
+            typeof (self::TestMutualRecursionA.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestMutualRecursionB__Descriptor 
+        = Descriptor.MessageTypes[13];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMutualRecursionB__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestMutualRecursionB__Descriptor,
+            new string[] { "A", "OptionalInt32", },
+            typeof (self::TestMutualRecursionB),
+            typeof (self::TestMutualRecursionB.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor 
+        = Descriptor.MessageTypes[14];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestDupFieldNumber__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor,
+            new string[] { "A", "Foo", "Bar", },
+            typeof (self::TestDupFieldNumber),
+            typeof (self::TestDupFieldNumber.Builder));
+    internal static readonly pbd::MessageDescriptor  internal__static_protobuf_unittest_TestDupFieldNumber_Foo__Descriptor 
+        = internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor.NestedTypes[0];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestDupFieldNumber_Foo__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestDupFieldNumber_Foo__Descriptor,
+            new string[] { "A", },
+            typeof (self::TestDupFieldNumber.Types.Foo),
+            typeof (self::TestDupFieldNumber.Types.Foo.Builder));
+    internal static readonly pbd::MessageDescriptor  internal__static_protobuf_unittest_TestDupFieldNumber_Bar__Descriptor 
+        = internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor.NestedTypes[1];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestDupFieldNumber_Bar__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestDupFieldNumber_Bar__Descriptor,
+            new string[] { "A", },
+            typeof (self::TestDupFieldNumber.Types.Bar),
+            typeof (self::TestDupFieldNumber.Types.Bar.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestNestedMessageHasBits__Descriptor 
+        = Descriptor.MessageTypes[15];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestNestedMessageHasBits__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestNestedMessageHasBits__Descriptor,
+            new string[] { "OptionalNestedMessage", },
+            typeof (self::TestNestedMessageHasBits),
+            typeof (self::TestNestedMessageHasBits.Builder));
+    internal static readonly pbd::MessageDescriptor  internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__Descriptor 
+        = internal__static_protobuf_unittest_TestNestedMessageHasBits__Descriptor.NestedTypes[0];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__Descriptor,
+            new string[] { "NestedmessageRepeatedInt32", "NestedmessageRepeatedForeignmessage", },
+            typeof (self::TestNestedMessageHasBits.Types.NestedMessage),
+            typeof (self::TestNestedMessageHasBits.Types.NestedMessage.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestCamelCaseFieldNames__Descriptor 
+        = Descriptor.MessageTypes[16];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestCamelCaseFieldNames__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestCamelCaseFieldNames__Descriptor,
+            new string[] { "PrimitiveField", "StringField", "EnumField", "MessageField", "StringPieceField", "CordField", "RepeatedPrimitiveField", "RepeatedStringField", "RepeatedEnumField", "RepeatedMessageField", "RepeatedStringPieceField", "RepeatedCordField", },
+            typeof (self::TestCamelCaseFieldNames),
+            typeof (self::TestCamelCaseFieldNames.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestFieldOrderings__Descriptor 
+        = Descriptor.MessageTypes[17];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestFieldOrderings__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestFieldOrderings__Descriptor,
+            new string[] { "MyString", "MyInt", "MyFloat", },
+            typeof (self::TestFieldOrderings),
+            typeof (self::TestFieldOrderings.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestExtremeDefaultValues__Descriptor 
+        = Descriptor.MessageTypes[18];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestExtremeDefaultValues__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestExtremeDefaultValues__Descriptor,
+            new string[] { "EscapedBytes", "LargeUint32", "LargeUint64", "SmallInt32", "SmallInt64", "Utf8String", },
+            typeof (self::TestExtremeDefaultValues),
+            typeof (self::TestExtremeDefaultValues.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_FooRequest__Descriptor 
+        = Descriptor.MessageTypes[19];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_FooRequest__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_FooRequest__Descriptor,
+            new string[] { },
+            typeof (self::FooRequest),
+            typeof (self::FooRequest.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_FooResponse__Descriptor 
+        = Descriptor.MessageTypes[20];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_FooResponse__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_FooResponse__Descriptor,
+            new string[] { },
+            typeof (self::FooResponse),
+            typeof (self::FooResponse.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_BarRequest__Descriptor 
+        = Descriptor.MessageTypes[21];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_BarRequest__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_BarRequest__Descriptor,
+            new string[] { },
+            typeof (self::BarRequest),
+            typeof (self::BarRequest.Builder));
+    internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_BarResponse__Descriptor 
+        = Descriptor.MessageTypes[22];
+    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_BarResponse__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_BarResponse__Descriptor,
+            new string[] { },
+            typeof (self::BarResponse),
+            typeof (self::BarResponse.Builder));
+    #endregion
+    
+  }
+  
+  #region Enums
+  public enum ForeignEnum {
+    FOREIGN_FOO = 4,
+    FOREIGN_BAR = 5,
+    FOREIGN_BAZ = 6,
+  }
+  
+  public enum TestEnumWithDupValue {
+    FOO1 = 1,
+    BAR1 = 2,
+    BAZ = 3,
+  }
+  
+  public enum TestSparseEnum {
+    SPARSE_A = 123,
+    SPARSE_B = 62374,
+    SPARSE_C = 12589234,
+    SPARSE_D = -15,
+    SPARSE_E = -53452,
+    SPARSE_F = 0,
+    SPARSE_G = 2,
+  }
+  
+  #endregion
+  
+  #region Messages
+  public sealed partial class TestAllTypes : pb::GeneratedMessage<TestAllTypes, TestAllTypes.Builder> {
+    // Use TestAllTypes.CreateBuilder() to construct.
+    private TestAllTypes() {}
+    
+    private static readonly TestAllTypes defaultInstance = new TestAllTypes();
+    public static TestAllTypes DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestAllTypes DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes__FieldAccessorTable; }
+    }
+    
+    #region Nested types
+    public static class Types {
+      public enum NestedEnum {
+        FOO = 1,
+        BAR = 2,
+        BAZ = 3,
+      }
+      
+      public sealed partial class NestedMessage : pb::GeneratedMessage<NestedMessage, NestedMessage.Builder> {
+        // Use NestedMessage.CreateBuilder() to construct.
+        private NestedMessage() {}
+        
+        private static readonly NestedMessage defaultInstance = new NestedMessage();
+        public static NestedMessage DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override NestedMessage DefaultInstanceForType {
+          get { return defaultInstance; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes_NestedMessage__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+          get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes_NestedMessage__FieldAccessorTable; }
+        }
+        
+        // optional int32 bb = 1;
+        private bool hasBb;
+        private int bb_ = 0;
+        public bool HasBb {
+          get { return hasBb; }
+        }
+        public int Bb {
+          get { return bb_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::CodedOutputStream output) {
+          if (HasBb) {
+            output.WriteInt32(1, Bb);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (HasBb) {
+              size += pb::CodedOutputStream.ComputeInt32Size(1, Bb);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static self::TestAllTypes.Types.NestedMessage ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static self::TestAllTypes.Types.NestedMessage ParseFrom(pb::ByteString data,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestAllTypes.Types.NestedMessage ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static self::TestAllTypes.Types.NestedMessage parseFrom(byte[] data,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestAllTypes.Types.NestedMessage ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static self::TestAllTypes.Types.NestedMessage ParseFrom(
+            global::System.IO.Stream input,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestAllTypes.Types.NestedMessage ParseFrom(pb::CodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static self::TestAllTypes.Types.NestedMessage ParseFrom(pb::CodedInputStream input,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+                   .BuildParsed();
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override IBuilder<self::TestAllTypes.Types.NestedMessage> CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(self::TestAllTypes.Types.NestedMessage prototype) {
+          return (Builder) new Builder().MergeFrom(prototype);
+        }
+        
+        public sealed partial class Builder : pb::GeneratedBuilder<self::TestAllTypes.Types.NestedMessage, Builder> {
+          // Construct using self::TestAllTypes.Types.NestedMessage.CreateBuilder()
+          internal Builder() {}
+          
+          self::TestAllTypes.Types.NestedMessage result = new self::TestAllTypes.Types.NestedMessage();
+          
+          protected override self::TestAllTypes.Types.NestedMessage MessageBeingBuilt {
+            get { return result; }
+          }
+          
+          public override IBuilder<self::TestAllTypes.Types.NestedMessage> Clear() {
+            result = new self::TestAllTypes.Types.NestedMessage();
+            return this;
+          }
+          
+          public override IBuilder<self::TestAllTypes.Types.NestedMessage> Clone() {
+            return new Builder().MergeFrom(result);
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return self::TestAllTypes.Types.NestedMessage.Descriptor; }
+          }
+          
+          public override self::TestAllTypes.Types.NestedMessage DefaultInstanceForType {
+            get { return self::TestAllTypes.Types.NestedMessage.DefaultInstance; }
+          }
+          
+          public override self::TestAllTypes.Types.NestedMessage BuildPartial() {
+            self::TestAllTypes.Types.NestedMessage returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public override IBuilder MergeFrom(pb::IMessage other) {
+            if (other is self::TestAllTypes.Types.NestedMessage) {
+              return MergeFrom((self::TestAllTypes.Types.NestedMessage) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override IBuilder<self::TestAllTypes.Types.NestedMessage> MergeFrom(self::TestAllTypes.Types.NestedMessage other) {
+            if (other == self::TestAllTypes.Types.NestedMessage.DefaultInstance) return this;
+            if (other.HasBb) {
+              Bb = other.Bb;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override IBuilder<self::TestAllTypes.Types.NestedMessage> MergeFrom(pb::CodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override IBuilder<self::TestAllTypes.Types.NestedMessage> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            pb::UnknownFieldSet.Builder unknownFields =
+              pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+            while (true) {
+              uint tag = input.ReadTag();
+              switch (tag) {
+                case 0:
+                  this.UnknownFields = unknownFields.Build();
+                  return this;
+                default: {
+                  if (!ParseUnknownField(input, unknownFields,
+                                         extensionRegistry, tag)) {
+                    this.UnknownFields = unknownFields.Build();
+                    return this;
+                  }
+                  break;
+                }
+                case 8: {
+                  Bb = input.ReadInt32();
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          // optional int32 bb = 1;
+          public bool HasBb {
+            get { return result.HasBb; }
+          }
+          public int Bb {
+            get { return result.Bb; }
+            set { SetBb(value); }
+          }
+          public Builder SetBb(int value) {
+            result.hasBb = true;
+            result.bb_ = value;
+            return this;
+          }
+          public Builder ClearBb() {
+            result.hasBb = false;
+            result.bb_ = 0;
+            return this;
+          }
+        }
+      }
+      
+      public sealed partial class OptionalGroup : pb::GeneratedMessage<OptionalGroup, OptionalGroup.Builder> {
+        // Use OptionalGroup.CreateBuilder() to construct.
+        private OptionalGroup() {}
+        
+        private static readonly OptionalGroup defaultInstance = new OptionalGroup();
+        public static OptionalGroup DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override OptionalGroup DefaultInstanceForType {
+          get { return defaultInstance; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+          get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__FieldAccessorTable; }
+        }
+        
+        // optional int32 a = 17;
+        private bool hasA;
+        private int a_ = 0;
+        public bool HasA {
+          get { return hasA; }
+        }
+        public int A {
+          get { return a_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::CodedOutputStream output) {
+          if (HasA) {
+            output.WriteInt32(17, A);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (HasA) {
+              size += pb::CodedOutputStream.ComputeInt32Size(17, A);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static self::TestAllTypes.Types.OptionalGroup ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static self::TestAllTypes.Types.OptionalGroup ParseFrom(pb::ByteString data,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestAllTypes.Types.OptionalGroup ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static self::TestAllTypes.Types.OptionalGroup parseFrom(byte[] data,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestAllTypes.Types.OptionalGroup ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static self::TestAllTypes.Types.OptionalGroup ParseFrom(
+            global::System.IO.Stream input,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestAllTypes.Types.OptionalGroup ParseFrom(pb::CodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static self::TestAllTypes.Types.OptionalGroup ParseFrom(pb::CodedInputStream input,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+                   .BuildParsed();
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override IBuilder<self::TestAllTypes.Types.OptionalGroup> CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(self::TestAllTypes.Types.OptionalGroup prototype) {
+          return (Builder) new Builder().MergeFrom(prototype);
+        }
+        
+        public sealed partial class Builder : pb::GeneratedBuilder<self::TestAllTypes.Types.OptionalGroup, Builder> {
+          // Construct using self::TestAllTypes.Types.OptionalGroup.CreateBuilder()
+          internal Builder() {}
+          
+          self::TestAllTypes.Types.OptionalGroup result = new self::TestAllTypes.Types.OptionalGroup();
+          
+          protected override self::TestAllTypes.Types.OptionalGroup MessageBeingBuilt {
+            get { return result; }
+          }
+          
+          public override IBuilder<self::TestAllTypes.Types.OptionalGroup> Clear() {
+            result = new self::TestAllTypes.Types.OptionalGroup();
+            return this;
+          }
+          
+          public override IBuilder<self::TestAllTypes.Types.OptionalGroup> Clone() {
+            return new Builder().MergeFrom(result);
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return self::TestAllTypes.Types.OptionalGroup.Descriptor; }
+          }
+          
+          public override self::TestAllTypes.Types.OptionalGroup DefaultInstanceForType {
+            get { return self::TestAllTypes.Types.OptionalGroup.DefaultInstance; }
+          }
+          
+          public override self::TestAllTypes.Types.OptionalGroup BuildPartial() {
+            self::TestAllTypes.Types.OptionalGroup returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public override IBuilder MergeFrom(pb::IMessage other) {
+            if (other is self::TestAllTypes.Types.OptionalGroup) {
+              return MergeFrom((self::TestAllTypes.Types.OptionalGroup) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override IBuilder<self::TestAllTypes.Types.OptionalGroup> MergeFrom(self::TestAllTypes.Types.OptionalGroup other) {
+            if (other == self::TestAllTypes.Types.OptionalGroup.DefaultInstance) return this;
+            if (other.HasA) {
+              A = other.A;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override IBuilder<self::TestAllTypes.Types.OptionalGroup> MergeFrom(pb::CodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override IBuilder<self::TestAllTypes.Types.OptionalGroup> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            pb::UnknownFieldSet.Builder unknownFields =
+              pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+            while (true) {
+              uint tag = input.ReadTag();
+              switch (tag) {
+                case 0:
+                  this.UnknownFields = unknownFields.Build();
+                  return this;
+                default: {
+                  if (!ParseUnknownField(input, unknownFields,
+                                         extensionRegistry, tag)) {
+                    this.UnknownFields = unknownFields.Build();
+                    return this;
+                  }
+                  break;
+                }
+                case 136: {
+                  A = input.ReadInt32();
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          // optional int32 a = 17;
+          public bool HasA {
+            get { return result.HasA; }
+          }
+          public int A {
+            get { return result.A; }
+            set { SetA(value); }
+          }
+          public Builder SetA(int value) {
+            result.hasA = true;
+            result.a_ = value;
+            return this;
+          }
+          public Builder ClearA() {
+            result.hasA = false;
+            result.a_ = 0;
+            return this;
+          }
+        }
+      }
+      
+      public sealed partial class RepeatedGroup : pb::GeneratedMessage<RepeatedGroup, RepeatedGroup.Builder> {
+        // Use RepeatedGroup.CreateBuilder() to construct.
+        private RepeatedGroup() {}
+        
+        private static readonly RepeatedGroup defaultInstance = new RepeatedGroup();
+        public static RepeatedGroup DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override RepeatedGroup DefaultInstanceForType {
+          get { return defaultInstance; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+          get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__FieldAccessorTable; }
+        }
+        
+        // optional int32 a = 47;
+        private bool hasA;
+        private int a_ = 0;
+        public bool HasA {
+          get { return hasA; }
+        }
+        public int A {
+          get { return a_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::CodedOutputStream output) {
+          if (HasA) {
+            output.WriteInt32(47, A);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (HasA) {
+              size += pb::CodedOutputStream.ComputeInt32Size(47, A);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static self::TestAllTypes.Types.RepeatedGroup ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static self::TestAllTypes.Types.RepeatedGroup ParseFrom(pb::ByteString data,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestAllTypes.Types.RepeatedGroup ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static self::TestAllTypes.Types.RepeatedGroup parseFrom(byte[] data,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestAllTypes.Types.RepeatedGroup ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static self::TestAllTypes.Types.RepeatedGroup ParseFrom(
+            global::System.IO.Stream input,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestAllTypes.Types.RepeatedGroup ParseFrom(pb::CodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static self::TestAllTypes.Types.RepeatedGroup ParseFrom(pb::CodedInputStream input,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+                   .BuildParsed();
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override IBuilder<self::TestAllTypes.Types.RepeatedGroup> CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(self::TestAllTypes.Types.RepeatedGroup prototype) {
+          return (Builder) new Builder().MergeFrom(prototype);
+        }
+        
+        public sealed partial class Builder : pb::GeneratedBuilder<self::TestAllTypes.Types.RepeatedGroup, Builder> {
+          // Construct using self::TestAllTypes.Types.RepeatedGroup.CreateBuilder()
+          internal Builder() {}
+          
+          self::TestAllTypes.Types.RepeatedGroup result = new self::TestAllTypes.Types.RepeatedGroup();
+          
+          protected override self::TestAllTypes.Types.RepeatedGroup MessageBeingBuilt {
+            get { return result; }
+          }
+          
+          public override IBuilder<self::TestAllTypes.Types.RepeatedGroup> Clear() {
+            result = new self::TestAllTypes.Types.RepeatedGroup();
+            return this;
+          }
+          
+          public override IBuilder<self::TestAllTypes.Types.RepeatedGroup> Clone() {
+            return new Builder().MergeFrom(result);
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return self::TestAllTypes.Types.RepeatedGroup.Descriptor; }
+          }
+          
+          public override self::TestAllTypes.Types.RepeatedGroup DefaultInstanceForType {
+            get { return self::TestAllTypes.Types.RepeatedGroup.DefaultInstance; }
+          }
+          
+          public override self::TestAllTypes.Types.RepeatedGroup BuildPartial() {
+            self::TestAllTypes.Types.RepeatedGroup returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public override IBuilder MergeFrom(pb::IMessage other) {
+            if (other is self::TestAllTypes.Types.RepeatedGroup) {
+              return MergeFrom((self::TestAllTypes.Types.RepeatedGroup) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override IBuilder<self::TestAllTypes.Types.RepeatedGroup> MergeFrom(self::TestAllTypes.Types.RepeatedGroup other) {
+            if (other == self::TestAllTypes.Types.RepeatedGroup.DefaultInstance) return this;
+            if (other.HasA) {
+              A = other.A;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override IBuilder<self::TestAllTypes.Types.RepeatedGroup> MergeFrom(pb::CodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override IBuilder<self::TestAllTypes.Types.RepeatedGroup> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            pb::UnknownFieldSet.Builder unknownFields =
+              pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+            while (true) {
+              uint tag = input.ReadTag();
+              switch (tag) {
+                case 0:
+                  this.UnknownFields = unknownFields.Build();
+                  return this;
+                default: {
+                  if (!ParseUnknownField(input, unknownFields,
+                                         extensionRegistry, tag)) {
+                    this.UnknownFields = unknownFields.Build();
+                    return this;
+                  }
+                  break;
+                }
+                case 376: {
+                  A = input.ReadInt32();
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          // optional int32 a = 47;
+          public bool HasA {
+            get { return result.HasA; }
+          }
+          public int A {
+            get { return result.A; }
+            set { SetA(value); }
+          }
+          public Builder SetA(int value) {
+            result.hasA = true;
+            result.a_ = value;
+            return this;
+          }
+          public Builder ClearA() {
+            result.hasA = false;
+            result.a_ = 0;
+            return this;
+          }
+        }
+      }
+      
+    }
+    #endregion
+    
+    // optional int32 optional_int32 = 1;
+    private bool hasOptionalInt32;
+    private int optionalInt32_ = 0;
+    public bool HasOptionalInt32 {
+      get { return hasOptionalInt32; }
+    }
+    public int OptionalInt32 {
+      get { return optionalInt32_; }
+    }
+    
+    // optional int64 optional_int64 = 2;
+    private bool hasOptionalInt64;
+    private long optionalInt64_ = 0L;
+    public bool HasOptionalInt64 {
+      get { return hasOptionalInt64; }
+    }
+    public long OptionalInt64 {
+      get { return optionalInt64_; }
+    }
+    
+    // optional uint32 optional_uint32 = 3;
+    private bool hasOptionalUint32;
+    private uint optionalUint32_ = 0;
+    public bool HasOptionalUint32 {
+      get { return hasOptionalUint32; }
+    }
+    public uint OptionalUint32 {
+      get { return optionalUint32_; }
+    }
+    
+    // optional uint64 optional_uint64 = 4;
+    private bool hasOptionalUint64;
+    private ulong optionalUint64_ = 0UL;
+    public bool HasOptionalUint64 {
+      get { return hasOptionalUint64; }
+    }
+    public ulong OptionalUint64 {
+      get { return optionalUint64_; }
+    }
+    
+    // optional sint32 optional_sint32 = 5;
+    private bool hasOptionalSint32;
+    private int optionalSint32_ = 0;
+    public bool HasOptionalSint32 {
+      get { return hasOptionalSint32; }
+    }
+    public int OptionalSint32 {
+      get { return optionalSint32_; }
+    }
+    
+    // optional sint64 optional_sint64 = 6;
+    private bool hasOptionalSint64;
+    private long optionalSint64_ = 0L;
+    public bool HasOptionalSint64 {
+      get { return hasOptionalSint64; }
+    }
+    public long OptionalSint64 {
+      get { return optionalSint64_; }
+    }
+    
+    // optional fixed32 optional_fixed32 = 7;
+    private bool hasOptionalFixed32;
+    private uint optionalFixed32_ = 0;
+    public bool HasOptionalFixed32 {
+      get { return hasOptionalFixed32; }
+    }
+    public uint OptionalFixed32 {
+      get { return optionalFixed32_; }
+    }
+    
+    // optional fixed64 optional_fixed64 = 8;
+    private bool hasOptionalFixed64;
+    private ulong optionalFixed64_ = 0UL;
+    public bool HasOptionalFixed64 {
+      get { return hasOptionalFixed64; }
+    }
+    public ulong OptionalFixed64 {
+      get { return optionalFixed64_; }
+    }
+    
+    // optional sfixed32 optional_sfixed32 = 9;
+    private bool hasOptionalSfixed32;
+    private int optionalSfixed32_ = 0;
+    public bool HasOptionalSfixed32 {
+      get { return hasOptionalSfixed32; }
+    }
+    public int OptionalSfixed32 {
+      get { return optionalSfixed32_; }
+    }
+    
+    // optional sfixed64 optional_sfixed64 = 10;
+    private bool hasOptionalSfixed64;
+    private long optionalSfixed64_ = 0L;
+    public bool HasOptionalSfixed64 {
+      get { return hasOptionalSfixed64; }
+    }
+    public long OptionalSfixed64 {
+      get { return optionalSfixed64_; }
+    }
+    
+    // optional float optional_float = 11;
+    private bool hasOptionalFloat;
+    private float optionalFloat_ = 0F;
+    public bool HasOptionalFloat {
+      get { return hasOptionalFloat; }
+    }
+    public float OptionalFloat {
+      get { return optionalFloat_; }
+    }
+    
+    // optional double optional_double = 12;
+    private bool hasOptionalDouble;
+    private double optionalDouble_ = 0D;
+    public bool HasOptionalDouble {
+      get { return hasOptionalDouble; }
+    }
+    public double OptionalDouble {
+      get { return optionalDouble_; }
+    }
+    
+    // optional bool optional_bool = 13;
+    private bool hasOptionalBool;
+    private bool optionalBool_ = false;
+    public bool HasOptionalBool {
+      get { return hasOptionalBool; }
+    }
+    public bool OptionalBool {
+      get { return optionalBool_; }
+    }
+    
+    // optional string optional_string = 14;
+    private bool hasOptionalString;
+    private string optionalString_ = "";
+    public bool HasOptionalString {
+      get { return hasOptionalString; }
+    }
+    public string OptionalString {
+      get { return optionalString_; }
+    }
+    
+    // optional bytes optional_bytes = 15;
+    private bool hasOptionalBytes;
+    private pb::ByteString optionalBytes_ = pb::ByteString.Empty;
+    public bool HasOptionalBytes {
+      get { return hasOptionalBytes; }
+    }
+    public pb::ByteString OptionalBytes {
+      get { return optionalBytes_; }
+    }
+    
+    // optional group OptionalGroup = 16 {
+    private bool hasOptionalGroup;
+    private self::TestAllTypes.Types.OptionalGroup optionalGroup_ = self::TestAllTypes.Types.OptionalGroup.DefaultInstance;
+    public bool HasOptionalGroup {
+      get { return hasOptionalGroup; }
+    }
+    public self::TestAllTypes.Types.OptionalGroup OptionalGroup {
+      get { return optionalGroup_; }
+    }
+    
+    // optional .protobuf_unittest.TestAllTypes.NestedMessage optional_nested_message = 18;
+    private bool hasOptionalNestedMessage;
+    private self::TestAllTypes.Types.NestedMessage optionalNestedMessage_ = self::TestAllTypes.Types.NestedMessage.DefaultInstance;
+    public bool HasOptionalNestedMessage {
+      get { return hasOptionalNestedMessage; }
+    }
+    public self::TestAllTypes.Types.NestedMessage OptionalNestedMessage {
+      get { return optionalNestedMessage_; }
+    }
+    
+    // optional .protobuf_unittest.ForeignMessage optional_foreign_message = 19;
+    private bool hasOptionalForeignMessage;
+    private self::ForeignMessage optionalForeignMessage_ = self::ForeignMessage.DefaultInstance;
+    public bool HasOptionalForeignMessage {
+      get { return hasOptionalForeignMessage; }
+    }
+    public self::ForeignMessage OptionalForeignMessage {
+      get { return optionalForeignMessage_; }
+    }
+    
+    // optional .protobuf_unittest_import.ImportMessage optional_import_message = 20;
+    private bool hasOptionalImportMessage;
+    private self::ImportMessage optionalImportMessage_ = self::ImportMessage.DefaultInstance;
+    public bool HasOptionalImportMessage {
+      get { return hasOptionalImportMessage; }
+    }
+    public self::ImportMessage OptionalImportMessage {
+      get { return optionalImportMessage_; }
+    }
+    
+    // optional .protobuf_unittest.TestAllTypes.NestedEnum optional_nested_enum = 21;
+    private bool hasOptionalNestedEnum;
+    private self::TestAllTypes.Types.NestedEnum optionalNestedEnum_ = self::TestAllTypes.Types.NestedEnum.FOO;
+    public bool HasOptionalNestedEnum {
+      get { return hasOptionalNestedEnum; }
+    }
+    public self::TestAllTypes.Types.NestedEnum OptionalNestedEnum {  get { return optionalNestedEnum_; }}
+    
+    // optional .protobuf_unittest.ForeignEnum optional_foreign_enum = 22;
+    private bool hasOptionalForeignEnum;
+    private self::ForeignEnum optionalForeignEnum_ = self::ForeignEnum.FOREIGN_FOO;
+    public bool HasOptionalForeignEnum {
+      get { return hasOptionalForeignEnum; }
+    }
+    public self::ForeignEnum OptionalForeignEnum {  get { return optionalForeignEnum_; }}
+    
+    // optional .protobuf_unittest_import.ImportEnum optional_import_enum = 23;
+    private bool hasOptionalImportEnum;
+    private self::ImportEnum optionalImportEnum_ = self::ImportEnum.IMPORT_FOO;
+    public bool HasOptionalImportEnum {
+      get { return hasOptionalImportEnum; }
+    }
+    public self::ImportEnum OptionalImportEnum {  get { return optionalImportEnum_; }}
+    
+    // optional string optional_string_piece = 24 [ctype = STRING_PIECE];
+    private bool hasOptionalStringPiece;
+    private string optionalStringPiece_ = "";
+    public bool HasOptionalStringPiece {
+      get { return hasOptionalStringPiece; }
+    }
+    public string OptionalStringPiece {
+      get { return optionalStringPiece_; }
+    }
+    
+    // optional string optional_cord = 25 [ctype = CORD];
+    private bool hasOptionalCord;
+    private string optionalCord_ = "";
+    public bool HasOptionalCord {
+      get { return hasOptionalCord; }
+    }
+    public string OptionalCord {
+      get { return optionalCord_; }
+    }
+    
+    // repeated int32 repeated_int32 = 31;
+    private scg::IList<int> repeatedInt32_ = pbc::Lists<int>.Empty;
+    public scg::IList<int> RepeatedInt32List {
+      get { return repeatedInt32_; }
+    }
+    public int RepeatedInt32Count {
+      get { return repeatedInt32_.Count; }
+    }
+    public int GetRepeatedInt32(int index) {
+      return repeatedInt32_[index];
+    }
+    
+    // repeated int64 repeated_int64 = 32;
+    private scg::IList<long> repeatedInt64_ = pbc::Lists<long>.Empty;
+    public scg::IList<long> RepeatedInt64List {
+      get { return repeatedInt64_; }
+    }
+    public int RepeatedInt64Count {
+      get { return repeatedInt64_.Count; }
+    }
+    public long GetRepeatedInt64(int index) {
+      return repeatedInt64_[index];
+    }
+    
+    // repeated uint32 repeated_uint32 = 33;
+    private scg::IList<uint> repeatedUint32_ = pbc::Lists<uint>.Empty;
+    public scg::IList<uint> RepeatedUint32List {
+      get { return repeatedUint32_; }
+    }
+    public int RepeatedUint32Count {
+      get { return repeatedUint32_.Count; }
+    }
+    public uint GetRepeatedUint32(int index) {
+      return repeatedUint32_[index];
+    }
+    
+    // repeated uint64 repeated_uint64 = 34;
+    private scg::IList<ulong> repeatedUint64_ = pbc::Lists<ulong>.Empty;
+    public scg::IList<ulong> RepeatedUint64List {
+      get { return repeatedUint64_; }
+    }
+    public int RepeatedUint64Count {
+      get { return repeatedUint64_.Count; }
+    }
+    public ulong GetRepeatedUint64(int index) {
+      return repeatedUint64_[index];
+    }
+    
+    // repeated sint32 repeated_sint32 = 35;
+    private scg::IList<int> repeatedSint32_ = pbc::Lists<int>.Empty;
+    public scg::IList<int> RepeatedSint32List {
+      get { return repeatedSint32_; }
+    }
+    public int RepeatedSint32Count {
+      get { return repeatedSint32_.Count; }
+    }
+    public int GetRepeatedSint32(int index) {
+      return repeatedSint32_[index];
+    }
+    
+    // repeated sint64 repeated_sint64 = 36;
+    private scg::IList<long> repeatedSint64_ = pbc::Lists<long>.Empty;
+    public scg::IList<long> RepeatedSint64List {
+      get { return repeatedSint64_; }
+    }
+    public int RepeatedSint64Count {
+      get { return repeatedSint64_.Count; }
+    }
+    public long GetRepeatedSint64(int index) {
+      return repeatedSint64_[index];
+    }
+    
+    // repeated fixed32 repeated_fixed32 = 37;
+    private scg::IList<uint> repeatedFixed32_ = pbc::Lists<uint>.Empty;
+    public scg::IList<uint> RepeatedFixed32List {
+      get { return repeatedFixed32_; }
+    }
+    public int RepeatedFixed32Count {
+      get { return repeatedFixed32_.Count; }
+    }
+    public uint GetRepeatedFixed32(int index) {
+      return repeatedFixed32_[index];
+    }
+    
+    // repeated fixed64 repeated_fixed64 = 38;
+    private scg::IList<ulong> repeatedFixed64_ = pbc::Lists<ulong>.Empty;
+    public scg::IList<ulong> RepeatedFixed64List {
+      get { return repeatedFixed64_; }
+    }
+    public int RepeatedFixed64Count {
+      get { return repeatedFixed64_.Count; }
+    }
+    public ulong GetRepeatedFixed64(int index) {
+      return repeatedFixed64_[index];
+    }
+    
+    // repeated sfixed32 repeated_sfixed32 = 39;
+    private scg::IList<int> repeatedSfixed32_ = pbc::Lists<int>.Empty;
+    public scg::IList<int> RepeatedSfixed32List {
+      get { return repeatedSfixed32_; }
+    }
+    public int RepeatedSfixed32Count {
+      get { return repeatedSfixed32_.Count; }
+    }
+    public int GetRepeatedSfixed32(int index) {
+      return repeatedSfixed32_[index];
+    }
+    
+    // repeated sfixed64 repeated_sfixed64 = 40;
+    private scg::IList<long> repeatedSfixed64_ = pbc::Lists<long>.Empty;
+    public scg::IList<long> RepeatedSfixed64List {
+      get { return repeatedSfixed64_; }
+    }
+    public int RepeatedSfixed64Count {
+      get { return repeatedSfixed64_.Count; }
+    }
+    public long GetRepeatedSfixed64(int index) {
+      return repeatedSfixed64_[index];
+    }
+    
+    // repeated float repeated_float = 41;
+    private scg::IList<float> repeatedFloat_ = pbc::Lists<float>.Empty;
+    public scg::IList<float> RepeatedFloatList {
+      get { return repeatedFloat_; }
+    }
+    public int RepeatedFloatCount {
+      get { return repeatedFloat_.Count; }
+    }
+    public float GetRepeatedFloat(int index) {
+      return repeatedFloat_[index];
+    }
+    
+    // repeated double repeated_double = 42;
+    private scg::IList<double> repeatedDouble_ = pbc::Lists<double>.Empty;
+    public scg::IList<double> RepeatedDoubleList {
+      get { return repeatedDouble_; }
+    }
+    public int RepeatedDoubleCount {
+      get { return repeatedDouble_.Count; }
+    }
+    public double GetRepeatedDouble(int index) {
+      return repeatedDouble_[index];
+    }
+    
+    // repeated bool repeated_bool = 43;
+    private scg::IList<bool> repeatedBool_ = pbc::Lists<bool>.Empty;
+    public scg::IList<bool> RepeatedBoolList {
+      get { return repeatedBool_; }
+    }
+    public int RepeatedBoolCount {
+      get { return repeatedBool_.Count; }
+    }
+    public bool GetRepeatedBool(int index) {
+      return repeatedBool_[index];
+    }
+    
+    // repeated string repeated_string = 44;
+    private scg::IList<string> repeatedString_ = pbc::Lists<string>.Empty;
+    public scg::IList<string> RepeatedStringList {
+      get { return repeatedString_; }
+    }
+    public int RepeatedStringCount {
+      get { return repeatedString_.Count; }
+    }
+    public string GetRepeatedString(int index) {
+      return repeatedString_[index];
+    }
+    
+    // repeated bytes repeated_bytes = 45;
+    private scg::IList<pb::ByteString> repeatedBytes_ = pbc::Lists<pb::ByteString>.Empty;
+    public scg::IList<pb::ByteString> RepeatedBytesList {
+      get { return repeatedBytes_; }
+    }
+    public int RepeatedBytesCount {
+      get { return repeatedBytes_.Count; }
+    }
+    public pb::ByteString GetRepeatedBytes(int index) {
+      return repeatedBytes_[index];
+    }
+    
+    // repeated group RepeatedGroup = 46 {
+    private scg::IList<self::TestAllTypes.Types.RepeatedGroup> repeatedGroup_ = pbc::Lists<self::TestAllTypes.Types.RepeatedGroup>.Empty;
+    public scg::IList<self::TestAllTypes.Types.RepeatedGroup> RepeatedGroupList {
+      get { return repeatedGroup_; } 
+    }
+    public int RepeatedGroupCount
+      { get { return repeatedGroup_.Count; }
+    }
+    public self::TestAllTypes.Types.RepeatedGroup GetRepeatedGroup(int index) {
+      return repeatedGroup_ [index];
+    }
+    
+    // repeated .protobuf_unittest.TestAllTypes.NestedMessage repeated_nested_message = 48;
+    private scg::IList<self::TestAllTypes.Types.NestedMessage> repeatedNestedMessage_ = pbc::Lists<self::TestAllTypes.Types.NestedMessage>.Empty;
+    public scg::IList<self::TestAllTypes.Types.NestedMessage> RepeatedNestedMessageList {
+      get { return repeatedNestedMessage_; } 
+    }
+    public int RepeatedNestedMessageCount
+      { get { return repeatedNestedMessage_.Count; }
+    }
+    public self::TestAllTypes.Types.NestedMessage GetRepeatedNestedMessage(int index) {
+      return repeatedNestedMessage_ [index];
+    }
+    
+    // repeated .protobuf_unittest.ForeignMessage repeated_foreign_message = 49;
+    private scg::IList<self::ForeignMessage> repeatedForeignMessage_ = pbc::Lists<self::ForeignMessage>.Empty;
+    public scg::IList<self::ForeignMessage> RepeatedForeignMessageList {
+      get { return repeatedForeignMessage_; } 
+    }
+    public int RepeatedForeignMessageCount
+      { get { return repeatedForeignMessage_.Count; }
+    }
+    public self::ForeignMessage GetRepeatedForeignMessage(int index) {
+      return repeatedForeignMessage_ [index];
+    }
+    
+    // repeated .protobuf_unittest_import.ImportMessage repeated_import_message = 50;
+    private scg::IList<self::ImportMessage> repeatedImportMessage_ = pbc::Lists<self::ImportMessage>.Empty;
+    public scg::IList<self::ImportMessage> RepeatedImportMessageList {
+      get { return repeatedImportMessage_; } 
+    }
+    public int RepeatedImportMessageCount
+      { get { return repeatedImportMessage_.Count; }
+    }
+    public self::ImportMessage GetRepeatedImportMessage(int index) {
+      return repeatedImportMessage_ [index];
+    }
+    
+    // repeated .protobuf_unittest.TestAllTypes.NestedEnum repeated_nested_enum = 51;
+    private scg::IList<self::TestAllTypes.Types.NestedEnum> repeatedNestedEnum_ = new scg::List<self::TestAllTypes.Types.NestedEnum> ();
+    public scg.IList<self::TestAllTypes.Types.NestedEnum> RepeatedNestedEnumList {
+      get { return pbc::Lists.AsReadOnly(repeatedNestedEnum_); }
+    }
+    public int RepeatedNestedEnumCount {
+      get { return repeatedNestedEnum_.Count; }
+    }
+    public self::TestAllTypes.Types.NestedEnum GetRepeatedNestedEnum(int index) {
+      return repeatedNestedEnum_[index];
+    }
+    
+    // repeated .protobuf_unittest.ForeignEnum repeated_foreign_enum = 52;
+    private scg::IList<self::ForeignEnum> repeatedForeignEnum_ = new scg::List<self::ForeignEnum> ();
+    public scg.IList<self::ForeignEnum> RepeatedForeignEnumList {
+      get { return pbc::Lists.AsReadOnly(repeatedForeignEnum_); }
+    }
+    public int RepeatedForeignEnumCount {
+      get { return repeatedForeignEnum_.Count; }
+    }
+    public self::ForeignEnum GetRepeatedForeignEnum(int index) {
+      return repeatedForeignEnum_[index];
+    }
+    
+    // repeated .protobuf_unittest_import.ImportEnum repeated_import_enum = 53;
+    private scg::IList<self::ImportEnum> repeatedImportEnum_ = new scg::List<self::ImportEnum> ();
+    public scg.IList<self::ImportEnum> RepeatedImportEnumList {
+      get { return pbc::Lists.AsReadOnly(repeatedImportEnum_); }
+    }
+    public int RepeatedImportEnumCount {
+      get { return repeatedImportEnum_.Count; }
+    }
+    public self::ImportEnum GetRepeatedImportEnum(int index) {
+      return repeatedImportEnum_[index];
+    }
+    
+    // repeated string repeated_string_piece = 54 [ctype = STRING_PIECE];
+    private scg::IList<string> repeatedStringPiece_ = pbc::Lists<string>.Empty;
+    public scg::IList<string> RepeatedStringPieceList {
+      get { return repeatedStringPiece_; }
+    }
+    public int RepeatedStringPieceCount {
+      get { return repeatedStringPiece_.Count; }
+    }
+    public string GetRepeatedStringPiece(int index) {
+      return repeatedStringPiece_[index];
+    }
+    
+    // repeated string repeated_cord = 55 [ctype = CORD];
+    private scg::IList<string> repeatedCord_ = pbc::Lists<string>.Empty;
+    public scg::IList<string> RepeatedCordList {
+      get { return repeatedCord_; }
+    }
+    public int RepeatedCordCount {
+      get { return repeatedCord_.Count; }
+    }
+    public string GetRepeatedCord(int index) {
+      return repeatedCord_[index];
+    }
+    
+    // optional int32 default_int32 = 61 [default = 41];
+    private bool hasDefaultInt32;
+    private int defaultInt32_ = 41;
+    public bool HasDefaultInt32 {
+      get { return hasDefaultInt32; }
+    }
+    public int DefaultInt32 {
+      get { return defaultInt32_; }
+    }
+    
+    // optional int64 default_int64 = 62 [default = 42];
+    private bool hasDefaultInt64;
+    private long defaultInt64_ = 42L;
+    public bool HasDefaultInt64 {
+      get { return hasDefaultInt64; }
+    }
+    public long DefaultInt64 {
+      get { return defaultInt64_; }
+    }
+    
+    // optional uint32 default_uint32 = 63 [default = 43];
+    private bool hasDefaultUint32;
+    private uint defaultUint32_ = 43;
+    public bool HasDefaultUint32 {
+      get { return hasDefaultUint32; }
+    }
+    public uint DefaultUint32 {
+      get { return defaultUint32_; }
+    }
+    
+    // optional uint64 default_uint64 = 64 [default = 44];
+    private bool hasDefaultUint64;
+    private ulong defaultUint64_ = 44UL;
+    public bool HasDefaultUint64 {
+      get { return hasDefaultUint64; }
+    }
+    public ulong DefaultUint64 {
+      get { return defaultUint64_; }
+    }
+    
+    // optional sint32 default_sint32 = 65 [default = -45];
+    private bool hasDefaultSint32;
+    private int defaultSint32_ = -45;
+    public bool HasDefaultSint32 {
+      get { return hasDefaultSint32; }
+    }
+    public int DefaultSint32 {
+      get { return defaultSint32_; }
+    }
+    
+    // optional sint64 default_sint64 = 66 [default = 46];
+    private bool hasDefaultSint64;
+    private long defaultSint64_ = 46L;
+    public bool HasDefaultSint64 {
+      get { return hasDefaultSint64; }
+    }
+    public long DefaultSint64 {
+      get { return defaultSint64_; }
+    }
+    
+    // optional fixed32 default_fixed32 = 67 [default = 47];
+    private bool hasDefaultFixed32;
+    private uint defaultFixed32_ = 47;
+    public bool HasDefaultFixed32 {
+      get { return hasDefaultFixed32; }
+    }
+    public uint DefaultFixed32 {
+      get { return defaultFixed32_; }
+    }
+    
+    // optional fixed64 default_fixed64 = 68 [default = 48];
+    private bool hasDefaultFixed64;
+    private ulong defaultFixed64_ = 48UL;
+    public bool HasDefaultFixed64 {
+      get { return hasDefaultFixed64; }
+    }
+    public ulong DefaultFixed64 {
+      get { return defaultFixed64_; }
+    }
+    
+    // optional sfixed32 default_sfixed32 = 69 [default = 49];
+    private bool hasDefaultSfixed32;
+    private int defaultSfixed32_ = 49;
+    public bool HasDefaultSfixed32 {
+      get { return hasDefaultSfixed32; }
+    }
+    public int DefaultSfixed32 {
+      get { return defaultSfixed32_; }
+    }
+    
+    // optional sfixed64 default_sfixed64 = 70 [default = -50];
+    private bool hasDefaultSfixed64;
+    private long defaultSfixed64_ = -50L;
+    public bool HasDefaultSfixed64 {
+      get { return hasDefaultSfixed64; }
+    }
+    public long DefaultSfixed64 {
+      get { return defaultSfixed64_; }
+    }
+    
+    // optional float default_float = 71 [default = 51.5];
+    private bool hasDefaultFloat;
+    private float defaultFloat_ = 51.5F;
+    public bool HasDefaultFloat {
+      get { return hasDefaultFloat; }
+    }
+    public float DefaultFloat {
+      get { return defaultFloat_; }
+    }
+    
+    // optional double default_double = 72 [default = 52000];
+    private bool hasDefaultDouble;
+    private double defaultDouble_ = 52000D;
+    public bool HasDefaultDouble {
+      get { return hasDefaultDouble; }
+    }
+    public double DefaultDouble {
+      get { return defaultDouble_; }
+    }
+    
+    // optional bool default_bool = 73 [default = true];
+    private bool hasDefaultBool;
+    private bool defaultBool_ = true;
+    public bool HasDefaultBool {
+      get { return hasDefaultBool; }
+    }
+    public bool DefaultBool {
+      get { return defaultBool_; }
+    }
+    
+    // optional string default_string = 74 [default = "hello"];
+    private bool hasDefaultString;
+    private string defaultString_ = "hello";
+    public bool HasDefaultString {
+      get { return hasDefaultString; }
+    }
+    public string DefaultString {
+      get { return defaultString_; }
+    }
+    
+    // optional bytes default_bytes = 75 [default = "world"];
+    private bool hasDefaultBytes;
+    private pb::ByteString defaultBytes_ = ((pb::ByteString) self::TestAllTypes.Descriptor.Fields[62].DefaultValue);
+    public bool HasDefaultBytes {
+      get { return hasDefaultBytes; }
+    }
+    public pb::ByteString DefaultBytes {
+      get { return defaultBytes_; }
+    }
+    
+    // optional .protobuf_unittest.TestAllTypes.NestedEnum default_nested_enum = 81 [default = BAR];
+    private bool hasDefaultNestedEnum;
+    private self::TestAllTypes.Types.NestedEnum defaultNestedEnum_ = self::TestAllTypes.Types.NestedEnum.BAR;
+    public bool HasDefaultNestedEnum {
+      get { return hasDefaultNestedEnum; }
+    }
+    public self::TestAllTypes.Types.NestedEnum DefaultNestedEnum {  get { return defaultNestedEnum_; }}
+    
+    // optional .protobuf_unittest.ForeignEnum default_foreign_enum = 82 [default = FOREIGN_BAR];
+    private bool hasDefaultForeignEnum;
+    private self::ForeignEnum defaultForeignEnum_ = self::ForeignEnum.FOREIGN_BAR;
+    public bool HasDefaultForeignEnum {
+      get { return hasDefaultForeignEnum; }
+    }
+    public self::ForeignEnum DefaultForeignEnum {  get { return defaultForeignEnum_; }}
+    
+    // optional .protobuf_unittest_import.ImportEnum default_import_enum = 83 [default = IMPORT_BAR];
+    private bool hasDefaultImportEnum;
+    private self::ImportEnum defaultImportEnum_ = self::ImportEnum.IMPORT_BAR;
+    public bool HasDefaultImportEnum {
+      get { return hasDefaultImportEnum; }
+    }
+    public self::ImportEnum DefaultImportEnum {  get { return defaultImportEnum_; }}
+    
+    // optional string default_string_piece = 84 [default = "abc", ctype = STRING_PIECE];
+    private bool hasDefaultStringPiece;
+    private string defaultStringPiece_ = "abc";
+    public bool HasDefaultStringPiece {
+      get { return hasDefaultStringPiece; }
+    }
+    public string DefaultStringPiece {
+      get { return defaultStringPiece_; }
+    }
+    
+    // optional string default_cord = 85 [default = "123", ctype = CORD];
+    private bool hasDefaultCord;
+    private string defaultCord_ = "123";
+    public bool HasDefaultCord {
+      get { return hasDefaultCord; }
+    }
+    public string DefaultCord {
+      get { return defaultCord_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasOptionalInt32) {
+        output.WriteInt32(1, OptionalInt32);
+      }
+      if (HasOptionalInt64) {
+        output.WriteInt64(2, OptionalInt64);
+      }
+      if (HasOptionalUint32) {
+        output.WriteUInt32(3, OptionalUint32);
+      }
+      if (HasOptionalUint64) {
+        output.WriteUInt64(4, OptionalUint64);
+      }
+      if (HasOptionalSint32) {
+        output.WriteSInt32(5, OptionalSint32);
+      }
+      if (HasOptionalSint64) {
+        output.WriteSInt64(6, OptionalSint64);
+      }
+      if (HasOptionalFixed32) {
+        output.WriteFixed32(7, OptionalFixed32);
+      }
+      if (HasOptionalFixed64) {
+        output.WriteFixed64(8, OptionalFixed64);
+      }
+      if (HasOptionalSfixed32) {
+        output.WriteSFixed32(9, OptionalSfixed32);
+      }
+      if (HasOptionalSfixed64) {
+        output.WriteSFixed64(10, OptionalSfixed64);
+      }
+      if (HasOptionalFloat) {
+        output.WriteFloat(11, OptionalFloat);
+      }
+      if (HasOptionalDouble) {
+        output.WriteDouble(12, OptionalDouble);
+      }
+      if (HasOptionalBool) {
+        output.WriteBool(13, OptionalBool);
+      }
+      if (HasOptionalString) {
+        output.WriteString(14, OptionalString);
+      }
+      if (HasOptionalBytes) {
+        output.WriteBytes(15, OptionalBytes);
+      }
+      if (HasOptionalGroup) {
+        output.WriteGroup(16, OptionalGroup);
+      }
+      if (HasOptionalNestedMessage) {
+        output.WriteMessage(18, OptionalNestedMessage);
+      }
+      if (HasOptionalForeignMessage) {
+        output.WriteMessage(19, OptionalForeignMessage);
+      }
+      if (HasOptionalImportMessage) {
+        output.WriteMessage(20, OptionalImportMessage);
+      }
+      if (HasOptionalNestedEnum) {
+        output.WriteEnum(21, (int) OptionalNestedEnum);
+      }
+      if (HasOptionalForeignEnum) {
+        output.WriteEnum(22, (int) OptionalForeignEnum);
+      }
+      if (HasOptionalImportEnum) {
+        output.WriteEnum(23, (int) OptionalImportEnum);
+      }
+      if (HasOptionalStringPiece) {
+        output.WriteString(24, OptionalStringPiece);
+      }
+      if (HasOptionalCord) {
+        output.WriteString(25, OptionalCord);
+      }
+      foreach (int element in RepeatedInt32List) {
+        output.WriteInt32(31, element);
+      }
+      foreach (long element in RepeatedInt64List) {
+        output.WriteInt64(32, element);
+      }
+      foreach (uint element in RepeatedUint32List) {
+        output.WriteUInt32(33, element);
+      }
+      foreach (ulong element in RepeatedUint64List) {
+        output.WriteUInt64(34, element);
+      }
+      foreach (int element in RepeatedSint32List) {
+        output.WriteSInt32(35, element);
+      }
+      foreach (long element in RepeatedSint64List) {
+        output.WriteSInt64(36, element);
+      }
+      foreach (uint element in RepeatedFixed32List) {
+        output.WriteFixed32(37, element);
+      }
+      foreach (ulong element in RepeatedFixed64List) {
+        output.WriteFixed64(38, element);
+      }
+      foreach (int element in RepeatedSfixed32List) {
+        output.WriteSFixed32(39, element);
+      }
+      foreach (long element in RepeatedSfixed64List) {
+        output.WriteSFixed64(40, element);
+      }
+      foreach (float element in RepeatedFloatList) {
+        output.WriteFloat(41, element);
+      }
+      foreach (double element in RepeatedDoubleList) {
+        output.WriteDouble(42, element);
+      }
+      foreach (bool element in RepeatedBoolList) {
+        output.WriteBool(43, element);
+      }
+      foreach (string element in RepeatedStringList) {
+        output.WriteString(44, element);
+      }
+      foreach (pb::ByteString element in RepeatedBytesList) {
+        output.WriteBytes(45, element);
+      }
+      foreach (self::TestAllTypes.Types.RepeatedGroup element in RepeatedGroupList) {
+        output.WriteGroup(46, element);
+      }
+      foreach (self::TestAllTypes.Types.NestedMessage element in RepeatedNestedMessageList) {
+        output.WriteMessage(48, element);
+      }
+      foreach (self::ForeignMessage element in RepeatedForeignMessageList) {
+        output.WriteMessage(49, element);
+      }
+      foreach (self::ImportMessage element in RepeatedImportMessageList) {
+        output.WriteMessage(50, element);
+      }
+      foreach (self::TestAllTypes.Types.NestedEnum element in RepeatedNestedEnumList) {
+        output.WriteEnum(51, (int) element);
+      }
+      foreach (self::ForeignEnum element in RepeatedForeignEnumList) {
+        output.WriteEnum(52, (int) element);
+      }
+      foreach (self::ImportEnum element in RepeatedImportEnumList) {
+        output.WriteEnum(53, (int) element);
+      }
+      foreach (string element in RepeatedStringPieceList) {
+        output.WriteString(54, element);
+      }
+      foreach (string element in RepeatedCordList) {
+        output.WriteString(55, element);
+      }
+      if (HasDefaultInt32) {
+        output.WriteInt32(61, DefaultInt32);
+      }
+      if (HasDefaultInt64) {
+        output.WriteInt64(62, DefaultInt64);
+      }
+      if (HasDefaultUint32) {
+        output.WriteUInt32(63, DefaultUint32);
+      }
+      if (HasDefaultUint64) {
+        output.WriteUInt64(64, DefaultUint64);
+      }
+      if (HasDefaultSint32) {
+        output.WriteSInt32(65, DefaultSint32);
+      }
+      if (HasDefaultSint64) {
+        output.WriteSInt64(66, DefaultSint64);
+      }
+      if (HasDefaultFixed32) {
+        output.WriteFixed32(67, DefaultFixed32);
+      }
+      if (HasDefaultFixed64) {
+        output.WriteFixed64(68, DefaultFixed64);
+      }
+      if (HasDefaultSfixed32) {
+        output.WriteSFixed32(69, DefaultSfixed32);
+      }
+      if (HasDefaultSfixed64) {
+        output.WriteSFixed64(70, DefaultSfixed64);
+      }
+      if (HasDefaultFloat) {
+        output.WriteFloat(71, DefaultFloat);
+      }
+      if (HasDefaultDouble) {
+        output.WriteDouble(72, DefaultDouble);
+      }
+      if (HasDefaultBool) {
+        output.WriteBool(73, DefaultBool);
+      }
+      if (HasDefaultString) {
+        output.WriteString(74, DefaultString);
+      }
+      if (HasDefaultBytes) {
+        output.WriteBytes(75, DefaultBytes);
+      }
+      if (HasDefaultNestedEnum) {
+        output.WriteEnum(81, (int) DefaultNestedEnum);
+      }
+      if (HasDefaultForeignEnum) {
+        output.WriteEnum(82, (int) DefaultForeignEnum);
+      }
+      if (HasDefaultImportEnum) {
+        output.WriteEnum(83, (int) DefaultImportEnum);
+      }
+      if (HasDefaultStringPiece) {
+        output.WriteString(84, DefaultStringPiece);
+      }
+      if (HasDefaultCord) {
+        output.WriteString(85, DefaultCord);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasOptionalInt32) {
+          size += pb::CodedOutputStream.ComputeInt32Size(1, OptionalInt32);
+        }
+        if (HasOptionalInt64) {
+          size += pb::CodedOutputStream.ComputeInt64Size(2, OptionalInt64);
+        }
+        if (HasOptionalUint32) {
+          size += pb::CodedOutputStream.ComputeUInt32Size(3, OptionalUint32);
+        }
+        if (HasOptionalUint64) {
+          size += pb::CodedOutputStream.ComputeUInt64Size(4, OptionalUint64);
+        }
+        if (HasOptionalSint32) {
+          size += pb::CodedOutputStream.ComputeSInt32Size(5, OptionalSint32);
+        }
+        if (HasOptionalSint64) {
+          size += pb::CodedOutputStream.ComputeSInt64Size(6, OptionalSint64);
+        }
+        if (HasOptionalFixed32) {
+          size += pb::CodedOutputStream.ComputeFixed32Size(7, OptionalFixed32);
+        }
+        if (HasOptionalFixed64) {
+          size += pb::CodedOutputStream.ComputeFixed64Size(8, OptionalFixed64);
+        }
+        if (HasOptionalSfixed32) {
+          size += pb::CodedOutputStream.ComputeSFixed32Size(9, OptionalSfixed32);
+        }
+        if (HasOptionalSfixed64) {
+          size += pb::CodedOutputStream.ComputeSFixed64Size(10, OptionalSfixed64);
+        }
+        if (HasOptionalFloat) {
+          size += pb::CodedOutputStream.ComputeFloatSize(11, OptionalFloat);
+        }
+        if (HasOptionalDouble) {
+          size += pb::CodedOutputStream.ComputeDoubleSize(12, OptionalDouble);
+        }
+        if (HasOptionalBool) {
+          size += pb::CodedOutputStream.ComputeBoolSize(13, OptionalBool);
+        }
+        if (HasOptionalString) {
+          size += pb::CodedOutputStream.ComputeStringSize(14, OptionalString);
+        }
+        if (HasOptionalBytes) {
+          size += pb::CodedOutputStream.ComputeBytesSize(15, OptionalBytes);
+        }
+        if (HasOptionalGroup) {
+          size += pb::CodedOutputStream.ComputeGroupSize(16, OptionalGroup);
+        }
+        if (HasOptionalNestedMessage) {
+          size += pb::CodedOutputStream.ComputeMessageSize(18, OptionalNestedMessage);
+        }
+        if (HasOptionalForeignMessage) {
+          size += pb::CodedOutputStream.ComputeMessageSize(19, OptionalForeignMessage);
+        }
+        if (HasOptionalImportMessage) {
+          size += pb::CodedOutputStream.ComputeMessageSize(20, OptionalImportMessage);
+        }
+        if (HasOptionalNestedEnum) {
+          size += pb::CodedOutputStream
+            .ComputeEnumSize(21, (int) OptionalNestedEnum);
+        }
+        if (HasOptionalForeignEnum) {
+          size += pb::CodedOutputStream
+            .ComputeEnumSize(22, (int) OptionalForeignEnum);
+        }
+        if (HasOptionalImportEnum) {
+          size += pb::CodedOutputStream
+            .ComputeEnumSize(23, (int) OptionalImportEnum);
+        }
+        if (HasOptionalStringPiece) {
+          size += pb::CodedOutputStream.ComputeStringSize(24, OptionalStringPiece);
+        }
+        if (HasOptionalCord) {
+          size += pb::CodedOutputStream.ComputeStringSize(25, OptionalCord);
+        }
+        foreach (int element in RepeatedInt32List) {
+          size += pb::CodedOutputStream
+            .ComputeInt32Size(31, element);
+        }
+        foreach (long element in RepeatedInt64List) {
+          size += pb::CodedOutputStream
+            .ComputeInt64Size(32, element);
+        }
+        foreach (uint element in RepeatedUint32List) {
+          size += pb::CodedOutputStream
+            .ComputeUInt32Size(33, element);
+        }
+        foreach (ulong element in RepeatedUint64List) {
+          size += pb::CodedOutputStream
+            .ComputeUInt64Size(34, element);
+        }
+        foreach (int element in RepeatedSint32List) {
+          size += pb::CodedOutputStream
+            .ComputeSInt32Size(35, element);
+        }
+        foreach (long element in RepeatedSint64List) {
+          size += pb::CodedOutputStream
+            .ComputeSInt64Size(36, element);
+        }
+        foreach (uint element in RepeatedFixed32List) {
+          size += pb::CodedOutputStream
+            .ComputeFixed32Size(37, element);
+        }
+        foreach (ulong element in RepeatedFixed64List) {
+          size += pb::CodedOutputStream
+            .ComputeFixed64Size(38, element);
+        }
+        foreach (int element in RepeatedSfixed32List) {
+          size += pb::CodedOutputStream
+            .ComputeSFixed32Size(39, element);
+        }
+        foreach (long element in RepeatedSfixed64List) {
+          size += pb::CodedOutputStream
+            .ComputeSFixed64Size(40, element);
+        }
+        foreach (float element in RepeatedFloatList) {
+          size += pb::CodedOutputStream
+            .ComputeFloatSize(41, element);
+        }
+        foreach (double element in RepeatedDoubleList) {
+          size += pb::CodedOutputStream
+            .ComputeDoubleSize(42, element);
+        }
+        foreach (bool element in RepeatedBoolList) {
+          size += pb::CodedOutputStream
+            .ComputeBoolSize(43, element);
+        }
+        foreach (string element in RepeatedStringList) {
+          size += pb::CodedOutputStream
+            .ComputeStringSize(44, element);
+        }
+        foreach (pb::ByteString element in RepeatedBytesList) {
+          size += pb::CodedOutputStream
+            .ComputeBytesSize(45, element);
+        }
+        foreach (self::TestAllTypes.Types.RepeatedGroup element in RepeatedGroupList) {
+          size += pb::CodedOutputStream.ComputeGroupSize(46, element);
+        }
+        foreach (self::TestAllTypes.Types.NestedMessage element in RepeatedNestedMessageList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(48, element);
+        }
+        foreach (self::ForeignMessage element in RepeatedForeignMessageList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(49, element);
+        }
+        foreach (self::ImportMessage element in RepeatedImportMessageList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(50, element);
+        }
+        foreach (self::TestAllTypes.Types.NestedEnum element in RepeatedNestedEnumList) {
+          size += pb::CodedOutputStream
+            .ComputeEnumSize(51, (int) element);
+        }
+        foreach (self::ForeignEnum element in RepeatedForeignEnumList) {
+          size += pb::CodedOutputStream
+            .ComputeEnumSize(52, (int) element);
+        }
+        foreach (self::ImportEnum element in RepeatedImportEnumList) {
+          size += pb::CodedOutputStream
+            .ComputeEnumSize(53, (int) element);
+        }
+        foreach (string element in RepeatedStringPieceList) {
+          size += pb::CodedOutputStream
+            .ComputeStringSize(54, element);
+        }
+        foreach (string element in RepeatedCordList) {
+          size += pb::CodedOutputStream
+            .ComputeStringSize(55, element);
+        }
+        if (HasDefaultInt32) {
+          size += pb::CodedOutputStream.ComputeInt32Size(61, DefaultInt32);
+        }
+        if (HasDefaultInt64) {
+          size += pb::CodedOutputStream.ComputeInt64Size(62, DefaultInt64);
+        }
+        if (HasDefaultUint32) {
+          size += pb::CodedOutputStream.ComputeUInt32Size(63, DefaultUint32);
+        }
+        if (HasDefaultUint64) {
+          size += pb::CodedOutputStream.ComputeUInt64Size(64, DefaultUint64);
+        }
+        if (HasDefaultSint32) {
+          size += pb::CodedOutputStream.ComputeSInt32Size(65, DefaultSint32);
+        }
+        if (HasDefaultSint64) {
+          size += pb::CodedOutputStream.ComputeSInt64Size(66, DefaultSint64);
+        }
+        if (HasDefaultFixed32) {
+          size += pb::CodedOutputStream.ComputeFixed32Size(67, DefaultFixed32);
+        }
+        if (HasDefaultFixed64) {
+          size += pb::CodedOutputStream.ComputeFixed64Size(68, DefaultFixed64);
+        }
+        if (HasDefaultSfixed32) {
+          size += pb::CodedOutputStream.ComputeSFixed32Size(69, DefaultSfixed32);
+        }
+        if (HasDefaultSfixed64) {
+          size += pb::CodedOutputStream.ComputeSFixed64Size(70, DefaultSfixed64);
+        }
+        if (HasDefaultFloat) {
+          size += pb::CodedOutputStream.ComputeFloatSize(71, DefaultFloat);
+        }
+        if (HasDefaultDouble) {
+          size += pb::CodedOutputStream.ComputeDoubleSize(72, DefaultDouble);
+        }
+        if (HasDefaultBool) {
+          size += pb::CodedOutputStream.ComputeBoolSize(73, DefaultBool);
+        }
+        if (HasDefaultString) {
+          size += pb::CodedOutputStream.ComputeStringSize(74, DefaultString);
+        }
+        if (HasDefaultBytes) {
+          size += pb::CodedOutputStream.ComputeBytesSize(75, DefaultBytes);
+        }
+        if (HasDefaultNestedEnum) {
+          size += pb::CodedOutputStream
+            .ComputeEnumSize(81, (int) DefaultNestedEnum);
+        }
+        if (HasDefaultForeignEnum) {
+          size += pb::CodedOutputStream
+            .ComputeEnumSize(82, (int) DefaultForeignEnum);
+        }
+        if (HasDefaultImportEnum) {
+          size += pb::CodedOutputStream
+            .ComputeEnumSize(83, (int) DefaultImportEnum);
+        }
+        if (HasDefaultStringPiece) {
+          size += pb::CodedOutputStream.ComputeStringSize(84, DefaultStringPiece);
+        }
+        if (HasDefaultCord) {
+          size += pb::CodedOutputStream.ComputeStringSize(85, DefaultCord);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestAllTypes ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestAllTypes ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestAllTypes ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestAllTypes parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestAllTypes ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestAllTypes ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestAllTypes ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestAllTypes ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestAllTypes> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestAllTypes prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestAllTypes, Builder> {
+      // Construct using self::TestAllTypes.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestAllTypes result = new self::TestAllTypes();
+      
+      protected override self::TestAllTypes MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestAllTypes> Clear() {
+        result = new self::TestAllTypes();
+        return this;
+      }
+      
+      public override IBuilder<self::TestAllTypes> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestAllTypes.Descriptor; }
+      }
+      
+      public override self::TestAllTypes DefaultInstanceForType {
+        get { return self::TestAllTypes.DefaultInstance; }
+      }
+      
+      public override self::TestAllTypes BuildPartial() {
+        result.repeatedInt32_ = pbc::Lists<int>.AsReadOnly(result.repeatedInt32_);
+        result.repeatedInt64_ = pbc::Lists<long>.AsReadOnly(result.repeatedInt64_);
+        result.repeatedUint32_ = pbc::Lists<uint>.AsReadOnly(result.repeatedUint32_);
+        result.repeatedUint64_ = pbc::Lists<ulong>.AsReadOnly(result.repeatedUint64_);
+        result.repeatedSint32_ = pbc::Lists<int>.AsReadOnly(result.repeatedSint32_);
+        result.repeatedSint64_ = pbc::Lists<long>.AsReadOnly(result.repeatedSint64_);
+        result.repeatedFixed32_ = pbc::Lists<uint>.AsReadOnly(result.repeatedFixed32_);
+        result.repeatedFixed64_ = pbc::Lists<ulong>.AsReadOnly(result.repeatedFixed64_);
+        result.repeatedSfixed32_ = pbc::Lists<int>.AsReadOnly(result.repeatedSfixed32_);
+        result.repeatedSfixed64_ = pbc::Lists<long>.AsReadOnly(result.repeatedSfixed64_);
+        result.repeatedFloat_ = pbc::Lists<float>.AsReadOnly(result.repeatedFloat_);
+        result.repeatedDouble_ = pbc::Lists<double>.AsReadOnly(result.repeatedDouble_);
+        result.repeatedBool_ = pbc::Lists<bool>.AsReadOnly(result.repeatedBool_);
+        result.repeatedString_ = pbc::Lists<string>.AsReadOnly(result.repeatedString_);
+        result.repeatedBytes_ = pbc::Lists<pb::ByteString>.AsReadOnly(result.repeatedBytes_);
+        if (result.repeatedGroup_ != pbc::Lists<self::TestAllTypes.Types.RepeatedGroup>.Empty) {
+          result.repeatedGroup_ = pbc::Lists<self::TestAllTypes.Types.RepeatedGroup>.AsReadOnly(result.repeatedGroup_);
+        }
+        if (result.repeatedNestedMessage_ != pbc::Lists<self::TestAllTypes.Types.NestedMessage>.Empty) {
+          result.repeatedNestedMessage_ = pbc::Lists<self::TestAllTypes.Types.NestedMessage>.AsReadOnly(result.repeatedNestedMessage_);
+        }
+        if (result.repeatedForeignMessage_ != pbc::Lists<self::ForeignMessage>.Empty) {
+          result.repeatedForeignMessage_ = pbc::Lists<self::ForeignMessage>.AsReadOnly(result.repeatedForeignMessage_);
+        }
+        if (result.repeatedImportMessage_ != pbc::Lists<self::ImportMessage>.Empty) {
+          result.repeatedImportMessage_ = pbc::Lists<self::ImportMessage>.AsReadOnly(result.repeatedImportMessage_);
+        }
+        result.repeatedNestedEnum_ = pbc::Lists.AsReadOnly(result.repeatedNestedEnum_);
+        result.repeatedForeignEnum_ = pbc::Lists.AsReadOnly(result.repeatedForeignEnum_);
+        result.repeatedImportEnum_ = pbc::Lists.AsReadOnly(result.repeatedImportEnum_);
+        result.repeatedStringPiece_ = pbc::Lists<string>.AsReadOnly(result.repeatedStringPiece_);
+        result.repeatedCord_ = pbc::Lists<string>.AsReadOnly(result.repeatedCord_);
+        self::TestAllTypes returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestAllTypes) {
+          return MergeFrom((self::TestAllTypes) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestAllTypes> MergeFrom(self::TestAllTypes other) {
+        if (other == self::TestAllTypes.DefaultInstance) return this;
+        if (other.HasOptionalInt32) {
+          OptionalInt32 = other.OptionalInt32;
+        }
+        if (other.HasOptionalInt64) {
+          OptionalInt64 = other.OptionalInt64;
+        }
+        if (other.HasOptionalUint32) {
+          OptionalUint32 = other.OptionalUint32;
+        }
+        if (other.HasOptionalUint64) {
+          OptionalUint64 = other.OptionalUint64;
+        }
+        if (other.HasOptionalSint32) {
+          OptionalSint32 = other.OptionalSint32;
+        }
+        if (other.HasOptionalSint64) {
+          OptionalSint64 = other.OptionalSint64;
+        }
+        if (other.HasOptionalFixed32) {
+          OptionalFixed32 = other.OptionalFixed32;
+        }
+        if (other.HasOptionalFixed64) {
+          OptionalFixed64 = other.OptionalFixed64;
+        }
+        if (other.HasOptionalSfixed32) {
+          OptionalSfixed32 = other.OptionalSfixed32;
+        }
+        if (other.HasOptionalSfixed64) {
+          OptionalSfixed64 = other.OptionalSfixed64;
+        }
+        if (other.HasOptionalFloat) {
+          OptionalFloat = other.OptionalFloat;
+        }
+        if (other.HasOptionalDouble) {
+          OptionalDouble = other.OptionalDouble;
+        }
+        if (other.HasOptionalBool) {
+          OptionalBool = other.OptionalBool;
+        }
+        if (other.HasOptionalString) {
+          OptionalString = other.OptionalString;
+        }
+        if (other.HasOptionalBytes) {
+          OptionalBytes = other.OptionalBytes;
+        }
+        if (other.HasOptionalGroup) {
+          MergeOptionalGroup(other.OptionalGroup);
+        }
+        if (other.HasOptionalNestedMessage) {
+          MergeOptionalNestedMessage(other.OptionalNestedMessage);
+        }
+        if (other.HasOptionalForeignMessage) {
+          MergeOptionalForeignMessage(other.OptionalForeignMessage);
+        }
+        if (other.HasOptionalImportMessage) {
+          MergeOptionalImportMessage(other.OptionalImportMessage);
+        }
+        if (other.HasOptionalNestedEnum) {
+          OptionalNestedEnum = other.OptionalNestedEnum;
+        }
+        if (other.HasOptionalForeignEnum) {
+          OptionalForeignEnum = other.OptionalForeignEnum;
+        }
+        if (other.HasOptionalImportEnum) {
+          OptionalImportEnum = other.OptionalImportEnum;
+        }
+        if (other.HasOptionalStringPiece) {
+          OptionalStringPiece = other.OptionalStringPiece;
+        }
+        if (other.HasOptionalCord) {
+          OptionalCord = other.OptionalCord;
+        }
+        if (other.repeatedInt32_.Count != 0) {
+          if (result.repeatedInt32_.Count == 0) {
+            result.repeatedInt32_ = new scg::List<int>();
+          }
+          base.AddRange(other.repeatedInt32_, result.repeatedInt32_);
+        }
+        if (other.repeatedInt64_.Count != 0) {
+          if (result.repeatedInt64_.Count == 0) {
+            result.repeatedInt64_ = new scg::List<long>();
+          }
+          base.AddRange(other.repeatedInt64_, result.repeatedInt64_);
+        }
+        if (other.repeatedUint32_.Count != 0) {
+          if (result.repeatedUint32_.Count == 0) {
+            result.repeatedUint32_ = new scg::List<uint>();
+          }
+          base.AddRange(other.repeatedUint32_, result.repeatedUint32_);
+        }
+        if (other.repeatedUint64_.Count != 0) {
+          if (result.repeatedUint64_.Count == 0) {
+            result.repeatedUint64_ = new scg::List<ulong>();
+          }
+          base.AddRange(other.repeatedUint64_, result.repeatedUint64_);
+        }
+        if (other.repeatedSint32_.Count != 0) {
+          if (result.repeatedSint32_.Count == 0) {
+            result.repeatedSint32_ = new scg::List<int>();
+          }
+          base.AddRange(other.repeatedSint32_, result.repeatedSint32_);
+        }
+        if (other.repeatedSint64_.Count != 0) {
+          if (result.repeatedSint64_.Count == 0) {
+            result.repeatedSint64_ = new scg::List<long>();
+          }
+          base.AddRange(other.repeatedSint64_, result.repeatedSint64_);
+        }
+        if (other.repeatedFixed32_.Count != 0) {
+          if (result.repeatedFixed32_.Count == 0) {
+            result.repeatedFixed32_ = new scg::List<uint>();
+          }
+          base.AddRange(other.repeatedFixed32_, result.repeatedFixed32_);
+        }
+        if (other.repeatedFixed64_.Count != 0) {
+          if (result.repeatedFixed64_.Count == 0) {
+            result.repeatedFixed64_ = new scg::List<ulong>();
+          }
+          base.AddRange(other.repeatedFixed64_, result.repeatedFixed64_);
+        }
+        if (other.repeatedSfixed32_.Count != 0) {
+          if (result.repeatedSfixed32_.Count == 0) {
+            result.repeatedSfixed32_ = new scg::List<int>();
+          }
+          base.AddRange(other.repeatedSfixed32_, result.repeatedSfixed32_);
+        }
+        if (other.repeatedSfixed64_.Count != 0) {
+          if (result.repeatedSfixed64_.Count == 0) {
+            result.repeatedSfixed64_ = new scg::List<long>();
+          }
+          base.AddRange(other.repeatedSfixed64_, result.repeatedSfixed64_);
+        }
+        if (other.repeatedFloat_.Count != 0) {
+          if (result.repeatedFloat_.Count == 0) {
+            result.repeatedFloat_ = new scg::List<float>();
+          }
+          base.AddRange(other.repeatedFloat_, result.repeatedFloat_);
+        }
+        if (other.repeatedDouble_.Count != 0) {
+          if (result.repeatedDouble_.Count == 0) {
+            result.repeatedDouble_ = new scg::List<double>();
+          }
+          base.AddRange(other.repeatedDouble_, result.repeatedDouble_);
+        }
+        if (other.repeatedBool_.Count != 0) {
+          if (result.repeatedBool_.Count == 0) {
+            result.repeatedBool_ = new scg::List<bool>();
+          }
+          base.AddRange(other.repeatedBool_, result.repeatedBool_);
+        }
+        if (other.repeatedString_.Count != 0) {
+          if (result.repeatedString_.Count == 0) {
+            result.repeatedString_ = new scg::List<string>();
+          }
+          base.AddRange(other.repeatedString_, result.repeatedString_);
+        }
+        if (other.repeatedBytes_.Count != 0) {
+          if (result.repeatedBytes_.Count == 0) {
+            result.repeatedBytes_ = new scg::List<pb::ByteString>();
+          }
+          base.AddRange(other.repeatedBytes_, result.repeatedBytes_);
+        }
+        if (other.repeatedGroup_.Count != 0) {
+          if (result.repeatedGroup_.Count == 0) {
+            result.repeatedGroup_ = new scg::List<self::TestAllTypes.Types.RepeatedGroup>();
+          }
+          base.AddRange(other.repeatedGroup_, result.repeatedGroup_);
+        }
+        if (other.repeatedNestedMessage_.Count != 0) {
+          if (result.repeatedNestedMessage_.Count == 0) {
+            result.repeatedNestedMessage_ = new scg::List<self::TestAllTypes.Types.NestedMessage>();
+          }
+          base.AddRange(other.repeatedNestedMessage_, result.repeatedNestedMessage_);
+        }
+        if (other.repeatedForeignMessage_.Count != 0) {
+          if (result.repeatedForeignMessage_.Count == 0) {
+            result.repeatedForeignMessage_ = new scg::List<self::ForeignMessage>();
+          }
+          base.AddRange(other.repeatedForeignMessage_, result.repeatedForeignMessage_);
+        }
+        if (other.repeatedImportMessage_.Count != 0) {
+          if (result.repeatedImportMessage_.Count == 0) {
+            result.repeatedImportMessage_ = new scg::List<self::ImportMessage>();
+          }
+          base.AddRange(other.repeatedImportMessage_, result.repeatedImportMessage_);
+        }
+        if (other.repeatedNestedEnum_.Count != 0) {
+          if (result.repeatedNestedEnum_.Count == 0) {
+            result.repeatedNestedEnum_ = new scg::List<self::TestAllTypes.Types.NestedEnum>();
+          }
+          base.AddRange(other.repeatedNestedEnum_, result.repeatedNestedEnum_);
+        }
+        if (other.repeatedForeignEnum_.Count != 0) {
+          if (result.repeatedForeignEnum_.Count == 0) {
+            result.repeatedForeignEnum_ = new scg::List<self::ForeignEnum>();
+          }
+          base.AddRange(other.repeatedForeignEnum_, result.repeatedForeignEnum_);
+        }
+        if (other.repeatedImportEnum_.Count != 0) {
+          if (result.repeatedImportEnum_.Count == 0) {
+            result.repeatedImportEnum_ = new scg::List<self::ImportEnum>();
+          }
+          base.AddRange(other.repeatedImportEnum_, result.repeatedImportEnum_);
+        }
+        if (other.repeatedStringPiece_.Count != 0) {
+          if (result.repeatedStringPiece_.Count == 0) {
+            result.repeatedStringPiece_ = new scg::List<string>();
+          }
+          base.AddRange(other.repeatedStringPiece_, result.repeatedStringPiece_);
+        }
+        if (other.repeatedCord_.Count != 0) {
+          if (result.repeatedCord_.Count == 0) {
+            result.repeatedCord_ = new scg::List<string>();
+          }
+          base.AddRange(other.repeatedCord_, result.repeatedCord_);
+        }
+        if (other.HasDefaultInt32) {
+          DefaultInt32 = other.DefaultInt32;
+        }
+        if (other.HasDefaultInt64) {
+          DefaultInt64 = other.DefaultInt64;
+        }
+        if (other.HasDefaultUint32) {
+          DefaultUint32 = other.DefaultUint32;
+        }
+        if (other.HasDefaultUint64) {
+          DefaultUint64 = other.DefaultUint64;
+        }
+        if (other.HasDefaultSint32) {
+          DefaultSint32 = other.DefaultSint32;
+        }
+        if (other.HasDefaultSint64) {
+          DefaultSint64 = other.DefaultSint64;
+        }
+        if (other.HasDefaultFixed32) {
+          DefaultFixed32 = other.DefaultFixed32;
+        }
+        if (other.HasDefaultFixed64) {
+          DefaultFixed64 = other.DefaultFixed64;
+        }
+        if (other.HasDefaultSfixed32) {
+          DefaultSfixed32 = other.DefaultSfixed32;
+        }
+        if (other.HasDefaultSfixed64) {
+          DefaultSfixed64 = other.DefaultSfixed64;
+        }
+        if (other.HasDefaultFloat) {
+          DefaultFloat = other.DefaultFloat;
+        }
+        if (other.HasDefaultDouble) {
+          DefaultDouble = other.DefaultDouble;
+        }
+        if (other.HasDefaultBool) {
+          DefaultBool = other.DefaultBool;
+        }
+        if (other.HasDefaultString) {
+          DefaultString = other.DefaultString;
+        }
+        if (other.HasDefaultBytes) {
+          DefaultBytes = other.DefaultBytes;
+        }
+        if (other.HasDefaultNestedEnum) {
+          DefaultNestedEnum = other.DefaultNestedEnum;
+        }
+        if (other.HasDefaultForeignEnum) {
+          DefaultForeignEnum = other.DefaultForeignEnum;
+        }
+        if (other.HasDefaultImportEnum) {
+          DefaultImportEnum = other.DefaultImportEnum;
+        }
+        if (other.HasDefaultStringPiece) {
+          DefaultStringPiece = other.DefaultStringPiece;
+        }
+        if (other.HasDefaultCord) {
+          DefaultCord = other.DefaultCord;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestAllTypes> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestAllTypes> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 8: {
+              OptionalInt32 = input.ReadInt32();
+              break;
+            }
+            case 16: {
+              OptionalInt64 = input.ReadInt64();
+              break;
+            }
+            case 24: {
+              OptionalUint32 = input.ReadUInt32();
+              break;
+            }
+            case 32: {
+              OptionalUint64 = input.ReadUInt64();
+              break;
+            }
+            case 40: {
+              OptionalSint32 = input.ReadSInt32();
+              break;
+            }
+            case 48: {
+              OptionalSint64 = input.ReadSInt64();
+              break;
+            }
+            case 61: {
+              OptionalFixed32 = input.ReadFixed32();
+              break;
+            }
+            case 65: {
+              OptionalFixed64 = input.ReadFixed64();
+              break;
+            }
+            case 77: {
+              OptionalSfixed32 = input.ReadSFixed32();
+              break;
+            }
+            case 81: {
+              OptionalSfixed64 = input.ReadSFixed64();
+              break;
+            }
+            case 93: {
+              OptionalFloat = input.ReadFloat();
+              break;
+            }
+            case 97: {
+              OptionalDouble = input.ReadDouble();
+              break;
+            }
+            case 104: {
+              OptionalBool = input.ReadBool();
+              break;
+            }
+            case 114: {
+              OptionalString = input.ReadString();
+              break;
+            }
+            case 122: {
+              OptionalBytes = input.ReadBytes();
+              break;
+            }
+            case 131: {
+              self::TestAllTypes.Types.OptionalGroup.Builder subBuilder = self::TestAllTypes.Types.OptionalGroup.CreateBuilder();
+              if (HasOptionalGroup) {
+                subBuilder.MergeFrom(OptionalGroup);
+              }
+              input.ReadGroup(16, subBuilder, extensionRegistry);
+              OptionalGroup = subBuilder.BuildPartial();
+              break;
+            }
+            case 146: {
+              self::TestAllTypes.Types.NestedMessage.Builder subBuilder = self::TestAllTypes.Types.NestedMessage.CreateBuilder();
+              if (HasOptionalNestedMessage) {
+                subBuilder.MergeFrom(OptionalNestedMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              OptionalNestedMessage = subBuilder.BuildPartial();
+              break;
+            }
+            case 154: {
+              self::ForeignMessage.Builder subBuilder = self::ForeignMessage.CreateBuilder();
+              if (HasOptionalForeignMessage) {
+                subBuilder.MergeFrom(OptionalForeignMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              OptionalForeignMessage = subBuilder.BuildPartial();
+              break;
+            }
+            case 162: {
+              self::ImportMessage.Builder subBuilder = self::ImportMessage.CreateBuilder();
+              if (HasOptionalImportMessage) {
+                subBuilder.MergeFrom(OptionalImportMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              OptionalImportMessage = subBuilder.BuildPartial();
+              break;
+            }
+            case 168: {
+              int rawValue = input.ReadEnum();
+              if (!global::System.Enum.IsDefined(typeof(self::TestAllTypes.Types.NestedEnum), rawValue)) {
+                unknownFields.MergeVarintField(21, (ulong) rawValue);
+              } else {
+                OptionalNestedEnum = (self::TestAllTypes.Types.NestedEnum) rawValue;
+              }
+              break;
+            }
+            case 176: {
+              int rawValue = input.ReadEnum();
+              if (!global::System.Enum.IsDefined(typeof(self::ForeignEnum), rawValue)) {
+                unknownFields.MergeVarintField(22, (ulong) rawValue);
+              } else {
+                OptionalForeignEnum = (self::ForeignEnum) rawValue;
+              }
+              break;
+            }
+            case 184: {
+              int rawValue = input.ReadEnum();
+              if (!global::System.Enum.IsDefined(typeof(self::ImportEnum), rawValue)) {
+                unknownFields.MergeVarintField(23, (ulong) rawValue);
+              } else {
+                OptionalImportEnum = (self::ImportEnum) rawValue;
+              }
+              break;
+            }
+            case 194: {
+              OptionalStringPiece = input.ReadString();
+              break;
+            }
+            case 202: {
+              OptionalCord = input.ReadString();
+              break;
+            }
+            case 248: {
+              AddRepeatedInt32(input.ReadInt32());
+              break;
+            }
+            case 256: {
+              AddRepeatedInt64(input.ReadInt64());
+              break;
+            }
+            case 264: {
+              AddRepeatedUint32(input.ReadUInt32());
+              break;
+            }
+            case 272: {
+              AddRepeatedUint64(input.ReadUInt64());
+              break;
+            }
+            case 280: {
+              AddRepeatedSint32(input.ReadSInt32());
+              break;
+            }
+            case 288: {
+              AddRepeatedSint64(input.ReadSInt64());
+              break;
+            }
+            case 301: {
+              AddRepeatedFixed32(input.ReadFixed32());
+              break;
+            }
+            case 305: {
+              AddRepeatedFixed64(input.ReadFixed64());
+              break;
+            }
+            case 317: {
+              AddRepeatedSfixed32(input.ReadSFixed32());
+              break;
+            }
+            case 321: {
+              AddRepeatedSfixed64(input.ReadSFixed64());
+              break;
+            }
+            case 333: {
+              AddRepeatedFloat(input.ReadFloat());
+              break;
+            }
+            case 337: {
+              AddRepeatedDouble(input.ReadDouble());
+              break;
+            }
+            case 344: {
+              AddRepeatedBool(input.ReadBool());
+              break;
+            }
+            case 354: {
+              AddRepeatedString(input.ReadString());
+              break;
+            }
+            case 362: {
+              AddRepeatedBytes(input.ReadBytes());
+              break;
+            }
+            case 371: {
+              self::TestAllTypes.Types.RepeatedGroup.Builder subBuilder = self::TestAllTypes.Types.RepeatedGroup.CreateBuilder();
+              input.ReadGroup(46, subBuilder, extensionRegistry);
+              AddRepeatedGroup(subBuilder.BuildPartial());
+              break;
+            }
+            case 386: {
+              self::TestAllTypes.Types.NestedMessage.Builder subBuilder = self::TestAllTypes.Types.NestedMessage.CreateBuilder();
+              input.ReadMessage(subBuilder, extensionRegistry);
+              AddRepeatedNestedMessage(subBuilder.BuildPartial());
+              break;
+            }
+            case 394: {
+              self::ForeignMessage.Builder subBuilder = self::ForeignMessage.CreateBuilder();
+              input.ReadMessage(subBuilder, extensionRegistry);
+              AddRepeatedForeignMessage(subBuilder.BuildPartial());
+              break;
+            }
+            case 402: {
+              self::ImportMessage.Builder subBuilder = self::ImportMessage.CreateBuilder();
+              input.ReadMessage(subBuilder, extensionRegistry);
+              AddRepeatedImportMessage(subBuilder.BuildPartial());
+              break;
+            }
+            case 408: {
+              int rawValue = input.ReadEnum();
+              self::TestAllTypes.Types.NestedEnum value = (self::TestAllTypes.Types.NestedEnum) rawValue;
+              if (!global::System.Enum.IsDefined(typeof(self::TestAllTypes.Types.NestedEnum), value)) {
+                unknownFields.MergeVarintField(51, (ulong) rawValue);
+              } else {
+                AddRepeatedNestedEnum(value);
+              }
+              break;
+            }
+            case 416: {
+              int rawValue = input.ReadEnum();
+              self::ForeignEnum value = (self::ForeignEnum) rawValue;
+              if (!global::System.Enum.IsDefined(typeof(self::ForeignEnum), value)) {
+                unknownFields.MergeVarintField(52, (ulong) rawValue);
+              } else {
+                AddRepeatedForeignEnum(value);
+              }
+              break;
+            }
+            case 424: {
+              int rawValue = input.ReadEnum();
+              self::ImportEnum value = (self::ImportEnum) rawValue;
+              if (!global::System.Enum.IsDefined(typeof(self::ImportEnum), value)) {
+                unknownFields.MergeVarintField(53, (ulong) rawValue);
+              } else {
+                AddRepeatedImportEnum(value);
+              }
+              break;
+            }
+            case 434: {
+              AddRepeatedStringPiece(input.ReadString());
+              break;
+            }
+            case 442: {
+              AddRepeatedCord(input.ReadString());
+              break;
+            }
+            case 488: {
+              DefaultInt32 = input.ReadInt32();
+              break;
+            }
+            case 496: {
+              DefaultInt64 = input.ReadInt64();
+              break;
+            }
+            case 504: {
+              DefaultUint32 = input.ReadUInt32();
+              break;
+            }
+            case 512: {
+              DefaultUint64 = input.ReadUInt64();
+              break;
+            }
+            case 520: {
+              DefaultSint32 = input.ReadSInt32();
+              break;
+            }
+            case 528: {
+              DefaultSint64 = input.ReadSInt64();
+              break;
+            }
+            case 541: {
+              DefaultFixed32 = input.ReadFixed32();
+              break;
+            }
+            case 545: {
+              DefaultFixed64 = input.ReadFixed64();
+              break;
+            }
+            case 557: {
+              DefaultSfixed32 = input.ReadSFixed32();
+              break;
+            }
+            case 561: {
+              DefaultSfixed64 = input.ReadSFixed64();
+              break;
+            }
+            case 573: {
+              DefaultFloat = input.ReadFloat();
+              break;
+            }
+            case 577: {
+              DefaultDouble = input.ReadDouble();
+              break;
+            }
+            case 584: {
+              DefaultBool = input.ReadBool();
+              break;
+            }
+            case 594: {
+              DefaultString = input.ReadString();
+              break;
+            }
+            case 602: {
+              DefaultBytes = input.ReadBytes();
+              break;
+            }
+            case 648: {
+              int rawValue = input.ReadEnum();
+              if (!global::System.Enum.IsDefined(typeof(self::TestAllTypes.Types.NestedEnum), rawValue)) {
+                unknownFields.MergeVarintField(81, (ulong) rawValue);
+              } else {
+                DefaultNestedEnum = (self::TestAllTypes.Types.NestedEnum) rawValue;
+              }
+              break;
+            }
+            case 656: {
+              int rawValue = input.ReadEnum();
+              if (!global::System.Enum.IsDefined(typeof(self::ForeignEnum), rawValue)) {
+                unknownFields.MergeVarintField(82, (ulong) rawValue);
+              } else {
+                DefaultForeignEnum = (self::ForeignEnum) rawValue;
+              }
+              break;
+            }
+            case 664: {
+              int rawValue = input.ReadEnum();
+              if (!global::System.Enum.IsDefined(typeof(self::ImportEnum), rawValue)) {
+                unknownFields.MergeVarintField(83, (ulong) rawValue);
+              } else {
+                DefaultImportEnum = (self::ImportEnum) rawValue;
+              }
+              break;
+            }
+            case 674: {
+              DefaultStringPiece = input.ReadString();
+              break;
+            }
+            case 682: {
+              DefaultCord = input.ReadString();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional int32 optional_int32 = 1;
+      public bool HasOptionalInt32 {
+        get { return result.HasOptionalInt32; }
+      }
+      public int OptionalInt32 {
+        get { return result.OptionalInt32; }
+        set { SetOptionalInt32(value); }
+      }
+      public Builder SetOptionalInt32(int value) {
+        result.hasOptionalInt32 = true;
+        result.optionalInt32_ = value;
+        return this;
+      }
+      public Builder ClearOptionalInt32() {
+        result.hasOptionalInt32 = false;
+        result.optionalInt32_ = 0;
+        return this;
+      }
+      
+      // optional int64 optional_int64 = 2;
+      public bool HasOptionalInt64 {
+        get { return result.HasOptionalInt64; }
+      }
+      public long OptionalInt64 {
+        get { return result.OptionalInt64; }
+        set { SetOptionalInt64(value); }
+      }
+      public Builder SetOptionalInt64(long value) {
+        result.hasOptionalInt64 = true;
+        result.optionalInt64_ = value;
+        return this;
+      }
+      public Builder ClearOptionalInt64() {
+        result.hasOptionalInt64 = false;
+        result.optionalInt64_ = 0L;
+        return this;
+      }
+      
+      // optional uint32 optional_uint32 = 3;
+      public bool HasOptionalUint32 {
+        get { return result.HasOptionalUint32; }
+      }
+      public uint OptionalUint32 {
+        get { return result.OptionalUint32; }
+        set { SetOptionalUint32(value); }
+      }
+      public Builder SetOptionalUint32(uint value) {
+        result.hasOptionalUint32 = true;
+        result.optionalUint32_ = value;
+        return this;
+      }
+      public Builder ClearOptionalUint32() {
+        result.hasOptionalUint32 = false;
+        result.optionalUint32_ = 0;
+        return this;
+      }
+      
+      // optional uint64 optional_uint64 = 4;
+      public bool HasOptionalUint64 {
+        get { return result.HasOptionalUint64; }
+      }
+      public ulong OptionalUint64 {
+        get { return result.OptionalUint64; }
+        set { SetOptionalUint64(value); }
+      }
+      public Builder SetOptionalUint64(ulong value) {
+        result.hasOptionalUint64 = true;
+        result.optionalUint64_ = value;
+        return this;
+      }
+      public Builder ClearOptionalUint64() {
+        result.hasOptionalUint64 = false;
+        result.optionalUint64_ = 0UL;
+        return this;
+      }
+      
+      // optional sint32 optional_sint32 = 5;
+      public bool HasOptionalSint32 {
+        get { return result.HasOptionalSint32; }
+      }
+      public int OptionalSint32 {
+        get { return result.OptionalSint32; }
+        set { SetOptionalSint32(value); }
+      }
+      public Builder SetOptionalSint32(int value) {
+        result.hasOptionalSint32 = true;
+        result.optionalSint32_ = value;
+        return this;
+      }
+      public Builder ClearOptionalSint32() {
+        result.hasOptionalSint32 = false;
+        result.optionalSint32_ = 0;
+        return this;
+      }
+      
+      // optional sint64 optional_sint64 = 6;
+      public bool HasOptionalSint64 {
+        get { return result.HasOptionalSint64; }
+      }
+      public long OptionalSint64 {
+        get { return result.OptionalSint64; }
+        set { SetOptionalSint64(value); }
+      }
+      public Builder SetOptionalSint64(long value) {
+        result.hasOptionalSint64 = true;
+        result.optionalSint64_ = value;
+        return this;
+      }
+      public Builder ClearOptionalSint64() {
+        result.hasOptionalSint64 = false;
+        result.optionalSint64_ = 0L;
+        return this;
+      }
+      
+      // optional fixed32 optional_fixed32 = 7;
+      public bool HasOptionalFixed32 {
+        get { return result.HasOptionalFixed32; }
+      }
+      public uint OptionalFixed32 {
+        get { return result.OptionalFixed32; }
+        set { SetOptionalFixed32(value); }
+      }
+      public Builder SetOptionalFixed32(uint value) {
+        result.hasOptionalFixed32 = true;
+        result.optionalFixed32_ = value;
+        return this;
+      }
+      public Builder ClearOptionalFixed32() {
+        result.hasOptionalFixed32 = false;
+        result.optionalFixed32_ = 0;
+        return this;
+      }
+      
+      // optional fixed64 optional_fixed64 = 8;
+      public bool HasOptionalFixed64 {
+        get { return result.HasOptionalFixed64; }
+      }
+      public ulong OptionalFixed64 {
+        get { return result.OptionalFixed64; }
+        set { SetOptionalFixed64(value); }
+      }
+      public Builder SetOptionalFixed64(ulong value) {
+        result.hasOptionalFixed64 = true;
+        result.optionalFixed64_ = value;
+        return this;
+      }
+      public Builder ClearOptionalFixed64() {
+        result.hasOptionalFixed64 = false;
+        result.optionalFixed64_ = 0UL;
+        return this;
+      }
+      
+      // optional sfixed32 optional_sfixed32 = 9;
+      public bool HasOptionalSfixed32 {
+        get { return result.HasOptionalSfixed32; }
+      }
+      public int OptionalSfixed32 {
+        get { return result.OptionalSfixed32; }
+        set { SetOptionalSfixed32(value); }
+      }
+      public Builder SetOptionalSfixed32(int value) {
+        result.hasOptionalSfixed32 = true;
+        result.optionalSfixed32_ = value;
+        return this;
+      }
+      public Builder ClearOptionalSfixed32() {
+        result.hasOptionalSfixed32 = false;
+        result.optionalSfixed32_ = 0;
+        return this;
+      }
+      
+      // optional sfixed64 optional_sfixed64 = 10;
+      public bool HasOptionalSfixed64 {
+        get { return result.HasOptionalSfixed64; }
+      }
+      public long OptionalSfixed64 {
+        get { return result.OptionalSfixed64; }
+        set { SetOptionalSfixed64(value); }
+      }
+      public Builder SetOptionalSfixed64(long value) {
+        result.hasOptionalSfixed64 = true;
+        result.optionalSfixed64_ = value;
+        return this;
+      }
+      public Builder ClearOptionalSfixed64() {
+        result.hasOptionalSfixed64 = false;
+        result.optionalSfixed64_ = 0L;
+        return this;
+      }
+      
+      // optional float optional_float = 11;
+      public bool HasOptionalFloat {
+        get { return result.HasOptionalFloat; }
+      }
+      public float OptionalFloat {
+        get { return result.OptionalFloat; }
+        set { SetOptionalFloat(value); }
+      }
+      public Builder SetOptionalFloat(float value) {
+        result.hasOptionalFloat = true;
+        result.optionalFloat_ = value;
+        return this;
+      }
+      public Builder ClearOptionalFloat() {
+        result.hasOptionalFloat = false;
+        result.optionalFloat_ = 0F;
+        return this;
+      }
+      
+      // optional double optional_double = 12;
+      public bool HasOptionalDouble {
+        get { return result.HasOptionalDouble; }
+      }
+      public double OptionalDouble {
+        get { return result.OptionalDouble; }
+        set { SetOptionalDouble(value); }
+      }
+      public Builder SetOptionalDouble(double value) {
+        result.hasOptionalDouble = true;
+        result.optionalDouble_ = value;
+        return this;
+      }
+      public Builder ClearOptionalDouble() {
+        result.hasOptionalDouble = false;
+        result.optionalDouble_ = 0D;
+        return this;
+      }
+      
+      // optional bool optional_bool = 13;
+      public bool HasOptionalBool {
+        get { return result.HasOptionalBool; }
+      }
+      public bool OptionalBool {
+        get { return result.OptionalBool; }
+        set { SetOptionalBool(value); }
+      }
+      public Builder SetOptionalBool(bool value) {
+        result.hasOptionalBool = true;
+        result.optionalBool_ = value;
+        return this;
+      }
+      public Builder ClearOptionalBool() {
+        result.hasOptionalBool = false;
+        result.optionalBool_ = false;
+        return this;
+      }
+      
+      // optional string optional_string = 14;
+      public bool HasOptionalString {
+        get { return result.HasOptionalString; }
+      }
+      public string OptionalString {
+        get { return result.OptionalString; }
+        set { SetOptionalString(value); }
+      }
+      public Builder SetOptionalString(string value) {
+        result.hasOptionalString = true;
+        result.optionalString_ = value;
+        return this;
+      }
+      public Builder ClearOptionalString() {
+        result.hasOptionalString = false;
+        result.optionalString_ = "";
+        return this;
+      }
+      
+      // optional bytes optional_bytes = 15;
+      public bool HasOptionalBytes {
+        get { return result.HasOptionalBytes; }
+      }
+      public pb::ByteString OptionalBytes {
+        get { return result.OptionalBytes; }
+        set { SetOptionalBytes(value); }
+      }
+      public Builder SetOptionalBytes(pb::ByteString value) {
+        result.hasOptionalBytes = true;
+        result.optionalBytes_ = value;
+        return this;
+      }
+      public Builder ClearOptionalBytes() {
+        result.hasOptionalBytes = false;
+        result.optionalBytes_ = pb::ByteString.Empty;
+        return this;
+      }
+      
+      // optional group OptionalGroup = 16 {
+      public bool HasOptionalGroup {
+        get { return result.HasOptionalGroup; }
+      }
+      public self::TestAllTypes.Types.OptionalGroup OptionalGroup {
+        get { return result.OptionalGroup; }
+        set { SetOptionalGroup(value); }
+      }
+      public Builder SetOptionalGroup(self::TestAllTypes.Types.OptionalGroup value) {
+        result.hasOptionalGroup = true;
+        result.optionalGroup_ = value;
+        return this;
+      }
+      public Builder SetOptionalGroup(self::TestAllTypes.Types.OptionalGroup.Builder builderForValue) {
+        result.hasOptionalGroup = true;
+        result.optionalGroup_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalGroup(self::TestAllTypes.Types.OptionalGroup value) {
+        if (result.HasOptionalGroup &&
+            result.optionalGroup_ != self::TestAllTypes.Types.OptionalGroup.DefaultInstance) {
+          result.optionalGroup_ =
+            self::TestAllTypes.Types.OptionalGroup.CreateBuilder(result.optionalGroup_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalGroup_ = value;
+        }
+        result.hasOptionalGroup = true;
+        return this;
+      }
+      public Builder ClearOptionalGroup() {
+        result.hasOptionalGroup = false;
+        result.optionalGroup_ = self::TestAllTypes.Types.OptionalGroup.DefaultInstance;
+        return this;
+      }
+      
+      // optional .protobuf_unittest.TestAllTypes.NestedMessage optional_nested_message = 18;
+      public bool HasOptionalNestedMessage {
+        get { return result.HasOptionalNestedMessage; }
+      }
+      public self::TestAllTypes.Types.NestedMessage OptionalNestedMessage {
+        get { return result.OptionalNestedMessage; }
+        set { SetOptionalNestedMessage(value); }
+      }
+      public Builder SetOptionalNestedMessage(self::TestAllTypes.Types.NestedMessage value) {
+        result.hasOptionalNestedMessage = true;
+        result.optionalNestedMessage_ = value;
+        return this;
+      }
+      public Builder SetOptionalNestedMessage(self::TestAllTypes.Types.NestedMessage.Builder builderForValue) {
+        result.hasOptionalNestedMessage = true;
+        result.optionalNestedMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalNestedMessage(self::TestAllTypes.Types.NestedMessage value) {
+        if (result.HasOptionalNestedMessage &&
+            result.optionalNestedMessage_ != self::TestAllTypes.Types.NestedMessage.DefaultInstance) {
+          result.optionalNestedMessage_ =
+            self::TestAllTypes.Types.NestedMessage.CreateBuilder(result.optionalNestedMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalNestedMessage_ = value;
+        }
+        result.hasOptionalNestedMessage = true;
+        return this;
+      }
+      public Builder ClearOptionalNestedMessage() {
+        result.hasOptionalNestedMessage = false;
+        result.optionalNestedMessage_ = self::TestAllTypes.Types.NestedMessage.DefaultInstance;
+        return this;
+      }
+      
+      // optional .protobuf_unittest.ForeignMessage optional_foreign_message = 19;
+      public bool HasOptionalForeignMessage {
+        get { return result.HasOptionalForeignMessage; }
+      }
+      public self::ForeignMessage OptionalForeignMessage {
+        get { return result.OptionalForeignMessage; }
+        set { SetOptionalForeignMessage(value); }
+      }
+      public Builder SetOptionalForeignMessage(self::ForeignMessage value) {
+        result.hasOptionalForeignMessage = true;
+        result.optionalForeignMessage_ = value;
+        return this;
+      }
+      public Builder SetOptionalForeignMessage(self::ForeignMessage.Builder builderForValue) {
+        result.hasOptionalForeignMessage = true;
+        result.optionalForeignMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalForeignMessage(self::ForeignMessage value) {
+        if (result.HasOptionalForeignMessage &&
+            result.optionalForeignMessage_ != self::ForeignMessage.DefaultInstance) {
+          result.optionalForeignMessage_ =
+            self::ForeignMessage.CreateBuilder(result.optionalForeignMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalForeignMessage_ = value;
+        }
+        result.hasOptionalForeignMessage = true;
+        return this;
+      }
+      public Builder ClearOptionalForeignMessage() {
+        result.hasOptionalForeignMessage = false;
+        result.optionalForeignMessage_ = self::ForeignMessage.DefaultInstance;
+        return this;
+      }
+      
+      // optional .protobuf_unittest_import.ImportMessage optional_import_message = 20;
+      public bool HasOptionalImportMessage {
+        get { return result.HasOptionalImportMessage; }
+      }
+      public self::ImportMessage OptionalImportMessage {
+        get { return result.OptionalImportMessage; }
+        set { SetOptionalImportMessage(value); }
+      }
+      public Builder SetOptionalImportMessage(self::ImportMessage value) {
+        result.hasOptionalImportMessage = true;
+        result.optionalImportMessage_ = value;
+        return this;
+      }
+      public Builder SetOptionalImportMessage(self::ImportMessage.Builder builderForValue) {
+        result.hasOptionalImportMessage = true;
+        result.optionalImportMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalImportMessage(self::ImportMessage value) {
+        if (result.HasOptionalImportMessage &&
+            result.optionalImportMessage_ != self::ImportMessage.DefaultInstance) {
+          result.optionalImportMessage_ =
+            self::ImportMessage.CreateBuilder(result.optionalImportMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalImportMessage_ = value;
+        }
+        result.hasOptionalImportMessage = true;
+        return this;
+      }
+      public Builder ClearOptionalImportMessage() {
+        result.hasOptionalImportMessage = false;
+        result.optionalImportMessage_ = self::ImportMessage.DefaultInstance;
+        return this;
+      }
+      
+      // optional .protobuf_unittest.TestAllTypes.NestedEnum optional_nested_enum = 21;
+      public bool HasOptionalNestedEnum {
+        get { return result.HasOptionalNestedEnum; }
+      }
+      public self::TestAllTypes.Types.NestedEnum OptionalNestedEnum {
+        get { return result.OptionalNestedEnum; }
+        set { SetOptionalNestedEnum(value); }
+      }
+      public Builder SetOptionalNestedEnum(self::TestAllTypes.Types.NestedEnum value) {
+        result.hasOptionalNestedEnum = true;
+        result.optionalNestedEnum_ = value;
+        return this;
+      }
+      public Builder ClearOptionalNestedEnum() {
+        result.hasOptionalNestedEnum = false;
+        result.optionalNestedEnum_ = self::TestAllTypes.Types.NestedEnum.FOO;
+        return this;
+      }
+      
+      // optional .protobuf_unittest.ForeignEnum optional_foreign_enum = 22;
+      public bool HasOptionalForeignEnum {
+        get { return result.HasOptionalForeignEnum; }
+      }
+      public self::ForeignEnum OptionalForeignEnum {
+        get { return result.OptionalForeignEnum; }
+        set { SetOptionalForeignEnum(value); }
+      }
+      public Builder SetOptionalForeignEnum(self::ForeignEnum value) {
+        result.hasOptionalForeignEnum = true;
+        result.optionalForeignEnum_ = value;
+        return this;
+      }
+      public Builder ClearOptionalForeignEnum() {
+        result.hasOptionalForeignEnum = false;
+        result.optionalForeignEnum_ = self::ForeignEnum.FOREIGN_FOO;
+        return this;
+      }
+      
+      // optional .protobuf_unittest_import.ImportEnum optional_import_enum = 23;
+      public bool HasOptionalImportEnum {
+        get { return result.HasOptionalImportEnum; }
+      }
+      public self::ImportEnum OptionalImportEnum {
+        get { return result.OptionalImportEnum; }
+        set { SetOptionalImportEnum(value); }
+      }
+      public Builder SetOptionalImportEnum(self::ImportEnum value) {
+        result.hasOptionalImportEnum = true;
+        result.optionalImportEnum_ = value;
+        return this;
+      }
+      public Builder ClearOptionalImportEnum() {
+        result.hasOptionalImportEnum = false;
+        result.optionalImportEnum_ = self::ImportEnum.IMPORT_FOO;
+        return this;
+      }
+      
+      // optional string optional_string_piece = 24 [ctype = STRING_PIECE];
+      public bool HasOptionalStringPiece {
+        get { return result.HasOptionalStringPiece; }
+      }
+      public string OptionalStringPiece {
+        get { return result.OptionalStringPiece; }
+        set { SetOptionalStringPiece(value); }
+      }
+      public Builder SetOptionalStringPiece(string value) {
+        result.hasOptionalStringPiece = true;
+        result.optionalStringPiece_ = value;
+        return this;
+      }
+      public Builder ClearOptionalStringPiece() {
+        result.hasOptionalStringPiece = false;
+        result.optionalStringPiece_ = "";
+        return this;
+      }
+      
+      // optional string optional_cord = 25 [ctype = CORD];
+      public bool HasOptionalCord {
+        get { return result.HasOptionalCord; }
+      }
+      public string OptionalCord {
+        get { return result.OptionalCord; }
+        set { SetOptionalCord(value); }
+      }
+      public Builder SetOptionalCord(string value) {
+        result.hasOptionalCord = true;
+        result.optionalCord_ = value;
+        return this;
+      }
+      public Builder ClearOptionalCord() {
+        result.hasOptionalCord = false;
+        result.optionalCord_ = "";
+        return this;
+      }
+      
+      // repeated int32 repeated_int32 = 31;
+      public scg::IList<int> RepeatedInt32List {
+        get { return pbc::Lists<int>.AsReadOnly(result.repeatedInt32_); }
+      }
+      public int RepeatedInt32Count {
+        get { return result.RepeatedInt32Count; }
+      }
+      public int GetRepeatedInt32(int index) {
+        return result.GetRepeatedInt32(index);
+      }
+      public Builder SetRepeatedInt32(int index, int value) {
+        result.repeatedInt32_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedInt32(int value) {
+        if (result.repeatedInt32_.Count == 0) {
+          result.repeatedInt32_ = new scg::List<int>();
+        }
+        result.repeatedInt32_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedInt32(scg::IEnumerable<int> values) {
+        if (result.repeatedInt32_.Count == 0) {
+          result.repeatedInt32_ = new scg::List<int>();
+        }
+        base.AddRange(values, result.repeatedInt32_);
+        return this;
+      }
+      public Builder ClearRepeatedInt32() {
+        result.repeatedInt32_ = pbc::Lists<int>.Empty;
+        return this;
+      }
+      
+      // repeated int64 repeated_int64 = 32;
+      public scg::IList<long> RepeatedInt64List {
+        get { return pbc::Lists<long>.AsReadOnly(result.repeatedInt64_); }
+      }
+      public int RepeatedInt64Count {
+        get { return result.RepeatedInt64Count; }
+      }
+      public long GetRepeatedInt64(int index) {
+        return result.GetRepeatedInt64(index);
+      }
+      public Builder SetRepeatedInt64(int index, long value) {
+        result.repeatedInt64_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedInt64(long value) {
+        if (result.repeatedInt64_.Count == 0) {
+          result.repeatedInt64_ = new scg::List<long>();
+        }
+        result.repeatedInt64_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedInt64(scg::IEnumerable<long> values) {
+        if (result.repeatedInt64_.Count == 0) {
+          result.repeatedInt64_ = new scg::List<long>();
+        }
+        base.AddRange(values, result.repeatedInt64_);
+        return this;
+      }
+      public Builder ClearRepeatedInt64() {
+        result.repeatedInt64_ = pbc::Lists<long>.Empty;
+        return this;
+      }
+      
+      // repeated uint32 repeated_uint32 = 33;
+      public scg::IList<uint> RepeatedUint32List {
+        get { return pbc::Lists<uint>.AsReadOnly(result.repeatedUint32_); }
+      }
+      public int RepeatedUint32Count {
+        get { return result.RepeatedUint32Count; }
+      }
+      public uint GetRepeatedUint32(int index) {
+        return result.GetRepeatedUint32(index);
+      }
+      public Builder SetRepeatedUint32(int index, uint value) {
+        result.repeatedUint32_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedUint32(uint value) {
+        if (result.repeatedUint32_.Count == 0) {
+          result.repeatedUint32_ = new scg::List<uint>();
+        }
+        result.repeatedUint32_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedUint32(scg::IEnumerable<uint> values) {
+        if (result.repeatedUint32_.Count == 0) {
+          result.repeatedUint32_ = new scg::List<uint>();
+        }
+        base.AddRange(values, result.repeatedUint32_);
+        return this;
+      }
+      public Builder ClearRepeatedUint32() {
+        result.repeatedUint32_ = pbc::Lists<uint>.Empty;
+        return this;
+      }
+      
+      // repeated uint64 repeated_uint64 = 34;
+      public scg::IList<ulong> RepeatedUint64List {
+        get { return pbc::Lists<ulong>.AsReadOnly(result.repeatedUint64_); }
+      }
+      public int RepeatedUint64Count {
+        get { return result.RepeatedUint64Count; }
+      }
+      public ulong GetRepeatedUint64(int index) {
+        return result.GetRepeatedUint64(index);
+      }
+      public Builder SetRepeatedUint64(int index, ulong value) {
+        result.repeatedUint64_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedUint64(ulong value) {
+        if (result.repeatedUint64_.Count == 0) {
+          result.repeatedUint64_ = new scg::List<ulong>();
+        }
+        result.repeatedUint64_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedUint64(scg::IEnumerable<ulong> values) {
+        if (result.repeatedUint64_.Count == 0) {
+          result.repeatedUint64_ = new scg::List<ulong>();
+        }
+        base.AddRange(values, result.repeatedUint64_);
+        return this;
+      }
+      public Builder ClearRepeatedUint64() {
+        result.repeatedUint64_ = pbc::Lists<ulong>.Empty;
+        return this;
+      }
+      
+      // repeated sint32 repeated_sint32 = 35;
+      public scg::IList<int> RepeatedSint32List {
+        get { return pbc::Lists<int>.AsReadOnly(result.repeatedSint32_); }
+      }
+      public int RepeatedSint32Count {
+        get { return result.RepeatedSint32Count; }
+      }
+      public int GetRepeatedSint32(int index) {
+        return result.GetRepeatedSint32(index);
+      }
+      public Builder SetRepeatedSint32(int index, int value) {
+        result.repeatedSint32_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedSint32(int value) {
+        if (result.repeatedSint32_.Count == 0) {
+          result.repeatedSint32_ = new scg::List<int>();
+        }
+        result.repeatedSint32_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedSint32(scg::IEnumerable<int> values) {
+        if (result.repeatedSint32_.Count == 0) {
+          result.repeatedSint32_ = new scg::List<int>();
+        }
+        base.AddRange(values, result.repeatedSint32_);
+        return this;
+      }
+      public Builder ClearRepeatedSint32() {
+        result.repeatedSint32_ = pbc::Lists<int>.Empty;
+        return this;
+      }
+      
+      // repeated sint64 repeated_sint64 = 36;
+      public scg::IList<long> RepeatedSint64List {
+        get { return pbc::Lists<long>.AsReadOnly(result.repeatedSint64_); }
+      }
+      public int RepeatedSint64Count {
+        get { return result.RepeatedSint64Count; }
+      }
+      public long GetRepeatedSint64(int index) {
+        return result.GetRepeatedSint64(index);
+      }
+      public Builder SetRepeatedSint64(int index, long value) {
+        result.repeatedSint64_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedSint64(long value) {
+        if (result.repeatedSint64_.Count == 0) {
+          result.repeatedSint64_ = new scg::List<long>();
+        }
+        result.repeatedSint64_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedSint64(scg::IEnumerable<long> values) {
+        if (result.repeatedSint64_.Count == 0) {
+          result.repeatedSint64_ = new scg::List<long>();
+        }
+        base.AddRange(values, result.repeatedSint64_);
+        return this;
+      }
+      public Builder ClearRepeatedSint64() {
+        result.repeatedSint64_ = pbc::Lists<long>.Empty;
+        return this;
+      }
+      
+      // repeated fixed32 repeated_fixed32 = 37;
+      public scg::IList<uint> RepeatedFixed32List {
+        get { return pbc::Lists<uint>.AsReadOnly(result.repeatedFixed32_); }
+      }
+      public int RepeatedFixed32Count {
+        get { return result.RepeatedFixed32Count; }
+      }
+      public uint GetRepeatedFixed32(int index) {
+        return result.GetRepeatedFixed32(index);
+      }
+      public Builder SetRepeatedFixed32(int index, uint value) {
+        result.repeatedFixed32_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedFixed32(uint value) {
+        if (result.repeatedFixed32_.Count == 0) {
+          result.repeatedFixed32_ = new scg::List<uint>();
+        }
+        result.repeatedFixed32_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedFixed32(scg::IEnumerable<uint> values) {
+        if (result.repeatedFixed32_.Count == 0) {
+          result.repeatedFixed32_ = new scg::List<uint>();
+        }
+        base.AddRange(values, result.repeatedFixed32_);
+        return this;
+      }
+      public Builder ClearRepeatedFixed32() {
+        result.repeatedFixed32_ = pbc::Lists<uint>.Empty;
+        return this;
+      }
+      
+      // repeated fixed64 repeated_fixed64 = 38;
+      public scg::IList<ulong> RepeatedFixed64List {
+        get { return pbc::Lists<ulong>.AsReadOnly(result.repeatedFixed64_); }
+      }
+      public int RepeatedFixed64Count {
+        get { return result.RepeatedFixed64Count; }
+      }
+      public ulong GetRepeatedFixed64(int index) {
+        return result.GetRepeatedFixed64(index);
+      }
+      public Builder SetRepeatedFixed64(int index, ulong value) {
+        result.repeatedFixed64_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedFixed64(ulong value) {
+        if (result.repeatedFixed64_.Count == 0) {
+          result.repeatedFixed64_ = new scg::List<ulong>();
+        }
+        result.repeatedFixed64_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedFixed64(scg::IEnumerable<ulong> values) {
+        if (result.repeatedFixed64_.Count == 0) {
+          result.repeatedFixed64_ = new scg::List<ulong>();
+        }
+        base.AddRange(values, result.repeatedFixed64_);
+        return this;
+      }
+      public Builder ClearRepeatedFixed64() {
+        result.repeatedFixed64_ = pbc::Lists<ulong>.Empty;
+        return this;
+      }
+      
+      // repeated sfixed32 repeated_sfixed32 = 39;
+      public scg::IList<int> RepeatedSfixed32List {
+        get { return pbc::Lists<int>.AsReadOnly(result.repeatedSfixed32_); }
+      }
+      public int RepeatedSfixed32Count {
+        get { return result.RepeatedSfixed32Count; }
+      }
+      public int GetRepeatedSfixed32(int index) {
+        return result.GetRepeatedSfixed32(index);
+      }
+      public Builder SetRepeatedSfixed32(int index, int value) {
+        result.repeatedSfixed32_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedSfixed32(int value) {
+        if (result.repeatedSfixed32_.Count == 0) {
+          result.repeatedSfixed32_ = new scg::List<int>();
+        }
+        result.repeatedSfixed32_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedSfixed32(scg::IEnumerable<int> values) {
+        if (result.repeatedSfixed32_.Count == 0) {
+          result.repeatedSfixed32_ = new scg::List<int>();
+        }
+        base.AddRange(values, result.repeatedSfixed32_);
+        return this;
+      }
+      public Builder ClearRepeatedSfixed32() {
+        result.repeatedSfixed32_ = pbc::Lists<int>.Empty;
+        return this;
+      }
+      
+      // repeated sfixed64 repeated_sfixed64 = 40;
+      public scg::IList<long> RepeatedSfixed64List {
+        get { return pbc::Lists<long>.AsReadOnly(result.repeatedSfixed64_); }
+      }
+      public int RepeatedSfixed64Count {
+        get { return result.RepeatedSfixed64Count; }
+      }
+      public long GetRepeatedSfixed64(int index) {
+        return result.GetRepeatedSfixed64(index);
+      }
+      public Builder SetRepeatedSfixed64(int index, long value) {
+        result.repeatedSfixed64_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedSfixed64(long value) {
+        if (result.repeatedSfixed64_.Count == 0) {
+          result.repeatedSfixed64_ = new scg::List<long>();
+        }
+        result.repeatedSfixed64_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedSfixed64(scg::IEnumerable<long> values) {
+        if (result.repeatedSfixed64_.Count == 0) {
+          result.repeatedSfixed64_ = new scg::List<long>();
+        }
+        base.AddRange(values, result.repeatedSfixed64_);
+        return this;
+      }
+      public Builder ClearRepeatedSfixed64() {
+        result.repeatedSfixed64_ = pbc::Lists<long>.Empty;
+        return this;
+      }
+      
+      // repeated float repeated_float = 41;
+      public scg::IList<float> RepeatedFloatList {
+        get { return pbc::Lists<float>.AsReadOnly(result.repeatedFloat_); }
+      }
+      public int RepeatedFloatCount {
+        get { return result.RepeatedFloatCount; }
+      }
+      public float GetRepeatedFloat(int index) {
+        return result.GetRepeatedFloat(index);
+      }
+      public Builder SetRepeatedFloat(int index, float value) {
+        result.repeatedFloat_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedFloat(float value) {
+        if (result.repeatedFloat_.Count == 0) {
+          result.repeatedFloat_ = new scg::List<float>();
+        }
+        result.repeatedFloat_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedFloat(scg::IEnumerable<float> values) {
+        if (result.repeatedFloat_.Count == 0) {
+          result.repeatedFloat_ = new scg::List<float>();
+        }
+        base.AddRange(values, result.repeatedFloat_);
+        return this;
+      }
+      public Builder ClearRepeatedFloat() {
+        result.repeatedFloat_ = pbc::Lists<float>.Empty;
+        return this;
+      }
+      
+      // repeated double repeated_double = 42;
+      public scg::IList<double> RepeatedDoubleList {
+        get { return pbc::Lists<double>.AsReadOnly(result.repeatedDouble_); }
+      }
+      public int RepeatedDoubleCount {
+        get { return result.RepeatedDoubleCount; }
+      }
+      public double GetRepeatedDouble(int index) {
+        return result.GetRepeatedDouble(index);
+      }
+      public Builder SetRepeatedDouble(int index, double value) {
+        result.repeatedDouble_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedDouble(double value) {
+        if (result.repeatedDouble_.Count == 0) {
+          result.repeatedDouble_ = new scg::List<double>();
+        }
+        result.repeatedDouble_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedDouble(scg::IEnumerable<double> values) {
+        if (result.repeatedDouble_.Count == 0) {
+          result.repeatedDouble_ = new scg::List<double>();
+        }
+        base.AddRange(values, result.repeatedDouble_);
+        return this;
+      }
+      public Builder ClearRepeatedDouble() {
+        result.repeatedDouble_ = pbc::Lists<double>.Empty;
+        return this;
+      }
+      
+      // repeated bool repeated_bool = 43;
+      public scg::IList<bool> RepeatedBoolList {
+        get { return pbc::Lists<bool>.AsReadOnly(result.repeatedBool_); }
+      }
+      public int RepeatedBoolCount {
+        get { return result.RepeatedBoolCount; }
+      }
+      public bool GetRepeatedBool(int index) {
+        return result.GetRepeatedBool(index);
+      }
+      public Builder SetRepeatedBool(int index, bool value) {
+        result.repeatedBool_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedBool(bool value) {
+        if (result.repeatedBool_.Count == 0) {
+          result.repeatedBool_ = new scg::List<bool>();
+        }
+        result.repeatedBool_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedBool(scg::IEnumerable<bool> values) {
+        if (result.repeatedBool_.Count == 0) {
+          result.repeatedBool_ = new scg::List<bool>();
+        }
+        base.AddRange(values, result.repeatedBool_);
+        return this;
+      }
+      public Builder ClearRepeatedBool() {
+        result.repeatedBool_ = pbc::Lists<bool>.Empty;
+        return this;
+      }
+      
+      // repeated string repeated_string = 44;
+      public scg::IList<string> RepeatedStringList {
+        get { return pbc::Lists<string>.AsReadOnly(result.repeatedString_); }
+      }
+      public int RepeatedStringCount {
+        get { return result.RepeatedStringCount; }
+      }
+      public string GetRepeatedString(int index) {
+        return result.GetRepeatedString(index);
+      }
+      public Builder SetRepeatedString(int index, string value) {
+        result.repeatedString_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedString(string value) {
+        if (result.repeatedString_.Count == 0) {
+          result.repeatedString_ = new scg::List<string>();
+        }
+        result.repeatedString_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedString(scg::IEnumerable<string> values) {
+        if (result.repeatedString_.Count == 0) {
+          result.repeatedString_ = new scg::List<string>();
+        }
+        base.AddRange(values, result.repeatedString_);
+        return this;
+      }
+      public Builder ClearRepeatedString() {
+        result.repeatedString_ = pbc::Lists<string>.Empty;
+        return this;
+      }
+      
+      // repeated bytes repeated_bytes = 45;
+      public scg::IList<pb::ByteString> RepeatedBytesList {
+        get { return pbc::Lists<pb::ByteString>.AsReadOnly(result.repeatedBytes_); }
+      }
+      public int RepeatedBytesCount {
+        get { return result.RepeatedBytesCount; }
+      }
+      public pb::ByteString GetRepeatedBytes(int index) {
+        return result.GetRepeatedBytes(index);
+      }
+      public Builder SetRepeatedBytes(int index, pb::ByteString value) {
+        result.repeatedBytes_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedBytes(pb::ByteString value) {
+        if (result.repeatedBytes_.Count == 0) {
+          result.repeatedBytes_ = new scg::List<pb::ByteString>();
+        }
+        result.repeatedBytes_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedBytes(scg::IEnumerable<pb::ByteString> values) {
+        if (result.repeatedBytes_.Count == 0) {
+          result.repeatedBytes_ = new scg::List<pb::ByteString>();
+        }
+        base.AddRange(values, result.repeatedBytes_);
+        return this;
+      }
+      public Builder ClearRepeatedBytes() {
+        result.repeatedBytes_ = pbc::Lists<pb::ByteString>.Empty;
+        return this;
+      }
+      
+      // repeated group RepeatedGroup = 46 {
+      public scg::IList<self::TestAllTypes.Types.RepeatedGroup> RepeatedGroupList {
+        get { return pbc::Lists.AsReadOnly(result.repeatedGroup_); }
+      }
+      public int RepeatedGroupCount {
+        get { return result.RepeatedGroupCount; }
+      }
+      public self::TestAllTypes.Types.RepeatedGroup GetRepeatedGroup(int index) {
+        return result.GetRepeatedGroup(index);
+      }
+      public Builder SetRepeatedGroup(int index, self::TestAllTypes.Types.RepeatedGroup value) {
+        result.repeatedGroup_[index] = value;
+        return this;
+      }
+      public Builder SetRepeatedGroup(int index, self::TestAllTypes.Types.RepeatedGroup.Builder builderForValue) {
+        result.repeatedGroup_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRepeatedGroup(self::TestAllTypes.Types.RepeatedGroup value) {
+        if (result.repeatedGroup_ == pbc::Lists<self::TestAllTypes.Types.RepeatedGroup>.Empty) {
+          result.repeatedGroup_ = new scg::List<self::TestAllTypes.Types.RepeatedGroup>();
+        }
+        result.repeatedGroup_.Add(value);
+        return this;
+      }
+      public Builder AddRepeatedGroup(self::TestAllTypes.Types.RepeatedGroup.Builder builderForValue) {
+        if (result.repeatedGroup_ == pbc::Lists<self::TestAllTypes.Types.RepeatedGroup>.Empty) {
+          result.repeatedGroup_ = new scg::List<self::TestAllTypes.Types.RepeatedGroup>();
+        }
+        result.repeatedGroup_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRepeatedGroup(scg::IEnumerable<self::TestAllTypes.Types.RepeatedGroup> values) {
+        if (result.repeatedGroup_ == pbc::Lists<self::TestAllTypes.Types.RepeatedGroup>.Empty) {
+          result.repeatedGroup_ = new scg::List<self::TestAllTypes.Types.RepeatedGroup>();
+        }
+        base.AddRange(values, result.repeatedGroup_);
+        return this;
+      }
+      public Builder ClearRepeatedGroup() {
+        result.repeatedGroup_ = pbc::Lists<self::TestAllTypes.Types.RepeatedGroup>.Empty;
+        return this;
+      }
+      
+      // repeated .protobuf_unittest.TestAllTypes.NestedMessage repeated_nested_message = 48;
+      public scg::IList<self::TestAllTypes.Types.NestedMessage> RepeatedNestedMessageList {
+        get { return pbc::Lists.AsReadOnly(result.repeatedNestedMessage_); }
+      }
+      public int RepeatedNestedMessageCount {
+        get { return result.RepeatedNestedMessageCount; }
+      }
+      public self::TestAllTypes.Types.NestedMessage GetRepeatedNestedMessage(int index) {
+        return result.GetRepeatedNestedMessage(index);
+      }
+      public Builder SetRepeatedNestedMessage(int index, self::TestAllTypes.Types.NestedMessage value) {
+        result.repeatedNestedMessage_[index] = value;
+        return this;
+      }
+      public Builder SetRepeatedNestedMessage(int index, self::TestAllTypes.Types.NestedMessage.Builder builderForValue) {
+        result.repeatedNestedMessage_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRepeatedNestedMessage(self::TestAllTypes.Types.NestedMessage value) {
+        if (result.repeatedNestedMessage_ == pbc::Lists<self::TestAllTypes.Types.NestedMessage>.Empty) {
+          result.repeatedNestedMessage_ = new scg::List<self::TestAllTypes.Types.NestedMessage>();
+        }
+        result.repeatedNestedMessage_.Add(value);
+        return this;
+      }
+      public Builder AddRepeatedNestedMessage(self::TestAllTypes.Types.NestedMessage.Builder builderForValue) {
+        if (result.repeatedNestedMessage_ == pbc::Lists<self::TestAllTypes.Types.NestedMessage>.Empty) {
+          result.repeatedNestedMessage_ = new scg::List<self::TestAllTypes.Types.NestedMessage>();
+        }
+        result.repeatedNestedMessage_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRepeatedNestedMessage(scg::IEnumerable<self::TestAllTypes.Types.NestedMessage> values) {
+        if (result.repeatedNestedMessage_ == pbc::Lists<self::TestAllTypes.Types.NestedMessage>.Empty) {
+          result.repeatedNestedMessage_ = new scg::List<self::TestAllTypes.Types.NestedMessage>();
+        }
+        base.AddRange(values, result.repeatedNestedMessage_);
+        return this;
+      }
+      public Builder ClearRepeatedNestedMessage() {
+        result.repeatedNestedMessage_ = pbc::Lists<self::TestAllTypes.Types.NestedMessage>.Empty;
+        return this;
+      }
+      
+      // repeated .protobuf_unittest.ForeignMessage repeated_foreign_message = 49;
+      public scg::IList<self::ForeignMessage> RepeatedForeignMessageList {
+        get { return pbc::Lists.AsReadOnly(result.repeatedForeignMessage_); }
+      }
+      public int RepeatedForeignMessageCount {
+        get { return result.RepeatedForeignMessageCount; }
+      }
+      public self::ForeignMessage GetRepeatedForeignMessage(int index) {
+        return result.GetRepeatedForeignMessage(index);
+      }
+      public Builder SetRepeatedForeignMessage(int index, self::ForeignMessage value) {
+        result.repeatedForeignMessage_[index] = value;
+        return this;
+      }
+      public Builder SetRepeatedForeignMessage(int index, self::ForeignMessage.Builder builderForValue) {
+        result.repeatedForeignMessage_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRepeatedForeignMessage(self::ForeignMessage value) {
+        if (result.repeatedForeignMessage_ == pbc::Lists<self::ForeignMessage>.Empty) {
+          result.repeatedForeignMessage_ = new scg::List<self::ForeignMessage>();
+        }
+        result.repeatedForeignMessage_.Add(value);
+        return this;
+      }
+      public Builder AddRepeatedForeignMessage(self::ForeignMessage.Builder builderForValue) {
+        if (result.repeatedForeignMessage_ == pbc::Lists<self::ForeignMessage>.Empty) {
+          result.repeatedForeignMessage_ = new scg::List<self::ForeignMessage>();
+        }
+        result.repeatedForeignMessage_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRepeatedForeignMessage(scg::IEnumerable<self::ForeignMessage> values) {
+        if (result.repeatedForeignMessage_ == pbc::Lists<self::ForeignMessage>.Empty) {
+          result.repeatedForeignMessage_ = new scg::List<self::ForeignMessage>();
+        }
+        base.AddRange(values, result.repeatedForeignMessage_);
+        return this;
+      }
+      public Builder ClearRepeatedForeignMessage() {
+        result.repeatedForeignMessage_ = pbc::Lists<self::ForeignMessage>.Empty;
+        return this;
+      }
+      
+      // repeated .protobuf_unittest_import.ImportMessage repeated_import_message = 50;
+      public scg::IList<self::ImportMessage> RepeatedImportMessageList {
+        get { return pbc::Lists.AsReadOnly(result.repeatedImportMessage_); }
+      }
+      public int RepeatedImportMessageCount {
+        get { return result.RepeatedImportMessageCount; }
+      }
+      public self::ImportMessage GetRepeatedImportMessage(int index) {
+        return result.GetRepeatedImportMessage(index);
+      }
+      public Builder SetRepeatedImportMessage(int index, self::ImportMessage value) {
+        result.repeatedImportMessage_[index] = value;
+        return this;
+      }
+      public Builder SetRepeatedImportMessage(int index, self::ImportMessage.Builder builderForValue) {
+        result.repeatedImportMessage_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRepeatedImportMessage(self::ImportMessage value) {
+        if (result.repeatedImportMessage_ == pbc::Lists<self::ImportMessage>.Empty) {
+          result.repeatedImportMessage_ = new scg::List<self::ImportMessage>();
+        }
+        result.repeatedImportMessage_.Add(value);
+        return this;
+      }
+      public Builder AddRepeatedImportMessage(self::ImportMessage.Builder builderForValue) {
+        if (result.repeatedImportMessage_ == pbc::Lists<self::ImportMessage>.Empty) {
+          result.repeatedImportMessage_ = new scg::List<self::ImportMessage>();
+        }
+        result.repeatedImportMessage_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRepeatedImportMessage(scg::IEnumerable<self::ImportMessage> values) {
+        if (result.repeatedImportMessage_ == pbc::Lists<self::ImportMessage>.Empty) {
+          result.repeatedImportMessage_ = new scg::List<self::ImportMessage>();
+        }
+        base.AddRange(values, result.repeatedImportMessage_);
+        return this;
+      }
+      public Builder ClearRepeatedImportMessage() {
+        result.repeatedImportMessage_ = pbc::Lists<self::ImportMessage>.Empty;
+        return this;
+      }
+      
+      // repeated .protobuf_unittest.TestAllTypes.NestedEnum repeated_nested_enum = 51;
+      public scg::IList<self::TestAllTypes.Types.NestedEnum> RepeatedNestedEnumList {
+        get { return pbc::Lists.AsReadOnly(result.repeatedNestedEnum_); }
+      }
+      public int RepeatedNestedEnumCount {
+        get { return result.RepeatedNestedEnumCount; } 
+      }
+      public self::TestAllTypes.Types.NestedEnum GetRepeatedNestedEnum(int index) {
+        return result.GetRepeatedNestedEnum(index);
+      }
+      public Builder SetRepeatedNestedEnum(int index, self::TestAllTypes.Types.NestedEnum value) {
+        result.repeatedNestedEnum_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedNestedEnum(self::TestAllTypes.Types.NestedEnum value) {
+        if (result.repeatedNestedEnum_.Count == 0) {
+          result.repeatedNestedEnum_ = new scg::List<self::TestAllTypes.Types.NestedEnum>();
+        }
+        result.repeatedNestedEnum_.Add(value);
+        return this;
+      }
+      public Builder AddAllRepeatedNestedEnum(scg::IEnumerable<self::TestAllTypes.Types.NestedEnum> values) {
+        if (result.repeatedNestedEnum_.Count == 0) {
+          result.repeatedNestedEnum_ = new scg::List<self::TestAllTypes.Types.NestedEnum>();
+        }
+        base.AddRange(values, result.repeatedNestedEnum_);
+        return this;
+      }
+      public Builder ClearRepeatedNestedEnum() {
+        result.repeatedNestedEnum_ = pbc::Lists<self::TestAllTypes.Types.NestedEnum>.Empty;
+        return this;
+      }
+      
+      // repeated .protobuf_unittest.ForeignEnum repeated_foreign_enum = 52;
+      public scg::IList<self::ForeignEnum> RepeatedForeignEnumList {
+        get { return pbc::Lists.AsReadOnly(result.repeatedForeignEnum_); }
+      }
+      public int RepeatedForeignEnumCount {
+        get { return result.RepeatedForeignEnumCount; } 
+      }
+      public self::ForeignEnum GetRepeatedForeignEnum(int index) {
+        return result.GetRepeatedForeignEnum(index);
+      }
+      public Builder SetRepeatedForeignEnum(int index, self::ForeignEnum value) {
+        result.repeatedForeignEnum_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedForeignEnum(self::ForeignEnum value) {
+        if (result.repeatedForeignEnum_.Count == 0) {
+          result.repeatedForeignEnum_ = new scg::List<self::ForeignEnum>();
+        }
+        result.repeatedForeignEnum_.Add(value);
+        return this;
+      }
+      public Builder AddAllRepeatedForeignEnum(scg::IEnumerable<self::ForeignEnum> values) {
+        if (result.repeatedForeignEnum_.Count == 0) {
+          result.repeatedForeignEnum_ = new scg::List<self::ForeignEnum>();
+        }
+        base.AddRange(values, result.repeatedForeignEnum_);
+        return this;
+      }
+      public Builder ClearRepeatedForeignEnum() {
+        result.repeatedForeignEnum_ = pbc::Lists<self::ForeignEnum>.Empty;
+        return this;
+      }
+      
+      // repeated .protobuf_unittest_import.ImportEnum repeated_import_enum = 53;
+      public scg::IList<self::ImportEnum> RepeatedImportEnumList {
+        get { return pbc::Lists.AsReadOnly(result.repeatedImportEnum_); }
+      }
+      public int RepeatedImportEnumCount {
+        get { return result.RepeatedImportEnumCount; } 
+      }
+      public self::ImportEnum GetRepeatedImportEnum(int index) {
+        return result.GetRepeatedImportEnum(index);
+      }
+      public Builder SetRepeatedImportEnum(int index, self::ImportEnum value) {
+        result.repeatedImportEnum_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedImportEnum(self::ImportEnum value) {
+        if (result.repeatedImportEnum_.Count == 0) {
+          result.repeatedImportEnum_ = new scg::List<self::ImportEnum>();
+        }
+        result.repeatedImportEnum_.Add(value);
+        return this;
+      }
+      public Builder AddAllRepeatedImportEnum(scg::IEnumerable<self::ImportEnum> values) {
+        if (result.repeatedImportEnum_.Count == 0) {
+          result.repeatedImportEnum_ = new scg::List<self::ImportEnum>();
+        }
+        base.AddRange(values, result.repeatedImportEnum_);
+        return this;
+      }
+      public Builder ClearRepeatedImportEnum() {
+        result.repeatedImportEnum_ = pbc::Lists<self::ImportEnum>.Empty;
+        return this;
+      }
+      
+      // repeated string repeated_string_piece = 54 [ctype = STRING_PIECE];
+      public scg::IList<string> RepeatedStringPieceList {
+        get { return pbc::Lists<string>.AsReadOnly(result.repeatedStringPiece_); }
+      }
+      public int RepeatedStringPieceCount {
+        get { return result.RepeatedStringPieceCount; }
+      }
+      public string GetRepeatedStringPiece(int index) {
+        return result.GetRepeatedStringPiece(index);
+      }
+      public Builder SetRepeatedStringPiece(int index, string value) {
+        result.repeatedStringPiece_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedStringPiece(string value) {
+        if (result.repeatedStringPiece_.Count == 0) {
+          result.repeatedStringPiece_ = new scg::List<string>();
+        }
+        result.repeatedStringPiece_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedStringPiece(scg::IEnumerable<string> values) {
+        if (result.repeatedStringPiece_.Count == 0) {
+          result.repeatedStringPiece_ = new scg::List<string>();
+        }
+        base.AddRange(values, result.repeatedStringPiece_);
+        return this;
+      }
+      public Builder ClearRepeatedStringPiece() {
+        result.repeatedStringPiece_ = pbc::Lists<string>.Empty;
+        return this;
+      }
+      
+      // repeated string repeated_cord = 55 [ctype = CORD];
+      public scg::IList<string> RepeatedCordList {
+        get { return pbc::Lists<string>.AsReadOnly(result.repeatedCord_); }
+      }
+      public int RepeatedCordCount {
+        get { return result.RepeatedCordCount; }
+      }
+      public string GetRepeatedCord(int index) {
+        return result.GetRepeatedCord(index);
+      }
+      public Builder SetRepeatedCord(int index, string value) {
+        result.repeatedCord_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedCord(string value) {
+        if (result.repeatedCord_.Count == 0) {
+          result.repeatedCord_ = new scg::List<string>();
+        }
+        result.repeatedCord_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedCord(scg::IEnumerable<string> values) {
+        if (result.repeatedCord_.Count == 0) {
+          result.repeatedCord_ = new scg::List<string>();
+        }
+        base.AddRange(values, result.repeatedCord_);
+        return this;
+      }
+      public Builder ClearRepeatedCord() {
+        result.repeatedCord_ = pbc::Lists<string>.Empty;
+        return this;
+      }
+      
+      // optional int32 default_int32 = 61 [default = 41];
+      public bool HasDefaultInt32 {
+        get { return result.HasDefaultInt32; }
+      }
+      public int DefaultInt32 {
+        get { return result.DefaultInt32; }
+        set { SetDefaultInt32(value); }
+      }
+      public Builder SetDefaultInt32(int value) {
+        result.hasDefaultInt32 = true;
+        result.defaultInt32_ = value;
+        return this;
+      }
+      public Builder ClearDefaultInt32() {
+        result.hasDefaultInt32 = false;
+        result.defaultInt32_ = 41;
+        return this;
+      }
+      
+      // optional int64 default_int64 = 62 [default = 42];
+      public bool HasDefaultInt64 {
+        get { return result.HasDefaultInt64; }
+      }
+      public long DefaultInt64 {
+        get { return result.DefaultInt64; }
+        set { SetDefaultInt64(value); }
+      }
+      public Builder SetDefaultInt64(long value) {
+        result.hasDefaultInt64 = true;
+        result.defaultInt64_ = value;
+        return this;
+      }
+      public Builder ClearDefaultInt64() {
+        result.hasDefaultInt64 = false;
+        result.defaultInt64_ = 42L;
+        return this;
+      }
+      
+      // optional uint32 default_uint32 = 63 [default = 43];
+      public bool HasDefaultUint32 {
+        get { return result.HasDefaultUint32; }
+      }
+      public uint DefaultUint32 {
+        get { return result.DefaultUint32; }
+        set { SetDefaultUint32(value); }
+      }
+      public Builder SetDefaultUint32(uint value) {
+        result.hasDefaultUint32 = true;
+        result.defaultUint32_ = value;
+        return this;
+      }
+      public Builder ClearDefaultUint32() {
+        result.hasDefaultUint32 = false;
+        result.defaultUint32_ = 43;
+        return this;
+      }
+      
+      // optional uint64 default_uint64 = 64 [default = 44];
+      public bool HasDefaultUint64 {
+        get { return result.HasDefaultUint64; }
+      }
+      public ulong DefaultUint64 {
+        get { return result.DefaultUint64; }
+        set { SetDefaultUint64(value); }
+      }
+      public Builder SetDefaultUint64(ulong value) {
+        result.hasDefaultUint64 = true;
+        result.defaultUint64_ = value;
+        return this;
+      }
+      public Builder ClearDefaultUint64() {
+        result.hasDefaultUint64 = false;
+        result.defaultUint64_ = 44UL;
+        return this;
+      }
+      
+      // optional sint32 default_sint32 = 65 [default = -45];
+      public bool HasDefaultSint32 {
+        get { return result.HasDefaultSint32; }
+      }
+      public int DefaultSint32 {
+        get { return result.DefaultSint32; }
+        set { SetDefaultSint32(value); }
+      }
+      public Builder SetDefaultSint32(int value) {
+        result.hasDefaultSint32 = true;
+        result.defaultSint32_ = value;
+        return this;
+      }
+      public Builder ClearDefaultSint32() {
+        result.hasDefaultSint32 = false;
+        result.defaultSint32_ = -45;
+        return this;
+      }
+      
+      // optional sint64 default_sint64 = 66 [default = 46];
+      public bool HasDefaultSint64 {
+        get { return result.HasDefaultSint64; }
+      }
+      public long DefaultSint64 {
+        get { return result.DefaultSint64; }
+        set { SetDefaultSint64(value); }
+      }
+      public Builder SetDefaultSint64(long value) {
+        result.hasDefaultSint64 = true;
+        result.defaultSint64_ = value;
+        return this;
+      }
+      public Builder ClearDefaultSint64() {
+        result.hasDefaultSint64 = false;
+        result.defaultSint64_ = 46L;
+        return this;
+      }
+      
+      // optional fixed32 default_fixed32 = 67 [default = 47];
+      public bool HasDefaultFixed32 {
+        get { return result.HasDefaultFixed32; }
+      }
+      public uint DefaultFixed32 {
+        get { return result.DefaultFixed32; }
+        set { SetDefaultFixed32(value); }
+      }
+      public Builder SetDefaultFixed32(uint value) {
+        result.hasDefaultFixed32 = true;
+        result.defaultFixed32_ = value;
+        return this;
+      }
+      public Builder ClearDefaultFixed32() {
+        result.hasDefaultFixed32 = false;
+        result.defaultFixed32_ = 47;
+        return this;
+      }
+      
+      // optional fixed64 default_fixed64 = 68 [default = 48];
+      public bool HasDefaultFixed64 {
+        get { return result.HasDefaultFixed64; }
+      }
+      public ulong DefaultFixed64 {
+        get { return result.DefaultFixed64; }
+        set { SetDefaultFixed64(value); }
+      }
+      public Builder SetDefaultFixed64(ulong value) {
+        result.hasDefaultFixed64 = true;
+        result.defaultFixed64_ = value;
+        return this;
+      }
+      public Builder ClearDefaultFixed64() {
+        result.hasDefaultFixed64 = false;
+        result.defaultFixed64_ = 48UL;
+        return this;
+      }
+      
+      // optional sfixed32 default_sfixed32 = 69 [default = 49];
+      public bool HasDefaultSfixed32 {
+        get { return result.HasDefaultSfixed32; }
+      }
+      public int DefaultSfixed32 {
+        get { return result.DefaultSfixed32; }
+        set { SetDefaultSfixed32(value); }
+      }
+      public Builder SetDefaultSfixed32(int value) {
+        result.hasDefaultSfixed32 = true;
+        result.defaultSfixed32_ = value;
+        return this;
+      }
+      public Builder ClearDefaultSfixed32() {
+        result.hasDefaultSfixed32 = false;
+        result.defaultSfixed32_ = 49;
+        return this;
+      }
+      
+      // optional sfixed64 default_sfixed64 = 70 [default = -50];
+      public bool HasDefaultSfixed64 {
+        get { return result.HasDefaultSfixed64; }
+      }
+      public long DefaultSfixed64 {
+        get { return result.DefaultSfixed64; }
+        set { SetDefaultSfixed64(value); }
+      }
+      public Builder SetDefaultSfixed64(long value) {
+        result.hasDefaultSfixed64 = true;
+        result.defaultSfixed64_ = value;
+        return this;
+      }
+      public Builder ClearDefaultSfixed64() {
+        result.hasDefaultSfixed64 = false;
+        result.defaultSfixed64_ = -50L;
+        return this;
+      }
+      
+      // optional float default_float = 71 [default = 51.5];
+      public bool HasDefaultFloat {
+        get { return result.HasDefaultFloat; }
+      }
+      public float DefaultFloat {
+        get { return result.DefaultFloat; }
+        set { SetDefaultFloat(value); }
+      }
+      public Builder SetDefaultFloat(float value) {
+        result.hasDefaultFloat = true;
+        result.defaultFloat_ = value;
+        return this;
+      }
+      public Builder ClearDefaultFloat() {
+        result.hasDefaultFloat = false;
+        result.defaultFloat_ = 51.5F;
+        return this;
+      }
+      
+      // optional double default_double = 72 [default = 52000];
+      public bool HasDefaultDouble {
+        get { return result.HasDefaultDouble; }
+      }
+      public double DefaultDouble {
+        get { return result.DefaultDouble; }
+        set { SetDefaultDouble(value); }
+      }
+      public Builder SetDefaultDouble(double value) {
+        result.hasDefaultDouble = true;
+        result.defaultDouble_ = value;
+        return this;
+      }
+      public Builder ClearDefaultDouble() {
+        result.hasDefaultDouble = false;
+        result.defaultDouble_ = 52000D;
+        return this;
+      }
+      
+      // optional bool default_bool = 73 [default = true];
+      public bool HasDefaultBool {
+        get { return result.HasDefaultBool; }
+      }
+      public bool DefaultBool {
+        get { return result.DefaultBool; }
+        set { SetDefaultBool(value); }
+      }
+      public Builder SetDefaultBool(bool value) {
+        result.hasDefaultBool = true;
+        result.defaultBool_ = value;
+        return this;
+      }
+      public Builder ClearDefaultBool() {
+        result.hasDefaultBool = false;
+        result.defaultBool_ = true;
+        return this;
+      }
+      
+      // optional string default_string = 74 [default = "hello"];
+      public bool HasDefaultString {
+        get { return result.HasDefaultString; }
+      }
+      public string DefaultString {
+        get { return result.DefaultString; }
+        set { SetDefaultString(value); }
+      }
+      public Builder SetDefaultString(string value) {
+        result.hasDefaultString = true;
+        result.defaultString_ = value;
+        return this;
+      }
+      public Builder ClearDefaultString() {
+        result.hasDefaultString = false;
+        result.defaultString_ = "hello";
+        return this;
+      }
+      
+      // optional bytes default_bytes = 75 [default = "world"];
+      public bool HasDefaultBytes {
+        get { return result.HasDefaultBytes; }
+      }
+      public pb::ByteString DefaultBytes {
+        get { return result.DefaultBytes; }
+        set { SetDefaultBytes(value); }
+      }
+      public Builder SetDefaultBytes(pb::ByteString value) {
+        result.hasDefaultBytes = true;
+        result.defaultBytes_ = value;
+        return this;
+      }
+      public Builder ClearDefaultBytes() {
+        result.hasDefaultBytes = false;
+        result.defaultBytes_ = ((pb::ByteString) self::TestAllTypes.Descriptor.Fields[62].DefaultValue);
+        return this;
+      }
+      
+      // optional .protobuf_unittest.TestAllTypes.NestedEnum default_nested_enum = 81 [default = BAR];
+      public bool HasDefaultNestedEnum {
+        get { return result.HasDefaultNestedEnum; }
+      }
+      public self::TestAllTypes.Types.NestedEnum DefaultNestedEnum {
+        get { return result.DefaultNestedEnum; }
+        set { SetDefaultNestedEnum(value); }
+      }
+      public Builder SetDefaultNestedEnum(self::TestAllTypes.Types.NestedEnum value) {
+        result.hasDefaultNestedEnum = true;
+        result.defaultNestedEnum_ = value;
+        return this;
+      }
+      public Builder ClearDefaultNestedEnum() {
+        result.hasDefaultNestedEnum = false;
+        result.defaultNestedEnum_ = self::TestAllTypes.Types.NestedEnum.BAR;
+        return this;
+      }
+      
+      // optional .protobuf_unittest.ForeignEnum default_foreign_enum = 82 [default = FOREIGN_BAR];
+      public bool HasDefaultForeignEnum {
+        get { return result.HasDefaultForeignEnum; }
+      }
+      public self::ForeignEnum DefaultForeignEnum {
+        get { return result.DefaultForeignEnum; }
+        set { SetDefaultForeignEnum(value); }
+      }
+      public Builder SetDefaultForeignEnum(self::ForeignEnum value) {
+        result.hasDefaultForeignEnum = true;
+        result.defaultForeignEnum_ = value;
+        return this;
+      }
+      public Builder ClearDefaultForeignEnum() {
+        result.hasDefaultForeignEnum = false;
+        result.defaultForeignEnum_ = self::ForeignEnum.FOREIGN_BAR;
+        return this;
+      }
+      
+      // optional .protobuf_unittest_import.ImportEnum default_import_enum = 83 [default = IMPORT_BAR];
+      public bool HasDefaultImportEnum {
+        get { return result.HasDefaultImportEnum; }
+      }
+      public self::ImportEnum DefaultImportEnum {
+        get { return result.DefaultImportEnum; }
+        set { SetDefaultImportEnum(value); }
+      }
+      public Builder SetDefaultImportEnum(self::ImportEnum value) {
+        result.hasDefaultImportEnum = true;
+        result.defaultImportEnum_ = value;
+        return this;
+      }
+      public Builder ClearDefaultImportEnum() {
+        result.hasDefaultImportEnum = false;
+        result.defaultImportEnum_ = self::ImportEnum.IMPORT_BAR;
+        return this;
+      }
+      
+      // optional string default_string_piece = 84 [default = "abc", ctype = STRING_PIECE];
+      public bool HasDefaultStringPiece {
+        get { return result.HasDefaultStringPiece; }
+      }
+      public string DefaultStringPiece {
+        get { return result.DefaultStringPiece; }
+        set { SetDefaultStringPiece(value); }
+      }
+      public Builder SetDefaultStringPiece(string value) {
+        result.hasDefaultStringPiece = true;
+        result.defaultStringPiece_ = value;
+        return this;
+      }
+      public Builder ClearDefaultStringPiece() {
+        result.hasDefaultStringPiece = false;
+        result.defaultStringPiece_ = "abc";
+        return this;
+      }
+      
+      // optional string default_cord = 85 [default = "123", ctype = CORD];
+      public bool HasDefaultCord {
+        get { return result.HasDefaultCord; }
+      }
+      public string DefaultCord {
+        get { return result.DefaultCord; }
+        set { SetDefaultCord(value); }
+      }
+      public Builder SetDefaultCord(string value) {
+        result.hasDefaultCord = true;
+        result.defaultCord_ = value;
+        return this;
+      }
+      public Builder ClearDefaultCord() {
+        result.hasDefaultCord = false;
+        result.defaultCord_ = "123";
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class ForeignMessage : pb::GeneratedMessage<ForeignMessage, ForeignMessage.Builder> {
+    // Use ForeignMessage.CreateBuilder() to construct.
+    private ForeignMessage() {}
+    
+    private static readonly ForeignMessage defaultInstance = new ForeignMessage();
+    public static ForeignMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override ForeignMessage DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_ForeignMessage__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_ForeignMessage__FieldAccessorTable; }
+    }
+    
+    // optional int32 c = 1;
+    private bool hasC;
+    private int c_ = 0;
+    public bool HasC {
+      get { return hasC; }
+    }
+    public int C {
+      get { return c_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasC) {
+        output.WriteInt32(1, C);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasC) {
+          size += pb::CodedOutputStream.ComputeInt32Size(1, C);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::ForeignMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::ForeignMessage ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::ForeignMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::ForeignMessage parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::ForeignMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::ForeignMessage ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::ForeignMessage ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::ForeignMessage ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::ForeignMessage> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::ForeignMessage prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::ForeignMessage, Builder> {
+      // Construct using self::ForeignMessage.CreateBuilder()
+      internal Builder() {}
+      
+      self::ForeignMessage result = new self::ForeignMessage();
+      
+      protected override self::ForeignMessage MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::ForeignMessage> Clear() {
+        result = new self::ForeignMessage();
+        return this;
+      }
+      
+      public override IBuilder<self::ForeignMessage> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::ForeignMessage.Descriptor; }
+      }
+      
+      public override self::ForeignMessage DefaultInstanceForType {
+        get { return self::ForeignMessage.DefaultInstance; }
+      }
+      
+      public override self::ForeignMessage BuildPartial() {
+        self::ForeignMessage returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::ForeignMessage) {
+          return MergeFrom((self::ForeignMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::ForeignMessage> MergeFrom(self::ForeignMessage other) {
+        if (other == self::ForeignMessage.DefaultInstance) return this;
+        if (other.HasC) {
+          C = other.C;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::ForeignMessage> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::ForeignMessage> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 8: {
+              C = input.ReadInt32();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional int32 c = 1;
+      public bool HasC {
+        get { return result.HasC; }
+      }
+      public int C {
+        get { return result.C; }
+        set { SetC(value); }
+      }
+      public Builder SetC(int value) {
+        result.hasC = true;
+        result.c_ = value;
+        return this;
+      }
+      public Builder ClearC() {
+        result.hasC = false;
+        result.c_ = 0;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class TestAllExtensions : pb::ExtendableMessage<TestAllExtensions, TestAllExtensions.Builder> {
+    // Use TestAllExtensions.CreateBuilder() to construct.
+    private TestAllExtensions() {}
+    
+    private static readonly TestAllExtensions defaultInstance = new TestAllExtensions();
+    public static TestAllExtensions DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestAllExtensions DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestAllExtensions__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestAllExtensions__FieldAccessorTable; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (!ExtensionsAreInitialized) return false;
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      pb::ExtendableMessage<TestAllExtensions, TestAllExtensions.Builder>.ExtensionWriter extensionWriter = CreateExtensionWriter(this);
+      extensionWriter.WriteUntil(536870912, output);
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        size += ExtensionsSerializedSize;
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestAllExtensions ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestAllExtensions ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestAllExtensions ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestAllExtensions parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestAllExtensions ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestAllExtensions ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestAllExtensions ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestAllExtensions ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestAllExtensions> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestAllExtensions prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestAllExtensions, self::TestAllExtensions.Builder>.ExtendableBuilder {
+      // Construct using self::TestAllExtensions.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestAllExtensions result = new self::TestAllExtensions();
+      
+      protected override self::TestAllExtensions MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestAllExtensions> Clear() {
+        result = new self::TestAllExtensions();
+        return this;
+      }
+      
+      public override IBuilder<self::TestAllExtensions> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestAllExtensions.Descriptor; }
+      }
+      
+      public override self::TestAllExtensions DefaultInstanceForType {
+        get { return self::TestAllExtensions.DefaultInstance; }
+      }
+      
+      public override self::TestAllExtensions BuildPartial() {
+        self::TestAllExtensions returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestAllExtensions) {
+          return MergeFrom((self::TestAllExtensions) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestAllExtensions> MergeFrom(self::TestAllExtensions other) {
+        if (other == self::TestAllExtensions.DefaultInstance) return this;
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestAllExtensions> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestAllExtensions> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+          }
+        }
+      }
+      
+    }
+  }
+  
+  public sealed partial class OptionalGroup_extension : pb::GeneratedMessage<OptionalGroup_extension, OptionalGroup_extension.Builder> {
+    // Use OptionalGroup_extension.CreateBuilder() to construct.
+    private OptionalGroup_extension() {}
+    
+    private static readonly OptionalGroup_extension defaultInstance = new OptionalGroup_extension();
+    public static OptionalGroup_extension DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override OptionalGroup_extension DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_OptionalGroup_extension__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_OptionalGroup_extension__FieldAccessorTable; }
+    }
+    
+    // optional int32 a = 17;
+    private bool hasA;
+    private int a_ = 0;
+    public bool HasA {
+      get { return hasA; }
+    }
+    public int A {
+      get { return a_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasA) {
+        output.WriteInt32(17, A);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasA) {
+          size += pb::CodedOutputStream.ComputeInt32Size(17, A);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::OptionalGroup_extension ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::OptionalGroup_extension ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::OptionalGroup_extension ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::OptionalGroup_extension parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::OptionalGroup_extension ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::OptionalGroup_extension ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::OptionalGroup_extension ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::OptionalGroup_extension ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::OptionalGroup_extension> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::OptionalGroup_extension prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::OptionalGroup_extension, Builder> {
+      // Construct using self::OptionalGroup_extension.CreateBuilder()
+      internal Builder() {}
+      
+      self::OptionalGroup_extension result = new self::OptionalGroup_extension();
+      
+      protected override self::OptionalGroup_extension MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::OptionalGroup_extension> Clear() {
+        result = new self::OptionalGroup_extension();
+        return this;
+      }
+      
+      public override IBuilder<self::OptionalGroup_extension> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::OptionalGroup_extension.Descriptor; }
+      }
+      
+      public override self::OptionalGroup_extension DefaultInstanceForType {
+        get { return self::OptionalGroup_extension.DefaultInstance; }
+      }
+      
+      public override self::OptionalGroup_extension BuildPartial() {
+        self::OptionalGroup_extension returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::OptionalGroup_extension) {
+          return MergeFrom((self::OptionalGroup_extension) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::OptionalGroup_extension> MergeFrom(self::OptionalGroup_extension other) {
+        if (other == self::OptionalGroup_extension.DefaultInstance) return this;
+        if (other.HasA) {
+          A = other.A;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::OptionalGroup_extension> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::OptionalGroup_extension> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 136: {
+              A = input.ReadInt32();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional int32 a = 17;
+      public bool HasA {
+        get { return result.HasA; }
+      }
+      public int A {
+        get { return result.A; }
+        set { SetA(value); }
+      }
+      public Builder SetA(int value) {
+        result.hasA = true;
+        result.a_ = value;
+        return this;
+      }
+      public Builder ClearA() {
+        result.hasA = false;
+        result.a_ = 0;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class RepeatedGroup_extension : pb::GeneratedMessage<RepeatedGroup_extension, RepeatedGroup_extension.Builder> {
+    // Use RepeatedGroup_extension.CreateBuilder() to construct.
+    private RepeatedGroup_extension() {}
+    
+    private static readonly RepeatedGroup_extension defaultInstance = new RepeatedGroup_extension();
+    public static RepeatedGroup_extension DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override RepeatedGroup_extension DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_RepeatedGroup_extension__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_RepeatedGroup_extension__FieldAccessorTable; }
+    }
+    
+    // optional int32 a = 47;
+    private bool hasA;
+    private int a_ = 0;
+    public bool HasA {
+      get { return hasA; }
+    }
+    public int A {
+      get { return a_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasA) {
+        output.WriteInt32(47, A);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasA) {
+          size += pb::CodedOutputStream.ComputeInt32Size(47, A);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::RepeatedGroup_extension ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::RepeatedGroup_extension ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::RepeatedGroup_extension ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::RepeatedGroup_extension parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::RepeatedGroup_extension ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::RepeatedGroup_extension ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::RepeatedGroup_extension ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::RepeatedGroup_extension ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::RepeatedGroup_extension> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::RepeatedGroup_extension prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::RepeatedGroup_extension, Builder> {
+      // Construct using self::RepeatedGroup_extension.CreateBuilder()
+      internal Builder() {}
+      
+      self::RepeatedGroup_extension result = new self::RepeatedGroup_extension();
+      
+      protected override self::RepeatedGroup_extension MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::RepeatedGroup_extension> Clear() {
+        result = new self::RepeatedGroup_extension();
+        return this;
+      }
+      
+      public override IBuilder<self::RepeatedGroup_extension> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::RepeatedGroup_extension.Descriptor; }
+      }
+      
+      public override self::RepeatedGroup_extension DefaultInstanceForType {
+        get { return self::RepeatedGroup_extension.DefaultInstance; }
+      }
+      
+      public override self::RepeatedGroup_extension BuildPartial() {
+        self::RepeatedGroup_extension returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::RepeatedGroup_extension) {
+          return MergeFrom((self::RepeatedGroup_extension) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::RepeatedGroup_extension> MergeFrom(self::RepeatedGroup_extension other) {
+        if (other == self::RepeatedGroup_extension.DefaultInstance) return this;
+        if (other.HasA) {
+          A = other.A;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::RepeatedGroup_extension> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::RepeatedGroup_extension> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 376: {
+              A = input.ReadInt32();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional int32 a = 47;
+      public bool HasA {
+        get { return result.HasA; }
+      }
+      public int A {
+        get { return result.A; }
+        set { SetA(value); }
+      }
+      public Builder SetA(int value) {
+        result.hasA = true;
+        result.a_ = value;
+        return this;
+      }
+      public Builder ClearA() {
+        result.hasA = false;
+        result.a_ = 0;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class TestRequired : pb::GeneratedMessage<TestRequired, TestRequired.Builder> {
+    // Use TestRequired.CreateBuilder() to construct.
+    private TestRequired() {}
+    
+    private static readonly TestRequired defaultInstance = new TestRequired();
+    public static TestRequired DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestRequired DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestRequired__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestRequired__FieldAccessorTable; }
+    }
+    
+    #region Nested types
+    public static class Types {
+      public static readonly pb::GeneratedExtension<self::TestAllExtensions, self::TestRequired> Single =
+            pb::GeneratedExtension.CreateExtension<self::TestAllExtensions, self::TestRequired>(Descriptor.Extensions[0]);
+      public static readonly
+        pb::GeneratedExtension<self::TestAllExtensions, scg::IList<self::TestRequired>> name =
+            pb::GeneratedExtension.CreateRepeatedExtension<self::TestAllExtensions, self::TestRequired>(Descriptor.Extensions[1]);
+    }
+    #endregion
+    
+    // required int32 a = 1;
+    private bool hasA;
+    private int a_ = 0;
+    public bool HasA {
+      get { return hasA; }
+    }
+    public int A {
+      get { return a_; }
+    }
+    
+    // optional int32 dummy2 = 2;
+    private bool hasDummy2;
+    private int dummy2_ = 0;
+    public bool HasDummy2 {
+      get { return hasDummy2; }
+    }
+    public int Dummy2 {
+      get { return dummy2_; }
+    }
+    
+    // required int32 b = 3;
+    private bool hasB;
+    private int b_ = 0;
+    public bool HasB {
+      get { return hasB; }
+    }
+    public int B {
+      get { return b_; }
+    }
+    
+    // optional int32 dummy4 = 4;
+    private bool hasDummy4;
+    private int dummy4_ = 0;
+    public bool HasDummy4 {
+      get { return hasDummy4; }
+    }
+    public int Dummy4 {
+      get { return dummy4_; }
+    }
+    
+    // optional int32 dummy5 = 5;
+    private bool hasDummy5;
+    private int dummy5_ = 0;
+    public bool HasDummy5 {
+      get { return hasDummy5; }
+    }
+    public int Dummy5 {
+      get { return dummy5_; }
+    }
+    
+    // optional int32 dummy6 = 6;
+    private bool hasDummy6;
+    private int dummy6_ = 0;
+    public bool HasDummy6 {
+      get { return hasDummy6; }
+    }
+    public int Dummy6 {
+      get { return dummy6_; }
+    }
+    
+    // optional int32 dummy7 = 7;
+    private bool hasDummy7;
+    private int dummy7_ = 0;
+    public bool HasDummy7 {
+      get { return hasDummy7; }
+    }
+    public int Dummy7 {
+      get { return dummy7_; }
+    }
+    
+    // optional int32 dummy8 = 8;
+    private bool hasDummy8;
+    private int dummy8_ = 0;
+    public bool HasDummy8 {
+      get { return hasDummy8; }
+    }
+    public int Dummy8 {
+      get { return dummy8_; }
+    }
+    
+    // optional int32 dummy9 = 9;
+    private bool hasDummy9;
+    private int dummy9_ = 0;
+    public bool HasDummy9 {
+      get { return hasDummy9; }
+    }
+    public int Dummy9 {
+      get { return dummy9_; }
+    }
+    
+    // optional int32 dummy10 = 10;
+    private bool hasDummy10;
+    private int dummy10_ = 0;
+    public bool HasDummy10 {
+      get { return hasDummy10; }
+    }
+    public int Dummy10 {
+      get { return dummy10_; }
+    }
+    
+    // optional int32 dummy11 = 11;
+    private bool hasDummy11;
+    private int dummy11_ = 0;
+    public bool HasDummy11 {
+      get { return hasDummy11; }
+    }
+    public int Dummy11 {
+      get { return dummy11_; }
+    }
+    
+    // optional int32 dummy12 = 12;
+    private bool hasDummy12;
+    private int dummy12_ = 0;
+    public bool HasDummy12 {
+      get { return hasDummy12; }
+    }
+    public int Dummy12 {
+      get { return dummy12_; }
+    }
+    
+    // optional int32 dummy13 = 13;
+    private bool hasDummy13;
+    private int dummy13_ = 0;
+    public bool HasDummy13 {
+      get { return hasDummy13; }
+    }
+    public int Dummy13 {
+      get { return dummy13_; }
+    }
+    
+    // optional int32 dummy14 = 14;
+    private bool hasDummy14;
+    private int dummy14_ = 0;
+    public bool HasDummy14 {
+      get { return hasDummy14; }
+    }
+    public int Dummy14 {
+      get { return dummy14_; }
+    }
+    
+    // optional int32 dummy15 = 15;
+    private bool hasDummy15;
+    private int dummy15_ = 0;
+    public bool HasDummy15 {
+      get { return hasDummy15; }
+    }
+    public int Dummy15 {
+      get { return dummy15_; }
+    }
+    
+    // optional int32 dummy16 = 16;
+    private bool hasDummy16;
+    private int dummy16_ = 0;
+    public bool HasDummy16 {
+      get { return hasDummy16; }
+    }
+    public int Dummy16 {
+      get { return dummy16_; }
+    }
+    
+    // optional int32 dummy17 = 17;
+    private bool hasDummy17;
+    private int dummy17_ = 0;
+    public bool HasDummy17 {
+      get { return hasDummy17; }
+    }
+    public int Dummy17 {
+      get { return dummy17_; }
+    }
+    
+    // optional int32 dummy18 = 18;
+    private bool hasDummy18;
+    private int dummy18_ = 0;
+    public bool HasDummy18 {
+      get { return hasDummy18; }
+    }
+    public int Dummy18 {
+      get { return dummy18_; }
+    }
+    
+    // optional int32 dummy19 = 19;
+    private bool hasDummy19;
+    private int dummy19_ = 0;
+    public bool HasDummy19 {
+      get { return hasDummy19; }
+    }
+    public int Dummy19 {
+      get { return dummy19_; }
+    }
+    
+    // optional int32 dummy20 = 20;
+    private bool hasDummy20;
+    private int dummy20_ = 0;
+    public bool HasDummy20 {
+      get { return hasDummy20; }
+    }
+    public int Dummy20 {
+      get { return dummy20_; }
+    }
+    
+    // optional int32 dummy21 = 21;
+    private bool hasDummy21;
+    private int dummy21_ = 0;
+    public bool HasDummy21 {
+      get { return hasDummy21; }
+    }
+    public int Dummy21 {
+      get { return dummy21_; }
+    }
+    
+    // optional int32 dummy22 = 22;
+    private bool hasDummy22;
+    private int dummy22_ = 0;
+    public bool HasDummy22 {
+      get { return hasDummy22; }
+    }
+    public int Dummy22 {
+      get { return dummy22_; }
+    }
+    
+    // optional int32 dummy23 = 23;
+    private bool hasDummy23;
+    private int dummy23_ = 0;
+    public bool HasDummy23 {
+      get { return hasDummy23; }
+    }
+    public int Dummy23 {
+      get { return dummy23_; }
+    }
+    
+    // optional int32 dummy24 = 24;
+    private bool hasDummy24;
+    private int dummy24_ = 0;
+    public bool HasDummy24 {
+      get { return hasDummy24; }
+    }
+    public int Dummy24 {
+      get { return dummy24_; }
+    }
+    
+    // optional int32 dummy25 = 25;
+    private bool hasDummy25;
+    private int dummy25_ = 0;
+    public bool HasDummy25 {
+      get { return hasDummy25; }
+    }
+    public int Dummy25 {
+      get { return dummy25_; }
+    }
+    
+    // optional int32 dummy26 = 26;
+    private bool hasDummy26;
+    private int dummy26_ = 0;
+    public bool HasDummy26 {
+      get { return hasDummy26; }
+    }
+    public int Dummy26 {
+      get { return dummy26_; }
+    }
+    
+    // optional int32 dummy27 = 27;
+    private bool hasDummy27;
+    private int dummy27_ = 0;
+    public bool HasDummy27 {
+      get { return hasDummy27; }
+    }
+    public int Dummy27 {
+      get { return dummy27_; }
+    }
+    
+    // optional int32 dummy28 = 28;
+    private bool hasDummy28;
+    private int dummy28_ = 0;
+    public bool HasDummy28 {
+      get { return hasDummy28; }
+    }
+    public int Dummy28 {
+      get { return dummy28_; }
+    }
+    
+    // optional int32 dummy29 = 29;
+    private bool hasDummy29;
+    private int dummy29_ = 0;
+    public bool HasDummy29 {
+      get { return hasDummy29; }
+    }
+    public int Dummy29 {
+      get { return dummy29_; }
+    }
+    
+    // optional int32 dummy30 = 30;
+    private bool hasDummy30;
+    private int dummy30_ = 0;
+    public bool HasDummy30 {
+      get { return hasDummy30; }
+    }
+    public int Dummy30 {
+      get { return dummy30_; }
+    }
+    
+    // optional int32 dummy31 = 31;
+    private bool hasDummy31;
+    private int dummy31_ = 0;
+    public bool HasDummy31 {
+      get { return hasDummy31; }
+    }
+    public int Dummy31 {
+      get { return dummy31_; }
+    }
+    
+    // optional int32 dummy32 = 32;
+    private bool hasDummy32;
+    private int dummy32_ = 0;
+    public bool HasDummy32 {
+      get { return hasDummy32; }
+    }
+    public int Dummy32 {
+      get { return dummy32_; }
+    }
+    
+    // required int32 c = 33;
+    private bool hasC;
+    private int c_ = 0;
+    public bool HasC {
+      get { return hasC; }
+    }
+    public int C {
+      get { return c_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (!hasA) return false;
+        if (!hasB) return false;
+        if (!hasC) return false;
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasA) {
+        output.WriteInt32(1, A);
+      }
+      if (HasDummy2) {
+        output.WriteInt32(2, Dummy2);
+      }
+      if (HasB) {
+        output.WriteInt32(3, B);
+      }
+      if (HasDummy4) {
+        output.WriteInt32(4, Dummy4);
+      }
+      if (HasDummy5) {
+        output.WriteInt32(5, Dummy5);
+      }
+      if (HasDummy6) {
+        output.WriteInt32(6, Dummy6);
+      }
+      if (HasDummy7) {
+        output.WriteInt32(7, Dummy7);
+      }
+      if (HasDummy8) {
+        output.WriteInt32(8, Dummy8);
+      }
+      if (HasDummy9) {
+        output.WriteInt32(9, Dummy9);
+      }
+      if (HasDummy10) {
+        output.WriteInt32(10, Dummy10);
+      }
+      if (HasDummy11) {
+        output.WriteInt32(11, Dummy11);
+      }
+      if (HasDummy12) {
+        output.WriteInt32(12, Dummy12);
+      }
+      if (HasDummy13) {
+        output.WriteInt32(13, Dummy13);
+      }
+      if (HasDummy14) {
+        output.WriteInt32(14, Dummy14);
+      }
+      if (HasDummy15) {
+        output.WriteInt32(15, Dummy15);
+      }
+      if (HasDummy16) {
+        output.WriteInt32(16, Dummy16);
+      }
+      if (HasDummy17) {
+        output.WriteInt32(17, Dummy17);
+      }
+      if (HasDummy18) {
+        output.WriteInt32(18, Dummy18);
+      }
+      if (HasDummy19) {
+        output.WriteInt32(19, Dummy19);
+      }
+      if (HasDummy20) {
+        output.WriteInt32(20, Dummy20);
+      }
+      if (HasDummy21) {
+        output.WriteInt32(21, Dummy21);
+      }
+      if (HasDummy22) {
+        output.WriteInt32(22, Dummy22);
+      }
+      if (HasDummy23) {
+        output.WriteInt32(23, Dummy23);
+      }
+      if (HasDummy24) {
+        output.WriteInt32(24, Dummy24);
+      }
+      if (HasDummy25) {
+        output.WriteInt32(25, Dummy25);
+      }
+      if (HasDummy26) {
+        output.WriteInt32(26, Dummy26);
+      }
+      if (HasDummy27) {
+        output.WriteInt32(27, Dummy27);
+      }
+      if (HasDummy28) {
+        output.WriteInt32(28, Dummy28);
+      }
+      if (HasDummy29) {
+        output.WriteInt32(29, Dummy29);
+      }
+      if (HasDummy30) {
+        output.WriteInt32(30, Dummy30);
+      }
+      if (HasDummy31) {
+        output.WriteInt32(31, Dummy31);
+      }
+      if (HasDummy32) {
+        output.WriteInt32(32, Dummy32);
+      }
+      if (HasC) {
+        output.WriteInt32(33, C);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasA) {
+          size += pb::CodedOutputStream.ComputeInt32Size(1, A);
+        }
+        if (HasDummy2) {
+          size += pb::CodedOutputStream.ComputeInt32Size(2, Dummy2);
+        }
+        if (HasB) {
+          size += pb::CodedOutputStream.ComputeInt32Size(3, B);
+        }
+        if (HasDummy4) {
+          size += pb::CodedOutputStream.ComputeInt32Size(4, Dummy4);
+        }
+        if (HasDummy5) {
+          size += pb::CodedOutputStream.ComputeInt32Size(5, Dummy5);
+        }
+        if (HasDummy6) {
+          size += pb::CodedOutputStream.ComputeInt32Size(6, Dummy6);
+        }
+        if (HasDummy7) {
+          size += pb::CodedOutputStream.ComputeInt32Size(7, Dummy7);
+        }
+        if (HasDummy8) {
+          size += pb::CodedOutputStream.ComputeInt32Size(8, Dummy8);
+        }
+        if (HasDummy9) {
+          size += pb::CodedOutputStream.ComputeInt32Size(9, Dummy9);
+        }
+        if (HasDummy10) {
+          size += pb::CodedOutputStream.ComputeInt32Size(10, Dummy10);
+        }
+        if (HasDummy11) {
+          size += pb::CodedOutputStream.ComputeInt32Size(11, Dummy11);
+        }
+        if (HasDummy12) {
+          size += pb::CodedOutputStream.ComputeInt32Size(12, Dummy12);
+        }
+        if (HasDummy13) {
+          size += pb::CodedOutputStream.ComputeInt32Size(13, Dummy13);
+        }
+        if (HasDummy14) {
+          size += pb::CodedOutputStream.ComputeInt32Size(14, Dummy14);
+        }
+        if (HasDummy15) {
+          size += pb::CodedOutputStream.ComputeInt32Size(15, Dummy15);
+        }
+        if (HasDummy16) {
+          size += pb::CodedOutputStream.ComputeInt32Size(16, Dummy16);
+        }
+        if (HasDummy17) {
+          size += pb::CodedOutputStream.ComputeInt32Size(17, Dummy17);
+        }
+        if (HasDummy18) {
+          size += pb::CodedOutputStream.ComputeInt32Size(18, Dummy18);
+        }
+        if (HasDummy19) {
+          size += pb::CodedOutputStream.ComputeInt32Size(19, Dummy19);
+        }
+        if (HasDummy20) {
+          size += pb::CodedOutputStream.ComputeInt32Size(20, Dummy20);
+        }
+        if (HasDummy21) {
+          size += pb::CodedOutputStream.ComputeInt32Size(21, Dummy21);
+        }
+        if (HasDummy22) {
+          size += pb::CodedOutputStream.ComputeInt32Size(22, Dummy22);
+        }
+        if (HasDummy23) {
+          size += pb::CodedOutputStream.ComputeInt32Size(23, Dummy23);
+        }
+        if (HasDummy24) {
+          size += pb::CodedOutputStream.ComputeInt32Size(24, Dummy24);
+        }
+        if (HasDummy25) {
+          size += pb::CodedOutputStream.ComputeInt32Size(25, Dummy25);
+        }
+        if (HasDummy26) {
+          size += pb::CodedOutputStream.ComputeInt32Size(26, Dummy26);
+        }
+        if (HasDummy27) {
+          size += pb::CodedOutputStream.ComputeInt32Size(27, Dummy27);
+        }
+        if (HasDummy28) {
+          size += pb::CodedOutputStream.ComputeInt32Size(28, Dummy28);
+        }
+        if (HasDummy29) {
+          size += pb::CodedOutputStream.ComputeInt32Size(29, Dummy29);
+        }
+        if (HasDummy30) {
+          size += pb::CodedOutputStream.ComputeInt32Size(30, Dummy30);
+        }
+        if (HasDummy31) {
+          size += pb::CodedOutputStream.ComputeInt32Size(31, Dummy31);
+        }
+        if (HasDummy32) {
+          size += pb::CodedOutputStream.ComputeInt32Size(32, Dummy32);
+        }
+        if (HasC) {
+          size += pb::CodedOutputStream.ComputeInt32Size(33, C);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestRequired ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestRequired ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestRequired ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestRequired parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestRequired ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestRequired ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestRequired ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestRequired ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestRequired> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestRequired prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestRequired, Builder> {
+      // Construct using self::TestRequired.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestRequired result = new self::TestRequired();
+      
+      protected override self::TestRequired MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestRequired> Clear() {
+        result = new self::TestRequired();
+        return this;
+      }
+      
+      public override IBuilder<self::TestRequired> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestRequired.Descriptor; }
+      }
+      
+      public override self::TestRequired DefaultInstanceForType {
+        get { return self::TestRequired.DefaultInstance; }
+      }
+      
+      public override self::TestRequired BuildPartial() {
+        self::TestRequired returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestRequired) {
+          return MergeFrom((self::TestRequired) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestRequired> MergeFrom(self::TestRequired other) {
+        if (other == self::TestRequired.DefaultInstance) return this;
+        if (other.HasA) {
+          A = other.A;
+        }
+        if (other.HasDummy2) {
+          Dummy2 = other.Dummy2;
+        }
+        if (other.HasB) {
+          B = other.B;
+        }
+        if (other.HasDummy4) {
+          Dummy4 = other.Dummy4;
+        }
+        if (other.HasDummy5) {
+          Dummy5 = other.Dummy5;
+        }
+        if (other.HasDummy6) {
+          Dummy6 = other.Dummy6;
+        }
+        if (other.HasDummy7) {
+          Dummy7 = other.Dummy7;
+        }
+        if (other.HasDummy8) {
+          Dummy8 = other.Dummy8;
+        }
+        if (other.HasDummy9) {
+          Dummy9 = other.Dummy9;
+        }
+        if (other.HasDummy10) {
+          Dummy10 = other.Dummy10;
+        }
+        if (other.HasDummy11) {
+          Dummy11 = other.Dummy11;
+        }
+        if (other.HasDummy12) {
+          Dummy12 = other.Dummy12;
+        }
+        if (other.HasDummy13) {
+          Dummy13 = other.Dummy13;
+        }
+        if (other.HasDummy14) {
+          Dummy14 = other.Dummy14;
+        }
+        if (other.HasDummy15) {
+          Dummy15 = other.Dummy15;
+        }
+        if (other.HasDummy16) {
+          Dummy16 = other.Dummy16;
+        }
+        if (other.HasDummy17) {
+          Dummy17 = other.Dummy17;
+        }
+        if (other.HasDummy18) {
+          Dummy18 = other.Dummy18;
+        }
+        if (other.HasDummy19) {
+          Dummy19 = other.Dummy19;
+        }
+        if (other.HasDummy20) {
+          Dummy20 = other.Dummy20;
+        }
+        if (other.HasDummy21) {
+          Dummy21 = other.Dummy21;
+        }
+        if (other.HasDummy22) {
+          Dummy22 = other.Dummy22;
+        }
+        if (other.HasDummy23) {
+          Dummy23 = other.Dummy23;
+        }
+        if (other.HasDummy24) {
+          Dummy24 = other.Dummy24;
+        }
+        if (other.HasDummy25) {
+          Dummy25 = other.Dummy25;
+        }
+        if (other.HasDummy26) {
+          Dummy26 = other.Dummy26;
+        }
+        if (other.HasDummy27) {
+          Dummy27 = other.Dummy27;
+        }
+        if (other.HasDummy28) {
+          Dummy28 = other.Dummy28;
+        }
+        if (other.HasDummy29) {
+          Dummy29 = other.Dummy29;
+        }
+        if (other.HasDummy30) {
+          Dummy30 = other.Dummy30;
+        }
+        if (other.HasDummy31) {
+          Dummy31 = other.Dummy31;
+        }
+        if (other.HasDummy32) {
+          Dummy32 = other.Dummy32;
+        }
+        if (other.HasC) {
+          C = other.C;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestRequired> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestRequired> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 8: {
+              A = input.ReadInt32();
+              break;
+            }
+            case 16: {
+              Dummy2 = input.ReadInt32();
+              break;
+            }
+            case 24: {
+              B = input.ReadInt32();
+              break;
+            }
+            case 32: {
+              Dummy4 = input.ReadInt32();
+              break;
+            }
+            case 40: {
+              Dummy5 = input.ReadInt32();
+              break;
+            }
+            case 48: {
+              Dummy6 = input.ReadInt32();
+              break;
+            }
+            case 56: {
+              Dummy7 = input.ReadInt32();
+              break;
+            }
+            case 64: {
+              Dummy8 = input.ReadInt32();
+              break;
+            }
+            case 72: {
+              Dummy9 = input.ReadInt32();
+              break;
+            }
+            case 80: {
+              Dummy10 = input.ReadInt32();
+              break;
+            }
+            case 88: {
+              Dummy11 = input.ReadInt32();
+              break;
+            }
+            case 96: {
+              Dummy12 = input.ReadInt32();
+              break;
+            }
+            case 104: {
+              Dummy13 = input.ReadInt32();
+              break;
+            }
+            case 112: {
+              Dummy14 = input.ReadInt32();
+              break;
+            }
+            case 120: {
+              Dummy15 = input.ReadInt32();
+              break;
+            }
+            case 128: {
+              Dummy16 = input.ReadInt32();
+              break;
+            }
+            case 136: {
+              Dummy17 = input.ReadInt32();
+              break;
+            }
+            case 144: {
+              Dummy18 = input.ReadInt32();
+              break;
+            }
+            case 152: {
+              Dummy19 = input.ReadInt32();
+              break;
+            }
+            case 160: {
+              Dummy20 = input.ReadInt32();
+              break;
+            }
+            case 168: {
+              Dummy21 = input.ReadInt32();
+              break;
+            }
+            case 176: {
+              Dummy22 = input.ReadInt32();
+              break;
+            }
+            case 184: {
+              Dummy23 = input.ReadInt32();
+              break;
+            }
+            case 192: {
+              Dummy24 = input.ReadInt32();
+              break;
+            }
+            case 200: {
+              Dummy25 = input.ReadInt32();
+              break;
+            }
+            case 208: {
+              Dummy26 = input.ReadInt32();
+              break;
+            }
+            case 216: {
+              Dummy27 = input.ReadInt32();
+              break;
+            }
+            case 224: {
+              Dummy28 = input.ReadInt32();
+              break;
+            }
+            case 232: {
+              Dummy29 = input.ReadInt32();
+              break;
+            }
+            case 240: {
+              Dummy30 = input.ReadInt32();
+              break;
+            }
+            case 248: {
+              Dummy31 = input.ReadInt32();
+              break;
+            }
+            case 256: {
+              Dummy32 = input.ReadInt32();
+              break;
+            }
+            case 264: {
+              C = input.ReadInt32();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // required int32 a = 1;
+      public bool HasA {
+        get { return result.HasA; }
+      }
+      public int A {
+        get { return result.A; }
+        set { SetA(value); }
+      }
+      public Builder SetA(int value) {
+        result.hasA = true;
+        result.a_ = value;
+        return this;
+      }
+      public Builder ClearA() {
+        result.hasA = false;
+        result.a_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy2 = 2;
+      public bool HasDummy2 {
+        get { return result.HasDummy2; }
+      }
+      public int Dummy2 {
+        get { return result.Dummy2; }
+        set { SetDummy2(value); }
+      }
+      public Builder SetDummy2(int value) {
+        result.hasDummy2 = true;
+        result.dummy2_ = value;
+        return this;
+      }
+      public Builder ClearDummy2() {
+        result.hasDummy2 = false;
+        result.dummy2_ = 0;
+        return this;
+      }
+      
+      // required int32 b = 3;
+      public bool HasB {
+        get { return result.HasB; }
+      }
+      public int B {
+        get { return result.B; }
+        set { SetB(value); }
+      }
+      public Builder SetB(int value) {
+        result.hasB = true;
+        result.b_ = value;
+        return this;
+      }
+      public Builder ClearB() {
+        result.hasB = false;
+        result.b_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy4 = 4;
+      public bool HasDummy4 {
+        get { return result.HasDummy4; }
+      }
+      public int Dummy4 {
+        get { return result.Dummy4; }
+        set { SetDummy4(value); }
+      }
+      public Builder SetDummy4(int value) {
+        result.hasDummy4 = true;
+        result.dummy4_ = value;
+        return this;
+      }
+      public Builder ClearDummy4() {
+        result.hasDummy4 = false;
+        result.dummy4_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy5 = 5;
+      public bool HasDummy5 {
+        get { return result.HasDummy5; }
+      }
+      public int Dummy5 {
+        get { return result.Dummy5; }
+        set { SetDummy5(value); }
+      }
+      public Builder SetDummy5(int value) {
+        result.hasDummy5 = true;
+        result.dummy5_ = value;
+        return this;
+      }
+      public Builder ClearDummy5() {
+        result.hasDummy5 = false;
+        result.dummy5_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy6 = 6;
+      public bool HasDummy6 {
+        get { return result.HasDummy6; }
+      }
+      public int Dummy6 {
+        get { return result.Dummy6; }
+        set { SetDummy6(value); }
+      }
+      public Builder SetDummy6(int value) {
+        result.hasDummy6 = true;
+        result.dummy6_ = value;
+        return this;
+      }
+      public Builder ClearDummy6() {
+        result.hasDummy6 = false;
+        result.dummy6_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy7 = 7;
+      public bool HasDummy7 {
+        get { return result.HasDummy7; }
+      }
+      public int Dummy7 {
+        get { return result.Dummy7; }
+        set { SetDummy7(value); }
+      }
+      public Builder SetDummy7(int value) {
+        result.hasDummy7 = true;
+        result.dummy7_ = value;
+        return this;
+      }
+      public Builder ClearDummy7() {
+        result.hasDummy7 = false;
+        result.dummy7_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy8 = 8;
+      public bool HasDummy8 {
+        get { return result.HasDummy8; }
+      }
+      public int Dummy8 {
+        get { return result.Dummy8; }
+        set { SetDummy8(value); }
+      }
+      public Builder SetDummy8(int value) {
+        result.hasDummy8 = true;
+        result.dummy8_ = value;
+        return this;
+      }
+      public Builder ClearDummy8() {
+        result.hasDummy8 = false;
+        result.dummy8_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy9 = 9;
+      public bool HasDummy9 {
+        get { return result.HasDummy9; }
+      }
+      public int Dummy9 {
+        get { return result.Dummy9; }
+        set { SetDummy9(value); }
+      }
+      public Builder SetDummy9(int value) {
+        result.hasDummy9 = true;
+        result.dummy9_ = value;
+        return this;
+      }
+      public Builder ClearDummy9() {
+        result.hasDummy9 = false;
+        result.dummy9_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy10 = 10;
+      public bool HasDummy10 {
+        get { return result.HasDummy10; }
+      }
+      public int Dummy10 {
+        get { return result.Dummy10; }
+        set { SetDummy10(value); }
+      }
+      public Builder SetDummy10(int value) {
+        result.hasDummy10 = true;
+        result.dummy10_ = value;
+        return this;
+      }
+      public Builder ClearDummy10() {
+        result.hasDummy10 = false;
+        result.dummy10_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy11 = 11;
+      public bool HasDummy11 {
+        get { return result.HasDummy11; }
+      }
+      public int Dummy11 {
+        get { return result.Dummy11; }
+        set { SetDummy11(value); }
+      }
+      public Builder SetDummy11(int value) {
+        result.hasDummy11 = true;
+        result.dummy11_ = value;
+        return this;
+      }
+      public Builder ClearDummy11() {
+        result.hasDummy11 = false;
+        result.dummy11_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy12 = 12;
+      public bool HasDummy12 {
+        get { return result.HasDummy12; }
+      }
+      public int Dummy12 {
+        get { return result.Dummy12; }
+        set { SetDummy12(value); }
+      }
+      public Builder SetDummy12(int value) {
+        result.hasDummy12 = true;
+        result.dummy12_ = value;
+        return this;
+      }
+      public Builder ClearDummy12() {
+        result.hasDummy12 = false;
+        result.dummy12_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy13 = 13;
+      public bool HasDummy13 {
+        get { return result.HasDummy13; }
+      }
+      public int Dummy13 {
+        get { return result.Dummy13; }
+        set { SetDummy13(value); }
+      }
+      public Builder SetDummy13(int value) {
+        result.hasDummy13 = true;
+        result.dummy13_ = value;
+        return this;
+      }
+      public Builder ClearDummy13() {
+        result.hasDummy13 = false;
+        result.dummy13_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy14 = 14;
+      public bool HasDummy14 {
+        get { return result.HasDummy14; }
+      }
+      public int Dummy14 {
+        get { return result.Dummy14; }
+        set { SetDummy14(value); }
+      }
+      public Builder SetDummy14(int value) {
+        result.hasDummy14 = true;
+        result.dummy14_ = value;
+        return this;
+      }
+      public Builder ClearDummy14() {
+        result.hasDummy14 = false;
+        result.dummy14_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy15 = 15;
+      public bool HasDummy15 {
+        get { return result.HasDummy15; }
+      }
+      public int Dummy15 {
+        get { return result.Dummy15; }
+        set { SetDummy15(value); }
+      }
+      public Builder SetDummy15(int value) {
+        result.hasDummy15 = true;
+        result.dummy15_ = value;
+        return this;
+      }
+      public Builder ClearDummy15() {
+        result.hasDummy15 = false;
+        result.dummy15_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy16 = 16;
+      public bool HasDummy16 {
+        get { return result.HasDummy16; }
+      }
+      public int Dummy16 {
+        get { return result.Dummy16; }
+        set { SetDummy16(value); }
+      }
+      public Builder SetDummy16(int value) {
+        result.hasDummy16 = true;
+        result.dummy16_ = value;
+        return this;
+      }
+      public Builder ClearDummy16() {
+        result.hasDummy16 = false;
+        result.dummy16_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy17 = 17;
+      public bool HasDummy17 {
+        get { return result.HasDummy17; }
+      }
+      public int Dummy17 {
+        get { return result.Dummy17; }
+        set { SetDummy17(value); }
+      }
+      public Builder SetDummy17(int value) {
+        result.hasDummy17 = true;
+        result.dummy17_ = value;
+        return this;
+      }
+      public Builder ClearDummy17() {
+        result.hasDummy17 = false;
+        result.dummy17_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy18 = 18;
+      public bool HasDummy18 {
+        get { return result.HasDummy18; }
+      }
+      public int Dummy18 {
+        get { return result.Dummy18; }
+        set { SetDummy18(value); }
+      }
+      public Builder SetDummy18(int value) {
+        result.hasDummy18 = true;
+        result.dummy18_ = value;
+        return this;
+      }
+      public Builder ClearDummy18() {
+        result.hasDummy18 = false;
+        result.dummy18_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy19 = 19;
+      public bool HasDummy19 {
+        get { return result.HasDummy19; }
+      }
+      public int Dummy19 {
+        get { return result.Dummy19; }
+        set { SetDummy19(value); }
+      }
+      public Builder SetDummy19(int value) {
+        result.hasDummy19 = true;
+        result.dummy19_ = value;
+        return this;
+      }
+      public Builder ClearDummy19() {
+        result.hasDummy19 = false;
+        result.dummy19_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy20 = 20;
+      public bool HasDummy20 {
+        get { return result.HasDummy20; }
+      }
+      public int Dummy20 {
+        get { return result.Dummy20; }
+        set { SetDummy20(value); }
+      }
+      public Builder SetDummy20(int value) {
+        result.hasDummy20 = true;
+        result.dummy20_ = value;
+        return this;
+      }
+      public Builder ClearDummy20() {
+        result.hasDummy20 = false;
+        result.dummy20_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy21 = 21;
+      public bool HasDummy21 {
+        get { return result.HasDummy21; }
+      }
+      public int Dummy21 {
+        get { return result.Dummy21; }
+        set { SetDummy21(value); }
+      }
+      public Builder SetDummy21(int value) {
+        result.hasDummy21 = true;
+        result.dummy21_ = value;
+        return this;
+      }
+      public Builder ClearDummy21() {
+        result.hasDummy21 = false;
+        result.dummy21_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy22 = 22;
+      public bool HasDummy22 {
+        get { return result.HasDummy22; }
+      }
+      public int Dummy22 {
+        get { return result.Dummy22; }
+        set { SetDummy22(value); }
+      }
+      public Builder SetDummy22(int value) {
+        result.hasDummy22 = true;
+        result.dummy22_ = value;
+        return this;
+      }
+      public Builder ClearDummy22() {
+        result.hasDummy22 = false;
+        result.dummy22_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy23 = 23;
+      public bool HasDummy23 {
+        get { return result.HasDummy23; }
+      }
+      public int Dummy23 {
+        get { return result.Dummy23; }
+        set { SetDummy23(value); }
+      }
+      public Builder SetDummy23(int value) {
+        result.hasDummy23 = true;
+        result.dummy23_ = value;
+        return this;
+      }
+      public Builder ClearDummy23() {
+        result.hasDummy23 = false;
+        result.dummy23_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy24 = 24;
+      public bool HasDummy24 {
+        get { return result.HasDummy24; }
+      }
+      public int Dummy24 {
+        get { return result.Dummy24; }
+        set { SetDummy24(value); }
+      }
+      public Builder SetDummy24(int value) {
+        result.hasDummy24 = true;
+        result.dummy24_ = value;
+        return this;
+      }
+      public Builder ClearDummy24() {
+        result.hasDummy24 = false;
+        result.dummy24_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy25 = 25;
+      public bool HasDummy25 {
+        get { return result.HasDummy25; }
+      }
+      public int Dummy25 {
+        get { return result.Dummy25; }
+        set { SetDummy25(value); }
+      }
+      public Builder SetDummy25(int value) {
+        result.hasDummy25 = true;
+        result.dummy25_ = value;
+        return this;
+      }
+      public Builder ClearDummy25() {
+        result.hasDummy25 = false;
+        result.dummy25_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy26 = 26;
+      public bool HasDummy26 {
+        get { return result.HasDummy26; }
+      }
+      public int Dummy26 {
+        get { return result.Dummy26; }
+        set { SetDummy26(value); }
+      }
+      public Builder SetDummy26(int value) {
+        result.hasDummy26 = true;
+        result.dummy26_ = value;
+        return this;
+      }
+      public Builder ClearDummy26() {
+        result.hasDummy26 = false;
+        result.dummy26_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy27 = 27;
+      public bool HasDummy27 {
+        get { return result.HasDummy27; }
+      }
+      public int Dummy27 {
+        get { return result.Dummy27; }
+        set { SetDummy27(value); }
+      }
+      public Builder SetDummy27(int value) {
+        result.hasDummy27 = true;
+        result.dummy27_ = value;
+        return this;
+      }
+      public Builder ClearDummy27() {
+        result.hasDummy27 = false;
+        result.dummy27_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy28 = 28;
+      public bool HasDummy28 {
+        get { return result.HasDummy28; }
+      }
+      public int Dummy28 {
+        get { return result.Dummy28; }
+        set { SetDummy28(value); }
+      }
+      public Builder SetDummy28(int value) {
+        result.hasDummy28 = true;
+        result.dummy28_ = value;
+        return this;
+      }
+      public Builder ClearDummy28() {
+        result.hasDummy28 = false;
+        result.dummy28_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy29 = 29;
+      public bool HasDummy29 {
+        get { return result.HasDummy29; }
+      }
+      public int Dummy29 {
+        get { return result.Dummy29; }
+        set { SetDummy29(value); }
+      }
+      public Builder SetDummy29(int value) {
+        result.hasDummy29 = true;
+        result.dummy29_ = value;
+        return this;
+      }
+      public Builder ClearDummy29() {
+        result.hasDummy29 = false;
+        result.dummy29_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy30 = 30;
+      public bool HasDummy30 {
+        get { return result.HasDummy30; }
+      }
+      public int Dummy30 {
+        get { return result.Dummy30; }
+        set { SetDummy30(value); }
+      }
+      public Builder SetDummy30(int value) {
+        result.hasDummy30 = true;
+        result.dummy30_ = value;
+        return this;
+      }
+      public Builder ClearDummy30() {
+        result.hasDummy30 = false;
+        result.dummy30_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy31 = 31;
+      public bool HasDummy31 {
+        get { return result.HasDummy31; }
+      }
+      public int Dummy31 {
+        get { return result.Dummy31; }
+        set { SetDummy31(value); }
+      }
+      public Builder SetDummy31(int value) {
+        result.hasDummy31 = true;
+        result.dummy31_ = value;
+        return this;
+      }
+      public Builder ClearDummy31() {
+        result.hasDummy31 = false;
+        result.dummy31_ = 0;
+        return this;
+      }
+      
+      // optional int32 dummy32 = 32;
+      public bool HasDummy32 {
+        get { return result.HasDummy32; }
+      }
+      public int Dummy32 {
+        get { return result.Dummy32; }
+        set { SetDummy32(value); }
+      }
+      public Builder SetDummy32(int value) {
+        result.hasDummy32 = true;
+        result.dummy32_ = value;
+        return this;
+      }
+      public Builder ClearDummy32() {
+        result.hasDummy32 = false;
+        result.dummy32_ = 0;
+        return this;
+      }
+      
+      // required int32 c = 33;
+      public bool HasC {
+        get { return result.HasC; }
+      }
+      public int C {
+        get { return result.C; }
+        set { SetC(value); }
+      }
+      public Builder SetC(int value) {
+        result.hasC = true;
+        result.c_ = value;
+        return this;
+      }
+      public Builder ClearC() {
+        result.hasC = false;
+        result.c_ = 0;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class TestRequiredForeign : pb::GeneratedMessage<TestRequiredForeign, TestRequiredForeign.Builder> {
+    // Use TestRequiredForeign.CreateBuilder() to construct.
+    private TestRequiredForeign() {}
+    
+    private static readonly TestRequiredForeign defaultInstance = new TestRequiredForeign();
+    public static TestRequiredForeign DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestRequiredForeign DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestRequiredForeign__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestRequiredForeign__FieldAccessorTable; }
+    }
+    
+    // optional .protobuf_unittest.TestRequired optional_message = 1;
+    private bool hasOptionalMessage;
+    private self::TestRequired optionalMessage_ = self::TestRequired.DefaultInstance;
+    public bool HasOptionalMessage {
+      get { return hasOptionalMessage; }
+    }
+    public self::TestRequired OptionalMessage {
+      get { return optionalMessage_; }
+    }
+    
+    // repeated .protobuf_unittest.TestRequired repeated_message = 2;
+    private scg::IList<self::TestRequired> repeatedMessage_ = pbc::Lists<self::TestRequired>.Empty;
+    public scg::IList<self::TestRequired> RepeatedMessageList {
+      get { return repeatedMessage_; } 
+    }
+    public int RepeatedMessageCount
+      { get { return repeatedMessage_.Count; }
+    }
+    public self::TestRequired GetRepeatedMessage(int index) {
+      return repeatedMessage_ [index];
+    }
+    
+    // optional int32 dummy = 3;
+    private bool hasDummy;
+    private int dummy_ = 0;
+    public bool HasDummy {
+      get { return hasDummy; }
+    }
+    public int Dummy {
+      get { return dummy_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (HasOptionalMessage) {
+          if (!OptionalMessage.IsInitialized) return false;
+        }
+        foreach (self::TestRequired element in RepeatedMessageList) {
+          if (!element.IsInitialized) return false;
+        }
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasOptionalMessage) {
+        output.WriteMessage(1, OptionalMessage);
+      }
+      foreach (self::TestRequired element in RepeatedMessageList) {
+        output.WriteMessage(2, element);
+      }
+      if (HasDummy) {
+        output.WriteInt32(3, Dummy);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasOptionalMessage) {
+          size += pb::CodedOutputStream.ComputeMessageSize(1, OptionalMessage);
+        }
+        foreach (self::TestRequired element in RepeatedMessageList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(2, element);
+        }
+        if (HasDummy) {
+          size += pb::CodedOutputStream.ComputeInt32Size(3, Dummy);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestRequiredForeign ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestRequiredForeign ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestRequiredForeign ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestRequiredForeign parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestRequiredForeign ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestRequiredForeign ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestRequiredForeign ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestRequiredForeign ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestRequiredForeign> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestRequiredForeign prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestRequiredForeign, Builder> {
+      // Construct using self::TestRequiredForeign.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestRequiredForeign result = new self::TestRequiredForeign();
+      
+      protected override self::TestRequiredForeign MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestRequiredForeign> Clear() {
+        result = new self::TestRequiredForeign();
+        return this;
+      }
+      
+      public override IBuilder<self::TestRequiredForeign> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestRequiredForeign.Descriptor; }
+      }
+      
+      public override self::TestRequiredForeign DefaultInstanceForType {
+        get { return self::TestRequiredForeign.DefaultInstance; }
+      }
+      
+      public override self::TestRequiredForeign BuildPartial() {
+        if (result.repeatedMessage_ != pbc::Lists<self::TestRequired>.Empty) {
+          result.repeatedMessage_ = pbc::Lists<self::TestRequired>.AsReadOnly(result.repeatedMessage_);
+        }
+        self::TestRequiredForeign returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestRequiredForeign) {
+          return MergeFrom((self::TestRequiredForeign) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestRequiredForeign> MergeFrom(self::TestRequiredForeign other) {
+        if (other == self::TestRequiredForeign.DefaultInstance) return this;
+        if (other.HasOptionalMessage) {
+          MergeOptionalMessage(other.OptionalMessage);
+        }
+        if (other.repeatedMessage_.Count != 0) {
+          if (result.repeatedMessage_.Count == 0) {
+            result.repeatedMessage_ = new scg::List<self::TestRequired>();
+          }
+          base.AddRange(other.repeatedMessage_, result.repeatedMessage_);
+        }
+        if (other.HasDummy) {
+          Dummy = other.Dummy;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestRequiredForeign> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestRequiredForeign> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 10: {
+              self::TestRequired.Builder subBuilder = self::TestRequired.CreateBuilder();
+              if (HasOptionalMessage) {
+                subBuilder.MergeFrom(OptionalMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              OptionalMessage = subBuilder.BuildPartial();
+              break;
+            }
+            case 18: {
+              self::TestRequired.Builder subBuilder = self::TestRequired.CreateBuilder();
+              input.ReadMessage(subBuilder, extensionRegistry);
+              AddRepeatedMessage(subBuilder.BuildPartial());
+              break;
+            }
+            case 24: {
+              Dummy = input.ReadInt32();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional .protobuf_unittest.TestRequired optional_message = 1;
+      public bool HasOptionalMessage {
+        get { return result.HasOptionalMessage; }
+      }
+      public self::TestRequired OptionalMessage {
+        get { return result.OptionalMessage; }
+        set { SetOptionalMessage(value); }
+      }
+      public Builder SetOptionalMessage(self::TestRequired value) {
+        result.hasOptionalMessage = true;
+        result.optionalMessage_ = value;
+        return this;
+      }
+      public Builder SetOptionalMessage(self::TestRequired.Builder builderForValue) {
+        result.hasOptionalMessage = true;
+        result.optionalMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalMessage(self::TestRequired value) {
+        if (result.HasOptionalMessage &&
+            result.optionalMessage_ != self::TestRequired.DefaultInstance) {
+          result.optionalMessage_ =
+            self::TestRequired.CreateBuilder(result.optionalMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalMessage_ = value;
+        }
+        result.hasOptionalMessage = true;
+        return this;
+      }
+      public Builder ClearOptionalMessage() {
+        result.hasOptionalMessage = false;
+        result.optionalMessage_ = self::TestRequired.DefaultInstance;
+        return this;
+      }
+      
+      // repeated .protobuf_unittest.TestRequired repeated_message = 2;
+      public scg::IList<self::TestRequired> RepeatedMessageList {
+        get { return pbc::Lists.AsReadOnly(result.repeatedMessage_); }
+      }
+      public int RepeatedMessageCount {
+        get { return result.RepeatedMessageCount; }
+      }
+      public self::TestRequired GetRepeatedMessage(int index) {
+        return result.GetRepeatedMessage(index);
+      }
+      public Builder SetRepeatedMessage(int index, self::TestRequired value) {
+        result.repeatedMessage_[index] = value;
+        return this;
+      }
+      public Builder SetRepeatedMessage(int index, self::TestRequired.Builder builderForValue) {
+        result.repeatedMessage_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRepeatedMessage(self::TestRequired value) {
+        if (result.repeatedMessage_ == pbc::Lists<self::TestRequired>.Empty) {
+          result.repeatedMessage_ = new scg::List<self::TestRequired>();
+        }
+        result.repeatedMessage_.Add(value);
+        return this;
+      }
+      public Builder AddRepeatedMessage(self::TestRequired.Builder builderForValue) {
+        if (result.repeatedMessage_ == pbc::Lists<self::TestRequired>.Empty) {
+          result.repeatedMessage_ = new scg::List<self::TestRequired>();
+        }
+        result.repeatedMessage_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRepeatedMessage(scg::IEnumerable<self::TestRequired> values) {
+        if (result.repeatedMessage_ == pbc::Lists<self::TestRequired>.Empty) {
+          result.repeatedMessage_ = new scg::List<self::TestRequired>();
+        }
+        base.AddRange(values, result.repeatedMessage_);
+        return this;
+      }
+      public Builder ClearRepeatedMessage() {
+        result.repeatedMessage_ = pbc::Lists<self::TestRequired>.Empty;
+        return this;
+      }
+      
+      // optional int32 dummy = 3;
+      public bool HasDummy {
+        get { return result.HasDummy; }
+      }
+      public int Dummy {
+        get { return result.Dummy; }
+        set { SetDummy(value); }
+      }
+      public Builder SetDummy(int value) {
+        result.hasDummy = true;
+        result.dummy_ = value;
+        return this;
+      }
+      public Builder ClearDummy() {
+        result.hasDummy = false;
+        result.dummy_ = 0;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class TestForeignNested : pb::GeneratedMessage<TestForeignNested, TestForeignNested.Builder> {
+    // Use TestForeignNested.CreateBuilder() to construct.
+    private TestForeignNested() {}
+    
+    private static readonly TestForeignNested defaultInstance = new TestForeignNested();
+    public static TestForeignNested DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestForeignNested DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestForeignNested__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestForeignNested__FieldAccessorTable; }
+    }
+    
+    // optional .protobuf_unittest.TestAllTypes.NestedMessage foreign_nested = 1;
+    private bool hasForeignNested;
+    private self::TestAllTypes.Types.NestedMessage foreignNested_ = self::TestAllTypes.Types.NestedMessage.DefaultInstance;
+    public bool HasForeignNested {
+      get { return hasForeignNested; }
+    }
+    public self::TestAllTypes.Types.NestedMessage ForeignNested {
+      get { return foreignNested_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasForeignNested) {
+        output.WriteMessage(1, ForeignNested);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasForeignNested) {
+          size += pb::CodedOutputStream.ComputeMessageSize(1, ForeignNested);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestForeignNested ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestForeignNested ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestForeignNested ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestForeignNested parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestForeignNested ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestForeignNested ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestForeignNested ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestForeignNested ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestForeignNested> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestForeignNested prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestForeignNested, Builder> {
+      // Construct using self::TestForeignNested.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestForeignNested result = new self::TestForeignNested();
+      
+      protected override self::TestForeignNested MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestForeignNested> Clear() {
+        result = new self::TestForeignNested();
+        return this;
+      }
+      
+      public override IBuilder<self::TestForeignNested> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestForeignNested.Descriptor; }
+      }
+      
+      public override self::TestForeignNested DefaultInstanceForType {
+        get { return self::TestForeignNested.DefaultInstance; }
+      }
+      
+      public override self::TestForeignNested BuildPartial() {
+        self::TestForeignNested returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestForeignNested) {
+          return MergeFrom((self::TestForeignNested) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestForeignNested> MergeFrom(self::TestForeignNested other) {
+        if (other == self::TestForeignNested.DefaultInstance) return this;
+        if (other.HasForeignNested) {
+          MergeForeignNested(other.ForeignNested);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestForeignNested> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestForeignNested> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 10: {
+              self::TestAllTypes.Types.NestedMessage.Builder subBuilder = self::TestAllTypes.Types.NestedMessage.CreateBuilder();
+              if (HasForeignNested) {
+                subBuilder.MergeFrom(ForeignNested);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              ForeignNested = subBuilder.BuildPartial();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional .protobuf_unittest.TestAllTypes.NestedMessage foreign_nested = 1;
+      public bool HasForeignNested {
+        get { return result.HasForeignNested; }
+      }
+      public self::TestAllTypes.Types.NestedMessage ForeignNested {
+        get { return result.ForeignNested; }
+        set { SetForeignNested(value); }
+      }
+      public Builder SetForeignNested(self::TestAllTypes.Types.NestedMessage value) {
+        result.hasForeignNested = true;
+        result.foreignNested_ = value;
+        return this;
+      }
+      public Builder SetForeignNested(self::TestAllTypes.Types.NestedMessage.Builder builderForValue) {
+        result.hasForeignNested = true;
+        result.foreignNested_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeForeignNested(self::TestAllTypes.Types.NestedMessage value) {
+        if (result.HasForeignNested &&
+            result.foreignNested_ != self::TestAllTypes.Types.NestedMessage.DefaultInstance) {
+          result.foreignNested_ =
+            self::TestAllTypes.Types.NestedMessage.CreateBuilder(result.foreignNested_).MergeFrom(value).BuildPartial();
+        } else {
+          result.foreignNested_ = value;
+        }
+        result.hasForeignNested = true;
+        return this;
+      }
+      public Builder ClearForeignNested() {
+        result.hasForeignNested = false;
+        result.foreignNested_ = self::TestAllTypes.Types.NestedMessage.DefaultInstance;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class TestEmptyMessage : pb::GeneratedMessage<TestEmptyMessage, TestEmptyMessage.Builder> {
+    // Use TestEmptyMessage.CreateBuilder() to construct.
+    private TestEmptyMessage() {}
+    
+    private static readonly TestEmptyMessage defaultInstance = new TestEmptyMessage();
+    public static TestEmptyMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestEmptyMessage DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestEmptyMessage__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestEmptyMessage__FieldAccessorTable; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestEmptyMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestEmptyMessage ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestEmptyMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestEmptyMessage parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestEmptyMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestEmptyMessage ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestEmptyMessage ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestEmptyMessage ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestEmptyMessage> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestEmptyMessage prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestEmptyMessage, Builder> {
+      // Construct using self::TestEmptyMessage.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestEmptyMessage result = new self::TestEmptyMessage();
+      
+      protected override self::TestEmptyMessage MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestEmptyMessage> Clear() {
+        result = new self::TestEmptyMessage();
+        return this;
+      }
+      
+      public override IBuilder<self::TestEmptyMessage> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestEmptyMessage.Descriptor; }
+      }
+      
+      public override self::TestEmptyMessage DefaultInstanceForType {
+        get { return self::TestEmptyMessage.DefaultInstance; }
+      }
+      
+      public override self::TestEmptyMessage BuildPartial() {
+        self::TestEmptyMessage returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestEmptyMessage) {
+          return MergeFrom((self::TestEmptyMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestEmptyMessage> MergeFrom(self::TestEmptyMessage other) {
+        if (other == self::TestEmptyMessage.DefaultInstance) return this;
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestEmptyMessage> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestEmptyMessage> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+          }
+        }
+      }
+      
+    }
+  }
+  
+  public sealed partial class TestEmptyMessageWithExtensions : pb::ExtendableMessage<TestEmptyMessageWithExtensions, TestEmptyMessageWithExtensions.Builder> {
+    // Use TestEmptyMessageWithExtensions.CreateBuilder() to construct.
+    private TestEmptyMessageWithExtensions() {}
+    
+    private static readonly TestEmptyMessageWithExtensions defaultInstance = new TestEmptyMessageWithExtensions();
+    public static TestEmptyMessageWithExtensions DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestEmptyMessageWithExtensions DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__FieldAccessorTable; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (!ExtensionsAreInitialized) return false;
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      pb::ExtendableMessage<TestEmptyMessageWithExtensions, TestEmptyMessageWithExtensions.Builder>.ExtensionWriter extensionWriter = CreateExtensionWriter(this);
+      extensionWriter.WriteUntil(536870912, output);
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        size += ExtensionsSerializedSize;
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestEmptyMessageWithExtensions ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestEmptyMessageWithExtensions ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestEmptyMessageWithExtensions ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestEmptyMessageWithExtensions parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestEmptyMessageWithExtensions ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestEmptyMessageWithExtensions ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestEmptyMessageWithExtensions ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestEmptyMessageWithExtensions ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestEmptyMessageWithExtensions> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestEmptyMessageWithExtensions prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestEmptyMessageWithExtensions, self::TestEmptyMessageWithExtensions.Builder>.ExtendableBuilder {
+      // Construct using self::TestEmptyMessageWithExtensions.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestEmptyMessageWithExtensions result = new self::TestEmptyMessageWithExtensions();
+      
+      protected override self::TestEmptyMessageWithExtensions MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestEmptyMessageWithExtensions> Clear() {
+        result = new self::TestEmptyMessageWithExtensions();
+        return this;
+      }
+      
+      public override IBuilder<self::TestEmptyMessageWithExtensions> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestEmptyMessageWithExtensions.Descriptor; }
+      }
+      
+      public override self::TestEmptyMessageWithExtensions DefaultInstanceForType {
+        get { return self::TestEmptyMessageWithExtensions.DefaultInstance; }
+      }
+      
+      public override self::TestEmptyMessageWithExtensions BuildPartial() {
+        self::TestEmptyMessageWithExtensions returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestEmptyMessageWithExtensions) {
+          return MergeFrom((self::TestEmptyMessageWithExtensions) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestEmptyMessageWithExtensions> MergeFrom(self::TestEmptyMessageWithExtensions other) {
+        if (other == self::TestEmptyMessageWithExtensions.DefaultInstance) return this;
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestEmptyMessageWithExtensions> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestEmptyMessageWithExtensions> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+          }
+        }
+      }
+      
+    }
+  }
+  
+  public sealed partial class TestReallyLargeTagNumber : pb::GeneratedMessage<TestReallyLargeTagNumber, TestReallyLargeTagNumber.Builder> {
+    // Use TestReallyLargeTagNumber.CreateBuilder() to construct.
+    private TestReallyLargeTagNumber() {}
+    
+    private static readonly TestReallyLargeTagNumber defaultInstance = new TestReallyLargeTagNumber();
+    public static TestReallyLargeTagNumber DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestReallyLargeTagNumber DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestReallyLargeTagNumber__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestReallyLargeTagNumber__FieldAccessorTable; }
+    }
+    
+    // optional int32 a = 1;
+    private bool hasA;
+    private int a_ = 0;
+    public bool HasA {
+      get { return hasA; }
+    }
+    public int A {
+      get { return a_; }
+    }
+    
+    // optional int32 bb = 268435455;
+    private bool hasBb;
+    private int bb_ = 0;
+    public bool HasBb {
+      get { return hasBb; }
+    }
+    public int Bb {
+      get { return bb_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasA) {
+        output.WriteInt32(1, A);
+      }
+      if (HasBb) {
+        output.WriteInt32(268435455, Bb);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasA) {
+          size += pb::CodedOutputStream.ComputeInt32Size(1, A);
+        }
+        if (HasBb) {
+          size += pb::CodedOutputStream.ComputeInt32Size(268435455, Bb);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestReallyLargeTagNumber ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestReallyLargeTagNumber ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestReallyLargeTagNumber ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestReallyLargeTagNumber parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestReallyLargeTagNumber ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestReallyLargeTagNumber ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestReallyLargeTagNumber ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestReallyLargeTagNumber ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestReallyLargeTagNumber> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestReallyLargeTagNumber prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestReallyLargeTagNumber, Builder> {
+      // Construct using self::TestReallyLargeTagNumber.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestReallyLargeTagNumber result = new self::TestReallyLargeTagNumber();
+      
+      protected override self::TestReallyLargeTagNumber MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestReallyLargeTagNumber> Clear() {
+        result = new self::TestReallyLargeTagNumber();
+        return this;
+      }
+      
+      public override IBuilder<self::TestReallyLargeTagNumber> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestReallyLargeTagNumber.Descriptor; }
+      }
+      
+      public override self::TestReallyLargeTagNumber DefaultInstanceForType {
+        get { return self::TestReallyLargeTagNumber.DefaultInstance; }
+      }
+      
+      public override self::TestReallyLargeTagNumber BuildPartial() {
+        self::TestReallyLargeTagNumber returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestReallyLargeTagNumber) {
+          return MergeFrom((self::TestReallyLargeTagNumber) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestReallyLargeTagNumber> MergeFrom(self::TestReallyLargeTagNumber other) {
+        if (other == self::TestReallyLargeTagNumber.DefaultInstance) return this;
+        if (other.HasA) {
+          A = other.A;
+        }
+        if (other.HasBb) {
+          Bb = other.Bb;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestReallyLargeTagNumber> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestReallyLargeTagNumber> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 8: {
+              A = input.ReadInt32();
+              break;
+            }
+            case 2147483640: {
+              Bb = input.ReadInt32();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional int32 a = 1;
+      public bool HasA {
+        get { return result.HasA; }
+      }
+      public int A {
+        get { return result.A; }
+        set { SetA(value); }
+      }
+      public Builder SetA(int value) {
+        result.hasA = true;
+        result.a_ = value;
+        return this;
+      }
+      public Builder ClearA() {
+        result.hasA = false;
+        result.a_ = 0;
+        return this;
+      }
+      
+      // optional int32 bb = 268435455;
+      public bool HasBb {
+        get { return result.HasBb; }
+      }
+      public int Bb {
+        get { return result.Bb; }
+        set { SetBb(value); }
+      }
+      public Builder SetBb(int value) {
+        result.hasBb = true;
+        result.bb_ = value;
+        return this;
+      }
+      public Builder ClearBb() {
+        result.hasBb = false;
+        result.bb_ = 0;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class TestRecursiveMessage : pb::GeneratedMessage<TestRecursiveMessage, TestRecursiveMessage.Builder> {
+    // Use TestRecursiveMessage.CreateBuilder() to construct.
+    private TestRecursiveMessage() {}
+    
+    private static readonly TestRecursiveMessage defaultInstance = new TestRecursiveMessage();
+    public static TestRecursiveMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestRecursiveMessage DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestRecursiveMessage__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestRecursiveMessage__FieldAccessorTable; }
+    }
+    
+    // optional .protobuf_unittest.TestRecursiveMessage a = 1;
+    private bool hasA;
+    private self::TestRecursiveMessage a_ = self::TestRecursiveMessage.DefaultInstance;
+    public bool HasA {
+      get { return hasA; }
+    }
+    public self::TestRecursiveMessage A {
+      get { return a_; }
+    }
+    
+    // optional int32 i = 2;
+    private bool hasI;
+    private int i_ = 0;
+    public bool HasI {
+      get { return hasI; }
+    }
+    public int I {
+      get { return i_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasA) {
+        output.WriteMessage(1, A);
+      }
+      if (HasI) {
+        output.WriteInt32(2, I);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasA) {
+          size += pb::CodedOutputStream.ComputeMessageSize(1, A);
+        }
+        if (HasI) {
+          size += pb::CodedOutputStream.ComputeInt32Size(2, I);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestRecursiveMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestRecursiveMessage ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestRecursiveMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestRecursiveMessage parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestRecursiveMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestRecursiveMessage ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestRecursiveMessage ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestRecursiveMessage ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestRecursiveMessage> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestRecursiveMessage prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestRecursiveMessage, Builder> {
+      // Construct using self::TestRecursiveMessage.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestRecursiveMessage result = new self::TestRecursiveMessage();
+      
+      protected override self::TestRecursiveMessage MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestRecursiveMessage> Clear() {
+        result = new self::TestRecursiveMessage();
+        return this;
+      }
+      
+      public override IBuilder<self::TestRecursiveMessage> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestRecursiveMessage.Descriptor; }
+      }
+      
+      public override self::TestRecursiveMessage DefaultInstanceForType {
+        get { return self::TestRecursiveMessage.DefaultInstance; }
+      }
+      
+      public override self::TestRecursiveMessage BuildPartial() {
+        self::TestRecursiveMessage returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestRecursiveMessage) {
+          return MergeFrom((self::TestRecursiveMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestRecursiveMessage> MergeFrom(self::TestRecursiveMessage other) {
+        if (other == self::TestRecursiveMessage.DefaultInstance) return this;
+        if (other.HasA) {
+          MergeA(other.A);
+        }
+        if (other.HasI) {
+          I = other.I;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestRecursiveMessage> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestRecursiveMessage> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 10: {
+              self::TestRecursiveMessage.Builder subBuilder = self::TestRecursiveMessage.CreateBuilder();
+              if (HasA) {
+                subBuilder.MergeFrom(A);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              A = subBuilder.BuildPartial();
+              break;
+            }
+            case 16: {
+              I = input.ReadInt32();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional .protobuf_unittest.TestRecursiveMessage a = 1;
+      public bool HasA {
+        get { return result.HasA; }
+      }
+      public self::TestRecursiveMessage A {
+        get { return result.A; }
+        set { SetA(value); }
+      }
+      public Builder SetA(self::TestRecursiveMessage value) {
+        result.hasA = true;
+        result.a_ = value;
+        return this;
+      }
+      public Builder SetA(self::TestRecursiveMessage.Builder builderForValue) {
+        result.hasA = true;
+        result.a_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeA(self::TestRecursiveMessage value) {
+        if (result.HasA &&
+            result.a_ != self::TestRecursiveMessage.DefaultInstance) {
+          result.a_ =
+            self::TestRecursiveMessage.CreateBuilder(result.a_).MergeFrom(value).BuildPartial();
+        } else {
+          result.a_ = value;
+        }
+        result.hasA = true;
+        return this;
+      }
+      public Builder ClearA() {
+        result.hasA = false;
+        result.a_ = self::TestRecursiveMessage.DefaultInstance;
+        return this;
+      }
+      
+      // optional int32 i = 2;
+      public bool HasI {
+        get { return result.HasI; }
+      }
+      public int I {
+        get { return result.I; }
+        set { SetI(value); }
+      }
+      public Builder SetI(int value) {
+        result.hasI = true;
+        result.i_ = value;
+        return this;
+      }
+      public Builder ClearI() {
+        result.hasI = false;
+        result.i_ = 0;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class TestMutualRecursionA : pb::GeneratedMessage<TestMutualRecursionA, TestMutualRecursionA.Builder> {
+    // Use TestMutualRecursionA.CreateBuilder() to construct.
+    private TestMutualRecursionA() {}
+    
+    private static readonly TestMutualRecursionA defaultInstance = new TestMutualRecursionA();
+    public static TestMutualRecursionA DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestMutualRecursionA DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestMutualRecursionA__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestMutualRecursionA__FieldAccessorTable; }
+    }
+    
+    // optional .protobuf_unittest.TestMutualRecursionB bb = 1;
+    private bool hasBb;
+    private self::TestMutualRecursionB bb_ = self::TestMutualRecursionB.DefaultInstance;
+    public bool HasBb {
+      get { return hasBb; }
+    }
+    public self::TestMutualRecursionB Bb {
+      get { return bb_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasBb) {
+        output.WriteMessage(1, Bb);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasBb) {
+          size += pb::CodedOutputStream.ComputeMessageSize(1, Bb);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestMutualRecursionA ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestMutualRecursionA ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMutualRecursionA ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestMutualRecursionA parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMutualRecursionA ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestMutualRecursionA ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMutualRecursionA ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestMutualRecursionA ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestMutualRecursionA> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestMutualRecursionA prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestMutualRecursionA, Builder> {
+      // Construct using self::TestMutualRecursionA.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestMutualRecursionA result = new self::TestMutualRecursionA();
+      
+      protected override self::TestMutualRecursionA MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestMutualRecursionA> Clear() {
+        result = new self::TestMutualRecursionA();
+        return this;
+      }
+      
+      public override IBuilder<self::TestMutualRecursionA> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestMutualRecursionA.Descriptor; }
+      }
+      
+      public override self::TestMutualRecursionA DefaultInstanceForType {
+        get { return self::TestMutualRecursionA.DefaultInstance; }
+      }
+      
+      public override self::TestMutualRecursionA BuildPartial() {
+        self::TestMutualRecursionA returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestMutualRecursionA) {
+          return MergeFrom((self::TestMutualRecursionA) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestMutualRecursionA> MergeFrom(self::TestMutualRecursionA other) {
+        if (other == self::TestMutualRecursionA.DefaultInstance) return this;
+        if (other.HasBb) {
+          MergeBb(other.Bb);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestMutualRecursionA> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestMutualRecursionA> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 10: {
+              self::TestMutualRecursionB.Builder subBuilder = self::TestMutualRecursionB.CreateBuilder();
+              if (HasBb) {
+                subBuilder.MergeFrom(Bb);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              Bb = subBuilder.BuildPartial();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional .protobuf_unittest.TestMutualRecursionB bb = 1;
+      public bool HasBb {
+        get { return result.HasBb; }
+      }
+      public self::TestMutualRecursionB Bb {
+        get { return result.Bb; }
+        set { SetBb(value); }
+      }
+      public Builder SetBb(self::TestMutualRecursionB value) {
+        result.hasBb = true;
+        result.bb_ = value;
+        return this;
+      }
+      public Builder SetBb(self::TestMutualRecursionB.Builder builderForValue) {
+        result.hasBb = true;
+        result.bb_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeBb(self::TestMutualRecursionB value) {
+        if (result.HasBb &&
+            result.bb_ != self::TestMutualRecursionB.DefaultInstance) {
+          result.bb_ =
+            self::TestMutualRecursionB.CreateBuilder(result.bb_).MergeFrom(value).BuildPartial();
+        } else {
+          result.bb_ = value;
+        }
+        result.hasBb = true;
+        return this;
+      }
+      public Builder ClearBb() {
+        result.hasBb = false;
+        result.bb_ = self::TestMutualRecursionB.DefaultInstance;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class TestMutualRecursionB : pb::GeneratedMessage<TestMutualRecursionB, TestMutualRecursionB.Builder> {
+    // Use TestMutualRecursionB.CreateBuilder() to construct.
+    private TestMutualRecursionB() {}
+    
+    private static readonly TestMutualRecursionB defaultInstance = new TestMutualRecursionB();
+    public static TestMutualRecursionB DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestMutualRecursionB DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestMutualRecursionB__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestMutualRecursionB__FieldAccessorTable; }
+    }
+    
+    // optional .protobuf_unittest.TestMutualRecursionA a = 1;
+    private bool hasA;
+    private self::TestMutualRecursionA a_ = self::TestMutualRecursionA.DefaultInstance;
+    public bool HasA {
+      get { return hasA; }
+    }
+    public self::TestMutualRecursionA A {
+      get { return a_; }
+    }
+    
+    // optional int32 optional_int32 = 2;
+    private bool hasOptionalInt32;
+    private int optionalInt32_ = 0;
+    public bool HasOptionalInt32 {
+      get { return hasOptionalInt32; }
+    }
+    public int OptionalInt32 {
+      get { return optionalInt32_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasA) {
+        output.WriteMessage(1, A);
+      }
+      if (HasOptionalInt32) {
+        output.WriteInt32(2, OptionalInt32);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasA) {
+          size += pb::CodedOutputStream.ComputeMessageSize(1, A);
+        }
+        if (HasOptionalInt32) {
+          size += pb::CodedOutputStream.ComputeInt32Size(2, OptionalInt32);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestMutualRecursionB ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestMutualRecursionB ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMutualRecursionB ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestMutualRecursionB parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMutualRecursionB ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestMutualRecursionB ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestMutualRecursionB ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestMutualRecursionB ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestMutualRecursionB> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestMutualRecursionB prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestMutualRecursionB, Builder> {
+      // Construct using self::TestMutualRecursionB.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestMutualRecursionB result = new self::TestMutualRecursionB();
+      
+      protected override self::TestMutualRecursionB MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestMutualRecursionB> Clear() {
+        result = new self::TestMutualRecursionB();
+        return this;
+      }
+      
+      public override IBuilder<self::TestMutualRecursionB> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestMutualRecursionB.Descriptor; }
+      }
+      
+      public override self::TestMutualRecursionB DefaultInstanceForType {
+        get { return self::TestMutualRecursionB.DefaultInstance; }
+      }
+      
+      public override self::TestMutualRecursionB BuildPartial() {
+        self::TestMutualRecursionB returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestMutualRecursionB) {
+          return MergeFrom((self::TestMutualRecursionB) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestMutualRecursionB> MergeFrom(self::TestMutualRecursionB other) {
+        if (other == self::TestMutualRecursionB.DefaultInstance) return this;
+        if (other.HasA) {
+          MergeA(other.A);
+        }
+        if (other.HasOptionalInt32) {
+          OptionalInt32 = other.OptionalInt32;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestMutualRecursionB> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestMutualRecursionB> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 10: {
+              self::TestMutualRecursionA.Builder subBuilder = self::TestMutualRecursionA.CreateBuilder();
+              if (HasA) {
+                subBuilder.MergeFrom(A);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              A = subBuilder.BuildPartial();
+              break;
+            }
+            case 16: {
+              OptionalInt32 = input.ReadInt32();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional .protobuf_unittest.TestMutualRecursionA a = 1;
+      public bool HasA {
+        get { return result.HasA; }
+      }
+      public self::TestMutualRecursionA A {
+        get { return result.A; }
+        set { SetA(value); }
+      }
+      public Builder SetA(self::TestMutualRecursionA value) {
+        result.hasA = true;
+        result.a_ = value;
+        return this;
+      }
+      public Builder SetA(self::TestMutualRecursionA.Builder builderForValue) {
+        result.hasA = true;
+        result.a_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeA(self::TestMutualRecursionA value) {
+        if (result.HasA &&
+            result.a_ != self::TestMutualRecursionA.DefaultInstance) {
+          result.a_ =
+            self::TestMutualRecursionA.CreateBuilder(result.a_).MergeFrom(value).BuildPartial();
+        } else {
+          result.a_ = value;
+        }
+        result.hasA = true;
+        return this;
+      }
+      public Builder ClearA() {
+        result.hasA = false;
+        result.a_ = self::TestMutualRecursionA.DefaultInstance;
+        return this;
+      }
+      
+      // optional int32 optional_int32 = 2;
+      public bool HasOptionalInt32 {
+        get { return result.HasOptionalInt32; }
+      }
+      public int OptionalInt32 {
+        get { return result.OptionalInt32; }
+        set { SetOptionalInt32(value); }
+      }
+      public Builder SetOptionalInt32(int value) {
+        result.hasOptionalInt32 = true;
+        result.optionalInt32_ = value;
+        return this;
+      }
+      public Builder ClearOptionalInt32() {
+        result.hasOptionalInt32 = false;
+        result.optionalInt32_ = 0;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class TestDupFieldNumber : pb::GeneratedMessage<TestDupFieldNumber, TestDupFieldNumber.Builder> {
+    // Use TestDupFieldNumber.CreateBuilder() to construct.
+    private TestDupFieldNumber() {}
+    
+    private static readonly TestDupFieldNumber defaultInstance = new TestDupFieldNumber();
+    public static TestDupFieldNumber DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestDupFieldNumber DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestDupFieldNumber__FieldAccessorTable; }
+    }
+    
+    #region Nested types
+    public static class Types {
+      public sealed partial class Foo : pb::GeneratedMessage<Foo, Foo.Builder> {
+        // Use Foo.CreateBuilder() to construct.
+        private Foo() {}
+        
+        private static readonly Foo defaultInstance = new Foo();
+        public static Foo DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override Foo DefaultInstanceForType {
+          get { return defaultInstance; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestDupFieldNumber_Foo__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+          get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestDupFieldNumber_Foo__FieldAccessorTable; }
+        }
+        
+        // optional int32 a = 1;
+        private bool hasA;
+        private int a_ = 0;
+        public bool HasA {
+          get { return hasA; }
+        }
+        public int A {
+          get { return a_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::CodedOutputStream output) {
+          if (HasA) {
+            output.WriteInt32(1, A);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (HasA) {
+              size += pb::CodedOutputStream.ComputeInt32Size(1, A);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static self::TestDupFieldNumber.Types.Foo ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static self::TestDupFieldNumber.Types.Foo ParseFrom(pb::ByteString data,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestDupFieldNumber.Types.Foo ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static self::TestDupFieldNumber.Types.Foo parseFrom(byte[] data,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestDupFieldNumber.Types.Foo ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static self::TestDupFieldNumber.Types.Foo ParseFrom(
+            global::System.IO.Stream input,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestDupFieldNumber.Types.Foo ParseFrom(pb::CodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static self::TestDupFieldNumber.Types.Foo ParseFrom(pb::CodedInputStream input,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+                   .BuildParsed();
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override IBuilder<self::TestDupFieldNumber.Types.Foo> CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(self::TestDupFieldNumber.Types.Foo prototype) {
+          return (Builder) new Builder().MergeFrom(prototype);
+        }
+        
+        public sealed partial class Builder : pb::GeneratedBuilder<self::TestDupFieldNumber.Types.Foo, Builder> {
+          // Construct using self::TestDupFieldNumber.Types.Foo.CreateBuilder()
+          internal Builder() {}
+          
+          self::TestDupFieldNumber.Types.Foo result = new self::TestDupFieldNumber.Types.Foo();
+          
+          protected override self::TestDupFieldNumber.Types.Foo MessageBeingBuilt {
+            get { return result; }
+          }
+          
+          public override IBuilder<self::TestDupFieldNumber.Types.Foo> Clear() {
+            result = new self::TestDupFieldNumber.Types.Foo();
+            return this;
+          }
+          
+          public override IBuilder<self::TestDupFieldNumber.Types.Foo> Clone() {
+            return new Builder().MergeFrom(result);
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return self::TestDupFieldNumber.Types.Foo.Descriptor; }
+          }
+          
+          public override self::TestDupFieldNumber.Types.Foo DefaultInstanceForType {
+            get { return self::TestDupFieldNumber.Types.Foo.DefaultInstance; }
+          }
+          
+          public override self::TestDupFieldNumber.Types.Foo BuildPartial() {
+            self::TestDupFieldNumber.Types.Foo returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public override IBuilder MergeFrom(pb::IMessage other) {
+            if (other is self::TestDupFieldNumber.Types.Foo) {
+              return MergeFrom((self::TestDupFieldNumber.Types.Foo) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override IBuilder<self::TestDupFieldNumber.Types.Foo> MergeFrom(self::TestDupFieldNumber.Types.Foo other) {
+            if (other == self::TestDupFieldNumber.Types.Foo.DefaultInstance) return this;
+            if (other.HasA) {
+              A = other.A;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override IBuilder<self::TestDupFieldNumber.Types.Foo> MergeFrom(pb::CodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override IBuilder<self::TestDupFieldNumber.Types.Foo> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            pb::UnknownFieldSet.Builder unknownFields =
+              pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+            while (true) {
+              uint tag = input.ReadTag();
+              switch (tag) {
+                case 0:
+                  this.UnknownFields = unknownFields.Build();
+                  return this;
+                default: {
+                  if (!ParseUnknownField(input, unknownFields,
+                                         extensionRegistry, tag)) {
+                    this.UnknownFields = unknownFields.Build();
+                    return this;
+                  }
+                  break;
+                }
+                case 8: {
+                  A = input.ReadInt32();
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          // optional int32 a = 1;
+          public bool HasA {
+            get { return result.HasA; }
+          }
+          public int A {
+            get { return result.A; }
+            set { SetA(value); }
+          }
+          public Builder SetA(int value) {
+            result.hasA = true;
+            result.a_ = value;
+            return this;
+          }
+          public Builder ClearA() {
+            result.hasA = false;
+            result.a_ = 0;
+            return this;
+          }
+        }
+      }
+      
+      public sealed partial class Bar : pb::GeneratedMessage<Bar, Bar.Builder> {
+        // Use Bar.CreateBuilder() to construct.
+        private Bar() {}
+        
+        private static readonly Bar defaultInstance = new Bar();
+        public static Bar DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override Bar DefaultInstanceForType {
+          get { return defaultInstance; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestDupFieldNumber_Bar__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+          get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestDupFieldNumber_Bar__FieldAccessorTable; }
+        }
+        
+        // optional int32 a = 1;
+        private bool hasA;
+        private int a_ = 0;
+        public bool HasA {
+          get { return hasA; }
+        }
+        public int A {
+          get { return a_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::CodedOutputStream output) {
+          if (HasA) {
+            output.WriteInt32(1, A);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (HasA) {
+              size += pb::CodedOutputStream.ComputeInt32Size(1, A);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static self::TestDupFieldNumber.Types.Bar ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static self::TestDupFieldNumber.Types.Bar ParseFrom(pb::ByteString data,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestDupFieldNumber.Types.Bar ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static self::TestDupFieldNumber.Types.Bar parseFrom(byte[] data,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestDupFieldNumber.Types.Bar ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static self::TestDupFieldNumber.Types.Bar ParseFrom(
+            global::System.IO.Stream input,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestDupFieldNumber.Types.Bar ParseFrom(pb::CodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static self::TestDupFieldNumber.Types.Bar ParseFrom(pb::CodedInputStream input,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+                   .BuildParsed();
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override IBuilder<self::TestDupFieldNumber.Types.Bar> CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(self::TestDupFieldNumber.Types.Bar prototype) {
+          return (Builder) new Builder().MergeFrom(prototype);
+        }
+        
+        public sealed partial class Builder : pb::GeneratedBuilder<self::TestDupFieldNumber.Types.Bar, Builder> {
+          // Construct using self::TestDupFieldNumber.Types.Bar.CreateBuilder()
+          internal Builder() {}
+          
+          self::TestDupFieldNumber.Types.Bar result = new self::TestDupFieldNumber.Types.Bar();
+          
+          protected override self::TestDupFieldNumber.Types.Bar MessageBeingBuilt {
+            get { return result; }
+          }
+          
+          public override IBuilder<self::TestDupFieldNumber.Types.Bar> Clear() {
+            result = new self::TestDupFieldNumber.Types.Bar();
+            return this;
+          }
+          
+          public override IBuilder<self::TestDupFieldNumber.Types.Bar> Clone() {
+            return new Builder().MergeFrom(result);
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return self::TestDupFieldNumber.Types.Bar.Descriptor; }
+          }
+          
+          public override self::TestDupFieldNumber.Types.Bar DefaultInstanceForType {
+            get { return self::TestDupFieldNumber.Types.Bar.DefaultInstance; }
+          }
+          
+          public override self::TestDupFieldNumber.Types.Bar BuildPartial() {
+            self::TestDupFieldNumber.Types.Bar returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public override IBuilder MergeFrom(pb::IMessage other) {
+            if (other is self::TestDupFieldNumber.Types.Bar) {
+              return MergeFrom((self::TestDupFieldNumber.Types.Bar) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override IBuilder<self::TestDupFieldNumber.Types.Bar> MergeFrom(self::TestDupFieldNumber.Types.Bar other) {
+            if (other == self::TestDupFieldNumber.Types.Bar.DefaultInstance) return this;
+            if (other.HasA) {
+              A = other.A;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override IBuilder<self::TestDupFieldNumber.Types.Bar> MergeFrom(pb::CodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override IBuilder<self::TestDupFieldNumber.Types.Bar> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            pb::UnknownFieldSet.Builder unknownFields =
+              pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+            while (true) {
+              uint tag = input.ReadTag();
+              switch (tag) {
+                case 0:
+                  this.UnknownFields = unknownFields.Build();
+                  return this;
+                default: {
+                  if (!ParseUnknownField(input, unknownFields,
+                                         extensionRegistry, tag)) {
+                    this.UnknownFields = unknownFields.Build();
+                    return this;
+                  }
+                  break;
+                }
+                case 8: {
+                  A = input.ReadInt32();
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          // optional int32 a = 1;
+          public bool HasA {
+            get { return result.HasA; }
+          }
+          public int A {
+            get { return result.A; }
+            set { SetA(value); }
+          }
+          public Builder SetA(int value) {
+            result.hasA = true;
+            result.a_ = value;
+            return this;
+          }
+          public Builder ClearA() {
+            result.hasA = false;
+            result.a_ = 0;
+            return this;
+          }
+        }
+      }
+      
+    }
+    #endregion
+    
+    // optional int32 a = 1;
+    private bool hasA;
+    private int a_ = 0;
+    public bool HasA {
+      get { return hasA; }
+    }
+    public int A {
+      get { return a_; }
+    }
+    
+    // optional group Foo = 2 {
+    private bool hasFoo;
+    private self::TestDupFieldNumber.Types.Foo foo_ = self::TestDupFieldNumber.Types.Foo.DefaultInstance;
+    public bool HasFoo {
+      get { return hasFoo; }
+    }
+    public self::TestDupFieldNumber.Types.Foo Foo {
+      get { return foo_; }
+    }
+    
+    // optional group Bar = 3 {
+    private bool hasBar;
+    private self::TestDupFieldNumber.Types.Bar bar_ = self::TestDupFieldNumber.Types.Bar.DefaultInstance;
+    public bool HasBar {
+      get { return hasBar; }
+    }
+    public self::TestDupFieldNumber.Types.Bar Bar {
+      get { return bar_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasA) {
+        output.WriteInt32(1, A);
+      }
+      if (HasFoo) {
+        output.WriteGroup(2, Foo);
+      }
+      if (HasBar) {
+        output.WriteGroup(3, Bar);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasA) {
+          size += pb::CodedOutputStream.ComputeInt32Size(1, A);
+        }
+        if (HasFoo) {
+          size += pb::CodedOutputStream.ComputeGroupSize(2, Foo);
+        }
+        if (HasBar) {
+          size += pb::CodedOutputStream.ComputeGroupSize(3, Bar);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestDupFieldNumber ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestDupFieldNumber ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestDupFieldNumber ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestDupFieldNumber parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestDupFieldNumber ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestDupFieldNumber ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestDupFieldNumber ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestDupFieldNumber ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestDupFieldNumber> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestDupFieldNumber prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestDupFieldNumber, Builder> {
+      // Construct using self::TestDupFieldNumber.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestDupFieldNumber result = new self::TestDupFieldNumber();
+      
+      protected override self::TestDupFieldNumber MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestDupFieldNumber> Clear() {
+        result = new self::TestDupFieldNumber();
+        return this;
+      }
+      
+      public override IBuilder<self::TestDupFieldNumber> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestDupFieldNumber.Descriptor; }
+      }
+      
+      public override self::TestDupFieldNumber DefaultInstanceForType {
+        get { return self::TestDupFieldNumber.DefaultInstance; }
+      }
+      
+      public override self::TestDupFieldNumber BuildPartial() {
+        self::TestDupFieldNumber returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestDupFieldNumber) {
+          return MergeFrom((self::TestDupFieldNumber) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestDupFieldNumber> MergeFrom(self::TestDupFieldNumber other) {
+        if (other == self::TestDupFieldNumber.DefaultInstance) return this;
+        if (other.HasA) {
+          A = other.A;
+        }
+        if (other.HasFoo) {
+          MergeFoo(other.Foo);
+        }
+        if (other.HasBar) {
+          MergeBar(other.Bar);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestDupFieldNumber> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestDupFieldNumber> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 8: {
+              A = input.ReadInt32();
+              break;
+            }
+            case 19: {
+              self::TestDupFieldNumber.Types.Foo.Builder subBuilder = self::TestDupFieldNumber.Types.Foo.CreateBuilder();
+              if (HasFoo) {
+                subBuilder.MergeFrom(Foo);
+              }
+              input.ReadGroup(2, subBuilder, extensionRegistry);
+              Foo = subBuilder.BuildPartial();
+              break;
+            }
+            case 27: {
+              self::TestDupFieldNumber.Types.Bar.Builder subBuilder = self::TestDupFieldNumber.Types.Bar.CreateBuilder();
+              if (HasBar) {
+                subBuilder.MergeFrom(Bar);
+              }
+              input.ReadGroup(3, subBuilder, extensionRegistry);
+              Bar = subBuilder.BuildPartial();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional int32 a = 1;
+      public bool HasA {
+        get { return result.HasA; }
+      }
+      public int A {
+        get { return result.A; }
+        set { SetA(value); }
+      }
+      public Builder SetA(int value) {
+        result.hasA = true;
+        result.a_ = value;
+        return this;
+      }
+      public Builder ClearA() {
+        result.hasA = false;
+        result.a_ = 0;
+        return this;
+      }
+      
+      // optional group Foo = 2 {
+      public bool HasFoo {
+        get { return result.HasFoo; }
+      }
+      public self::TestDupFieldNumber.Types.Foo Foo {
+        get { return result.Foo; }
+        set { SetFoo(value); }
+      }
+      public Builder SetFoo(self::TestDupFieldNumber.Types.Foo value) {
+        result.hasFoo = true;
+        result.foo_ = value;
+        return this;
+      }
+      public Builder SetFoo(self::TestDupFieldNumber.Types.Foo.Builder builderForValue) {
+        result.hasFoo = true;
+        result.foo_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeFoo(self::TestDupFieldNumber.Types.Foo value) {
+        if (result.HasFoo &&
+            result.foo_ != self::TestDupFieldNumber.Types.Foo.DefaultInstance) {
+          result.foo_ =
+            self::TestDupFieldNumber.Types.Foo.CreateBuilder(result.foo_).MergeFrom(value).BuildPartial();
+        } else {
+          result.foo_ = value;
+        }
+        result.hasFoo = true;
+        return this;
+      }
+      public Builder ClearFoo() {
+        result.hasFoo = false;
+        result.foo_ = self::TestDupFieldNumber.Types.Foo.DefaultInstance;
+        return this;
+      }
+      
+      // optional group Bar = 3 {
+      public bool HasBar {
+        get { return result.HasBar; }
+      }
+      public self::TestDupFieldNumber.Types.Bar Bar {
+        get { return result.Bar; }
+        set { SetBar(value); }
+      }
+      public Builder SetBar(self::TestDupFieldNumber.Types.Bar value) {
+        result.hasBar = true;
+        result.bar_ = value;
+        return this;
+      }
+      public Builder SetBar(self::TestDupFieldNumber.Types.Bar.Builder builderForValue) {
+        result.hasBar = true;
+        result.bar_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeBar(self::TestDupFieldNumber.Types.Bar value) {
+        if (result.HasBar &&
+            result.bar_ != self::TestDupFieldNumber.Types.Bar.DefaultInstance) {
+          result.bar_ =
+            self::TestDupFieldNumber.Types.Bar.CreateBuilder(result.bar_).MergeFrom(value).BuildPartial();
+        } else {
+          result.bar_ = value;
+        }
+        result.hasBar = true;
+        return this;
+      }
+      public Builder ClearBar() {
+        result.hasBar = false;
+        result.bar_ = self::TestDupFieldNumber.Types.Bar.DefaultInstance;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class TestNestedMessageHasBits : pb::GeneratedMessage<TestNestedMessageHasBits, TestNestedMessageHasBits.Builder> {
+    // Use TestNestedMessageHasBits.CreateBuilder() to construct.
+    private TestNestedMessageHasBits() {}
+    
+    private static readonly TestNestedMessageHasBits defaultInstance = new TestNestedMessageHasBits();
+    public static TestNestedMessageHasBits DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestNestedMessageHasBits DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestNestedMessageHasBits__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestNestedMessageHasBits__FieldAccessorTable; }
+    }
+    
+    #region Nested types
+    public static class Types {
+      public sealed partial class NestedMessage : pb::GeneratedMessage<NestedMessage, NestedMessage.Builder> {
+        // Use NestedMessage.CreateBuilder() to construct.
+        private NestedMessage() {}
+        
+        private static readonly NestedMessage defaultInstance = new NestedMessage();
+        public static NestedMessage DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override NestedMessage DefaultInstanceForType {
+          get { return defaultInstance; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+          get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__FieldAccessorTable; }
+        }
+        
+        // repeated int32 nestedmessage_repeated_int32 = 1;
+        private scg::IList<int> nestedmessageRepeatedInt32_ = pbc::Lists<int>.Empty;
+        public scg::IList<int> NestedmessageRepeatedInt32List {
+          get { return nestedmessageRepeatedInt32_; }
+        }
+        public int NestedmessageRepeatedInt32Count {
+          get { return nestedmessageRepeatedInt32_.Count; }
+        }
+        public int GetNestedmessageRepeatedInt32(int index) {
+          return nestedmessageRepeatedInt32_[index];
+        }
+        
+        // repeated .protobuf_unittest.ForeignMessage nestedmessage_repeated_foreignmessage = 2;
+        private scg::IList<self::ForeignMessage> nestedmessageRepeatedForeignmessage_ = pbc::Lists<self::ForeignMessage>.Empty;
+        public scg::IList<self::ForeignMessage> NestedmessageRepeatedForeignmessageList {
+          get { return nestedmessageRepeatedForeignmessage_; } 
+        }
+        public int NestedmessageRepeatedForeignmessageCount
+          { get { return nestedmessageRepeatedForeignmessage_.Count; }
+        }
+        public self::ForeignMessage GetNestedmessageRepeatedForeignmessage(int index) {
+          return nestedmessageRepeatedForeignmessage_ [index];
+        }
+        
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::CodedOutputStream output) {
+          foreach (int element in NestedmessageRepeatedInt32List) {
+            output.WriteInt32(1, element);
+          }
+          foreach (self::ForeignMessage element in NestedmessageRepeatedForeignmessageList) {
+            output.WriteMessage(2, element);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            foreach (int element in NestedmessageRepeatedInt32List) {
+              size += pb::CodedOutputStream
+                .ComputeInt32Size(1, element);
+            }
+            foreach (self::ForeignMessage element in NestedmessageRepeatedForeignmessageList) {
+              size += pb::CodedOutputStream.ComputeMessageSize(2, element);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static self::TestNestedMessageHasBits.Types.NestedMessage ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static self::TestNestedMessageHasBits.Types.NestedMessage ParseFrom(pb::ByteString data,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestNestedMessageHasBits.Types.NestedMessage ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static self::TestNestedMessageHasBits.Types.NestedMessage parseFrom(byte[] data,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestNestedMessageHasBits.Types.NestedMessage ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static self::TestNestedMessageHasBits.Types.NestedMessage ParseFrom(
+            global::System.IO.Stream input,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+                   .BuildParsed();
+        }
+        public static self::TestNestedMessageHasBits.Types.NestedMessage ParseFrom(pb::CodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static self::TestNestedMessageHasBits.Types.NestedMessage ParseFrom(pb::CodedInputStream input,
+            pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+                   .BuildParsed();
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override IBuilder<self::TestNestedMessageHasBits.Types.NestedMessage> CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(self::TestNestedMessageHasBits.Types.NestedMessage prototype) {
+          return (Builder) new Builder().MergeFrom(prototype);
+        }
+        
+        public sealed partial class Builder : pb::GeneratedBuilder<self::TestNestedMessageHasBits.Types.NestedMessage, Builder> {
+          // Construct using self::TestNestedMessageHasBits.Types.NestedMessage.CreateBuilder()
+          internal Builder() {}
+          
+          self::TestNestedMessageHasBits.Types.NestedMessage result = new self::TestNestedMessageHasBits.Types.NestedMessage();
+          
+          protected override self::TestNestedMessageHasBits.Types.NestedMessage MessageBeingBuilt {
+            get { return result; }
+          }
+          
+          public override IBuilder<self::TestNestedMessageHasBits.Types.NestedMessage> Clear() {
+            result = new self::TestNestedMessageHasBits.Types.NestedMessage();
+            return this;
+          }
+          
+          public override IBuilder<self::TestNestedMessageHasBits.Types.NestedMessage> Clone() {
+            return new Builder().MergeFrom(result);
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return self::TestNestedMessageHasBits.Types.NestedMessage.Descriptor; }
+          }
+          
+          public override self::TestNestedMessageHasBits.Types.NestedMessage DefaultInstanceForType {
+            get { return self::TestNestedMessageHasBits.Types.NestedMessage.DefaultInstance; }
+          }
+          
+          public override self::TestNestedMessageHasBits.Types.NestedMessage BuildPartial() {
+            result.nestedmessageRepeatedInt32_ = pbc::Lists<int>.AsReadOnly(result.nestedmessageRepeatedInt32_);
+            if (result.nestedmessageRepeatedForeignmessage_ != pbc::Lists<self::ForeignMessage>.Empty) {
+              result.nestedmessageRepeatedForeignmessage_ = pbc::Lists<self::ForeignMessage>.AsReadOnly(result.nestedmessageRepeatedForeignmessage_);
+            }
+            self::TestNestedMessageHasBits.Types.NestedMessage returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public override IBuilder MergeFrom(pb::IMessage other) {
+            if (other is self::TestNestedMessageHasBits.Types.NestedMessage) {
+              return MergeFrom((self::TestNestedMessageHasBits.Types.NestedMessage) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override IBuilder<self::TestNestedMessageHasBits.Types.NestedMessage> MergeFrom(self::TestNestedMessageHasBits.Types.NestedMessage other) {
+            if (other == self::TestNestedMessageHasBits.Types.NestedMessage.DefaultInstance) return this;
+            if (other.nestedmessageRepeatedInt32_.Count != 0) {
+              if (result.nestedmessageRepeatedInt32_.Count == 0) {
+                result.nestedmessageRepeatedInt32_ = new scg::List<int>();
+              }
+              base.AddRange(other.nestedmessageRepeatedInt32_, result.nestedmessageRepeatedInt32_);
+            }
+            if (other.nestedmessageRepeatedForeignmessage_.Count != 0) {
+              if (result.nestedmessageRepeatedForeignmessage_.Count == 0) {
+                result.nestedmessageRepeatedForeignmessage_ = new scg::List<self::ForeignMessage>();
+              }
+              base.AddRange(other.nestedmessageRepeatedForeignmessage_, result.nestedmessageRepeatedForeignmessage_);
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override IBuilder<self::TestNestedMessageHasBits.Types.NestedMessage> MergeFrom(pb::CodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override IBuilder<self::TestNestedMessageHasBits.Types.NestedMessage> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            pb::UnknownFieldSet.Builder unknownFields =
+              pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+            while (true) {
+              uint tag = input.ReadTag();
+              switch (tag) {
+                case 0:
+                  this.UnknownFields = unknownFields.Build();
+                  return this;
+                default: {
+                  if (!ParseUnknownField(input, unknownFields,
+                                         extensionRegistry, tag)) {
+                    this.UnknownFields = unknownFields.Build();
+                    return this;
+                  }
+                  break;
+                }
+                case 8: {
+                  AddNestedmessageRepeatedInt32(input.ReadInt32());
+                  break;
+                }
+                case 18: {
+                  self::ForeignMessage.Builder subBuilder = self::ForeignMessage.CreateBuilder();
+                  input.ReadMessage(subBuilder, extensionRegistry);
+                  AddNestedmessageRepeatedForeignmessage(subBuilder.BuildPartial());
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          // repeated int32 nestedmessage_repeated_int32 = 1;
+          public scg::IList<int> NestedmessageRepeatedInt32List {
+            get { return pbc::Lists<int>.AsReadOnly(result.nestedmessageRepeatedInt32_); }
+          }
+          public int NestedmessageRepeatedInt32Count {
+            get { return result.NestedmessageRepeatedInt32Count; }
+          }
+          public int GetNestedmessageRepeatedInt32(int index) {
+            return result.GetNestedmessageRepeatedInt32(index);
+          }
+          public Builder SetNestedmessageRepeatedInt32(int index, int value) {
+            result.nestedmessageRepeatedInt32_[index] = value;
+            return this;
+          }
+          public Builder AddNestedmessageRepeatedInt32(int value) {
+            if (result.nestedmessageRepeatedInt32_.Count == 0) {
+              result.nestedmessageRepeatedInt32_ = new scg::List<int>();
+            }
+            result.nestedmessageRepeatedInt32_.Add(value);
+            return this;
+          }
+          public Builder AddRangeNestedmessageRepeatedInt32(scg::IEnumerable<int> values) {
+            if (result.nestedmessageRepeatedInt32_.Count == 0) {
+              result.nestedmessageRepeatedInt32_ = new scg::List<int>();
+            }
+            base.AddRange(values, result.nestedmessageRepeatedInt32_);
+            return this;
+          }
+          public Builder ClearNestedmessageRepeatedInt32() {
+            result.nestedmessageRepeatedInt32_ = pbc::Lists<int>.Empty;
+            return this;
+          }
+          
+          // repeated .protobuf_unittest.ForeignMessage nestedmessage_repeated_foreignmessage = 2;
+          public scg::IList<self::ForeignMessage> NestedmessageRepeatedForeignmessageList {
+            get { return pbc::Lists.AsReadOnly(result.nestedmessageRepeatedForeignmessage_); }
+          }
+          public int NestedmessageRepeatedForeignmessageCount {
+            get { return result.NestedmessageRepeatedForeignmessageCount; }
+          }
+          public self::ForeignMessage GetNestedmessageRepeatedForeignmessage(int index) {
+            return result.GetNestedmessageRepeatedForeignmessage(index);
+          }
+          public Builder SetNestedmessageRepeatedForeignmessage(int index, self::ForeignMessage value) {
+            result.nestedmessageRepeatedForeignmessage_[index] = value;
+            return this;
+          }
+          public Builder SetNestedmessageRepeatedForeignmessage(int index, self::ForeignMessage.Builder builderForValue) {
+            result.nestedmessageRepeatedForeignmessage_[index] = builderForValue.Build();
+            return this;
+          }
+          public Builder AddNestedmessageRepeatedForeignmessage(self::ForeignMessage value) {
+            if (result.nestedmessageRepeatedForeignmessage_ == pbc::Lists<self::ForeignMessage>.Empty) {
+              result.nestedmessageRepeatedForeignmessage_ = new scg::List<self::ForeignMessage>();
+            }
+            result.nestedmessageRepeatedForeignmessage_.Add(value);
+            return this;
+          }
+          public Builder AddNestedmessageRepeatedForeignmessage(self::ForeignMessage.Builder builderForValue) {
+            if (result.nestedmessageRepeatedForeignmessage_ == pbc::Lists<self::ForeignMessage>.Empty) {
+              result.nestedmessageRepeatedForeignmessage_ = new scg::List<self::ForeignMessage>();
+            }
+            result.nestedmessageRepeatedForeignmessage_.Add(builderForValue.Build());
+            return this;
+          }
+          public Builder AddRangeNestedmessageRepeatedForeignmessage(scg::IEnumerable<self::ForeignMessage> values) {
+            if (result.nestedmessageRepeatedForeignmessage_ == pbc::Lists<self::ForeignMessage>.Empty) {
+              result.nestedmessageRepeatedForeignmessage_ = new scg::List<self::ForeignMessage>();
+            }
+            base.AddRange(values, result.nestedmessageRepeatedForeignmessage_);
+            return this;
+          }
+          public Builder ClearNestedmessageRepeatedForeignmessage() {
+            result.nestedmessageRepeatedForeignmessage_ = pbc::Lists<self::ForeignMessage>.Empty;
+            return this;
+          }
+        }
+      }
+      
+    }
+    #endregion
+    
+    // optional .protobuf_unittest.TestNestedMessageHasBits.NestedMessage optional_nested_message = 1;
+    private bool hasOptionalNestedMessage;
+    private self::TestNestedMessageHasBits.Types.NestedMessage optionalNestedMessage_ = self::TestNestedMessageHasBits.Types.NestedMessage.DefaultInstance;
+    public bool HasOptionalNestedMessage {
+      get { return hasOptionalNestedMessage; }
+    }
+    public self::TestNestedMessageHasBits.Types.NestedMessage OptionalNestedMessage {
+      get { return optionalNestedMessage_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasOptionalNestedMessage) {
+        output.WriteMessage(1, OptionalNestedMessage);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasOptionalNestedMessage) {
+          size += pb::CodedOutputStream.ComputeMessageSize(1, OptionalNestedMessage);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestNestedMessageHasBits ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestNestedMessageHasBits ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestNestedMessageHasBits ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestNestedMessageHasBits parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestNestedMessageHasBits ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestNestedMessageHasBits ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestNestedMessageHasBits ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestNestedMessageHasBits ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestNestedMessageHasBits> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestNestedMessageHasBits prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestNestedMessageHasBits, Builder> {
+      // Construct using self::TestNestedMessageHasBits.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestNestedMessageHasBits result = new self::TestNestedMessageHasBits();
+      
+      protected override self::TestNestedMessageHasBits MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestNestedMessageHasBits> Clear() {
+        result = new self::TestNestedMessageHasBits();
+        return this;
+      }
+      
+      public override IBuilder<self::TestNestedMessageHasBits> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestNestedMessageHasBits.Descriptor; }
+      }
+      
+      public override self::TestNestedMessageHasBits DefaultInstanceForType {
+        get { return self::TestNestedMessageHasBits.DefaultInstance; }
+      }
+      
+      public override self::TestNestedMessageHasBits BuildPartial() {
+        self::TestNestedMessageHasBits returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestNestedMessageHasBits) {
+          return MergeFrom((self::TestNestedMessageHasBits) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestNestedMessageHasBits> MergeFrom(self::TestNestedMessageHasBits other) {
+        if (other == self::TestNestedMessageHasBits.DefaultInstance) return this;
+        if (other.HasOptionalNestedMessage) {
+          MergeOptionalNestedMessage(other.OptionalNestedMessage);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestNestedMessageHasBits> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestNestedMessageHasBits> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 10: {
+              self::TestNestedMessageHasBits.Types.NestedMessage.Builder subBuilder = self::TestNestedMessageHasBits.Types.NestedMessage.CreateBuilder();
+              if (HasOptionalNestedMessage) {
+                subBuilder.MergeFrom(OptionalNestedMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              OptionalNestedMessage = subBuilder.BuildPartial();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional .protobuf_unittest.TestNestedMessageHasBits.NestedMessage optional_nested_message = 1;
+      public bool HasOptionalNestedMessage {
+        get { return result.HasOptionalNestedMessage; }
+      }
+      public self::TestNestedMessageHasBits.Types.NestedMessage OptionalNestedMessage {
+        get { return result.OptionalNestedMessage; }
+        set { SetOptionalNestedMessage(value); }
+      }
+      public Builder SetOptionalNestedMessage(self::TestNestedMessageHasBits.Types.NestedMessage value) {
+        result.hasOptionalNestedMessage = true;
+        result.optionalNestedMessage_ = value;
+        return this;
+      }
+      public Builder SetOptionalNestedMessage(self::TestNestedMessageHasBits.Types.NestedMessage.Builder builderForValue) {
+        result.hasOptionalNestedMessage = true;
+        result.optionalNestedMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalNestedMessage(self::TestNestedMessageHasBits.Types.NestedMessage value) {
+        if (result.HasOptionalNestedMessage &&
+            result.optionalNestedMessage_ != self::TestNestedMessageHasBits.Types.NestedMessage.DefaultInstance) {
+          result.optionalNestedMessage_ =
+            self::TestNestedMessageHasBits.Types.NestedMessage.CreateBuilder(result.optionalNestedMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalNestedMessage_ = value;
+        }
+        result.hasOptionalNestedMessage = true;
+        return this;
+      }
+      public Builder ClearOptionalNestedMessage() {
+        result.hasOptionalNestedMessage = false;
+        result.optionalNestedMessage_ = self::TestNestedMessageHasBits.Types.NestedMessage.DefaultInstance;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class TestCamelCaseFieldNames : pb::GeneratedMessage<TestCamelCaseFieldNames, TestCamelCaseFieldNames.Builder> {
+    // Use TestCamelCaseFieldNames.CreateBuilder() to construct.
+    private TestCamelCaseFieldNames() {}
+    
+    private static readonly TestCamelCaseFieldNames defaultInstance = new TestCamelCaseFieldNames();
+    public static TestCamelCaseFieldNames DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestCamelCaseFieldNames DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestCamelCaseFieldNames__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestCamelCaseFieldNames__FieldAccessorTable; }
+    }
+    
+    // optional int32 PrimitiveField = 1;
+    private bool hasPrimitiveField;
+    private int primitiveField_ = 0;
+    public bool HasPrimitiveField {
+      get { return hasPrimitiveField; }
+    }
+    public int PrimitiveField {
+      get { return primitiveField_; }
+    }
+    
+    // optional string StringField = 2;
+    private bool hasStringField;
+    private string stringField_ = "";
+    public bool HasStringField {
+      get { return hasStringField; }
+    }
+    public string StringField {
+      get { return stringField_; }
+    }
+    
+    // optional .protobuf_unittest.ForeignEnum EnumField = 3;
+    private bool hasEnumField;
+    private self::ForeignEnum enumField_ = self::ForeignEnum.FOREIGN_FOO;
+    public bool HasEnumField {
+      get { return hasEnumField; }
+    }
+    public self::ForeignEnum EnumField {  get { return enumField_; }}
+    
+    // optional .protobuf_unittest.ForeignMessage MessageField = 4;
+    private bool hasMessageField;
+    private self::ForeignMessage messageField_ = self::ForeignMessage.DefaultInstance;
+    public bool HasMessageField {
+      get { return hasMessageField; }
+    }
+    public self::ForeignMessage MessageField {
+      get { return messageField_; }
+    }
+    
+    // optional string StringPieceField = 5 [ctype = STRING_PIECE];
+    private bool hasStringPieceField;
+    private string stringPieceField_ = "";
+    public bool HasStringPieceField {
+      get { return hasStringPieceField; }
+    }
+    public string StringPieceField {
+      get { return stringPieceField_; }
+    }
+    
+    // optional string CordField = 6 [ctype = CORD];
+    private bool hasCordField;
+    private string cordField_ = "";
+    public bool HasCordField {
+      get { return hasCordField; }
+    }
+    public string CordField {
+      get { return cordField_; }
+    }
+    
+    // repeated int32 RepeatedPrimitiveField = 7;
+    private scg::IList<int> repeatedPrimitiveField_ = pbc::Lists<int>.Empty;
+    public scg::IList<int> RepeatedPrimitiveFieldList {
+      get { return repeatedPrimitiveField_; }
+    }
+    public int RepeatedPrimitiveFieldCount {
+      get { return repeatedPrimitiveField_.Count; }
+    }
+    public int GetRepeatedPrimitiveField(int index) {
+      return repeatedPrimitiveField_[index];
+    }
+    
+    // repeated string RepeatedStringField = 8;
+    private scg::IList<string> repeatedStringField_ = pbc::Lists<string>.Empty;
+    public scg::IList<string> RepeatedStringFieldList {
+      get { return repeatedStringField_; }
+    }
+    public int RepeatedStringFieldCount {
+      get { return repeatedStringField_.Count; }
+    }
+    public string GetRepeatedStringField(int index) {
+      return repeatedStringField_[index];
+    }
+    
+    // repeated .protobuf_unittest.ForeignEnum RepeatedEnumField = 9;
+    private scg::IList<self::ForeignEnum> repeatedEnumField_ = new scg::List<self::ForeignEnum> ();
+    public scg.IList<self::ForeignEnum> RepeatedEnumFieldList {
+      get { return pbc::Lists.AsReadOnly(repeatedEnumField_); }
+    }
+    public int RepeatedEnumFieldCount {
+      get { return repeatedEnumField_.Count; }
+    }
+    public self::ForeignEnum GetRepeatedEnumField(int index) {
+      return repeatedEnumField_[index];
+    }
+    
+    // repeated .protobuf_unittest.ForeignMessage RepeatedMessageField = 10;
+    private scg::IList<self::ForeignMessage> repeatedMessageField_ = pbc::Lists<self::ForeignMessage>.Empty;
+    public scg::IList<self::ForeignMessage> RepeatedMessageFieldList {
+      get { return repeatedMessageField_; } 
+    }
+    public int RepeatedMessageFieldCount
+      { get { return repeatedMessageField_.Count; }
+    }
+    public self::ForeignMessage GetRepeatedMessageField(int index) {
+      return repeatedMessageField_ [index];
+    }
+    
+    // repeated string RepeatedStringPieceField = 11 [ctype = STRING_PIECE];
+    private scg::IList<string> repeatedStringPieceField_ = pbc::Lists<string>.Empty;
+    public scg::IList<string> RepeatedStringPieceFieldList {
+      get { return repeatedStringPieceField_; }
+    }
+    public int RepeatedStringPieceFieldCount {
+      get { return repeatedStringPieceField_.Count; }
+    }
+    public string GetRepeatedStringPieceField(int index) {
+      return repeatedStringPieceField_[index];
+    }
+    
+    // repeated string RepeatedCordField = 12 [ctype = CORD];
+    private scg::IList<string> repeatedCordField_ = pbc::Lists<string>.Empty;
+    public scg::IList<string> RepeatedCordFieldList {
+      get { return repeatedCordField_; }
+    }
+    public int RepeatedCordFieldCount {
+      get { return repeatedCordField_.Count; }
+    }
+    public string GetRepeatedCordField(int index) {
+      return repeatedCordField_[index];
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasPrimitiveField) {
+        output.WriteInt32(1, PrimitiveField);
+      }
+      if (HasStringField) {
+        output.WriteString(2, StringField);
+      }
+      if (HasEnumField) {
+        output.WriteEnum(3, (int) EnumField);
+      }
+      if (HasMessageField) {
+        output.WriteMessage(4, MessageField);
+      }
+      if (HasStringPieceField) {
+        output.WriteString(5, StringPieceField);
+      }
+      if (HasCordField) {
+        output.WriteString(6, CordField);
+      }
+      foreach (int element in RepeatedPrimitiveFieldList) {
+        output.WriteInt32(7, element);
+      }
+      foreach (string element in RepeatedStringFieldList) {
+        output.WriteString(8, element);
+      }
+      foreach (self::ForeignEnum element in RepeatedEnumFieldList) {
+        output.WriteEnum(9, (int) element);
+      }
+      foreach (self::ForeignMessage element in RepeatedMessageFieldList) {
+        output.WriteMessage(10, element);
+      }
+      foreach (string element in RepeatedStringPieceFieldList) {
+        output.WriteString(11, element);
+      }
+      foreach (string element in RepeatedCordFieldList) {
+        output.WriteString(12, element);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasPrimitiveField) {
+          size += pb::CodedOutputStream.ComputeInt32Size(1, PrimitiveField);
+        }
+        if (HasStringField) {
+          size += pb::CodedOutputStream.ComputeStringSize(2, StringField);
+        }
+        if (HasEnumField) {
+          size += pb::CodedOutputStream
+            .ComputeEnumSize(3, (int) EnumField);
+        }
+        if (HasMessageField) {
+          size += pb::CodedOutputStream.ComputeMessageSize(4, MessageField);
+        }
+        if (HasStringPieceField) {
+          size += pb::CodedOutputStream.ComputeStringSize(5, StringPieceField);
+        }
+        if (HasCordField) {
+          size += pb::CodedOutputStream.ComputeStringSize(6, CordField);
+        }
+        foreach (int element in RepeatedPrimitiveFieldList) {
+          size += pb::CodedOutputStream
+            .ComputeInt32Size(7, element);
+        }
+        foreach (string element in RepeatedStringFieldList) {
+          size += pb::CodedOutputStream
+            .ComputeStringSize(8, element);
+        }
+        foreach (self::ForeignEnum element in RepeatedEnumFieldList) {
+          size += pb::CodedOutputStream
+            .ComputeEnumSize(9, (int) element);
+        }
+        foreach (self::ForeignMessage element in RepeatedMessageFieldList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(10, element);
+        }
+        foreach (string element in RepeatedStringPieceFieldList) {
+          size += pb::CodedOutputStream
+            .ComputeStringSize(11, element);
+        }
+        foreach (string element in RepeatedCordFieldList) {
+          size += pb::CodedOutputStream
+            .ComputeStringSize(12, element);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestCamelCaseFieldNames ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestCamelCaseFieldNames ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestCamelCaseFieldNames ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestCamelCaseFieldNames parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestCamelCaseFieldNames ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestCamelCaseFieldNames ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestCamelCaseFieldNames ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestCamelCaseFieldNames ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestCamelCaseFieldNames> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestCamelCaseFieldNames prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestCamelCaseFieldNames, Builder> {
+      // Construct using self::TestCamelCaseFieldNames.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestCamelCaseFieldNames result = new self::TestCamelCaseFieldNames();
+      
+      protected override self::TestCamelCaseFieldNames MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestCamelCaseFieldNames> Clear() {
+        result = new self::TestCamelCaseFieldNames();
+        return this;
+      }
+      
+      public override IBuilder<self::TestCamelCaseFieldNames> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestCamelCaseFieldNames.Descriptor; }
+      }
+      
+      public override self::TestCamelCaseFieldNames DefaultInstanceForType {
+        get { return self::TestCamelCaseFieldNames.DefaultInstance; }
+      }
+      
+      public override self::TestCamelCaseFieldNames BuildPartial() {
+        result.repeatedPrimitiveField_ = pbc::Lists<int>.AsReadOnly(result.repeatedPrimitiveField_);
+        result.repeatedStringField_ = pbc::Lists<string>.AsReadOnly(result.repeatedStringField_);
+        result.repeatedEnumField_ = pbc::Lists.AsReadOnly(result.repeatedEnumField_);
+        if (result.repeatedMessageField_ != pbc::Lists<self::ForeignMessage>.Empty) {
+          result.repeatedMessageField_ = pbc::Lists<self::ForeignMessage>.AsReadOnly(result.repeatedMessageField_);
+        }
+        result.repeatedStringPieceField_ = pbc::Lists<string>.AsReadOnly(result.repeatedStringPieceField_);
+        result.repeatedCordField_ = pbc::Lists<string>.AsReadOnly(result.repeatedCordField_);
+        self::TestCamelCaseFieldNames returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestCamelCaseFieldNames) {
+          return MergeFrom((self::TestCamelCaseFieldNames) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestCamelCaseFieldNames> MergeFrom(self::TestCamelCaseFieldNames other) {
+        if (other == self::TestCamelCaseFieldNames.DefaultInstance) return this;
+        if (other.HasPrimitiveField) {
+          PrimitiveField = other.PrimitiveField;
+        }
+        if (other.HasStringField) {
+          StringField = other.StringField;
+        }
+        if (other.HasEnumField) {
+          EnumField = other.EnumField;
+        }
+        if (other.HasMessageField) {
+          MergeMessageField(other.MessageField);
+        }
+        if (other.HasStringPieceField) {
+          StringPieceField = other.StringPieceField;
+        }
+        if (other.HasCordField) {
+          CordField = other.CordField;
+        }
+        if (other.repeatedPrimitiveField_.Count != 0) {
+          if (result.repeatedPrimitiveField_.Count == 0) {
+            result.repeatedPrimitiveField_ = new scg::List<int>();
+          }
+          base.AddRange(other.repeatedPrimitiveField_, result.repeatedPrimitiveField_);
+        }
+        if (other.repeatedStringField_.Count != 0) {
+          if (result.repeatedStringField_.Count == 0) {
+            result.repeatedStringField_ = new scg::List<string>();
+          }
+          base.AddRange(other.repeatedStringField_, result.repeatedStringField_);
+        }
+        if (other.repeatedEnumField_.Count != 0) {
+          if (result.repeatedEnumField_.Count == 0) {
+            result.repeatedEnumField_ = new scg::List<self::ForeignEnum>();
+          }
+          base.AddRange(other.repeatedEnumField_, result.repeatedEnumField_);
+        }
+        if (other.repeatedMessageField_.Count != 0) {
+          if (result.repeatedMessageField_.Count == 0) {
+            result.repeatedMessageField_ = new scg::List<self::ForeignMessage>();
+          }
+          base.AddRange(other.repeatedMessageField_, result.repeatedMessageField_);
+        }
+        if (other.repeatedStringPieceField_.Count != 0) {
+          if (result.repeatedStringPieceField_.Count == 0) {
+            result.repeatedStringPieceField_ = new scg::List<string>();
+          }
+          base.AddRange(other.repeatedStringPieceField_, result.repeatedStringPieceField_);
+        }
+        if (other.repeatedCordField_.Count != 0) {
+          if (result.repeatedCordField_.Count == 0) {
+            result.repeatedCordField_ = new scg::List<string>();
+          }
+          base.AddRange(other.repeatedCordField_, result.repeatedCordField_);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestCamelCaseFieldNames> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestCamelCaseFieldNames> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 8: {
+              PrimitiveField = input.ReadInt32();
+              break;
+            }
+            case 18: {
+              StringField = input.ReadString();
+              break;
+            }
+            case 24: {
+              int rawValue = input.ReadEnum();
+              if (!global::System.Enum.IsDefined(typeof(self::ForeignEnum), rawValue)) {
+                unknownFields.MergeVarintField(3, (ulong) rawValue);
+              } else {
+                EnumField = (self::ForeignEnum) rawValue;
+              }
+              break;
+            }
+            case 34: {
+              self::ForeignMessage.Builder subBuilder = self::ForeignMessage.CreateBuilder();
+              if (HasMessageField) {
+                subBuilder.MergeFrom(MessageField);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              MessageField = subBuilder.BuildPartial();
+              break;
+            }
+            case 42: {
+              StringPieceField = input.ReadString();
+              break;
+            }
+            case 50: {
+              CordField = input.ReadString();
+              break;
+            }
+            case 56: {
+              AddRepeatedPrimitiveField(input.ReadInt32());
+              break;
+            }
+            case 66: {
+              AddRepeatedStringField(input.ReadString());
+              break;
+            }
+            case 72: {
+              int rawValue = input.ReadEnum();
+              self::ForeignEnum value = (self::ForeignEnum) rawValue;
+              if (!global::System.Enum.IsDefined(typeof(self::ForeignEnum), value)) {
+                unknownFields.MergeVarintField(9, (ulong) rawValue);
+              } else {
+                AddRepeatedEnumField(value);
+              }
+              break;
+            }
+            case 82: {
+              self::ForeignMessage.Builder subBuilder = self::ForeignMessage.CreateBuilder();
+              input.ReadMessage(subBuilder, extensionRegistry);
+              AddRepeatedMessageField(subBuilder.BuildPartial());
+              break;
+            }
+            case 90: {
+              AddRepeatedStringPieceField(input.ReadString());
+              break;
+            }
+            case 98: {
+              AddRepeatedCordField(input.ReadString());
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional int32 PrimitiveField = 1;
+      public bool HasPrimitiveField {
+        get { return result.HasPrimitiveField; }
+      }
+      public int PrimitiveField {
+        get { return result.PrimitiveField; }
+        set { SetPrimitiveField(value); }
+      }
+      public Builder SetPrimitiveField(int value) {
+        result.hasPrimitiveField = true;
+        result.primitiveField_ = value;
+        return this;
+      }
+      public Builder ClearPrimitiveField() {
+        result.hasPrimitiveField = false;
+        result.primitiveField_ = 0;
+        return this;
+      }
+      
+      // optional string StringField = 2;
+      public bool HasStringField {
+        get { return result.HasStringField; }
+      }
+      public string StringField {
+        get { return result.StringField; }
+        set { SetStringField(value); }
+      }
+      public Builder SetStringField(string value) {
+        result.hasStringField = true;
+        result.stringField_ = value;
+        return this;
+      }
+      public Builder ClearStringField() {
+        result.hasStringField = false;
+        result.stringField_ = "";
+        return this;
+      }
+      
+      // optional .protobuf_unittest.ForeignEnum EnumField = 3;
+      public bool HasEnumField {
+        get { return result.HasEnumField; }
+      }
+      public self::ForeignEnum EnumField {
+        get { return result.EnumField; }
+        set { SetEnumField(value); }
+      }
+      public Builder SetEnumField(self::ForeignEnum value) {
+        result.hasEnumField = true;
+        result.enumField_ = value;
+        return this;
+      }
+      public Builder ClearEnumField() {
+        result.hasEnumField = false;
+        result.enumField_ = self::ForeignEnum.FOREIGN_FOO;
+        return this;
+      }
+      
+      // optional .protobuf_unittest.ForeignMessage MessageField = 4;
+      public bool HasMessageField {
+        get { return result.HasMessageField; }
+      }
+      public self::ForeignMessage MessageField {
+        get { return result.MessageField; }
+        set { SetMessageField(value); }
+      }
+      public Builder SetMessageField(self::ForeignMessage value) {
+        result.hasMessageField = true;
+        result.messageField_ = value;
+        return this;
+      }
+      public Builder SetMessageField(self::ForeignMessage.Builder builderForValue) {
+        result.hasMessageField = true;
+        result.messageField_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeMessageField(self::ForeignMessage value) {
+        if (result.HasMessageField &&
+            result.messageField_ != self::ForeignMessage.DefaultInstance) {
+          result.messageField_ =
+            self::ForeignMessage.CreateBuilder(result.messageField_).MergeFrom(value).BuildPartial();
+        } else {
+          result.messageField_ = value;
+        }
+        result.hasMessageField = true;
+        return this;
+      }
+      public Builder ClearMessageField() {
+        result.hasMessageField = false;
+        result.messageField_ = self::ForeignMessage.DefaultInstance;
+        return this;
+      }
+      
+      // optional string StringPieceField = 5 [ctype = STRING_PIECE];
+      public bool HasStringPieceField {
+        get { return result.HasStringPieceField; }
+      }
+      public string StringPieceField {
+        get { return result.StringPieceField; }
+        set { SetStringPieceField(value); }
+      }
+      public Builder SetStringPieceField(string value) {
+        result.hasStringPieceField = true;
+        result.stringPieceField_ = value;
+        return this;
+      }
+      public Builder ClearStringPieceField() {
+        result.hasStringPieceField = false;
+        result.stringPieceField_ = "";
+        return this;
+      }
+      
+      // optional string CordField = 6 [ctype = CORD];
+      public bool HasCordField {
+        get { return result.HasCordField; }
+      }
+      public string CordField {
+        get { return result.CordField; }
+        set { SetCordField(value); }
+      }
+      public Builder SetCordField(string value) {
+        result.hasCordField = true;
+        result.cordField_ = value;
+        return this;
+      }
+      public Builder ClearCordField() {
+        result.hasCordField = false;
+        result.cordField_ = "";
+        return this;
+      }
+      
+      // repeated int32 RepeatedPrimitiveField = 7;
+      public scg::IList<int> RepeatedPrimitiveFieldList {
+        get { return pbc::Lists<int>.AsReadOnly(result.repeatedPrimitiveField_); }
+      }
+      public int RepeatedPrimitiveFieldCount {
+        get { return result.RepeatedPrimitiveFieldCount; }
+      }
+      public int GetRepeatedPrimitiveField(int index) {
+        return result.GetRepeatedPrimitiveField(index);
+      }
+      public Builder SetRepeatedPrimitiveField(int index, int value) {
+        result.repeatedPrimitiveField_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedPrimitiveField(int value) {
+        if (result.repeatedPrimitiveField_.Count == 0) {
+          result.repeatedPrimitiveField_ = new scg::List<int>();
+        }
+        result.repeatedPrimitiveField_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedPrimitiveField(scg::IEnumerable<int> values) {
+        if (result.repeatedPrimitiveField_.Count == 0) {
+          result.repeatedPrimitiveField_ = new scg::List<int>();
+        }
+        base.AddRange(values, result.repeatedPrimitiveField_);
+        return this;
+      }
+      public Builder ClearRepeatedPrimitiveField() {
+        result.repeatedPrimitiveField_ = pbc::Lists<int>.Empty;
+        return this;
+      }
+      
+      // repeated string RepeatedStringField = 8;
+      public scg::IList<string> RepeatedStringFieldList {
+        get { return pbc::Lists<string>.AsReadOnly(result.repeatedStringField_); }
+      }
+      public int RepeatedStringFieldCount {
+        get { return result.RepeatedStringFieldCount; }
+      }
+      public string GetRepeatedStringField(int index) {
+        return result.GetRepeatedStringField(index);
+      }
+      public Builder SetRepeatedStringField(int index, string value) {
+        result.repeatedStringField_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedStringField(string value) {
+        if (result.repeatedStringField_.Count == 0) {
+          result.repeatedStringField_ = new scg::List<string>();
+        }
+        result.repeatedStringField_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedStringField(scg::IEnumerable<string> values) {
+        if (result.repeatedStringField_.Count == 0) {
+          result.repeatedStringField_ = new scg::List<string>();
+        }
+        base.AddRange(values, result.repeatedStringField_);
+        return this;
+      }
+      public Builder ClearRepeatedStringField() {
+        result.repeatedStringField_ = pbc::Lists<string>.Empty;
+        return this;
+      }
+      
+      // repeated .protobuf_unittest.ForeignEnum RepeatedEnumField = 9;
+      public scg::IList<self::ForeignEnum> RepeatedEnumFieldList {
+        get { return pbc::Lists.AsReadOnly(result.repeatedEnumField_); }
+      }
+      public int RepeatedEnumFieldCount {
+        get { return result.RepeatedEnumFieldCount; } 
+      }
+      public self::ForeignEnum GetRepeatedEnumField(int index) {
+        return result.GetRepeatedEnumField(index);
+      }
+      public Builder SetRepeatedEnumField(int index, self::ForeignEnum value) {
+        result.repeatedEnumField_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedEnumField(self::ForeignEnum value) {
+        if (result.repeatedEnumField_.Count == 0) {
+          result.repeatedEnumField_ = new scg::List<self::ForeignEnum>();
+        }
+        result.repeatedEnumField_.Add(value);
+        return this;
+      }
+      public Builder AddAllRepeatedEnumField(scg::IEnumerable<self::ForeignEnum> values) {
+        if (result.repeatedEnumField_.Count == 0) {
+          result.repeatedEnumField_ = new scg::List<self::ForeignEnum>();
+        }
+        base.AddRange(values, result.repeatedEnumField_);
+        return this;
+      }
+      public Builder ClearRepeatedEnumField() {
+        result.repeatedEnumField_ = pbc::Lists<self::ForeignEnum>.Empty;
+        return this;
+      }
+      
+      // repeated .protobuf_unittest.ForeignMessage RepeatedMessageField = 10;
+      public scg::IList<self::ForeignMessage> RepeatedMessageFieldList {
+        get { return pbc::Lists.AsReadOnly(result.repeatedMessageField_); }
+      }
+      public int RepeatedMessageFieldCount {
+        get { return result.RepeatedMessageFieldCount; }
+      }
+      public self::ForeignMessage GetRepeatedMessageField(int index) {
+        return result.GetRepeatedMessageField(index);
+      }
+      public Builder SetRepeatedMessageField(int index, self::ForeignMessage value) {
+        result.repeatedMessageField_[index] = value;
+        return this;
+      }
+      public Builder SetRepeatedMessageField(int index, self::ForeignMessage.Builder builderForValue) {
+        result.repeatedMessageField_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRepeatedMessageField(self::ForeignMessage value) {
+        if (result.repeatedMessageField_ == pbc::Lists<self::ForeignMessage>.Empty) {
+          result.repeatedMessageField_ = new scg::List<self::ForeignMessage>();
+        }
+        result.repeatedMessageField_.Add(value);
+        return this;
+      }
+      public Builder AddRepeatedMessageField(self::ForeignMessage.Builder builderForValue) {
+        if (result.repeatedMessageField_ == pbc::Lists<self::ForeignMessage>.Empty) {
+          result.repeatedMessageField_ = new scg::List<self::ForeignMessage>();
+        }
+        result.repeatedMessageField_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRepeatedMessageField(scg::IEnumerable<self::ForeignMessage> values) {
+        if (result.repeatedMessageField_ == pbc::Lists<self::ForeignMessage>.Empty) {
+          result.repeatedMessageField_ = new scg::List<self::ForeignMessage>();
+        }
+        base.AddRange(values, result.repeatedMessageField_);
+        return this;
+      }
+      public Builder ClearRepeatedMessageField() {
+        result.repeatedMessageField_ = pbc::Lists<self::ForeignMessage>.Empty;
+        return this;
+      }
+      
+      // repeated string RepeatedStringPieceField = 11 [ctype = STRING_PIECE];
+      public scg::IList<string> RepeatedStringPieceFieldList {
+        get { return pbc::Lists<string>.AsReadOnly(result.repeatedStringPieceField_); }
+      }
+      public int RepeatedStringPieceFieldCount {
+        get { return result.RepeatedStringPieceFieldCount; }
+      }
+      public string GetRepeatedStringPieceField(int index) {
+        return result.GetRepeatedStringPieceField(index);
+      }
+      public Builder SetRepeatedStringPieceField(int index, string value) {
+        result.repeatedStringPieceField_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedStringPieceField(string value) {
+        if (result.repeatedStringPieceField_.Count == 0) {
+          result.repeatedStringPieceField_ = new scg::List<string>();
+        }
+        result.repeatedStringPieceField_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedStringPieceField(scg::IEnumerable<string> values) {
+        if (result.repeatedStringPieceField_.Count == 0) {
+          result.repeatedStringPieceField_ = new scg::List<string>();
+        }
+        base.AddRange(values, result.repeatedStringPieceField_);
+        return this;
+      }
+      public Builder ClearRepeatedStringPieceField() {
+        result.repeatedStringPieceField_ = pbc::Lists<string>.Empty;
+        return this;
+      }
+      
+      // repeated string RepeatedCordField = 12 [ctype = CORD];
+      public scg::IList<string> RepeatedCordFieldList {
+        get { return pbc::Lists<string>.AsReadOnly(result.repeatedCordField_); }
+      }
+      public int RepeatedCordFieldCount {
+        get { return result.RepeatedCordFieldCount; }
+      }
+      public string GetRepeatedCordField(int index) {
+        return result.GetRepeatedCordField(index);
+      }
+      public Builder SetRepeatedCordField(int index, string value) {
+        result.repeatedCordField_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedCordField(string value) {
+        if (result.repeatedCordField_.Count == 0) {
+          result.repeatedCordField_ = new scg::List<string>();
+        }
+        result.repeatedCordField_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedCordField(scg::IEnumerable<string> values) {
+        if (result.repeatedCordField_.Count == 0) {
+          result.repeatedCordField_ = new scg::List<string>();
+        }
+        base.AddRange(values, result.repeatedCordField_);
+        return this;
+      }
+      public Builder ClearRepeatedCordField() {
+        result.repeatedCordField_ = pbc::Lists<string>.Empty;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class TestFieldOrderings : pb::ExtendableMessage<TestFieldOrderings, TestFieldOrderings.Builder> {
+    // Use TestFieldOrderings.CreateBuilder() to construct.
+    private TestFieldOrderings() {}
+    
+    private static readonly TestFieldOrderings defaultInstance = new TestFieldOrderings();
+    public static TestFieldOrderings DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestFieldOrderings DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestFieldOrderings__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestFieldOrderings__FieldAccessorTable; }
+    }
+    
+    // optional string my_string = 11;
+    private bool hasMyString;
+    private string myString_ = "";
+    public bool HasMyString {
+      get { return hasMyString; }
+    }
+    public string MyString {
+      get { return myString_; }
+    }
+    
+    // optional int64 my_int = 1;
+    private bool hasMyInt;
+    private long myInt_ = 0L;
+    public bool HasMyInt {
+      get { return hasMyInt; }
+    }
+    public long MyInt {
+      get { return myInt_; }
+    }
+    
+    // optional float my_float = 101;
+    private bool hasMyFloat;
+    private float myFloat_ = 0F;
+    public bool HasMyFloat {
+      get { return hasMyFloat; }
+    }
+    public float MyFloat {
+      get { return myFloat_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (!ExtensionsAreInitialized) return false;
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      pb::ExtendableMessage<TestFieldOrderings, TestFieldOrderings.Builder>.ExtensionWriter extensionWriter = CreateExtensionWriter(this);
+      if (HasMyInt) {
+        output.WriteInt64(1, MyInt);
+      }
+      extensionWriter.WriteUntil(11, output);
+      if (HasMyString) {
+        output.WriteString(11, MyString);
+      }
+      extensionWriter.WriteUntil(101, output);
+      if (HasMyFloat) {
+        output.WriteFloat(101, MyFloat);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasMyInt) {
+          size += pb::CodedOutputStream.ComputeInt64Size(1, MyInt);
+        }
+        if (HasMyString) {
+          size += pb::CodedOutputStream.ComputeStringSize(11, MyString);
+        }
+        if (HasMyFloat) {
+          size += pb::CodedOutputStream.ComputeFloatSize(101, MyFloat);
+        }
+        size += ExtensionsSerializedSize;
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestFieldOrderings ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestFieldOrderings ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestFieldOrderings ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestFieldOrderings parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestFieldOrderings ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestFieldOrderings ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestFieldOrderings ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestFieldOrderings ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestFieldOrderings> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestFieldOrderings prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestFieldOrderings, self::TestFieldOrderings.Builder>.ExtendableBuilder {
+      // Construct using self::TestFieldOrderings.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestFieldOrderings result = new self::TestFieldOrderings();
+      
+      protected override self::TestFieldOrderings MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestFieldOrderings> Clear() {
+        result = new self::TestFieldOrderings();
+        return this;
+      }
+      
+      public override IBuilder<self::TestFieldOrderings> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestFieldOrderings.Descriptor; }
+      }
+      
+      public override self::TestFieldOrderings DefaultInstanceForType {
+        get { return self::TestFieldOrderings.DefaultInstance; }
+      }
+      
+      public override self::TestFieldOrderings BuildPartial() {
+        self::TestFieldOrderings returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestFieldOrderings) {
+          return MergeFrom((self::TestFieldOrderings) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestFieldOrderings> MergeFrom(self::TestFieldOrderings other) {
+        if (other == self::TestFieldOrderings.DefaultInstance) return this;
+        if (other.HasMyString) {
+          MyString = other.MyString;
+        }
+        if (other.HasMyInt) {
+          MyInt = other.MyInt;
+        }
+        if (other.HasMyFloat) {
+          MyFloat = other.MyFloat;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestFieldOrderings> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestFieldOrderings> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 8: {
+              MyInt = input.ReadInt64();
+              break;
+            }
+            case 90: {
+              MyString = input.ReadString();
+              break;
+            }
+            case 813: {
+              MyFloat = input.ReadFloat();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional string my_string = 11;
+      public bool HasMyString {
+        get { return result.HasMyString; }
+      }
+      public string MyString {
+        get { return result.MyString; }
+        set { SetMyString(value); }
+      }
+      public Builder SetMyString(string value) {
+        result.hasMyString = true;
+        result.myString_ = value;
+        return this;
+      }
+      public Builder ClearMyString() {
+        result.hasMyString = false;
+        result.myString_ = "";
+        return this;
+      }
+      
+      // optional int64 my_int = 1;
+      public bool HasMyInt {
+        get { return result.HasMyInt; }
+      }
+      public long MyInt {
+        get { return result.MyInt; }
+        set { SetMyInt(value); }
+      }
+      public Builder SetMyInt(long value) {
+        result.hasMyInt = true;
+        result.myInt_ = value;
+        return this;
+      }
+      public Builder ClearMyInt() {
+        result.hasMyInt = false;
+        result.myInt_ = 0L;
+        return this;
+      }
+      
+      // optional float my_float = 101;
+      public bool HasMyFloat {
+        get { return result.HasMyFloat; }
+      }
+      public float MyFloat {
+        get { return result.MyFloat; }
+        set { SetMyFloat(value); }
+      }
+      public Builder SetMyFloat(float value) {
+        result.hasMyFloat = true;
+        result.myFloat_ = value;
+        return this;
+      }
+      public Builder ClearMyFloat() {
+        result.hasMyFloat = false;
+        result.myFloat_ = 0F;
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class TestExtremeDefaultValues : pb::GeneratedMessage<TestExtremeDefaultValues, TestExtremeDefaultValues.Builder> {
+    // Use TestExtremeDefaultValues.CreateBuilder() to construct.
+    private TestExtremeDefaultValues() {}
+    
+    private static readonly TestExtremeDefaultValues defaultInstance = new TestExtremeDefaultValues();
+    public static TestExtremeDefaultValues DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestExtremeDefaultValues DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestExtremeDefaultValues__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_TestExtremeDefaultValues__FieldAccessorTable; }
+    }
+    
+    // optional bytes escaped_bytes = 1 [default = "\000\001\007\010\014\n\r\t\013\\\'\"\376"];
+    private bool hasEscapedBytes;
+    private pb::ByteString escapedBytes_ = ((pb::ByteString) self::TestExtremeDefaultValues.Descriptor.Fields[0].DefaultValue);
+    public bool HasEscapedBytes {
+      get { return hasEscapedBytes; }
+    }
+    public pb::ByteString EscapedBytes {
+      get { return escapedBytes_; }
+    }
+    
+    // optional uint32 large_uint32 = 2 [default = 4294967295];
+    private bool hasLargeUint32;
+    private uint largeUint32_ = 4294967295;
+    public bool HasLargeUint32 {
+      get { return hasLargeUint32; }
+    }
+    public uint LargeUint32 {
+      get { return largeUint32_; }
+    }
+    
+    // optional uint64 large_uint64 = 3 [default = 18446744073709551615];
+    private bool hasLargeUint64;
+    private ulong largeUint64_ = 18446744073709551615UL;
+    public bool HasLargeUint64 {
+      get { return hasLargeUint64; }
+    }
+    public ulong LargeUint64 {
+      get { return largeUint64_; }
+    }
+    
+    // optional int32 small_int32 = 4 [default = -2147483647];
+    private bool hasSmallInt32;
+    private int smallInt32_ = -2147483647;
+    public bool HasSmallInt32 {
+      get { return hasSmallInt32; }
+    }
+    public int SmallInt32 {
+      get { return smallInt32_; }
+    }
+    
+    // optional int64 small_int64 = 5 [default = -9223372036854775807];
+    private bool hasSmallInt64;
+    private long smallInt64_ = -9223372036854775807L;
+    public bool HasSmallInt64 {
+      get { return hasSmallInt64; }
+    }
+    public long SmallInt64 {
+      get { return smallInt64_; }
+    }
+    
+    // optional string utf8_string = 6 [default = "\341\210\264"];
+    private bool hasUtf8String;
+    private string utf8String_ = ((string) self::TestExtremeDefaultValues.Descriptor.Fields[5].DefaultValue);
+    public bool HasUtf8String {
+      get { return hasUtf8String; }
+    }
+    public string Utf8String {
+      get { return utf8String_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      if (HasEscapedBytes) {
+        output.WriteBytes(1, EscapedBytes);
+      }
+      if (HasLargeUint32) {
+        output.WriteUInt32(2, LargeUint32);
+      }
+      if (HasLargeUint64) {
+        output.WriteUInt64(3, LargeUint64);
+      }
+      if (HasSmallInt32) {
+        output.WriteInt32(4, SmallInt32);
+      }
+      if (HasSmallInt64) {
+        output.WriteInt64(5, SmallInt64);
+      }
+      if (HasUtf8String) {
+        output.WriteString(6, Utf8String);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasEscapedBytes) {
+          size += pb::CodedOutputStream.ComputeBytesSize(1, EscapedBytes);
+        }
+        if (HasLargeUint32) {
+          size += pb::CodedOutputStream.ComputeUInt32Size(2, LargeUint32);
+        }
+        if (HasLargeUint64) {
+          size += pb::CodedOutputStream.ComputeUInt64Size(3, LargeUint64);
+        }
+        if (HasSmallInt32) {
+          size += pb::CodedOutputStream.ComputeInt32Size(4, SmallInt32);
+        }
+        if (HasSmallInt64) {
+          size += pb::CodedOutputStream.ComputeInt64Size(5, SmallInt64);
+        }
+        if (HasUtf8String) {
+          size += pb::CodedOutputStream.ComputeStringSize(6, Utf8String);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::TestExtremeDefaultValues ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestExtremeDefaultValues ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestExtremeDefaultValues ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::TestExtremeDefaultValues parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestExtremeDefaultValues ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestExtremeDefaultValues ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::TestExtremeDefaultValues ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::TestExtremeDefaultValues ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::TestExtremeDefaultValues> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::TestExtremeDefaultValues prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::TestExtremeDefaultValues, Builder> {
+      // Construct using self::TestExtremeDefaultValues.CreateBuilder()
+      internal Builder() {}
+      
+      self::TestExtremeDefaultValues result = new self::TestExtremeDefaultValues();
+      
+      protected override self::TestExtremeDefaultValues MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::TestExtremeDefaultValues> Clear() {
+        result = new self::TestExtremeDefaultValues();
+        return this;
+      }
+      
+      public override IBuilder<self::TestExtremeDefaultValues> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::TestExtremeDefaultValues.Descriptor; }
+      }
+      
+      public override self::TestExtremeDefaultValues DefaultInstanceForType {
+        get { return self::TestExtremeDefaultValues.DefaultInstance; }
+      }
+      
+      public override self::TestExtremeDefaultValues BuildPartial() {
+        self::TestExtremeDefaultValues returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::TestExtremeDefaultValues) {
+          return MergeFrom((self::TestExtremeDefaultValues) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::TestExtremeDefaultValues> MergeFrom(self::TestExtremeDefaultValues other) {
+        if (other == self::TestExtremeDefaultValues.DefaultInstance) return this;
+        if (other.HasEscapedBytes) {
+          EscapedBytes = other.EscapedBytes;
+        }
+        if (other.HasLargeUint32) {
+          LargeUint32 = other.LargeUint32;
+        }
+        if (other.HasLargeUint64) {
+          LargeUint64 = other.LargeUint64;
+        }
+        if (other.HasSmallInt32) {
+          SmallInt32 = other.SmallInt32;
+        }
+        if (other.HasSmallInt64) {
+          SmallInt64 = other.SmallInt64;
+        }
+        if (other.HasUtf8String) {
+          Utf8String = other.Utf8String;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::TestExtremeDefaultValues> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::TestExtremeDefaultValues> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+            case 10: {
+              EscapedBytes = input.ReadBytes();
+              break;
+            }
+            case 16: {
+              LargeUint32 = input.ReadUInt32();
+              break;
+            }
+            case 24: {
+              LargeUint64 = input.ReadUInt64();
+              break;
+            }
+            case 32: {
+              SmallInt32 = input.ReadInt32();
+              break;
+            }
+            case 40: {
+              SmallInt64 = input.ReadInt64();
+              break;
+            }
+            case 50: {
+              Utf8String = input.ReadString();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // optional bytes escaped_bytes = 1 [default = "\000\001\007\010\014\n\r\t\013\\\'\"\376"];
+      public bool HasEscapedBytes {
+        get { return result.HasEscapedBytes; }
+      }
+      public pb::ByteString EscapedBytes {
+        get { return result.EscapedBytes; }
+        set { SetEscapedBytes(value); }
+      }
+      public Builder SetEscapedBytes(pb::ByteString value) {
+        result.hasEscapedBytes = true;
+        result.escapedBytes_ = value;
+        return this;
+      }
+      public Builder ClearEscapedBytes() {
+        result.hasEscapedBytes = false;
+        result.escapedBytes_ = ((pb::ByteString) self::TestExtremeDefaultValues.Descriptor.Fields[0].DefaultValue);
+        return this;
+      }
+      
+      // optional uint32 large_uint32 = 2 [default = 4294967295];
+      public bool HasLargeUint32 {
+        get { return result.HasLargeUint32; }
+      }
+      public uint LargeUint32 {
+        get { return result.LargeUint32; }
+        set { SetLargeUint32(value); }
+      }
+      public Builder SetLargeUint32(uint value) {
+        result.hasLargeUint32 = true;
+        result.largeUint32_ = value;
+        return this;
+      }
+      public Builder ClearLargeUint32() {
+        result.hasLargeUint32 = false;
+        result.largeUint32_ = 4294967295;
+        return this;
+      }
+      
+      // optional uint64 large_uint64 = 3 [default = 18446744073709551615];
+      public bool HasLargeUint64 {
+        get { return result.HasLargeUint64; }
+      }
+      public ulong LargeUint64 {
+        get { return result.LargeUint64; }
+        set { SetLargeUint64(value); }
+      }
+      public Builder SetLargeUint64(ulong value) {
+        result.hasLargeUint64 = true;
+        result.largeUint64_ = value;
+        return this;
+      }
+      public Builder ClearLargeUint64() {
+        result.hasLargeUint64 = false;
+        result.largeUint64_ = 18446744073709551615UL;
+        return this;
+      }
+      
+      // optional int32 small_int32 = 4 [default = -2147483647];
+      public bool HasSmallInt32 {
+        get { return result.HasSmallInt32; }
+      }
+      public int SmallInt32 {
+        get { return result.SmallInt32; }
+        set { SetSmallInt32(value); }
+      }
+      public Builder SetSmallInt32(int value) {
+        result.hasSmallInt32 = true;
+        result.smallInt32_ = value;
+        return this;
+      }
+      public Builder ClearSmallInt32() {
+        result.hasSmallInt32 = false;
+        result.smallInt32_ = -2147483647;
+        return this;
+      }
+      
+      // optional int64 small_int64 = 5 [default = -9223372036854775807];
+      public bool HasSmallInt64 {
+        get { return result.HasSmallInt64; }
+      }
+      public long SmallInt64 {
+        get { return result.SmallInt64; }
+        set { SetSmallInt64(value); }
+      }
+      public Builder SetSmallInt64(long value) {
+        result.hasSmallInt64 = true;
+        result.smallInt64_ = value;
+        return this;
+      }
+      public Builder ClearSmallInt64() {
+        result.hasSmallInt64 = false;
+        result.smallInt64_ = -9223372036854775807L;
+        return this;
+      }
+      
+      // optional string utf8_string = 6 [default = "\341\210\264"];
+      public bool HasUtf8String {
+        get { return result.HasUtf8String; }
+      }
+      public string Utf8String {
+        get { return result.Utf8String; }
+        set { SetUtf8String(value); }
+      }
+      public Builder SetUtf8String(string value) {
+        result.hasUtf8String = true;
+        result.utf8String_ = value;
+        return this;
+      }
+      public Builder ClearUtf8String() {
+        result.hasUtf8String = false;
+        result.utf8String_ = ((string) self::TestExtremeDefaultValues.Descriptor.Fields[5].DefaultValue);
+        return this;
+      }
+    }
+  }
+  
+  public sealed partial class FooRequest : pb::GeneratedMessage<FooRequest, FooRequest.Builder> {
+    // Use FooRequest.CreateBuilder() to construct.
+    private FooRequest() {}
+    
+    private static readonly FooRequest defaultInstance = new FooRequest();
+    public static FooRequest DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override FooRequest DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_FooRequest__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_FooRequest__FieldAccessorTable; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::FooRequest ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::FooRequest ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::FooRequest ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::FooRequest parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::FooRequest ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::FooRequest ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::FooRequest ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::FooRequest ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::FooRequest> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::FooRequest prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::FooRequest, Builder> {
+      // Construct using self::FooRequest.CreateBuilder()
+      internal Builder() {}
+      
+      self::FooRequest result = new self::FooRequest();
+      
+      protected override self::FooRequest MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::FooRequest> Clear() {
+        result = new self::FooRequest();
+        return this;
+      }
+      
+      public override IBuilder<self::FooRequest> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::FooRequest.Descriptor; }
+      }
+      
+      public override self::FooRequest DefaultInstanceForType {
+        get { return self::FooRequest.DefaultInstance; }
+      }
+      
+      public override self::FooRequest BuildPartial() {
+        self::FooRequest returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::FooRequest) {
+          return MergeFrom((self::FooRequest) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::FooRequest> MergeFrom(self::FooRequest other) {
+        if (other == self::FooRequest.DefaultInstance) return this;
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::FooRequest> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::FooRequest> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+          }
+        }
+      }
+      
+    }
+  }
+  
+  public sealed partial class FooResponse : pb::GeneratedMessage<FooResponse, FooResponse.Builder> {
+    // Use FooResponse.CreateBuilder() to construct.
+    private FooResponse() {}
+    
+    private static readonly FooResponse defaultInstance = new FooResponse();
+    public static FooResponse DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override FooResponse DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_FooResponse__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_FooResponse__FieldAccessorTable; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::FooResponse ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::FooResponse ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::FooResponse ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::FooResponse parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::FooResponse ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::FooResponse ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::FooResponse ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::FooResponse ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::FooResponse> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::FooResponse prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::FooResponse, Builder> {
+      // Construct using self::FooResponse.CreateBuilder()
+      internal Builder() {}
+      
+      self::FooResponse result = new self::FooResponse();
+      
+      protected override self::FooResponse MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::FooResponse> Clear() {
+        result = new self::FooResponse();
+        return this;
+      }
+      
+      public override IBuilder<self::FooResponse> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::FooResponse.Descriptor; }
+      }
+      
+      public override self::FooResponse DefaultInstanceForType {
+        get { return self::FooResponse.DefaultInstance; }
+      }
+      
+      public override self::FooResponse BuildPartial() {
+        self::FooResponse returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::FooResponse) {
+          return MergeFrom((self::FooResponse) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::FooResponse> MergeFrom(self::FooResponse other) {
+        if (other == self::FooResponse.DefaultInstance) return this;
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::FooResponse> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::FooResponse> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+          }
+        }
+      }
+      
+    }
+  }
+  
+  public sealed partial class BarRequest : pb::GeneratedMessage<BarRequest, BarRequest.Builder> {
+    // Use BarRequest.CreateBuilder() to construct.
+    private BarRequest() {}
+    
+    private static readonly BarRequest defaultInstance = new BarRequest();
+    public static BarRequest DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override BarRequest DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_BarRequest__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_BarRequest__FieldAccessorTable; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::BarRequest ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::BarRequest ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::BarRequest ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::BarRequest parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::BarRequest ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::BarRequest ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::BarRequest ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::BarRequest ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::BarRequest> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::BarRequest prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::BarRequest, Builder> {
+      // Construct using self::BarRequest.CreateBuilder()
+      internal Builder() {}
+      
+      self::BarRequest result = new self::BarRequest();
+      
+      protected override self::BarRequest MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::BarRequest> Clear() {
+        result = new self::BarRequest();
+        return this;
+      }
+      
+      public override IBuilder<self::BarRequest> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::BarRequest.Descriptor; }
+      }
+      
+      public override self::BarRequest DefaultInstanceForType {
+        get { return self::BarRequest.DefaultInstance; }
+      }
+      
+      public override self::BarRequest BuildPartial() {
+        self::BarRequest returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::BarRequest) {
+          return MergeFrom((self::BarRequest) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::BarRequest> MergeFrom(self::BarRequest other) {
+        if (other == self::BarRequest.DefaultInstance) return this;
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::BarRequest> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::BarRequest> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+          }
+        }
+      }
+      
+    }
+  }
+  
+  public sealed partial class BarResponse : pb::GeneratedMessage<BarResponse, BarResponse.Builder> {
+    // Use BarResponse.CreateBuilder() to construct.
+    private BarResponse() {}
+    
+    private static readonly BarResponse defaultInstance = new BarResponse();
+    public static BarResponse DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override BarResponse DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_BarResponse__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+      get { return self::UnitTestProtoFile.internal__static_protobuf_unittest_BarResponse__FieldAccessorTable; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static self::BarResponse ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::BarResponse ParseFrom(pb::ByteString data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::BarResponse ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static self::BarResponse parseFrom(byte[] data,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::BarResponse ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::BarResponse ParseFrom(
+        global::System.IO.Stream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    public static self::BarResponse ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static self::BarResponse ParseFrom(pb::CodedInputStream input,
+        pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry))
+               .BuildParsed();
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override IBuilder<self::BarResponse> CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(self::BarResponse prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<self::BarResponse, Builder> {
+      // Construct using self::BarResponse.CreateBuilder()
+      internal Builder() {}
+      
+      self::BarResponse result = new self::BarResponse();
+      
+      protected override self::BarResponse MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override IBuilder<self::BarResponse> Clear() {
+        result = new self::BarResponse();
+        return this;
+      }
+      
+      public override IBuilder<self::BarResponse> Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return self::BarResponse.Descriptor; }
+      }
+      
+      public override self::BarResponse DefaultInstanceForType {
+        get { return self::BarResponse.DefaultInstance; }
+      }
+      
+      public override self::BarResponse BuildPartial() {
+        self::BarResponse returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override IBuilder MergeFrom(pb::IMessage other) {
+        if (other is self::BarResponse) {
+          return MergeFrom((self::BarResponse) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override IBuilder<self::BarResponse> MergeFrom(self::BarResponse other) {
+        if (other == self::BarResponse.DefaultInstance) return this;
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override IBuilder<self::BarResponse> MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override IBuilder<self::BarResponse> MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields =
+          pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0:
+              this.UnknownFields = unknownFields.Build();
+              return this;
+            default: {
+              if (!ParseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.UnknownFields = unknownFields.Build();
+                return this;
+              }
+              break;
+            }
+          }
+        }
+      }
+      
+    }
+  }
+  
+  #endregion
+  
+  #region Services
+  public abstract class TestService : pb::IService {
+    public abstract void Foo(
+        pb::IRpcController controller,
+        self::FooRequest request,
+        global::System.Action<self::FooResponse> done);
+    public abstract void Bar(
+        pb::IRpcController controller,
+        self::BarRequest request,
+        global::System.Action<self::BarResponse> done);
+    
+    public static pbd::ServiceDescriptor Descriptor {
+      get { return self::UnitTestProtoFile.Descriptor.Services[0]; }
+    }
+    public pbd::ServiceDescriptor DescriptorForType {
+      get { return Descriptor; }
+    }
+    
+    public void CallMethod(
+        pbd::MethodDescriptor method,
+        pb::IRpcController controller,
+        pb::IMessage request,
+        global::System.Action<pb::IMessage> done) {
+      if (method.Service != Descriptor) {
+        throw new global::System.ArgumentException(
+          "Service.CallMethod() given method descriptor for wrong " +
+          "service type.");
+      }
+      switch(method.Index) {
+        case 0:
+          this.Foo(controller, (self::FooRequest)request,
+            pb::RpcUtil.SpecializeCallback<self::FooResponse>(
+              done));
+          return;
+        case 1:
+          this.Bar(controller, (self::BarRequest)request,
+            pb::RpcUtil.SpecializeCallback<self::BarResponse>(
+              done));
+          return;
+        default:
+          throw new global::System.InvalidOperationException("Can't get here.");
+      }
+    }
+    
+    public pb::IMessage GetRequestPrototype(pbd::MethodDescriptor method) {
+      if (method.Service != Descriptor) {
+        throw new global::System.ArgumentException(
+          "Service.GetRequestPrototype() given method " +
+          "descriptor for wrong service type.");
+      }
+      switch(method.Index) {
+        case 0:
+          return self::FooRequest.DefaultInstance;
+        case 1:
+          return self::BarRequest.DefaultInstance;
+        default:
+          throw new global::System.ArgumentException("Can't get here.");
+      }
+    }
+    
+    public pb::IMessage GetResponsePrototype(pbd::MethodDescriptor method) {
+      if (method.Service != Descriptor) {
+        throw new global::System.ArgumentException(
+          "Service.GetResponsePrototype() given method " +
+          "descriptor for wrong service type.");
+      }
+      switch(method.Index) {
+        case 0:
+          return self::FooResponse.DefaultInstance;
+        case 1:
+          return self::BarResponse.DefaultInstance;
+        default:
+          throw new global::System.ArgumentException("Can't get here.");
+      }
+    }
+    
+    public static Stub CreateStub(
+        pb::IRpcChannel channel) {
+      return new Stub(channel);
+    }
+    
+    public class Stub : self::TestService {
+      internal Stub(pb::IRpcChannel channel) {
+        this.channel = channel;
+      }
+      
+      private readonly pb::IRpcChannel channel;
+      
+      public pb::IRpcChannel Channel {
+        get { return channel; }
+      }
+      
+      public override void Foo(
+          pb::IRpcController controller,
+          self::FooRequest request,
+          global::System.Action<self::FooResponse> done) {
+        channel.CallMethod(
+          Descriptor.Methods[0],
+          controller,
+          request,
+          self::FooResponse.DefaultInstance,
+          pb::RpcUtil.GeneralizeCallback(done, self::FooResponse.DefaultInstance));
+      }
+      
+      public override void Bar(
+          pb::IRpcController controller,
+          self::BarRequest request,
+          global::System.Action<self::BarResponse> done) {
+        channel.CallMethod(
+          Descriptor.Methods[1],
+          controller,
+          request,
+          self::BarResponse.DefaultInstance,
+          pb::RpcUtil.GeneralizeCallback(done, self::BarResponse.DefaultInstance));
+      }
+    }
+  }
+  
+  #endregion
+}

+ 32 - 0
csharp/ProtocolBuffers.Test/TestUtil.cs

@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.IO;
+
+namespace Google.ProtocolBuffers {
+  internal static class TestUtil {
+
+    private static DirectoryInfo testDataDirectory;
+
+    internal static DirectoryInfo TestDataDirectory {
+      get {
+        if (testDataDirectory != null) {
+          return testDataDirectory;
+        }
+
+        DirectoryInfo ancestor = new DirectoryInfo(".");
+        // Search each parent directory looking for "src/google/protobuf".
+        while (ancestor != null) {
+          string candidate = Path.Combine(ancestor.FullName, "src/google/protobuf");
+          if (Directory.Exists(candidate)) {
+            testDataDirectory = new DirectoryInfo(candidate);
+            return testDataDirectory;
+          }
+          ancestor = ancestor.Parent;
+        }
+        // TODO(jonskeet): Come up with a better exception to throw
+        throw new Exception("Unable to find directory containing test files");
+      }
+    }
+  }
+}

+ 5 - 3
csharp/ProtocolBuffers/CodedInputStream.cs

@@ -142,6 +142,7 @@ namespace Google.ProtocolBuffers {
     /// Read a double field from the stream.
     /// </summary>
     public double ReadDouble() {
+      // TODO(jonskeet): Test this on different endiannesses
       return BitConverter.Int64BitsToDouble((long) ReadRawLittleEndian64());
     }
 
@@ -149,9 +150,10 @@ namespace Google.ProtocolBuffers {
     /// Read a float field from the stream.
     /// </summary>
     public float ReadFloat() {
-      //return Float.intBitsToFloat(readRawLittleEndian32());
-      // FIXME implement!
-      throw new NotImplementedException();
+      // TODO(jonskeet): Test this on different endiannesses
+      uint raw = ReadRawLittleEndian32();
+      byte[] rawBytes = BitConverter.GetBytes(raw);
+      return BitConverter.ToSingle(rawBytes, 0);
     }
 
     /// <summary>

+ 9 - 6
csharp/ProtocolBuffers/CodedOutputStream.cs

@@ -98,6 +98,7 @@ namespace Google.ProtocolBuffers {
     /// Writes a double field value, including tag, to the stream.
     /// </summary>
     public void WriteDouble(int fieldNumber, double value) {
+      // TODO(jonskeet): Test this on different endiannesses
       WriteTag(fieldNumber, WireFormat.WireType.Fixed64);
       WriteRawLittleEndian64((ulong)BitConverter.DoubleToInt64Bits(value));
     }
@@ -107,8 +108,10 @@ namespace Google.ProtocolBuffers {
     /// </summary>
     public void WriteFloat(int fieldNumber, float value) {
       WriteTag(fieldNumber, WireFormat.WireType.Fixed32);
-      // FIXME: How do we convert a single to 32 bits? (Without unsafe code)
-      //WriteRawLittleEndian32(BitConverter.SingleT(value));
+      // TODO(jonskeet): Test this on different endiannesses
+      byte[] rawBytes = BitConverter.GetBytes(value);
+      uint asInteger = BitConverter.ToUInt32(rawBytes, 0);
+      WriteRawLittleEndian32(asInteger);
     }
 
     /// <summary>
@@ -434,7 +437,7 @@ namespace Google.ProtocolBuffers {
     /// Compute the number of bytes that would be needed to encode a
     /// fixed64 field, including the tag.
     /// </summary>
-    public static int ComputeFixed64Size(int fieldNumber, long value) {
+    public static int ComputeFixed64Size(int fieldNumber, ulong value) {
       return ComputeTagSize(fieldNumber) + LittleEndian64Size;
     }
 
@@ -442,7 +445,7 @@ namespace Google.ProtocolBuffers {
     /// Compute the number of bytes that would be needed to encode a
     /// fixed32 field, including the tag.
     /// </summary>
-    public static int ComputeFixed32Size(int fieldNumber, int value) {
+    public static int ComputeFixed32Size(int fieldNumber, uint value) {
       return ComputeTagSize(fieldNumber) + LittleEndian32Size;
     }
 
@@ -625,8 +628,8 @@ namespace Google.ProtocolBuffers {
         case FieldType.Int64: return ComputeInt64Size(fieldNumber, (long)value);
         case FieldType.UInt64: return ComputeUInt64Size(fieldNumber, (ulong)value);
         case FieldType.Int32: return ComputeInt32Size(fieldNumber, (int)value);
-        case FieldType.Fixed64: return ComputeFixed64Size(fieldNumber, (long)value);
-        case FieldType.Fixed32: return ComputeFixed32Size(fieldNumber, (int)value);
+        case FieldType.Fixed64: return ComputeFixed64Size(fieldNumber, (ulong)value);
+        case FieldType.Fixed32: return ComputeFixed32Size(fieldNumber, (uint)value);
         case FieldType.Bool: return ComputeBoolSize(fieldNumber, (bool)value);
         case FieldType.String: return ComputeStringSize(fieldNumber, (string)value);
         case FieldType.Group: return ComputeGroupSize(fieldNumber, (IMessage)value);

+ 156 - 181
csharp/ProtocolBuffers/DescriptorProtos/DescriptorProtoFile.cs

@@ -16,152 +16,152 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
     }
     private static readonly pbd::FileDescriptor descriptor = pbd::FileDescriptor.InternalBuildGeneratedFileFrom (
         new byte[] {
-            0x0a, 0x24, 0x73, 0x72, 0x63, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 
-            0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 
-            0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x22, 0xdc, 0x02, 0x0a, 0x13, 
-            0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 
-            0x0c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x12, 0x0f, 0x0a, 0x07, 0x70, 0x61, 0x63, 
-            0x6b, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x12, 0x12, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 
-            0x65, 0x6e, 0x63, 0x79, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x12, 0x36, 0x0a, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 
-            0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 
-            0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 
-            0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x37, 0x0a, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 
-            0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 
-            0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 
-            0x6f, 0x74, 0x6f, 0x12, 0x38, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 
-            0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 
-            0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 
-            0x6f, 0x12, 0x38, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 
-            0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 
-            0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 
-            0x2d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 
-            0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 
-            0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xa9, 0x03, 0x0a, 0x0f, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 
-            0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 
-            0x12, 0x34, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 
-            0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 
-            0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x38, 0x0a, 0x09, 0x65, 0x78, 
-            0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 
-            0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 
-            0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x35, 0x0a, 0x0b, 0x6e, 0x65, 0x73, 0x74, 
-            0x65, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 
-            0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 
-            0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x37, 0x0a, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 
-            0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 
-            0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 
-            0x72, 0x6f, 0x74, 0x6f, 0x12, 0x48, 0x0a, 0x0f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x61, 
-            0x6e, 0x67, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 
-            0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 
-            0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x30, 
-            0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 
-            0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 
-            0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x2c, 0x0a, 0x0e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 
-            0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x0d, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 
-            0x05, 0x12, 0x0b, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x22, 0x94, 0x05, 0x0a, 0x14, 0x46, 
-            0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 
-            0x0c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x12, 0x0e, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 
-            0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x12, 0x3a, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x04, 
-            0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 
-            0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 
-            0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x38, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 
-            0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 
-            0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 
-            0x74, 0x6f, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 
-            0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x12, 0x10, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, 0x18, 0x02, 
-            0x20, 0x01, 0x28, 0x09, 0x12, 0x15, 0x0a, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 
-            0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x12, 0x2e, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 
-            0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 
-            0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb6, 0x02, 0x0a, 0x04, 
-            0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 
-            0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x10, 0x02, 0x12, 0x0e, 0x0a, 
-            0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 
-            0x45, 0x5f, 0x55, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x04, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 
-            0x4e, 0x54, 0x33, 0x32, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x49, 0x58, 0x45, 0x44, 
-            0x36, 0x34, 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x49, 0x58, 0x45, 0x44, 0x33, 0x32, 
-            0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x4f, 0x4f, 0x4c, 0x10, 0x08, 0x12, 0x0f, 0x0a, 
-            0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x09, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 
-            0x50, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x0a, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 
-            0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x10, 0x0b, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x59, 0x54, 
-            0x45, 0x53, 0x10, 0x0c, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 
-            0x0d, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x10, 0x0e, 0x12, 0x11, 0x0a, 0x0d, 
-            0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x46, 0x49, 0x58, 0x45, 0x44, 0x33, 0x32, 0x10, 0x14, 0x12, 0x11, 0x0a, 0x0d, 0x54, 
-            0x59, 0x50, 0x45, 0x5f, 0x53, 0x46, 0x49, 0x58, 0x45, 0x44, 0x36, 0x34, 0x10, 0x10, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 
-            0x50, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x11, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 
-            0x53, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x12, 0x22, 0x43, 0x0a, 0x05, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x12, 0x0a, 
-            0x0e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x12, 0x0a, 
-            0x0e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x02, 0x12, 0x12, 0x0a, 
-            0x0e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x52, 0x45, 0x50, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x03, 0x22, 0x8c, 0x01, 
-            0x0a, 0x13, 0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 
-            0x6f, 0x12, 0x0c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x12, 0x38, 0x0a, 0x05, 0x76, 
-            0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 
-            0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, 
-            0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x2d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 
-            0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 
-            0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 
-            0x22, 0x6c, 0x0a, 0x18, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 
-            0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 
-            0x28, 0x09, 0x12, 0x0e, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x12, 0x32, 
-            0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 
-            0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 
-            0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x90, 0x01, 0x0a, 0x16, 0x53, 0x65, 0x72, 0x76, 0x69, 
-            0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x0a, 
-            0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x12, 0x36, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 
-            0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 
-            0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 
-            0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x30, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 
-            0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 
-            0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x7f, 0x0a, 
-            0x15, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 
-            0x74, 0x6f, 0x12, 0x0c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x12, 0x12, 0x0a, 0x0a, 
-            0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x12, 0x13, 0x0a, 0x0b, 
-            0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x12, 0x2f, 0x0a, 
-            0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 
-            0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 
-            0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x88, 0x03, 0x0a, 0x0b, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 
-            0x6e, 0x73, 0x12, 0x14, 0x0a, 0x0c, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x01, 
-            0x20, 0x01, 0x28, 0x09, 0x12, 0x1c, 0x0a, 0x14, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x63, 
-            0x6c, 0x61, 0x73, 0x73, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x12, 0x22, 0x0a, 0x13, 0x6a, 0x61, 
-            0x76, 0x61, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 
-            0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x0c, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 
-            0x7a, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 
+            0x0a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 
+            0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x67, 0x6f, 0x6f, 0x67, 
+            0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x22, 0xdc, 0x02, 0x0a, 0x13, 0x46, 0x69, 0x6c, 0x65, 
+            0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x0a, 0x04, 0x6e, 
+            0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x12, 0x0f, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 
+            0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x12, 0x12, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 
+            0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x12, 0x36, 0x0a, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x79, 
+            0x70, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 
+            0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 
+            0x74, 0x6f, 0x12, 0x37, 0x0a, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 
+            0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 
+            0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 
+            0x38, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 
+            0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 
+            0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x38, 0x0a, 
+            0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 
+            0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 
+            0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x2d, 0x0a, 0x07, 0x6f, 
+            0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 
             0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 
-            0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x3a, 0x09, 0x43, 0x4f, 0x44, 
-            0x45, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x12, 0x19, 0x0a, 0x10, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 
-            0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x09, 0x12, 0x1e, 0x0a, 0x15, 0x63, 0x73, 0x68, 
-            0x61, 0x72, 0x70, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0xe9, 
-            0x07, 0x20, 0x01, 0x28, 0x09, 0x12, 0x25, 0x0a, 0x15, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 
-            0x69, 0x70, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 
-            0x61, 0x6c, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x13, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x5f, 
-            0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 
-            0x65, 0x12, 0x24, 0x0a, 0x15, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x63, 
-            0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, 0xec, 0x07, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x22, 
-            0x28, 0x0a, 0x0c, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x53, 
-            0x50, 0x45, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x10, 
-            0x02, 0x22, 0x38, 0x0a, 0x0e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 
-            0x26, 0x0a, 0x17, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x77, 0x69, 0x72, 0x65, 0x5f, 
-            0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x22, 
-            0x85, 0x01, 0x0a, 0x0c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x32, 0x0a, 0x05, 
-            0x63, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 
-            0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 
-            0x6e, 0x73, 0x2e, 0x43, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x14, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 
-            0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x22, 0x23, 
-            0x0a, 0x05, 0x43, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x4f, 0x52, 0x44, 0x10, 0x01, 0x12, 0x10, 0x0a, 
-            0x0c, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x49, 0x45, 0x43, 0x45, 0x10, 0x02, 0x22, 0x0d, 0x0a, 0x0b, 0x45, 
-            0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 
-            0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x10, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 
-            0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x0f, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 
-            0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x72, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 
-            0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x42, 0x10, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 
-            0x50, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x48, 0x01, 0xc2, 0x3e, 0x27, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x50, 0x72, 
-            0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 
-            0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0xca, 0x3e, 0x13, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 
-            0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0xd0, 0x3e, 0x00, 0xd8, 0x3e, 0x00, 0xe0, 0x3e, 
-            0x01, 
+            0x6e, 0x73, 0x22, 0xa9, 0x03, 0x0a, 0x0f, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 
+            0x74, 0x6f, 0x12, 0x0c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x12, 0x34, 0x0a, 0x05, 
+            0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 
+            0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 
+            0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x38, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 
+            0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 
+            0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 
+            0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x35, 0x0a, 0x0b, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x74, 
+            0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 
+            0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 
+            0x6f, 0x74, 0x6f, 0x12, 0x37, 0x0a, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x03, 
+            0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 
+            0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 
+            0x12, 0x48, 0x0a, 0x0f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 
+            0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 
+            0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 
+            0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x6f, 0x70, 
+            0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 
+            0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 
+            0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x2c, 0x0a, 0x0e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 
+            0x67, 0x65, 0x12, 0x0d, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x12, 0x0b, 0x0a, 
+            0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x22, 0x94, 0x05, 0x0a, 0x14, 0x46, 0x69, 0x65, 0x6c, 0x64, 
+            0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x0a, 0x04, 0x6e, 
+            0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x12, 0x0e, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 
+            0x03, 0x20, 0x01, 0x28, 0x05, 0x12, 0x3a, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 
+            0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 
+            0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 
+            0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x38, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 
+            0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 
+            0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 
+            0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 
+            0x28, 0x09, 0x12, 0x10, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 
+            0x12, 0x15, 0x0a, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 
+            0x01, 0x28, 0x09, 0x12, 0x2e, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 
+            0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 
+            0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xb6, 0x02, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 
+            0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, 
+            0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 
+            0x45, 0x5f, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x49, 
+            0x4e, 0x54, 0x36, 0x34, 0x10, 0x04, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x33, 0x32, 
+            0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x49, 0x58, 0x45, 0x44, 0x36, 0x34, 0x10, 0x06, 
+            0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x49, 0x58, 0x45, 0x44, 0x33, 0x32, 0x10, 0x07, 0x12, 0x0d, 
+            0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x4f, 0x4f, 0x4c, 0x10, 0x08, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 
+            0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x09, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 
+            0x52, 0x4f, 0x55, 0x50, 0x10, 0x0a, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x53, 0x53, 0x41, 
+            0x47, 0x45, 0x10, 0x0b, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x0c, 
+            0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x0d, 0x12, 0x0d, 0x0a, 
+            0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x10, 0x0e, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x59, 0x50, 0x45, 
+            0x5f, 0x53, 0x46, 0x49, 0x58, 0x45, 0x44, 0x33, 0x32, 0x10, 0x0f, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x59, 0x50, 0x45, 0x5f, 
+            0x53, 0x46, 0x49, 0x58, 0x45, 0x44, 0x36, 0x34, 0x10, 0x10, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 
+            0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x11, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x54, 
+            0x36, 0x34, 0x10, 0x12, 0x22, 0x43, 0x0a, 0x05, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x41, 0x42, 
+            0x45, 0x4c, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x41, 0x42, 
+            0x45, 0x4c, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x41, 0x42, 
+            0x45, 0x4c, 0x5f, 0x52, 0x45, 0x50, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x03, 0x22, 0x8c, 0x01, 0x0a, 0x13, 0x45, 0x6e, 
+            0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x0a, 
+            0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x12, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 
+            0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 
+            0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 
+            0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x2d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 
+            0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 
+            0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x6c, 0x0a, 0x18, 
+            0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 
+            0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x12, 0x0e, 
+            0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x12, 0x32, 0x0a, 0x07, 0x6f, 0x70, 
+            0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 
+            0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 
+            0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x90, 0x01, 0x0a, 0x16, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 
+            0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 
+            0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x12, 0x36, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 
+            0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 
+            0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 
+            0x6f, 0x74, 0x6f, 0x12, 0x30, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 
+            0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 
+            0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x7f, 0x0a, 0x15, 0x4d, 0x65, 0x74, 
+            0x68, 0x6f, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 
+            0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x12, 0x12, 0x0a, 0x0a, 0x69, 0x6e, 0x70, 0x75, 
+            0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x12, 0x13, 0x0a, 0x0b, 0x6f, 0x75, 0x74, 0x70, 
+            0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x12, 0x2f, 0x0a, 0x07, 0x6f, 0x70, 0x74, 
+            0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 
+            0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 
+            0x6e, 0x73, 0x22, 0x88, 0x03, 0x0a, 0x0b, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 
+            0x0a, 0x0c, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 
+            0x12, 0x1c, 0x0a, 0x14, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 
+            0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x12, 0x22, 0x0a, 0x13, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x6d, 
+            0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x3a, 
+            0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x0c, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x5f, 0x66, 
+            0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 
+            0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 
+            0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x3a, 0x09, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, 
+            0x5a, 0x45, 0x12, 0x19, 0x0a, 0x10, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 
+            0x63, 0x65, 0x18, 0xe8, 0x07, 0x20, 0x01, 0x28, 0x09, 0x12, 0x1e, 0x0a, 0x15, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x5f, 
+            0x66, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 
+            0x09, 0x12, 0x25, 0x0a, 0x15, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 
+            0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 
+            0x12, 0x23, 0x0a, 0x13, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x73, 
+            0x73, 0x65, 0x73, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x12, 0x24, 0x0a, 
+            0x15, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 
+            0x65, 0x73, 0x18, 0xec, 0x07, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x22, 0x28, 0x0a, 0x0c, 0x4f, 
+            0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x50, 0x45, 0x45, 0x44, 
+            0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x10, 0x02, 0x22, 0x38, 0x0a, 
+            0x0e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x17, 0x6d, 
+            0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x77, 0x69, 0x72, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 
+            0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x22, 0x85, 0x01, 0x0a, 0x0c, 
+            0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x32, 0x0a, 0x05, 0x63, 0x74, 0x79, 0x70, 
+            0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 
+            0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 
+            0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x14, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 
+            0x5f, 0x6d, 0x61, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x22, 0x23, 0x0a, 0x05, 0x43, 0x54, 
+            0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x4f, 0x52, 0x44, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x52, 
+            0x49, 0x4e, 0x47, 0x5f, 0x50, 0x49, 0x45, 0x43, 0x45, 0x10, 0x02, 0x22, 0x0d, 0x0a, 0x0b, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 
+            0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 
+            0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x10, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 
+            0x69, 0x6f, 0x6e, 0x73, 0x22, 0x0f, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 
+            0x73, 0x42, 0x72, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 
+            0x6f, 0x62, 0x75, 0x66, 0x42, 0x10, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 
+            0x6f, 0x73, 0x48, 0x01, 0xc2, 0x3e, 0x27, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 
+            0x6f, 0x6c, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 
+            0x50, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0xca, 0x3e, 0x13, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 
+            0x72, 0x6f, 0x74, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0xd0, 0x3e, 0x00, 0xd8, 0x3e, 0x00, 0xe0, 0x3e, 0x01, 
         }, new pbd::FileDescriptor[] {
         });
     #endregion
     
     #region Extensions
+    /**/
     #endregion
     
     #region Static variables
@@ -295,7 +295,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_FileDescriptorProto__Descriptor; }
     }
     
-    protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_FileDescriptorProto__FieldAccessorTable; }
     }
     
@@ -973,7 +973,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_DescriptorProto__Descriptor; }
     }
     
-    protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_DescriptorProto__FieldAccessorTable; }
     }
     
@@ -996,7 +996,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
           get { return self::DescriptorProtoFile.internal__static_google_protobuf_DescriptorProto_ExtensionRange__Descriptor; }
         }
         
-        protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+        protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
           get { return self::DescriptorProtoFile.internal__static_google_protobuf_DescriptorProto_ExtensionRange__FieldAccessorTable; }
         }
         
@@ -1872,57 +1872,36 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_FieldDescriptorProto__Descriptor; }
     }
     
-    protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_FieldDescriptorProto__FieldAccessorTable; }
     }
     
     #region Nested types
     public static class Types {
       public enum Type {
-        [pbd::EnumDescriptorIndex(0)]
         TYPE_DOUBLE = 1,
-        [pbd::EnumDescriptorIndex(1)]
         TYPE_FLOAT = 2,
-        [pbd::EnumDescriptorIndex(2)]
         TYPE_INT64 = 3,
-        [pbd::EnumDescriptorIndex(3)]
         TYPE_UINT64 = 4,
-        [pbd::EnumDescriptorIndex(4)]
         TYPE_INT32 = 5,
-        [pbd::EnumDescriptorIndex(5)]
         TYPE_FIXED64 = 6,
-        [pbd::EnumDescriptorIndex(6)]
         TYPE_FIXED32 = 7,
-        [pbd::EnumDescriptorIndex(7)]
         TYPE_BOOL = 8,
-        [pbd::EnumDescriptorIndex(8)]
         TYPE_STRING = 9,
-        [pbd::EnumDescriptorIndex(9)]
         TYPE_GROUP = 10,
-        [pbd::EnumDescriptorIndex(10)]
         TYPE_MESSAGE = 11,
-        [pbd::EnumDescriptorIndex(11)]
         TYPE_BYTES = 12,
-        [pbd::EnumDescriptorIndex(12)]
         TYPE_UINT32 = 13,
-        [pbd::EnumDescriptorIndex(13)]
         TYPE_ENUM = 14,
-        [pbd::EnumDescriptorIndex(14)]
-        TYPE_SFIXED32 = 20,
-        [pbd::EnumDescriptorIndex(15)]
+        TYPE_SFIXED32 = 15,
         TYPE_SFIXED64 = 16,
-        [pbd::EnumDescriptorIndex(16)]
         TYPE_SINT32 = 17,
-        [pbd::EnumDescriptorIndex(17)]
         TYPE_SINT64 = 18,
       }
       
       public enum Label {
-        [pbd::EnumDescriptorIndex(0)]
         LABEL_OPTIONAL = 1,
-        [pbd::EnumDescriptorIndex(1)]
         LABEL_REQUIRED = 2,
-        [pbd::EnumDescriptorIndex(2)]
         LABEL_REPEATED = 3,
       }
       
@@ -2450,7 +2429,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_EnumDescriptorProto__Descriptor; }
     }
     
-    protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_EnumDescriptorProto__FieldAccessorTable; }
     }
     
@@ -2792,7 +2771,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_EnumValueDescriptorProto__Descriptor; }
     }
     
-    protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_EnumValueDescriptorProto__FieldAccessorTable; }
     }
     
@@ -3099,7 +3078,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_ServiceDescriptorProto__Descriptor; }
     }
     
-    protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_ServiceDescriptorProto__FieldAccessorTable; }
     }
     
@@ -3441,7 +3420,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_MethodDescriptorProto__Descriptor; }
     }
     
-    protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_MethodDescriptorProto__FieldAccessorTable; }
     }
     
@@ -3790,16 +3769,14 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_FileOptions__Descriptor; }
     }
     
-    protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_FileOptions__FieldAccessorTable; }
     }
     
     #region Nested types
     public static class Types {
       public enum OptimizeMode {
-        [pbd::EnumDescriptorIndex(0)]
         SPEED = 1,
-        [pbd::EnumDescriptorIndex(1)]
         CODE_SIZE = 2,
       }
       
@@ -4344,7 +4321,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_MessageOptions__Descriptor; }
     }
     
-    protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_MessageOptions__FieldAccessorTable; }
     }
     
@@ -4546,16 +4523,14 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_FieldOptions__Descriptor; }
     }
     
-    protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_FieldOptions__FieldAccessorTable; }
     }
     
     #region Nested types
     public static class Types {
       public enum CType {
-        [pbd::EnumDescriptorIndex(0)]
         CORD = 1,
-        [pbd::EnumDescriptorIndex(1)]
         STRING_PIECE = 2,
       }
       
@@ -4806,7 +4781,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_EnumOptions__Descriptor; }
     }
     
-    protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_EnumOptions__FieldAccessorTable; }
     }
     
@@ -4966,7 +4941,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_EnumValueOptions__Descriptor; }
     }
     
-    protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_EnumValueOptions__FieldAccessorTable; }
     }
     
@@ -5126,7 +5101,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_ServiceOptions__Descriptor; }
     }
     
-    protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_ServiceOptions__FieldAccessorTable; }
     }
     
@@ -5286,7 +5261,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_MethodOptions__Descriptor; }
     }
     
-    protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
       get { return self::DescriptorProtoFile.internal__static_google_protobuf_MethodOptions__FieldAccessorTable; }
     }
     

+ 2 - 1
csharp/ProtocolBuffers/Descriptors/EnumDescriptorIndexAttribute.cs

@@ -3,9 +3,10 @@
 namespace Google.ProtocolBuffers.Descriptors {
   /// <summary>
   /// Allows enum values to express the index within their descriptor.
+  /// TODO(jonskeet): Consider removing this. I don't think we need it after all.
   /// </summary>
   [AttributeUsage(AttributeTargets.Field)]
-  internal class EnumDescriptorIndexAttribute : Attribute {
+  public class EnumDescriptorIndexAttribute : Attribute {
     readonly int index;
 
     internal int Index {

+ 11 - 0
csharp/ProtocolBuffers/DynamicMessage.cs

@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Google.ProtocolBuffers {
+  public class DynamicMessage {
+    internal static object GetDefaultInstance(Google.ProtocolBuffers.Descriptors.MessageDescriptor messageDescriptor) {
+      throw new NotImplementedException();
+    }
+  }
+}

+ 165 - 0
csharp/ProtocolBuffers/ExtendableMessage.cs

@@ -0,0 +1,165 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Google.ProtocolBuffers.Descriptors;
+using Google.ProtocolBuffers.Collections;
+
+namespace Google.ProtocolBuffers {
+  public abstract class ExtendableMessage<TMessage,TBuilder> : GeneratedMessage<TMessage,TBuilder>
+    where TMessage : GeneratedMessage<TMessage, TBuilder>
+    where TBuilder : IBuilder<TMessage> {
+
+    protected ExtendableMessage() {}
+    private readonly FieldSet extensions = FieldSet.CreateFieldSet();
+
+    /// <summary>
+    /// Checks if a singular extension is present.
+    /// </summary>
+    public bool HasExtension(GeneratedExtension<TMessage, TBuilder> extension) {
+      return extensions.HasField(extension.Descriptor);
+    }
+
+    /// <summary>
+    /// Returns the number of elements in a repeated extension.
+    /// </summary>
+    public int GetExtensionCount<TExtension>(GeneratedExtension<TMessage, IList<TExtension>> extension) {
+      return extensions.GetRepeatedFieldCount(extension.Descriptor);
+    }
+
+    /// <summary>
+    /// Returns the value of an extension.
+    /// </summary>
+    public TExtension GetExtension<TExtension>(GeneratedExtension<TMessage, TExtension> extension) {
+      object value = extensions[extension.Descriptor];
+      if (value == null) {
+        return (TExtension) extension.MessageDefaultInstance;
+      } else {
+        return (TExtension) extension.FromReflectionType(value);
+      }
+    }
+
+    /// <summary>
+    /// Returns one element of a repeated extension.
+    /// </summary>
+    public TExtension GetExtension<TExtension>(GeneratedExtension<TMessage, IList<TExtension>> extension, int index) {
+      return (TExtension) extension.SingularFromReflectionType(extensions[extension.Descriptor, index]);
+    }
+
+    /// <summary>
+    /// Called by subclasses to check if all extensions are initialized.
+    /// </summary>
+    protected bool ExtensionsAreInitialized {
+      get { return extensions.IsInitialized; }      
+    }
+
+    #region Reflection
+    public override IDictionary<FieldDescriptor, object> AllFields {
+      get {
+        IDictionary<FieldDescriptor, object> result = GetMutableFieldMap();
+        foreach(KeyValuePair<FieldDescriptor, object> entry in extensions.AllFields) {
+          result[entry.Key] = entry.Value;
+        }
+        return Dictionaries.AsReadOnly(result);
+      }
+    }
+
+    public override bool HasField(FieldDescriptor field) {
+      if (field.IsExtension) {
+        VerifyContainingType(field);
+        return extensions.HasField(field);
+      } else {
+        return base.HasField(field);
+      }
+    }
+
+    public override object this[FieldDescriptor field] {
+      get {
+        if (field.IsExtension) {
+          VerifyContainingType(field);
+          object value = extensions[field];
+          if (value == null) {
+            // Lacking an ExtensionRegistry, we have no way to determine the
+            // extension's real type, so we return a DynamicMessage.
+            // TODO(jonskeet): Work out what this means
+            return DynamicMessage.GetDefaultInstance(field.MessageType);
+          } else {
+            return value;
+          }
+        } else {
+          return base[field];
+        }
+      }
+    }
+
+    public override int GetRepeatedFieldCount(FieldDescriptor field) {
+      if (field.IsExtension) {
+        VerifyContainingType(field);
+        return extensions.GetRepeatedFieldCount(field);
+      } else {
+        return base.GetRepeatedFieldCount(field);
+      }
+    }
+
+    public override object this[FieldDescriptor field, int index] {
+      get {
+        if (field.IsExtension) {
+          VerifyContainingType(field);
+          return extensions[field, index];
+        } else {
+          return base[field, index];
+        }
+      }
+    }
+  
+    private void VerifyContainingType(FieldDescriptor field) {
+      if (field.ContainingType != DescriptorForType) {
+        throw new ArgumentException("FieldDescriptor does not match message type.");
+      }
+    }
+    #endregion
+
+    /// <summary>
+    /// Used by subclasses to serialize extensions. Extension ranges may be
+    /// interleaves with field numbers, but we must write them in canonical
+    /// (sorted by field number) order. This class helps us to write individual
+    /// ranges of extensions at once.
+    /// 
+    /// TODO(jonskeet): See if we can improve this in terms of readability.
+    /// </summary>
+    protected class ExtensionWriter {
+      readonly IEnumerator<KeyValuePair<FieldDescriptor, object>> iterator;
+      readonly FieldSet extensions;
+      KeyValuePair<FieldDescriptor, object>? next = null;
+
+      internal ExtensionWriter(ExtendableMessage<TMessage, TBuilder> message) {
+        extensions = message.extensions;
+        iterator = message.extensions.GetEnumerator();
+        if (iterator.MoveNext()) {
+          next = iterator.Current;
+        }
+      }
+
+      public void WriteUntil(int end, CodedOutputStream output) {
+        while (next != null && next.Value.Key.FieldNumber < end) {
+          extensions.WriteField(next.Value.Key, next.Value.Value, output);
+          if (iterator.MoveNext()) {
+            next = iterator.Current;
+          } else {
+            next = null;
+          }
+        }
+      }
+    }
+
+    protected ExtensionWriter CreateExtensionWriter(ExtendableMessage<TMessage, TBuilder> message) {
+      return new ExtensionWriter(message);
+    }
+
+    /// <summary>
+    /// Called by subclasses to compute the size of extensions.
+    /// </summary>
+    protected int ExtensionsSerializedSize {
+      get { return extensions.SerializedSize; }
+    }
+  }
+}

+ 11 - 0
csharp/ProtocolBuffers/FieldSet.cs

@@ -30,6 +30,10 @@ namespace Google.ProtocolBuffers {
       this.fields = fields;
     }
 
+    public static FieldSet CreateFieldSet() {
+      return new FieldSet(new Dictionary<FieldDescriptor, object>());
+    }
+
     /// <summary>
     /// Makes this FieldSet immutable, and returns it for convenience. Any
     /// mutable repeated fields are made immutable, as well as the map itself.
@@ -395,6 +399,13 @@ namespace Google.ProtocolBuffers {
       ((IList<object>) list).Add(value);
     }
 
+    /// <summary>
+    /// Returns an enumerator for the field map. Used to write the fields out.
+    /// </summary>
+    internal IEnumerator<KeyValuePair<FieldDescriptor, object>> GetEnumerator() {
+      return fields.GetEnumerator();
+    }
+
     /// <summary>
     /// See <see cref="IMessage.IsInitialized" />
     /// </summary>

+ 14 - 3
csharp/ProtocolBuffers/GeneratedBuilder.cs

@@ -23,7 +23,7 @@ namespace Google.ProtocolBuffers {
     protected abstract TMessage MessageBeingBuilt { get; }
 
     protected internal FieldAccessorTable InternalFieldAccessors {
-      get { return MessageBeingBuilt.InternalFieldAccessors; }
+      get { return MessageBeingBuilt.FieldAccesseorsFromBuilder; }
     }
 
     public override bool Initialized {
@@ -190,6 +190,16 @@ namespace Google.ProtocolBuffers {
       return this;
     }
 
+    public virtual IBuilder<TMessage> MergeFrom(CodedInputStream input) {
+      ((IBuilder)this).MergeFrom(input);
+      return this;
+    }
+
+    public virtual IBuilder<TMessage> MergeFrom(CodedInputStream input, ExtensionRegistry extensionRegistry) {
+      ((IBuilder)this).MergeFrom(input, extensionRegistry);
+      return this;
+    }
+    
     /// <summary>
     /// Like Build(), but will wrap UninitializedMessageException in
     /// InvalidProtocolBufferException.
@@ -217,7 +227,8 @@ namespace Google.ProtocolBuffers {
     public abstract IBuilder<TMessage> Clone();
     public abstract new IBuilder<TMessage> Clear();
     public abstract TMessage DefaultInstanceForType { get; }
-    public abstract IBuilder<TMessage> MergeFrom(CodedInputStream input);
-    public abstract IBuilder<TMessage> MergeFrom(CodedInputStream input, ExtensionRegistry extensionRegistry);
+    
+    public abstract class ExtendableBuilder : GeneratedBuilder<TMessage, TBuilder> {
+    }
   }
 }

+ 68 - 2
csharp/ProtocolBuffers/GeneratedExtension.cs

@@ -1,7 +1,29 @@
 using Google.ProtocolBuffers.Descriptors;
+using System;
+using System.Collections.Generic;
+using System.Reflection;
 
 namespace Google.ProtocolBuffers {
 
+  public static class GeneratedExtension {
+
+    public static GeneratedExtension<TContainer, TExtension> CreateExtension<TContainer, TExtension>(FieldDescriptor descriptor)
+        where TContainer : IMessage<TContainer> {
+      if (descriptor.IsRepeated) {
+        throw new ArgumentException("Must call CreateRepeatedGeneratedExtension() for repeated types.");
+      }
+      return new GeneratedExtension<TContainer, TExtension>(descriptor);
+    }
+
+    public static GeneratedExtension<TContainer, IList<TExtension>> CreateRepeatedExtension<TContainer, TExtension>(FieldDescriptor descriptor) 
+        where TContainer : IMessage<TContainer> {
+      if (descriptor.IsRepeated) {
+        throw new ArgumentException("Must call CreateRepeatedGeneratedExtension() for repeated types.");
+      }
+      return new GeneratedExtension<TContainer, IList<TExtension>>(descriptor);
+    }
+  }
+
   /// <summary>
   /// Base class for all generated extensions.
   /// </summary>
@@ -24,8 +46,52 @@ namespace Google.ProtocolBuffers {
   /// in ExtendableMessage and ExtendableBuilder.
   /// </remarks>
   public class GeneratedExtension<TContainer, TExtension> where TContainer : IMessage<TContainer> {
-    public FieldDescriptor Descriptor;
+    private readonly IMessage messageDefaultInstance;
+    private readonly FieldDescriptor descriptor;
+
+    internal GeneratedExtension(FieldDescriptor descriptor) {
+      if (!descriptor.IsExtension) {
+        throw new ArgumentException("GeneratedExtension given a regular (non-extension) field.");
+      }
+
+      this.descriptor = descriptor;
+
+      switch (descriptor.MappedType) {
+        case MappedType.Message:
+          PropertyInfo defaultInstanceProperty = typeof(TExtension)
+              .GetProperty("DefaultInstance", BindingFlags.Static | BindingFlags.Public);
+          if (defaultInstanceProperty == null) {
+            throw new ArgumentException("No public static DefaultInstance property for type " + typeof(TExtension).Name);
+          }
+          messageDefaultInstance = (IMessage) defaultInstanceProperty.GetValue(null, null);
+          break;
+        case MappedType.Enum:
+          // FIXME(jonskeet): May not need this
+          //enumValueOf = getMethodOrDie(type, "valueOf",
+            //                           EnumValueDescriptor.class);
+          //enumGetValueDescriptor = getMethodOrDie(type, "getValueDescriptor");
+          messageDefaultInstance = null;
+          break;
+        default:
+          messageDefaultInstance = null;
+          break;
+      }
+    }
+
+    public FieldDescriptor Descriptor {
+      get { return descriptor; }
+    }
+
+    public IMessage MessageDefaultInstance {
+      get { return messageDefaultInstance; }
+    }
+
+    internal object SingularFromReflectionType(object p) {
+      throw new System.NotImplementedException();
+    }
 
-    public IMessage MessageDefaultInstance;
+    internal object FromReflectionType(object value) {
+      throw new System.NotImplementedException();
+    }
   }
 }

+ 9 - 4
csharp/ProtocolBuffers/GeneratedMessage.cs

@@ -14,11 +14,16 @@ namespace Google.ProtocolBuffers {
   /// can ignore this class as an implementation detail.
   /// </summary>
   public abstract class GeneratedMessage<TMessage, TBuilder> : AbstractMessage, IMessage<TMessage>
-      where TMessage : GeneratedMessage<TMessage, TBuilder> where TBuilder : IBuilder<TMessage> {
+      where TMessage : GeneratedMessage<TMessage, TBuilder> 
+      where TBuilder : IBuilder<TMessage> {
 
     private UnknownFieldSet unknownFields = UnknownFieldSet.DefaultInstance;
 
-    protected internal abstract FieldAccessorTable InternalFieldAccessors { get; }
+    internal FieldAccessorTable FieldAccesseorsFromBuilder {
+      get { return InternalFieldAccessors; }
+    }
+
+    protected abstract FieldAccessorTable InternalFieldAccessors { get; }
 
     public override MessageDescriptor DescriptorForType {
       get { return InternalFieldAccessors.Descriptor; }
@@ -36,7 +41,7 @@ namespace Google.ProtocolBuffers {
 
     public abstract IBuilder<TMessage> CreateBuilderForType();
 
-    private IDictionary<FieldDescriptor, Object> GetMutableFieldMap() {
+    internal IDictionary<FieldDescriptor, Object> GetMutableFieldMap() {
 
       // Use a SortedList so we'll end up serializing fields in order
       var ret = new SortedList<FieldDescriptor, object>();
@@ -83,6 +88,6 @@ namespace Google.ProtocolBuffers {
     /// </summary>
     internal void SetUnknownFields(UnknownFieldSet fieldSet) {
       unknownFields = fieldSet;
-    }
+    }    
   }
 }

+ 14 - 0
csharp/ProtocolBuffers/IRpcChannel.cs

@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Google.ProtocolBuffers.Descriptors;
+
+namespace Google.ProtocolBuffers {
+  /// <summary>
+  /// TODO(jonskeet): Do this properly.
+  /// </summary>
+  public interface IRpcChannel {
+    void CallMethod<T>(MethodDescriptor method, IRpcController controller,
+        IMessage request, IMessage responsePrototype, Action<T> done);
+  }
+}

+ 8 - 0
csharp/ProtocolBuffers/IRpcController.cs

@@ -0,0 +1,8 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Google.ProtocolBuffers {
+  public interface IRpcController {
+  }
+}

+ 9 - 0
csharp/ProtocolBuffers/IService.cs

@@ -0,0 +1,9 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Google.ProtocolBuffers {
+  public interface IService {
+    // TODO(jonskeet): Fill this in
+  }
+}

+ 6 - 0
csharp/ProtocolBuffers/ProtocolBuffers.csproj

@@ -67,6 +67,8 @@
     <Compile Include="Descriptors\MethodDescriptor.cs" />
     <Compile Include="Descriptors\PackageDescriptor.cs" />
     <Compile Include="Descriptors\ServiceDescriptor.cs" />
+    <Compile Include="DynamicMessage.cs" />
+    <Compile Include="ExtendableMessage.cs" />
     <Compile Include="ExtensionInfo.cs" />
     <Compile Include="ExtensionRegistry.cs" />
     <Compile Include="FieldAccess\SingleEnumAccessor.cs" />
@@ -85,7 +87,11 @@
     <Compile Include="IBuilder.cs" />
     <Compile Include="IMessage.cs" />
     <Compile Include="InvalidProtocolBufferException.cs" />
+    <Compile Include="IRpcChannel.cs" />
+    <Compile Include="IRpcController.cs" />
+    <Compile Include="IService.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="RpcUtil.cs" />
     <Compile Include="TextFormat.cs" />
     <Compile Include="TextGenerator.cs" />
     <Compile Include="UninitializedMessageException.cs" />

+ 35 - 0
csharp/ProtocolBuffers/RpcUtil.cs

@@ -0,0 +1,35 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Google.ProtocolBuffers {
+  public static class RpcUtil {
+
+    /// <summary>
+    /// Converts an Action[IMessage] to an Action[T].
+    /// </summary>
+    public static Action<T> SpecializeCallback<T>(Action<IMessage> action) 
+        where T : IMessage<T> {
+      return message => action(message);
+    }
+
+    /// <summary>
+    /// Converts an Action[T] to an Action[IMessage].
+    /// The generalized action will accept any message object which has
+    /// the same descriptor, and will convert it to the correct class
+    /// before calling the original action. However, if the generalized
+    /// callback is given a message with a different descriptor, an
+    /// exception will be thrown.
+    /// </summary>
+    public static Action<IMessage> GeneralizeCallback<T>(Action<T> action, T defaultInstance)
+        where T : class, IMessage<T> {
+      return message => {
+        T castMessage = message as T;
+        if (castMessage == null) {
+          castMessage = (T) defaultInstance.CreateBuilderForType().MergeFrom(message).Build();
+        }
+        action(castMessage);
+      };
+    }
+  }
+}

+ 5 - 13
csharp/ProtocolBuffers/TextFormat.cs

@@ -155,25 +155,18 @@ namespace Google.ProtocolBuffers {
         UnknownField field = entry.Value;
 
         foreach (ulong value in field.VarintList) {
-          generator.Print(entry.Key.ToString());
-          generator.Print(": ");
+          generator.Print(prefix);
           generator.Print(value.ToString());
           generator.Print("\n");
         }
         foreach (uint value in field.Fixed32List) {
-          generator.Print(entry.Key.ToString());
-          generator.Print(": ");
-          // FIXME(jonskeet): Get format of this right; in Java it's %08x. Find out what this means
-          // Also check we're okay in terms of signed/unsigned.
-          generator.Print(string.Format("0x{0:x}", value));
+          generator.Print(prefix);
+          generator.Print(string.Format("0x{0:x8}", value));
           generator.Print("\n");
         }
         foreach (ulong value in field.Fixed64List) {
-          generator.Print(entry.Key.ToString());
-          generator.Print(": ");
-          // FIXME(jonskeet): Get format of this right; in Java it's %016x. Find out what this means
-          // Also check we're okay in terms of signed/unsigned.
-          generator.Print(string.Format("0x{0:x}", value));
+          generator.Print(prefix);
+          generator.Print(string.Format("0x{0:x16}", value));
           generator.Print("\n");
         }
         foreach (ByteString value in field.LengthDelimitedList) {
@@ -193,7 +186,6 @@ namespace Google.ProtocolBuffers {
       }
     }
 
-
     internal static ulong ParseUInt64(string text) {
       return (ulong) ParseInteger(text, true, false);
     }

+ 2 - 2
csharp/ProtocolBuffers/UnknownField.cs

@@ -127,10 +127,10 @@ namespace Google.ProtocolBuffers {
       foreach (ulong value in varintList) {
         result += CodedOutputStream.ComputeUInt64Size(fieldNumber, value);
       }
-      foreach (int value in fixed32List) {
+      foreach (uint value in fixed32List) {
         result += CodedOutputStream.ComputeFixed32Size(fieldNumber, value);
       }
-      foreach (long value in fixed64List) {
+      foreach (ulong value in fixed64List) {
         result += CodedOutputStream.ComputeFixed64Size(fieldNumber, value);
       }
       foreach (ByteString value in lengthDelimitedList) {

+ 2 - 1
src/google/protobuf/compiler/csharp/csharp_enum.cc

@@ -69,8 +69,9 @@ void EnumGenerator::Generate(io::Printer* printer) {
     vars["number"] = SimpleItoa(canonical_values_[i]->number());
 
     // TODO(jonskeet): Change CONSTANT_CASE into PascalCase
+    // TODO(jonskeet): I don't think we need EnumDescriptorIndex after all
     printer->Print(vars,
-      "[pbd::EnumDescriptorIndex($index$)]\r\n"
+      //"[pbd::EnumDescriptorIndex($index$)]\r\n"
       "$name$ = $number$,\r\n");
   }
   printer->Outdent();

+ 8 - 8
src/google/protobuf/compiler/csharp/csharp_enum_field.cc

@@ -178,11 +178,11 @@ GenerateBuilderMembers(io::Printer* printer) const {
     //   could hold on to the returned list and modify it after the message
     //   has been built, thus mutating the message which is supposed to be
     //   immutable.
-    "public global::System.Collections.Generic::IList<$type$> $capitalized_name$List {\r\n"
+    "public scg::IList<$type$> $capitalized_name$List {\r\n"
     "  get { return pbc::Lists.AsReadOnly(result.$name$_); }\r\n"
     "}\r\n"
     "public int $capitalized_name$Count {\r\n"
-    "  get { return result.get$capitalized_name$Count; } \r\n"
+    "  get { return result.$capitalized_name$Count; } \r\n"
     "}\r\n"
     "public $type$ Get$capitalized_name$(int index) {\r\n"
     "  return result.Get$capitalized_name$(index);\r\n"
@@ -191,7 +191,7 @@ GenerateBuilderMembers(io::Printer* printer) const {
     "  result.$name$_[index] = value;\r\n"
     "  return this;\r\n"
     "}\r\n"
-    "public Builder add$capitalized_name$($type$ value) {\r\n"
+    "public Builder Add$capitalized_name$($type$ value) {\r\n"
     "  if (result.$name$_.Count == 0) {\r\n"
     "    result.$name$_ = new scg::List<$type$>();\r\n"
     "  }\r\n"
@@ -232,9 +232,9 @@ void RepeatedEnumFieldGenerator::
 GenerateParsingCode(io::Printer* printer) const {
   printer->Print(variables_,
     "int rawValue = input.ReadEnum();\r\n"
-    "$type$ value = $type$.valueOf(rawValue);\r\n"
-    "if (value == null) {\r\n"
-    "  unknownFields.MergeVarintField($number$, rawValue);\r\n"
+    "$type$ value = ($type$) rawValue;\r\n"
+    "if (!global::System.Enum.IsDefined(typeof($type$), value)) {\r\n"
+    "  unknownFields.MergeVarintField($number$, (ulong) rawValue);\r\n"
     "} else {\r\n"
     "  Add$capitalized_name$(value);\r\n"
     "}\r\n");
@@ -244,7 +244,7 @@ void RepeatedEnumFieldGenerator::
 GenerateSerializationCode(io::Printer* printer) const {
   printer->Print(variables_,
     "foreach ($type$ element in $capitalized_name$List) {\r\n"
-    "  output.WriteEnum($number$, element.Number);\r\n"
+    "  output.WriteEnum($number$, (int) element);\r\n"
     "}\r\n");
 }
 
@@ -253,7 +253,7 @@ GenerateSerializedSizeCode(io::Printer* printer) const {
   printer->Print(variables_,
     "foreach ($type$ element in $capitalized_name$List) {\r\n"
     "  size += pb::CodedOutputStream\r\n"
-    "    .ComputeEnumSize($number$, element.Number);\r\n"
+    "    .ComputeEnumSize($number$, (int) element);\r\n"
     "}\r\n");
 }
 

+ 6 - 16
src/google/protobuf/compiler/csharp/csharp_extension.cc

@@ -36,7 +36,7 @@ ExtensionGenerator::~ExtensionGenerator() {}
 
 void ExtensionGenerator::Generate(io::Printer* printer) {
   map<string, string> vars;
-  vars["name"] = UnderscoresToCamelCase(descriptor_);
+  vars["name"] = UnderscoresToCapitalizedCamelCase(descriptor_);
   vars["containing_type"] = ClassName(descriptor_->containing_type());
   vars["index"] = SimpleItoa(descriptor_->index());
 
@@ -56,23 +56,13 @@ void ExtensionGenerator::Generate(io::Printer* printer) {
 
   if (descriptor_->is_repeated()) {
     printer->Print(vars,
-      "public static final\r\n"
-      "  pb::GeneratedMessage.GeneratedExtension<\r\n"
-      "    $containing_type$,\r\n"
-      "    java.util.List<$type$>> $name$ =\r\n"
-      "      pb::GeneratedMessage\r\n"
-      "        .newRepeatedGeneratedExtension(\r\n"
-      "          getDescriptor().getExtensions().get($index$),\r\n"
-      "          typeof ($type$));\r\n");
+      "public static readonly\r\n"
+      "  pb::GeneratedExtension<$containing_type$, scg::IList<$type$>> name =\r\n"
+      "      pb::GeneratedExtension.CreateRepeatedExtension<$containing_type$, $type$>(Descriptor.Extensions[$index$]);\r\n");
   } else {
     printer->Print(vars,
-      "public static final\r\n"
-      "  pb::GeneratedMessage.GeneratedExtension<\r\n"
-      "    $containing_type$,\r\n"
-      "    $type$> $name$ =\r\n"
-      "      pb::GeneratedMessage.newGeneratedExtension(\r\n"
-      "        getDescriptor().getExtensions().get($index$),\r\n"
-      "        typeof ($type$));\r\n");
+      "public static readonly pb::GeneratedExtension<$containing_type$, $type$> $name$ =\r\n"
+      "      pb::GeneratedExtension.CreateExtension<$containing_type$, $type$>(Descriptor.Extensions[$index$]);\r\n");
   }
 }
 

+ 3 - 1
src/google/protobuf/compiler/csharp/csharp_file.cc

@@ -148,7 +148,7 @@ void FileGenerator::Generate(io::Printer* printer) {
   printer->Print("\r\n}, new pbd::FileDescriptor[] {\r\n");
   for (int i = 0; i < file_->dependency_count(); i++) {
     printer->Print(
-      "        $dependency$.getDescriptor(),\r\n",
+      "        $dependency$.Descriptor,\r\n",
       "dependency", ClassName(file_->dependency(i)));
   }
 
@@ -165,9 +165,11 @@ void FileGenerator::Generate(io::Printer* printer) {
   // Extensions must be generated in the outer class since they are values,
   // not classes.
   printer->Print("#region Extensions\r\n");
+  printer->Print("/*");
   for (int i = 0; i < file_->extension_count(); i++) {
     ExtensionGenerator(file_->extension(i)).Generate(printer);
   }
+  printer->Print("*/\r\n");
   printer->Print("#endregion\r\n\r\n");
 
   printer->Print("#region Static variables\r\n");

+ 12 - 4
src/google/protobuf/compiler/csharp/csharp_helpers.cc

@@ -91,6 +91,10 @@ string UnderscoresToCapitalizedCamelCase(const FieldDescriptor* field) {
   return UnderscoresToCamelCaseImpl(FieldName(field), true);
 }
 
+string UnderscoresToCapitalizedCamelCase(const MethodDescriptor* method) {
+  return UnderscoresToCamelCaseImpl(method->name(), true);
+}
+
 string UnderscoresToCamelCase(const MethodDescriptor* method) {
   return UnderscoresToCamelCaseImpl(method->name(), false);
 }
@@ -162,19 +166,23 @@ string ClassName(const FileDescriptor* descriptor) {
 MappedType GetMappedType(FieldDescriptor::Type field_type) {
   switch (field_type) {
     case FieldDescriptor::TYPE_INT32:
-    case FieldDescriptor::TYPE_UINT32:
     case FieldDescriptor::TYPE_SINT32:
-    case FieldDescriptor::TYPE_FIXED32:
     case FieldDescriptor::TYPE_SFIXED32:
       return MAPPEDTYPE_INT;
 
     case FieldDescriptor::TYPE_INT64:
-    case FieldDescriptor::TYPE_UINT64:
     case FieldDescriptor::TYPE_SINT64:
-    case FieldDescriptor::TYPE_FIXED64:
     case FieldDescriptor::TYPE_SFIXED64:
       return MAPPEDTYPE_LONG;
 
+    case FieldDescriptor::TYPE_UINT32:
+    case FieldDescriptor::TYPE_FIXED32:
+      return MAPPEDTYPE_UINT;
+
+    case FieldDescriptor::TYPE_UINT64:
+    case FieldDescriptor::TYPE_FIXED64:
+      return MAPPEDTYPE_ULONG;
+
     case FieldDescriptor::TYPE_FLOAT:
       return MAPPEDTYPE_FLOAT;
 

+ 1 - 0
src/google/protobuf/compiler/csharp/csharp_helpers.h

@@ -43,6 +43,7 @@ string UnderscoresToCapitalizedCamelCase(const FieldDescriptor* field);
 // Similar, but for method names.  (Typically, this merely has the effect
 // of lower-casing the first letter of the name.)
 string UnderscoresToCamelCase(const MethodDescriptor* method);
+string UnderscoresToCapitalizedCamelCase(const MethodDescriptor* method);
 
 // Strips ".proto" or ".protodevel" from the end of a filename.
 string StripProto(const string& filename);

+ 6 - 6
src/google/protobuf/compiler/csharp/csharp_message.cc

@@ -204,7 +204,7 @@ void MessageGenerator::Generate(io::Printer* printer) {
 
   if (descriptor_->extension_range_count() > 0) {
     printer->Print(
-      "$access$ sealed partial class $classname$ : pb::GeneratedMessage.ExtendableMessage<$classname$> {\r\n",
+      "$access$ sealed partial class $classname$ : pb::ExtendableMessage<$classname$, $classname$.Builder> {\r\n",
       "classname", descriptor_->name(),
       "access", ClassAccessLevel(descriptor_->file()));
   } else {
@@ -233,7 +233,7 @@ void MessageGenerator::Generate(io::Printer* printer) {
     "  get { return $fileclass$.internal__$identifier$__Descriptor; }\r\n"
     "}\r\n"
     "\r\n"
-    "protected internal override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {\r\n"
+    "protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {\r\n"
     "  get { return $fileclass$.internal__$identifier$__FieldAccessorTable; }\r\n"
     "}\r\n"
     "\r\n",
@@ -298,7 +298,8 @@ GenerateMessageSerializationMethods(io::Printer* printer) {
 
   if (descriptor_->extension_range_count() > 0) {
     printer->Print(
-      "pb::GeneratedMessage.ExtendableMessage.ExtensionWriter extensionWriter = CreateExtensionWriter();\r\n");
+      "pb::ExtendableMessage<$classname$, $classname$.Builder>.ExtensionWriter extensionWriter = CreateExtensionWriter(this);\r\n",
+      "classname", descriptor_->name());
   }
 
   // Merge the fields and the extension ranges, both sorted by field number.
@@ -434,8 +435,7 @@ void MessageGenerator::GenerateBuilder(io::Printer* printer) {
 
   if (descriptor_->extension_range_count() > 0) {
     printer->Print(
-      "$access$ sealed partial class Builder : pb::GeneratedMessage.ExtendableBuilder<\r\n"
-      "      $classname$, Builder> {\r\n",
+      "$access$ sealed partial class Builder : pb::GeneratedBuilder<$classname$, $classname$.Builder>.ExtendableBuilder {\r\n",
       "classname", ClassName(descriptor_),
       "access", ClassAccessLevel(descriptor_->file()));
   } else {
@@ -673,7 +673,7 @@ void MessageGenerator::GenerateIsInitialized(io::Printer* printer) {
 
   if (descriptor_->extension_range_count() > 0) {
     printer->Print(
-      "if (!extensionsAreInitialized()) return false;\r\n");
+      "if (!ExtensionsAreInitialized) return false;\r\n");
   }
 
   printer->Outdent();

+ 31 - 44
src/google/protobuf/compiler/csharp/csharp_service.cc

@@ -36,11 +36,8 @@ ServiceGenerator::ServiceGenerator(const ServiceDescriptor* descriptor)
 ServiceGenerator::~ServiceGenerator() {}
 
 void ServiceGenerator::Generate(io::Printer* printer) {
-  bool is_own_file = descriptor_->file()->options().csharp_multiple_files();
   printer->Print(
-    "public $static$ abstract class $classname$\r\n"
-    "    implements pb::Service {\r\n",
-    "static", is_own_file ? "" : "static",
+    "public abstract class $classname$ : pb::IService {\r\n",
     "classname", descriptor_->name());
   printer->Indent();
 
@@ -48,27 +45,24 @@ void ServiceGenerator::Generate(io::Printer* printer) {
   for (int i = 0; i < descriptor_->method_count(); i++) {
     const MethodDescriptor* method = descriptor_->method(i);
     map<string, string> vars;
-    vars["name"] = UnderscoresToCamelCase(method);
+    vars["name"] = UnderscoresToCapitalizedCamelCase(method);
     vars["input"] = ClassName(method->input_type());
     vars["output"] = ClassName(method->output_type());
     printer->Print(vars,
       "public abstract void $name$(\r\n"
-      "    pb::RpcController controller,\r\n"
+      "    pb::IRpcController controller,\r\n"
       "    $input$ request,\r\n"
-      "    pb::RpcCallback<$output$> done);\r\n");
+      "    global::System.Action<$output$> done);\r\n");
   }
 
-  // Generate getDescriptor() and getDescriptorForType().
+  // Generate Descriptor and DescriptorForType.
   printer->Print(
     "\r\n"
-    "public static final\r\n"
-    "    pbd::ServiceDescriptor\r\n"
-    "    getDescriptor() {\r\n"
-    "  return $file$.getDescriptor().getServices().get($index$);\r\n"
+    "public static pbd::ServiceDescriptor Descriptor {\r\n"
+    "  get { return $file$.Descriptor.Services[$index$]; }\r\n"
     "}\r\n"
-    "public final pbd::ServiceDescriptor\r\n"
-    "    DescriptorForType {\r\n"
-    "  return getDescriptor();\r\n"
+    "public pbd::ServiceDescriptor DescriptorForType {\r\n"
+    "  get { return Descriptor; }\r\n"
     "}\r\n",
     "file", ClassName(descriptor_->file()),
     "index", SimpleItoa(descriptor_->index()));
@@ -86,18 +80,17 @@ void ServiceGenerator::Generate(io::Printer* printer) {
 void ServiceGenerator::GenerateCallMethod(io::Printer* printer) {
   printer->Print(
     "\r\n"
-    "public final void callMethod(\r\n"
+    "public void CallMethod(\r\n"
     "    pbd::MethodDescriptor method,\r\n"
-    "    pb::RpcController controller,\r\n"
+    "    pb::IRpcController controller,\r\n"
     "    pb::IMessage request,\r\n"
-    "    pb::RpcCallback<\r\n"
-    "      pb::Message> done) {\r\n"
-    "  if (method.getService() != getDescriptor()) {\r\n"
+    "    global::System.Action<pb::IMessage> done) {\r\n"
+    "  if (method.Service != Descriptor) {\r\n"
     "    throw new global::System.ArgumentException(\r\n"
     "      \"Service.CallMethod() given method descriptor for wrong \" +\r\n"
     "      \"service type.\");\r\n"
     "  }\r\n"
-    "  switch(method.getIndex()) {\r\n");
+    "  switch(method.Index) {\r\n");
   printer->Indent();
   printer->Indent();
 
@@ -105,13 +98,13 @@ void ServiceGenerator::GenerateCallMethod(io::Printer* printer) {
     const MethodDescriptor* method = descriptor_->method(i);
     map<string, string> vars;
     vars["index"] = SimpleItoa(i);
-    vars["method"] = UnderscoresToCamelCase(method);
+    vars["method"] = UnderscoresToCapitalizedCamelCase(method);
     vars["input"] = ClassName(method->input_type());
     vars["output"] = ClassName(method->output_type());
     printer->Print(vars,
       "case $index$:\r\n"
       "  this.$method$(controller, ($input$)request,\r\n"
-      "    pb::RpcUtil.<$output$>specializeCallback(\r\n"
+      "    pb::RpcUtil.SpecializeCallback<$output$>(\r\n"
       "      done));\r\n"
       "  return;\r\n");
   }
@@ -132,10 +125,8 @@ void ServiceGenerator::GenerateCallMethod(io::Printer* printer) {
 void ServiceGenerator::GenerateGetPrototype(RequestOrResponse which,
                                             io::Printer* printer) {
   printer->Print(
-    "public final pb::Message\r\n"
-    "    Get$request_or_response$Prototype(\r\n"
-    "    pbd::MethodDescriptor method) {\r\n"
-    "  if (method.getService() != getDescriptor()) {\r\n"
+    "public pb::IMessage Get$request_or_response$Prototype(pbd::MethodDescriptor method) {\r\n"
+    "  if (method.Service != Descriptor) {\r\n"
     "    throw new global::System.ArgumentException(\r\n"
     "      \"Service.Get$request_or_response$Prototype() given method \" +\r\n"
     "      \"descriptor for wrong service type.\");\r\n"
@@ -162,7 +153,6 @@ void ServiceGenerator::GenerateGetPrototype(RequestOrResponse which,
 
   printer->Outdent();
   printer->Outdent();
-
   printer->Print(
     "  }\r\n"
     "}\r\n"
@@ -171,48 +161,45 @@ void ServiceGenerator::GenerateGetPrototype(RequestOrResponse which,
 
 void ServiceGenerator::GenerateStub(io::Printer* printer) {
   printer->Print(
-    "public static Stub newStub(\r\n"
-    "    pb::RpcChannel channel) {\r\n"
+    "public static Stub CreateStub(\r\n"
+    "    pb::IRpcChannel channel) {\r\n"
     "  return new Stub(channel);\r\n"
     "}\r\n"
     "\r\n"
-    "public static final class Stub extends $classname$ {\r\n",
+    "public class Stub : $classname$ {\r\n",
     "classname", ClassName(descriptor_));
   printer->Indent();
 
   printer->Print(
-    "private Stub(pb::RpcChannel channel) {\r\n"
+    "internal Stub(pb::IRpcChannel channel) {\r\n"
     "  this.channel = channel;\r\n"
     "}\r\n"
     "\r\n"
-    "private final pb::RpcChannel channel;\r\n"
+    "private readonly pb::IRpcChannel channel;\r\n"
     "\r\n"
-    "public pb::RpcChannel getChannel() {\r\n"
-    "  return channel;\r\n"
+    "public pb::IRpcChannel Channel {\r\n"
+    "  get { return channel; }\r\n"
     "}\r\n");
 
   for (int i = 0; i < descriptor_->method_count(); i++) {
     const MethodDescriptor* method = descriptor_->method(i);
     map<string, string> vars;
     vars["index"] = SimpleItoa(i);
-    vars["method"] = UnderscoresToCamelCase(method);
+    vars["method"] = UnderscoresToCapitalizedCamelCase(method);
     vars["input"] = ClassName(method->input_type());
     vars["output"] = ClassName(method->output_type());
     printer->Print(vars,
       "\r\n"
-      "public void $method$(\r\n"
-      "    pb::RpcController controller,\r\n"
+      "public override void $method$(\r\n"
+      "    pb::IRpcController controller,\r\n"
       "    $input$ request,\r\n"
-      "    pb::RpcCallback<$output$> done) {\r\n"
-      "  channel.callMethod(\r\n"
+      "    global::System.Action<$output$> done) {\r\n"
+      "  channel.CallMethod(\r\n"
       "    Descriptor.Methods[$index$],\r\n"
       "    controller,\r\n"
       "    request,\r\n"
       "    $output$.DefaultInstance,\r\n"
-      "    pb::RpcUtil.generalizeCallback(\r\n"
-      "      done,\r\n"
-      "      typeof ($output$),\r\n"
-      "      $output$.DefaultInstance));\r\n"
+      "    pb::RpcUtil.GeneralizeCallback(done, $output$.DefaultInstance));\r\n"
       "}\r\n");
   }
 

+ 2 - 0
src/google/protobuf/unittest.proto

@@ -20,6 +20,8 @@
 //
 // A proto file we will use for unit testing.
 
+option csharp_namespace = "Google.ProtocolBuffers.TestProtos";
+option csharp_file_classname = "UnitTestProtoFile";
 
 import "google/protobuf/unittest_import.proto";
 

+ 3 - 0
src/google/protobuf/unittest_embed_optimize_for.proto

@@ -24,6 +24,9 @@ import "google/protobuf/unittest_optimize_for.proto";
 
 package protobuf_unittest;
 
+option csharp_namespace = "Google.ProtocolBuffers.TestProtos";
+option csharp_file_classname = "UnitTestEmbedOptimizeForProtoFile";
+
 // We optimize for speed here, but we are importing a proto that is optimized
 // for code size.
 option optimize_for = SPEED;

+ 4 - 1
src/google/protobuf/unittest_import.proto

@@ -29,9 +29,12 @@ package protobuf_unittest_import;
 
 option optimize_for = SPEED;
 
-// Excercise the java_package option.
+// Exercise the java_package option.
 option java_package = "com.google.protobuf.test";
 
+option csharp_namespace = "Google.ProtocolBuffers.TestProtos";
+option csharp_file_classname = "UnitTestImportProtoFile";
+
 // Do not set a java_outer_classname here to verify that Proto2 works without
 // one.
 

+ 3 - 0
src/google/protobuf/unittest_mset.proto

@@ -24,6 +24,9 @@ package protobuf_unittest;
 
 option optimize_for = SPEED;
 
+option csharp_namespace = "Google.ProtocolBuffers.TestProtos";
+option csharp_file_classname = "UnitTestMessageSetProtoFile";
+
 // A message with message_set_wire_format.
 message TestMessageSet {
   option message_set_wire_format = true;

+ 3 - 0
src/google/protobuf/unittest_optimize_for.proto

@@ -26,6 +26,9 @@ package protobuf_unittest;
 
 option optimize_for = CODE_SIZE;
 
+option csharp_namespace = "Google.ProtocolBuffers.TestProtos";
+option csharp_file_classname = "UnitTestOptimizeForProtoFile";
+
 message TestOptimizedForSize {
   optional int32 i = 1;
   optional ForeignMessage msg = 19;