First pass at implementation and testing of reusable builders.
diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestCustomOptionsProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestCustomOptionsProtoFile.cs
index 0b1be42..bc29da2 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestCustomOptionsProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestCustomOptionsProtoFile.cs
@@ -513,7 +513,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

     public static Builder CreateBuilder(TestMessageWithCustomOptions prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

@@ -523,21 +523,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new TestMessageWithCustomOptions();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(TestMessageWithCustomOptions cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      TestMessageWithCustomOptions result = new TestMessageWithCustomOptions();

+      bool builderIsReadOnly;

+      TestMessageWithCustomOptions result;

+      

+      private TestMessageWithCustomOptions PrepareBuilder() {

+        if (builderIsReadOnly) {

+          TestMessageWithCustomOptions original = result;

+          result = new TestMessageWithCustomOptions();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override TestMessageWithCustomOptions MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new TestMessageWithCustomOptions();

+        result = DefaultInstance ?? new TestMessageWithCustomOptions();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        return new Builder().MergeFrom(result);

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

+          return new Builder().MergeFrom(result);

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -549,12 +576,11 @@
       }

       

       public override TestMessageWithCustomOptions BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        TestMessageWithCustomOptions returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -568,6 +594,7 @@
       

       public override Builder MergeFrom(TestMessageWithCustomOptions other) {

         if (other == global::Google.ProtocolBuffers.TestProtos.TestMessageWithCustomOptions.DefaultInstance) return this;

+        PrepareBuilder();

         if (other.HasField1) {

           Field1 = other.Field1;

         }

@@ -580,6 +607,7 @@
       }

       

       public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -636,11 +664,13 @@
       }

       public Builder SetField1(string value) {

         pb::ThrowHelper.ThrowIfNull(value, "value");

+        PrepareBuilder();

         result.hasField1 = true;

         result.field1_ = value;

         return this;

       }

       public Builder ClearField1() {

+        PrepareBuilder();

         result.hasField1 = false;

         result.field1_ = "";

         return this;

@@ -737,7 +767,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

     public static Builder CreateBuilder(CustomOptionFooRequest prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

@@ -747,21 +777,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new CustomOptionFooRequest();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(CustomOptionFooRequest cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      CustomOptionFooRequest result = new CustomOptionFooRequest();

+      bool builderIsReadOnly;

+      CustomOptionFooRequest result;

+      

+      private CustomOptionFooRequest PrepareBuilder() {

+        if (builderIsReadOnly) {

+          CustomOptionFooRequest original = result;

+          result = new CustomOptionFooRequest();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override CustomOptionFooRequest MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new CustomOptionFooRequest();

+        result = DefaultInstance ?? new CustomOptionFooRequest();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        return new Builder().MergeFrom(result);

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

+          return new Builder().MergeFrom(result);

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -773,12 +830,11 @@
       }

       

       public override CustomOptionFooRequest BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        CustomOptionFooRequest returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -792,6 +848,7 @@
       

       public override Builder MergeFrom(CustomOptionFooRequest other) {

         if (other == global::Google.ProtocolBuffers.TestProtos.CustomOptionFooRequest.DefaultInstance) return this;

+        PrepareBuilder();

         this.MergeUnknownFields(other.UnknownFields);

         return this;

       }

@@ -801,6 +858,7 @@
       }

       

       public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -935,7 +993,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

     public static Builder CreateBuilder(CustomOptionFooResponse prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

@@ -945,21 +1003,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new CustomOptionFooResponse();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(CustomOptionFooResponse cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      CustomOptionFooResponse result = new CustomOptionFooResponse();

+      bool builderIsReadOnly;

+      CustomOptionFooResponse result;

+      

+      private CustomOptionFooResponse PrepareBuilder() {

+        if (builderIsReadOnly) {

+          CustomOptionFooResponse original = result;

+          result = new CustomOptionFooResponse();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override CustomOptionFooResponse MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new CustomOptionFooResponse();

+        result = DefaultInstance ?? new CustomOptionFooResponse();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        return new Builder().MergeFrom(result);

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

+          return new Builder().MergeFrom(result);

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -971,12 +1056,11 @@
       }

       

       public override CustomOptionFooResponse BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        CustomOptionFooResponse returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -990,6 +1074,7 @@
       

       public override Builder MergeFrom(CustomOptionFooResponse other) {

         if (other == global::Google.ProtocolBuffers.TestProtos.CustomOptionFooResponse.DefaultInstance) return this;

+        PrepareBuilder();

         this.MergeUnknownFields(other.UnknownFields);

         return this;

       }

@@ -999,6 +1084,7 @@
       }

       

       public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -1148,7 +1234,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

     public static Builder CreateBuilder(DummyMessageContainingEnum prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

@@ -1158,21 +1244,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new DummyMessageContainingEnum();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(DummyMessageContainingEnum cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      DummyMessageContainingEnum result = new DummyMessageContainingEnum();

+      bool builderIsReadOnly;

+      DummyMessageContainingEnum result;

+      

+      private DummyMessageContainingEnum PrepareBuilder() {

+        if (builderIsReadOnly) {

+          DummyMessageContainingEnum original = result;

+          result = new DummyMessageContainingEnum();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override DummyMessageContainingEnum MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new DummyMessageContainingEnum();

+        result = DefaultInstance ?? new DummyMessageContainingEnum();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        return new Builder().MergeFrom(result);

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

+          return new Builder().MergeFrom(result);

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -1184,12 +1297,11 @@
       }

       

       public override DummyMessageContainingEnum BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        DummyMessageContainingEnum returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -1203,6 +1315,7 @@
       

       public override Builder MergeFrom(DummyMessageContainingEnum other) {

         if (other == global::Google.ProtocolBuffers.TestProtos.DummyMessageContainingEnum.DefaultInstance) return this;

+        PrepareBuilder();

         this.MergeUnknownFields(other.UnknownFields);

         return this;

       }

@@ -1212,6 +1325,7 @@
       }

       

       public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -1346,7 +1460,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

     public static Builder CreateBuilder(DummyMessageInvalidAsOptionType prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

@@ -1356,21 +1470,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new DummyMessageInvalidAsOptionType();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(DummyMessageInvalidAsOptionType cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      DummyMessageInvalidAsOptionType result = new DummyMessageInvalidAsOptionType();

+      bool builderIsReadOnly;

+      DummyMessageInvalidAsOptionType result;

+      

+      private DummyMessageInvalidAsOptionType PrepareBuilder() {

+        if (builderIsReadOnly) {

+          DummyMessageInvalidAsOptionType original = result;

+          result = new DummyMessageInvalidAsOptionType();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override DummyMessageInvalidAsOptionType MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new DummyMessageInvalidAsOptionType();

+        result = DefaultInstance ?? new DummyMessageInvalidAsOptionType();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        return new Builder().MergeFrom(result);

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

+          return new Builder().MergeFrom(result);

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -1382,12 +1523,11 @@
       }

       

       public override DummyMessageInvalidAsOptionType BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        DummyMessageInvalidAsOptionType returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -1401,6 +1541,7 @@
       

       public override Builder MergeFrom(DummyMessageInvalidAsOptionType other) {

         if (other == global::Google.ProtocolBuffers.TestProtos.DummyMessageInvalidAsOptionType.DefaultInstance) return this;

+        PrepareBuilder();

         this.MergeUnknownFields(other.UnknownFields);

         return this;

       }

@@ -1410,6 +1551,7 @@
       }

       

       public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -1544,7 +1686,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

     public static Builder CreateBuilder(CustomOptionMinIntegerValues prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

@@ -1554,21 +1696,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new CustomOptionMinIntegerValues();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(CustomOptionMinIntegerValues cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      CustomOptionMinIntegerValues result = new CustomOptionMinIntegerValues();

+      bool builderIsReadOnly;

+      CustomOptionMinIntegerValues result;

+      

+      private CustomOptionMinIntegerValues PrepareBuilder() {

+        if (builderIsReadOnly) {

+          CustomOptionMinIntegerValues original = result;

+          result = new CustomOptionMinIntegerValues();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override CustomOptionMinIntegerValues MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new CustomOptionMinIntegerValues();

+        result = DefaultInstance ?? new CustomOptionMinIntegerValues();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        return new Builder().MergeFrom(result);

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

+          return new Builder().MergeFrom(result);

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -1580,12 +1749,11 @@
       }

       

       public override CustomOptionMinIntegerValues BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        CustomOptionMinIntegerValues returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -1599,6 +1767,7 @@
       

       public override Builder MergeFrom(CustomOptionMinIntegerValues other) {

         if (other == global::Google.ProtocolBuffers.TestProtos.CustomOptionMinIntegerValues.DefaultInstance) return this;

+        PrepareBuilder();

         this.MergeUnknownFields(other.UnknownFields);

         return this;

       }

@@ -1608,6 +1777,7 @@
       }

       

       public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -1742,7 +1912,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

     public static Builder CreateBuilder(CustomOptionMaxIntegerValues prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

@@ -1752,21 +1922,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new CustomOptionMaxIntegerValues();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(CustomOptionMaxIntegerValues cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      CustomOptionMaxIntegerValues result = new CustomOptionMaxIntegerValues();

+      bool builderIsReadOnly;

+      CustomOptionMaxIntegerValues result;

+      

+      private CustomOptionMaxIntegerValues PrepareBuilder() {

+        if (builderIsReadOnly) {

+          CustomOptionMaxIntegerValues original = result;

+          result = new CustomOptionMaxIntegerValues();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override CustomOptionMaxIntegerValues MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new CustomOptionMaxIntegerValues();

+        result = DefaultInstance ?? new CustomOptionMaxIntegerValues();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        return new Builder().MergeFrom(result);

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

+          return new Builder().MergeFrom(result);

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -1778,12 +1975,11 @@
       }

       

       public override CustomOptionMaxIntegerValues BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        CustomOptionMaxIntegerValues returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -1797,6 +1993,7 @@
       

       public override Builder MergeFrom(CustomOptionMaxIntegerValues other) {

         if (other == global::Google.ProtocolBuffers.TestProtos.CustomOptionMaxIntegerValues.DefaultInstance) return this;

+        PrepareBuilder();

         this.MergeUnknownFields(other.UnknownFields);

         return this;

       }

@@ -1806,6 +2003,7 @@
       }

       

       public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -1940,7 +2138,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

     public static Builder CreateBuilder(CustomOptionOtherValues prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

@@ -1950,21 +2148,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new CustomOptionOtherValues();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(CustomOptionOtherValues cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      CustomOptionOtherValues result = new CustomOptionOtherValues();

+      bool builderIsReadOnly;

+      CustomOptionOtherValues result;

+      

+      private CustomOptionOtherValues PrepareBuilder() {

+        if (builderIsReadOnly) {

+          CustomOptionOtherValues original = result;

+          result = new CustomOptionOtherValues();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override CustomOptionOtherValues MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new CustomOptionOtherValues();

+        result = DefaultInstance ?? new CustomOptionOtherValues();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        return new Builder().MergeFrom(result);

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

+          return new Builder().MergeFrom(result);

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -1976,12 +2201,11 @@
       }

       

       public override CustomOptionOtherValues BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        CustomOptionOtherValues returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -1995,6 +2219,7 @@
       

       public override Builder MergeFrom(CustomOptionOtherValues other) {

         if (other == global::Google.ProtocolBuffers.TestProtos.CustomOptionOtherValues.DefaultInstance) return this;

+        PrepareBuilder();

         this.MergeUnknownFields(other.UnknownFields);

         return this;

       }

@@ -2004,6 +2229,7 @@
       }

       

       public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -2138,7 +2364,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

     public static Builder CreateBuilder(SettingRealsFromPositiveInts prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

@@ -2148,21 +2374,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new SettingRealsFromPositiveInts();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(SettingRealsFromPositiveInts cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      SettingRealsFromPositiveInts result = new SettingRealsFromPositiveInts();

+      bool builderIsReadOnly;

+      SettingRealsFromPositiveInts result;

+      

+      private SettingRealsFromPositiveInts PrepareBuilder() {

+        if (builderIsReadOnly) {

+          SettingRealsFromPositiveInts original = result;

+          result = new SettingRealsFromPositiveInts();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override SettingRealsFromPositiveInts MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new SettingRealsFromPositiveInts();

+        result = DefaultInstance ?? new SettingRealsFromPositiveInts();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        return new Builder().MergeFrom(result);

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

+          return new Builder().MergeFrom(result);

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -2174,12 +2427,11 @@
       }

       

       public override SettingRealsFromPositiveInts BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        SettingRealsFromPositiveInts returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -2193,6 +2445,7 @@
       

       public override Builder MergeFrom(SettingRealsFromPositiveInts other) {

         if (other == global::Google.ProtocolBuffers.TestProtos.SettingRealsFromPositiveInts.DefaultInstance) return this;

+        PrepareBuilder();

         this.MergeUnknownFields(other.UnknownFields);

         return this;

       }

@@ -2202,6 +2455,7 @@
       }

       

       public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -2336,7 +2590,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

     public static Builder CreateBuilder(SettingRealsFromNegativeInts prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

@@ -2346,21 +2600,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new SettingRealsFromNegativeInts();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(SettingRealsFromNegativeInts cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      SettingRealsFromNegativeInts result = new SettingRealsFromNegativeInts();

+      bool builderIsReadOnly;

+      SettingRealsFromNegativeInts result;

+      

+      private SettingRealsFromNegativeInts PrepareBuilder() {

+        if (builderIsReadOnly) {

+          SettingRealsFromNegativeInts original = result;

+          result = new SettingRealsFromNegativeInts();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override SettingRealsFromNegativeInts MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new SettingRealsFromNegativeInts();

+        result = DefaultInstance ?? new SettingRealsFromNegativeInts();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        return new Builder().MergeFrom(result);

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

+          return new Builder().MergeFrom(result);

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -2372,12 +2653,11 @@
       }

       

       public override SettingRealsFromNegativeInts BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        SettingRealsFromNegativeInts returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -2391,6 +2671,7 @@
       

       public override Builder MergeFrom(SettingRealsFromNegativeInts other) {

         if (other == global::Google.ProtocolBuffers.TestProtos.SettingRealsFromNegativeInts.DefaultInstance) return this;

+        PrepareBuilder();

         this.MergeUnknownFields(other.UnknownFields);

         return this;

       }

@@ -2400,6 +2681,7 @@
       }

       

       public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -2586,7 +2868,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

     public static Builder CreateBuilder(ComplexOptionType1 prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

@@ -2596,21 +2878,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new ComplexOptionType1();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(ComplexOptionType1 cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      ComplexOptionType1 result = new ComplexOptionType1();

+      bool builderIsReadOnly;

+      ComplexOptionType1 result;

+      

+      private ComplexOptionType1 PrepareBuilder() {

+        if (builderIsReadOnly) {

+          ComplexOptionType1 original = result;

+          result = new ComplexOptionType1();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override ComplexOptionType1 MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new ComplexOptionType1();

+        result = DefaultInstance ?? new ComplexOptionType1();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        return new Builder().MergeFrom(result);

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

+          return new Builder().MergeFrom(result);

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -2622,12 +2931,11 @@
       }

       

       public override ComplexOptionType1 BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        ComplexOptionType1 returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -2641,6 +2949,7 @@
       

       public override Builder MergeFrom(ComplexOptionType1 other) {

         if (other == global::Google.ProtocolBuffers.TestProtos.ComplexOptionType1.DefaultInstance) return this;

+        PrepareBuilder();

         if (other.HasFoo) {

           Foo = other.Foo;

         }

@@ -2660,6 +2969,7 @@
       }

       

       public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -2723,11 +3033,13 @@
         set { SetFoo(value); }

       }

       public Builder SetFoo(int value) {

+        PrepareBuilder();

         result.hasFoo = true;

         result.foo_ = value;

         return this;

       }

       public Builder ClearFoo() {

+        PrepareBuilder();

         result.hasFoo = false;

         result.foo_ = 0;

         return this;

@@ -2741,11 +3053,13 @@
         set { SetFoo2(value); }

       }

       public Builder SetFoo2(int value) {

+        PrepareBuilder();

         result.hasFoo2 = true;

         result.foo2_ = value;

         return this;

       }

       public Builder ClearFoo2() {

+        PrepareBuilder();

         result.hasFoo2 = false;

         result.foo2_ = 0;

         return this;

@@ -2759,11 +3073,13 @@
         set { SetFoo3(value); }

       }

       public Builder SetFoo3(int value) {

+        PrepareBuilder();

         result.hasFoo3 = true;

         result.foo3_ = value;

         return this;

       }

       public Builder ClearFoo3() {

+        PrepareBuilder();

         result.hasFoo3 = false;

         result.foo3_ = 0;

         return this;

@@ -2910,7 +3226,7 @@
         public override Builder ToBuilder() { return CreateBuilder(this); }

         public override Builder CreateBuilderForType() { return new Builder(); }

         public static Builder CreateBuilder(ComplexOptionType4 prototype) {

-          return (Builder) new Builder().MergeFrom(prototype);

+          return new Builder(prototype);

         }

         

         [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

@@ -2920,21 +3236,48 @@
           protected override Builder ThisBuilder {

             get { return this; }

           }

-          public Builder() {}

+          public Builder() {

+            result = DefaultInstance ?? new ComplexOptionType4();

+            builderIsReadOnly = result == DefaultInstance;

+          }

+          internal Builder(ComplexOptionType4 cloneFrom) {

+            result = cloneFrom;

+            builderIsReadOnly = true;

+          }

           

-          ComplexOptionType4 result = new ComplexOptionType4();

+          bool builderIsReadOnly;

+          ComplexOptionType4 result;

+          

+          private ComplexOptionType4 PrepareBuilder() {

+            if (builderIsReadOnly) {

+              ComplexOptionType4 original = result;

+              result = new ComplexOptionType4();

+              builderIsReadOnly = false;

+              MergeFrom(original);

+            }

+            return result;

+          }

+          

+          public override bool IsInitialized {

+            get { return result.IsInitialized; }

+          }

           

           protected override ComplexOptionType4 MessageBeingBuilt {

-            get { return result; }

+            get { return PrepareBuilder(); }

           }

           

           public override Builder Clear() {

-            result = new ComplexOptionType4();

+            result = DefaultInstance ?? new ComplexOptionType4();

+            builderIsReadOnly = true;

             return this;

           }

           

           public override Builder Clone() {

-            return new Builder().MergeFrom(result);

+            if (builderIsReadOnly) {

+              return new Builder(result);

+            } else {

+              return new Builder().MergeFrom(result);

+            }

           }

           

           public override pbd::MessageDescriptor DescriptorForType {

@@ -2946,12 +3289,11 @@
           }

           

           public override ComplexOptionType4 BuildPartial() {

-            if (result == null) {

-              throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+            if (builderIsReadOnly) {

+              return result;

             }

-            ComplexOptionType4 returnMe = result;

-            result = null;

-            return returnMe;

+            builderIsReadOnly = true;

+            return result;

           }

           

           public override Builder MergeFrom(pb::IMessage other) {

@@ -2965,6 +3307,7 @@
           

           public override Builder MergeFrom(ComplexOptionType4 other) {

             if (other == global::Google.ProtocolBuffers.TestProtos.ComplexOptionType2.Types.ComplexOptionType4.DefaultInstance) return this;

+            PrepareBuilder();

             if (other.HasWaldo) {

               Waldo = other.Waldo;

             }

@@ -2977,6 +3320,7 @@
           }

           

           public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+            PrepareBuilder();

             pb::UnknownFieldSet.Builder unknownFields = null;

             uint tag;

             string field_name;

@@ -3032,11 +3376,13 @@
             set { SetWaldo(value); }

           }

           public Builder SetWaldo(int value) {

+            PrepareBuilder();

             result.hasWaldo = true;

             result.waldo_ = value;

             return this;

           }

           public Builder ClearWaldo() {

+            PrepareBuilder();

             result.hasWaldo = false;

             result.waldo_ = 0;

             return this;

@@ -3164,7 +3510,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

     public static Builder CreateBuilder(ComplexOptionType2 prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

@@ -3174,21 +3520,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new ComplexOptionType2();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(ComplexOptionType2 cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      ComplexOptionType2 result = new ComplexOptionType2();

+      bool builderIsReadOnly;

+      ComplexOptionType2 result;

+      

+      private ComplexOptionType2 PrepareBuilder() {

+        if (builderIsReadOnly) {

+          ComplexOptionType2 original = result;

+          result = new ComplexOptionType2();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override ComplexOptionType2 MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new ComplexOptionType2();

+        result = DefaultInstance ?? new ComplexOptionType2();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        return new Builder().MergeFrom(result);

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

+          return new Builder().MergeFrom(result);

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -3200,12 +3573,11 @@
       }

       

       public override ComplexOptionType2 BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        ComplexOptionType2 returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -3219,6 +3591,7 @@
       

       public override Builder MergeFrom(ComplexOptionType2 other) {

         if (other == global::Google.ProtocolBuffers.TestProtos.ComplexOptionType2.DefaultInstance) return this;

+        PrepareBuilder();

         if (other.HasBar) {

           MergeBar(other.Bar);

         }

@@ -3238,6 +3611,7 @@
       }

       

       public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -3312,18 +3686,21 @@
       }

       public Builder SetBar(global::Google.ProtocolBuffers.TestProtos.ComplexOptionType1 value) {

         pb::ThrowHelper.ThrowIfNull(value, "value");

+        PrepareBuilder();

         result.hasBar = true;

         result.bar_ = value;

         return this;

       }

       public Builder SetBar(global::Google.ProtocolBuffers.TestProtos.ComplexOptionType1.Builder builderForValue) {

         pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");

+        PrepareBuilder();

         result.hasBar = true;

         result.bar_ = builderForValue.Build();

         return this;

       }

       public Builder MergeBar(global::Google.ProtocolBuffers.TestProtos.ComplexOptionType1 value) {

         pb::ThrowHelper.ThrowIfNull(value, "value");

+        PrepareBuilder();

         if (result.hasBar &&

             result.bar_ != global::Google.ProtocolBuffers.TestProtos.ComplexOptionType1.DefaultInstance) {

             result.bar_ = global::Google.ProtocolBuffers.TestProtos.ComplexOptionType1.CreateBuilder(result.bar_).MergeFrom(value).BuildPartial();

@@ -3334,6 +3711,7 @@
         return this;

       }

       public Builder ClearBar() {

+        PrepareBuilder();

         result.hasBar = false;

         result.bar_ = global::Google.ProtocolBuffers.TestProtos.ComplexOptionType1.DefaultInstance;

         return this;

@@ -3347,11 +3725,13 @@
         set { SetBaz(value); }

       }

       public Builder SetBaz(int value) {

+        PrepareBuilder();

         result.hasBaz = true;

         result.baz_ = value;

         return this;

       }

       public Builder ClearBaz() {

+        PrepareBuilder();

         result.hasBaz = false;

         result.baz_ = 0;

         return this;

@@ -3366,18 +3746,21 @@
       }

       public Builder SetFred(global::Google.ProtocolBuffers.TestProtos.ComplexOptionType2.Types.ComplexOptionType4 value) {

         pb::ThrowHelper.ThrowIfNull(value, "value");

+        PrepareBuilder();

         result.hasFred = true;

         result.fred_ = value;

         return this;

       }

       public Builder SetFred(global::Google.ProtocolBuffers.TestProtos.ComplexOptionType2.Types.ComplexOptionType4.Builder builderForValue) {

         pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");

+        PrepareBuilder();

         result.hasFred = true;

         result.fred_ = builderForValue.Build();

         return this;

       }

       public Builder MergeFred(global::Google.ProtocolBuffers.TestProtos.ComplexOptionType2.Types.ComplexOptionType4 value) {

         pb::ThrowHelper.ThrowIfNull(value, "value");

+        PrepareBuilder();

         if (result.hasFred &&

             result.fred_ != global::Google.ProtocolBuffers.TestProtos.ComplexOptionType2.Types.ComplexOptionType4.DefaultInstance) {

             result.fred_ = global::Google.ProtocolBuffers.TestProtos.ComplexOptionType2.Types.ComplexOptionType4.CreateBuilder(result.fred_).MergeFrom(value).BuildPartial();

@@ -3388,6 +3771,7 @@
         return this;

       }

       public Builder ClearFred() {

+        PrepareBuilder();

         result.hasFred = false;

         result.fred_ = global::Google.ProtocolBuffers.TestProtos.ComplexOptionType2.Types.ComplexOptionType4.DefaultInstance;

         return this;

@@ -3532,7 +3916,7 @@
         public override Builder ToBuilder() { return CreateBuilder(this); }

         public override Builder CreateBuilderForType() { return new Builder(); }

         public static Builder CreateBuilder(ComplexOptionType5 prototype) {

-          return (Builder) new Builder().MergeFrom(prototype);

+          return new Builder(prototype);

         }

         

         [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

@@ -3542,21 +3926,48 @@
           protected override Builder ThisBuilder {

             get { return this; }

           }

-          public Builder() {}

+          public Builder() {

+            result = DefaultInstance ?? new ComplexOptionType5();

+            builderIsReadOnly = result == DefaultInstance;

+          }

+          internal Builder(ComplexOptionType5 cloneFrom) {

+            result = cloneFrom;

+            builderIsReadOnly = true;

+          }

           

-          ComplexOptionType5 result = new ComplexOptionType5();

+          bool builderIsReadOnly;

+          ComplexOptionType5 result;

+          

+          private ComplexOptionType5 PrepareBuilder() {

+            if (builderIsReadOnly) {

+              ComplexOptionType5 original = result;

+              result = new ComplexOptionType5();

+              builderIsReadOnly = false;

+              MergeFrom(original);

+            }

+            return result;

+          }

+          

+          public override bool IsInitialized {

+            get { return result.IsInitialized; }

+          }

           

           protected override ComplexOptionType5 MessageBeingBuilt {

-            get { return result; }

+            get { return PrepareBuilder(); }

           }

           

           public override Builder Clear() {

-            result = new ComplexOptionType5();

+            result = DefaultInstance ?? new ComplexOptionType5();

+            builderIsReadOnly = true;

             return this;

           }

           

           public override Builder Clone() {

-            return new Builder().MergeFrom(result);

+            if (builderIsReadOnly) {

+              return new Builder(result);

+            } else {

+              return new Builder().MergeFrom(result);

+            }

           }

           

           public override pbd::MessageDescriptor DescriptorForType {

@@ -3568,12 +3979,11 @@
           }

           

           public override ComplexOptionType5 BuildPartial() {

-            if (result == null) {

-              throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+            if (builderIsReadOnly) {

+              return result;

             }

-            ComplexOptionType5 returnMe = result;

-            result = null;

-            return returnMe;

+            builderIsReadOnly = true;

+            return result;

           }

           

           public override Builder MergeFrom(pb::IMessage other) {

@@ -3587,6 +3997,7 @@
           

           public override Builder MergeFrom(ComplexOptionType5 other) {

             if (other == global::Google.ProtocolBuffers.TestProtos.ComplexOptionType3.Types.ComplexOptionType5.DefaultInstance) return this;

+            PrepareBuilder();

             if (other.HasPlugh) {

               Plugh = other.Plugh;

             }

@@ -3599,6 +4010,7 @@
           }

           

           public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+            PrepareBuilder();

             pb::UnknownFieldSet.Builder unknownFields = null;

             uint tag;

             string field_name;

@@ -3654,11 +4066,13 @@
             set { SetPlugh(value); }

           }

           public Builder SetPlugh(int value) {

+            PrepareBuilder();

             result.hasPlugh = true;

             result.plugh_ = value;

             return this;

           }

           public Builder ClearPlugh() {

+            PrepareBuilder();

             result.hasPlugh = false;

             result.plugh_ = 0;

             return this;

@@ -3763,7 +4177,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

     public static Builder CreateBuilder(ComplexOptionType3 prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

@@ -3773,21 +4187,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new ComplexOptionType3();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(ComplexOptionType3 cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      ComplexOptionType3 result = new ComplexOptionType3();

+      bool builderIsReadOnly;

+      ComplexOptionType3 result;

+      

+      private ComplexOptionType3 PrepareBuilder() {

+        if (builderIsReadOnly) {

+          ComplexOptionType3 original = result;

+          result = new ComplexOptionType3();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override ComplexOptionType3 MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new ComplexOptionType3();

+        result = DefaultInstance ?? new ComplexOptionType3();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        return new Builder().MergeFrom(result);

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

+          return new Builder().MergeFrom(result);

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -3799,12 +4240,11 @@
       }

       

       public override ComplexOptionType3 BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        ComplexOptionType3 returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -3818,6 +4258,7 @@
       

       public override Builder MergeFrom(ComplexOptionType3 other) {

         if (other == global::Google.ProtocolBuffers.TestProtos.ComplexOptionType3.DefaultInstance) return this;

+        PrepareBuilder();

         if (other.HasQux) {

           Qux = other.Qux;

         }

@@ -3833,6 +4274,7 @@
       }

       

       public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -3897,11 +4339,13 @@
         set { SetQux(value); }

       }

       public Builder SetQux(int value) {

+        PrepareBuilder();

         result.hasQux = true;

         result.qux_ = value;

         return this;

       }

       public Builder ClearQux() {

+        PrepareBuilder();

         result.hasQux = false;

         result.qux_ = 0;

         return this;

@@ -3916,18 +4360,21 @@
       }

       public Builder SetComplexOptionType5(global::Google.ProtocolBuffers.TestProtos.ComplexOptionType3.Types.ComplexOptionType5 value) {

         pb::ThrowHelper.ThrowIfNull(value, "value");

+        PrepareBuilder();

         result.hasComplexOptionType5 = true;

         result.complexOptionType5_ = value;

         return this;

       }

       public Builder SetComplexOptionType5(global::Google.ProtocolBuffers.TestProtos.ComplexOptionType3.Types.ComplexOptionType5.Builder builderForValue) {

         pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");

+        PrepareBuilder();

         result.hasComplexOptionType5 = true;

         result.complexOptionType5_ = builderForValue.Build();

         return this;

       }

       public Builder MergeComplexOptionType5(global::Google.ProtocolBuffers.TestProtos.ComplexOptionType3.Types.ComplexOptionType5 value) {

         pb::ThrowHelper.ThrowIfNull(value, "value");

+        PrepareBuilder();

         if (result.hasComplexOptionType5 &&

             result.complexOptionType5_ != global::Google.ProtocolBuffers.TestProtos.ComplexOptionType3.Types.ComplexOptionType5.DefaultInstance) {

             result.complexOptionType5_ = global::Google.ProtocolBuffers.TestProtos.ComplexOptionType3.Types.ComplexOptionType5.CreateBuilder(result.complexOptionType5_).MergeFrom(value).BuildPartial();

@@ -3938,6 +4385,7 @@
         return this;

       }

       public Builder ClearComplexOptionType5() {

+        PrepareBuilder();

         result.hasComplexOptionType5 = false;

         result.complexOptionType5_ = global::Google.ProtocolBuffers.TestProtos.ComplexOptionType3.Types.ComplexOptionType5.DefaultInstance;

         return this;

@@ -4050,7 +4498,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

     public static Builder CreateBuilder(ComplexOpt6 prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

@@ -4060,21 +4508,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new ComplexOpt6();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(ComplexOpt6 cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      ComplexOpt6 result = new ComplexOpt6();

+      bool builderIsReadOnly;

+      ComplexOpt6 result;

+      

+      private ComplexOpt6 PrepareBuilder() {

+        if (builderIsReadOnly) {

+          ComplexOpt6 original = result;

+          result = new ComplexOpt6();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override ComplexOpt6 MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new ComplexOpt6();

+        result = DefaultInstance ?? new ComplexOpt6();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        return new Builder().MergeFrom(result);

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

+          return new Builder().MergeFrom(result);

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -4086,12 +4561,11 @@
       }

       

       public override ComplexOpt6 BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        ComplexOpt6 returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -4105,6 +4579,7 @@
       

       public override Builder MergeFrom(ComplexOpt6 other) {

         if (other == global::Google.ProtocolBuffers.TestProtos.ComplexOpt6.DefaultInstance) return this;

+        PrepareBuilder();

         if (other.HasXyzzy) {

           Xyzzy = other.Xyzzy;

         }

@@ -4117,6 +4592,7 @@
       }

       

       public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -4172,11 +4648,13 @@
         set { SetXyzzy(value); }

       }

       public Builder SetXyzzy(int value) {

+        PrepareBuilder();

         result.hasXyzzy = true;

         result.xyzzy_ = value;

         return this;

       }

       public Builder ClearXyzzy() {

+        PrepareBuilder();

         result.hasXyzzy = false;

         result.xyzzy_ = 0;

         return this;

@@ -4273,7 +4751,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

     public static Builder CreateBuilder(VariousComplexOptions prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

@@ -4283,21 +4761,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new VariousComplexOptions();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(VariousComplexOptions cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      VariousComplexOptions result = new VariousComplexOptions();

+      bool builderIsReadOnly;

+      VariousComplexOptions result;

+      

+      private VariousComplexOptions PrepareBuilder() {

+        if (builderIsReadOnly) {

+          VariousComplexOptions original = result;

+          result = new VariousComplexOptions();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override VariousComplexOptions MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new VariousComplexOptions();

+        result = DefaultInstance ?? new VariousComplexOptions();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        return new Builder().MergeFrom(result);

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

+          return new Builder().MergeFrom(result);

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -4309,12 +4814,11 @@
       }

       

       public override VariousComplexOptions BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        VariousComplexOptions returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -4328,6 +4832,7 @@
       

       public override Builder MergeFrom(VariousComplexOptions other) {

         if (other == global::Google.ProtocolBuffers.TestProtos.VariousComplexOptions.DefaultInstance) return this;

+        PrepareBuilder();

         this.MergeUnknownFields(other.UnknownFields);

         return this;

       }

@@ -4337,6 +4842,7 @@
       }

       

       public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;