Browse Source

Merge pull request #288 from jtattermusch/csharp_protobuf_reviewed

C# protocol buffers (initial pull request)
Jie Luo 10 years ago
parent
commit
7646eec9ce
100 changed files with 46006 additions and 0 deletions
  1. 43 0
      csharp/.gitignore
  2. 148 0
      csharp/CHANGES.txt
  3. 17 0
      csharp/README.md
  4. 8 0
      csharp/build/BuildAll.bat
  5. 122 0
      csharp/build/Common.targets
  6. 59 0
      csharp/build/Google.ProtocolBuffers.nuspec
  7. 60 0
      csharp/build/Google.ProtocolBuffersLite.nuspec
  8. 2 0
      csharp/build/RunBenchmarks.bat
  9. 20 0
      csharp/build/build.bat
  10. 241 0
      csharp/build/build.csproj
  11. 248 0
      csharp/build/googlecode_upload.py
  12. 79 0
      csharp/build/nuspec.xsd
  13. 186 0
      csharp/build/publish.csproj
  14. 167 0
      csharp/build/target.csproj
  15. 41 0
      csharp/csproj_templates/CF20.csproj
  16. 44 0
      csharp/csproj_templates/CF35.csproj
  17. 17 0
      csharp/csproj_templates/NET20.csproj
  18. 20 0
      csharp/csproj_templates/NET35.csproj
  19. 20 0
      csharp/csproj_templates/NET40.csproj
  20. 51 0
      csharp/csproj_templates/PL40.csproj
  21. 44 0
      csharp/csproj_templates/SL20.csproj
  22. 47 0
      csharp/csproj_templates/SL30.csproj
  23. 48 0
      csharp/csproj_templates/SL40.csproj
  24. 34 0
      csharp/csproj_templates/SLTest.targets
  25. BIN
      csharp/keys/Google.ProtocolBuffers.snk
  26. 13 0
      csharp/keys/generate_new_key.bat
  27. 54 0
      csharp/lib/NUnit-config/Microsoft.VisualStudio.TestTools.cs
  28. 18 0
      csharp/lib/NUnit-config/nunit-console.v2.0.config
  29. 18 0
      csharp/lib/NUnit-config/nunit-console.v3.5.config
  30. 18 0
      csharp/lib/NUnit-config/nunit-console.v4.0.config
  31. 13 0
      csharp/lib/README.md
  32. 37 0
      csharp/mono/buildall.sh
  33. 29 0
      csharp/mono/generatesource.sh
  34. 91 0
      csharp/mono/readme.txt
  35. 140 0
      csharp/protos/benchmarks/google_size.proto
  36. 140 0
      csharp/protos/benchmarks/google_speed.proto
  37. 37 0
      csharp/protos/extest/unittest_extras.proto
  38. 72 0
      csharp/protos/extest/unittest_extras_full.proto
  39. 117 0
      csharp/protos/extest/unittest_extras_lite.proto
  40. 54 0
      csharp/protos/extest/unittest_extras_xmltest.proto
  41. 29 0
      csharp/protos/extest/unittest_generic_services.proto
  42. 137 0
      csharp/protos/extest/unittest_issues.proto
  43. 41 0
      csharp/protos/extest/unittest_rpc_interop.proto
  44. 42 0
      csharp/protos/extest/unittest_rpc_interop_lite.proto
  45. 147 0
      csharp/protos/google/protobuf/compiler/plugin.proto
  46. 115 0
      csharp/protos/google/protobuf/csharp_options.proto
  47. 533 0
      csharp/protos/google/protobuf/descriptor.proto
  48. 636 0
      csharp/protos/google/protobuf/unittest.proto
  49. 52 0
      csharp/protos/google/protobuf/unittest_csharp_options.proto
  50. 372 0
      csharp/protos/google/protobuf/unittest_custom_options.proto
  51. 56 0
      csharp/protos/google/protobuf/unittest_embed_optimize_for.proto
  52. 43 0
      csharp/protos/google/protobuf/unittest_empty.proto
  53. 1052 0
      csharp/protos/google/protobuf/unittest_enormous_descriptor.proto
  54. 67 0
      csharp/protos/google/protobuf/unittest_import.proto
  55. 55 0
      csharp/protos/google/protobuf/unittest_import_lite.proto
  56. 318 0
      csharp/protos/google/protobuf/unittest_lite.proto
  57. 49 0
      csharp/protos/google/protobuf/unittest_lite_imports_nonlite.proto
  58. 78 0
      csharp/protos/google/protobuf/unittest_mset.proto
  59. 58 0
      csharp/protos/google/protobuf/unittest_no_generic_services.proto
  60. 67 0
      csharp/protos/google/protobuf/unittest_optimize_for.proto
  61. 140 0
      csharp/protos/google/test/google_size.proto
  62. 140 0
      csharp/protos/google/test/google_speed.proto
  63. 44 0
      csharp/protos/npp.language.xml
  64. 31 0
      csharp/protos/tutorial/addressbook.proto
  65. 136 0
      csharp/src/AddressBook/AddPerson.cs
  66. 75 0
      csharp/src/AddressBook/AddressBook.csproj
  67. 1160 0
      csharp/src/AddressBook/AddressBookProtos.cs
  68. 103 0
      csharp/src/AddressBook/ListPeople.cs
  69. 99 0
      csharp/src/AddressBook/Program.cs
  70. 29 0
      csharp/src/AddressBook/Properties/AssemblyInfo.cs
  71. 44 0
      csharp/src/AddressBook/SampleUsage.cs
  72. 3 0
      csharp/src/AddressBook/app.config
  73. 538 0
      csharp/src/ProtoBench/Program.cs
  74. 32 0
      csharp/src/ProtoBench/Properties/AssemblyInfo.cs
  75. 88 0
      csharp/src/ProtoBench/ProtoBench.csproj
  76. 4572 0
      csharp/src/ProtoBench/TestProtos/GoogleSizeProtoFile.cs
  77. 6637 0
      csharp/src/ProtoBench/TestProtos/GoogleSpeedProtoFile.cs
  78. 346 0
      csharp/src/ProtoBench/TestProtos/UnitTestImportProtoFile.cs
  79. 21602 0
      csharp/src/ProtoBench/TestProtos/UnitTestProtoFile.cs
  80. BIN
      csharp/src/ProtoBench/google_message1.dat
  81. BIN
      csharp/src/ProtoBench/google_message2.dat
  82. 88 0
      csharp/src/ProtoDump/Program.cs
  83. 30 0
      csharp/src/ProtoDump/Properties/AssemblyInfo.cs
  84. 65 0
      csharp/src/ProtoDump/ProtoDump.csproj
  85. 150 0
      csharp/src/ProtoGen.Test/DependencyResolutionTest.cs
  86. 30 0
      csharp/src/ProtoGen.Test/Properties/AssemblyInfo.cs
  87. 99 0
      csharp/src/ProtoGen.Test/ProtoGen.Test.csproj
  88. 683 0
      csharp/src/ProtoGen.Test/ProtocGenCsUnittests.cs
  89. 59 0
      csharp/src/ProtoGen.Test/TempFile.cs
  90. 733 0
      csharp/src/ProtoGen.Test/TestPreprocessing.cs
  91. 101 0
      csharp/src/ProtoGen.Test/protoc-gen-cs.Test.csproj
  92. 55 0
      csharp/src/ProtoGen/DependencyResolutionException.cs
  93. 106 0
      csharp/src/ProtoGen/DescriptorUtil.cs
  94. 148 0
      csharp/src/ProtoGen/EnumFieldGenerator.cs
  95. 62 0
      csharp/src/ProtoGen/EnumGenerator.cs
  96. 183 0
      csharp/src/ProtoGen/ExtensionGenerator.cs
  97. 389 0
      csharp/src/ProtoGen/FieldGeneratorBase.cs
  98. 267 0
      csharp/src/ProtoGen/Generator.cs
  99. 330 0
      csharp/src/ProtoGen/GeneratorOptions.cs
  100. 45 0
      csharp/src/ProtoGen/Helpers.cs

+ 43 - 0
csharp/.gitignore

@@ -0,0 +1,43 @@
+#
+# 	Untracked directories
+#
+src/AddressBook/bin
+src/AddressBook/obj
+src/ProtocolBuffers/bin/
+src/ProtocolBuffers/obj/
+src/ProtocolBuffers/objCF
+src/ProtocolBuffers.Test/bin/
+src/ProtocolBuffers.Test/obj/
+src/ProtocolBuffersLite.Test/bin/
+src/ProtocolBuffersLite.Test/obj/
+src/ProtoBench/bin/
+src/ProtoBench/obj/
+src/ProtoDump/bin/
+src/ProtoDump/obj/
+src/ProtoGen/bin/
+src/ProtoGen/obj/
+src/ProtoGen.Test/bin/
+src/ProtoGen.Test/obj/
+src/ProtoMunge/bin/
+src/ProtoMunge/obj/
+mono/bin
+mono/tmp
+mono/protoc
+build_output
+build_temp
+build/msbuild*.log
+lib/Microsoft.Silverlight.Testing
+lib/NUnit
+
+#
+# 	Untracked files
+#
+*.user
+*.suo
+_ReSharper.*
+*.sln.cache
+mono/TestResult.xml
+mono/.libs
+mono/*.exe
+mono/*.dll
+lib/protoc.exe

+ 148 - 0
csharp/CHANGES.txt

@@ -0,0 +1,148 @@
+===============================================================================
+Welcome to the C# port of Google Protocol Buffers, written by Jon Skeet
+(skeet@pobox.com) based on the work of many talented people.
+
+===============================================================================
+RELEASE NOTES - Code imported into Google's main protobuf repository
+===============================================================================
+
+Everything below note this represents history of protobuf-csharp-port project
+before the code was merged into csharp/ subtree of GitHub google/protobuf
+repository.
+Frozen legacy version of the original project is available in
+https://github.com/jskeet/protobuf-csharp-port.
+
+===============================================================================
+RELEASE NOTES - Version 2.4.1.555
+===============================================================================
+
+Changes:
+- Upgrade solution format to Visual Studio 2012.
+- Add the ability to print a builder (not just a message)
+- TextGenerator introduces a new overload of PrintTo
+- Munge protoc's error format into a VS-C#-compatible output format.
+- Work to make ProtoGen clone that acts as a protoc.exe plugin.
+- Added the AllowPartiallyTrustedCallers attribute
+- Optimized enum parsing.
+
+Fixes:
+- Fix for bug in limited input stream's Position, Introduced Position on 
+  output stream
+- Fix for writing a character to a JSON output overflows allocated buffer
+- Optimize FromBase64String to return Empty when presented with empty string.
+- Use string.Concat instead of operator to avoid potential import problems
+- Issue 81: quoting for NUnit parameters.
+- Issue 56: NuGet package is noisy
+- Issue 70: Portable library project has some invalid Nunit-based code.
+- Issue 71: CodedInputStream.ReadBytes go to slow path unnecessarily
+- Issue 84: warning CS0219: The variable `size' is assigned but never used
+
+===============================================================================
+RELEASE NOTES - Version 2.4.1.521
+===============================================================================
+
+Changes:
+- Add generated_code_attributes option, defaulted to false
+- Added support for Portable library
+- Added 'Unsafe' static type in ByteString to allow direct buffer access
+
+Fixes:
+- Issue 50: The XML serializer will fail to deserialize a message with empty 
+  child message
+- Issue 45: Use of 'item' as a field name causes AmbiguousMatchException
+- Issue 49: Generated nested static Types class should be partial
+- Issue 38: Disable CLSCompliant warnings (3021)
+- Issue 40: proto_path does not work for command-line file names
+- Issue 54: should retire all bytes in buffer (bufferSize)
+- Issue 43: Fix to correct identical 'umbrella_classname' options from trying 
+  to write to the same filename.
+
+===============================================================================
+RELEASE NOTES - Version 2.4.1.473
+===============================================================================
+
+Features:
+- Added option service_generator_type to control service generation with
+  NONE, GENERIC, INTERFACE, or IRPCDISPATCH
+- Added interfaces IRpcDispatch and IRpcServerStub to provide for blocking
+  services and implementations.
+- Added ProtoGen.exe command-line argument "--protoc_dir=" to specify the 
+  location of protoc.exe.
+- Extracted interfaces for ICodedInputStream and ICodedOutputStream to allow
+  custom implementation of writers with both speed and size optimizations.
+- Addition of the "Google.ProtoBuffers.Serialization" assembly to support
+  reading and writing messages to/from XML, JSON, IDictionary<,> and others.
+- Several performance related fixes and tweeks
+- Issue 3:	Add option to mark generated code with attribute
+- Issue 20:	Support for decorating classes [Serializable]
+- Issue 21:	Decorate fields with [deprecated=true] as [System.Obsolete]
+- Issue 22:	Reusable Builder classes
+- Issue 24:	Support for using Json/Xml formats with ICodedInputStream
+- Issue 25: Added support for NuGet packages
+- Issue 31: Upgraded protoc.exe and descriptor to 2.4.1
+
+Fixes:
+- Issue 13:	Message with Field same name as message causes uncompilable .cs
+- Issue 16:	Does not integrate well with other tooling
+- Issue 19:	Support for negative enum values
+- Issue 26:	AddRange in GeneratedBuilder iterates twice.
+- Issue 27:	Remove XML documentation output from test projects to clear 
+  warnings/errors.
+- Issue 28: Circular message dependencies result in null default values for 
+  Message fields.
+- Issue 29: Message classes generated have a public default constructor.  You
+  can disable private ctor generation with the option generate_private_ctor.
+- Issue 35: Fixed a bug in ProtoGen handling of arguments with trailing \
+- Big-endian support for float, and double on Silverlight
+- Packed and Unpacked parsing allow for all repeated, as per version 2.3
+- Fix for leaving Builder a public ctor on internal classes for use with
+  generic "where T: new()" constraints.
+
+Other:
+- Changed the code signing key to a privately held key
+- Reformatted all code and line-endings to C# defaults
+- Reworking of performance benchmarks to produce reliable results, option /v2
+- Issue 34: Silverlight assemblies are now unit tested
+
+===============================================================================
+RELEASE NOTES - Version 2.3.0.277
+===============================================================================
+
+Features:
+- Added cls_compliance option to generate attributes indicating 
+  non-CLS-compliance.
+- Added file_extension option to control the generated output file's extension.
+- Added umbrella_namespace option to place the umbrella class into a nested
+  namespace to address issues with proto files having the same name as a 
+  message it contains.
+- Added output_directory option to set the output path for the source file(s).
+- Added ignore_google_protobuf option to avoid generating code for includes 
+  from the google.protobuf package.
+- Added the LITE framework (Google.ProtoBuffersLite.dll) and the ability to
+  generate code with "option optimize_for = LITE_RUNTIME;".
+- Added ability to invoke protoc.exe from within ProtoGen.exe.
+- Upgraded to protoc.exe (2.3) compiler.
+
+Fixes:
+- Issue 9:	Class cannot be static and sealed error
+- Issue 12:	default value for enumerate fields must be filled out
+
+Other:
+- Rewrite of build using MSBbuild instead of NAnt
+- Moved to NUnit Version 2.2.8.0
+- Changed to using secure .snk for releases
+
+===============================================================================
+RELEASE NOTES - Version 0.9.1
+===============================================================================
+
+Fixes:
+- issue 10:	Incorrect encoding of packed fields when serialized
+
+===============================================================================
+RELEASE NOTES - Version 0.9.0
+===============================================================================
+
+- Initial release
+
+===============================================================================

+ 17 - 0
csharp/README.md

@@ -0,0 +1,17 @@
+This directory contains a library that implements Protocol Buffers
+functionality in C#.
+
+Experimental only
+-----------------
+
+C# protobufs are currently under development and are not officially supported yet.
+Also, as of now, only proto2 is supported. Proto3 support for C# is currently in progress
+(both design & implementation).
+
+History of C# protobufs
+-----------------------
+
+This subtree was originally imported from https://github.com/jskeet/protobuf-csharp-port
+and represents the latest development version of C# protobufs, that will now be developed
+and maintained by Google. All the development will be done in open, under this repository
+(https://github.com/google/protobuf).

+ 8 - 0
csharp/build/BuildAll.bat

@@ -0,0 +1,8 @@
+@echo off
+SET BUILD_TARGET=%~1
+SET BUILD_CONFIG=%~2
+
+IF "%BUILD_TARGET%"=="" SET BUILD_TARGET=Rebuild
+IF "%BUILD_CONFIG%"=="" SET BUILD_CONFIG=Debug
+
+CMD.exe /Q /C "CD %~dp0 && %WINDIR%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /nologo build.csproj /t:%BUILD_TARGET% /toolsversion:4.0 "/p:Configuration=%BUILD_CONFIG%" %3 %4 %5 %6

+ 122 - 0
csharp/build/Common.targets

@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+
+<!-- **********************************************************************************************
+Targets For Clean
+*********************************************************************************************** -->
+
+  <Target Name="_CleanFolder">
+    <Message Importance="normal" Text="Removing temporary directory '$(CleanFolderDirectory)'"/>
+    <Error Text="Can not remove empty directory name." Condition=" '$(CleanFolderDirectory)' == '' " />
+
+    <Exec WorkingDirectory="$(MSBuildProjectDirectory)" Condition="Exists($(CleanFolderDirectory))" Outputs="@(Ignore)"
+      Command="MOVE /Y &quot;$(CleanFolderDirectory)&quot; &quot;$(CleanFolderDirectory)-deleted&quot; > NUL" />
+    
+    <RemoveDir Directories="$(CleanFolderDirectory)-deleted" Condition="Exists('$(CleanFolderDirectory)-deleted')" />
+  </Target>
+
+  <Target Name="_CleanTempOutput">
+    <MSBuild Projects="$(MSBuildProjectFullPath)" Properties="CleanFolderDirectory=%(TempBuildFolder.Identity);" Targets="_CleanFolder" />
+  </Target>
+  
+  <Target Name="_CleanAll" DependsOnTargets="_CleanTempOutput">
+    <MakeDir Directories="$(BuildTempDirectory)" />
+    <MakeDir Directories="$(BuildOutputDirectory)" />
+  </Target>
+
+<!-- **********************************************************************************************
+Targets For Build
+*********************************************************************************************** -->
+
+  <Target Name="_CompileAll">
+    <MSBuild Projects="$(MSBuildProjectFullPath)" Properties="SolutionTarget=Rebuild;" Targets="_BuildAllConfigurations" />
+  </Target>
+
+  <Target Name="_BuildAllConfigurations">
+    <MSBuild Properties="TargetVersion=cf20;Configuration=$(Configuration);Platform=$(Platform);" Targets="$(SolutionTarget)" Projects="$(MSBuildProjectDirectory)\target.csproj" />
+    <MSBuild Properties="TargetVersion=cf35;Configuration=$(Configuration);Platform=$(Platform);" Targets="$(SolutionTarget)" Projects="$(MSBuildProjectDirectory)\target.csproj" />
+    <MSBuild Properties="TargetVersion=net20;Configuration=$(Configuration);Platform=$(Platform);" Targets="$(SolutionTarget)" Projects="$(MSBuildProjectDirectory)\target.csproj" />
+    <MSBuild Properties="TargetVersion=net35;Configuration=$(Configuration);Platform=$(Platform);" Targets="$(SolutionTarget)" Projects="$(MSBuildProjectDirectory)\target.csproj" />
+    <MSBuild Properties="TargetVersion=net40;Configuration=$(Configuration);Platform=$(Platform);" Targets="$(SolutionTarget)" Projects="$(MSBuildProjectDirectory)\target.csproj" />
+    <MSBuild Properties="TargetVersion=sl20;Configuration=$(Configuration);Platform=$(Platform);" Targets="$(SolutionTarget)" Projects="$(MSBuildProjectDirectory)\target.csproj" />
+    <MSBuild Properties="TargetVersion=sl30;Configuration=$(Configuration);Platform=$(Platform);" Targets="$(SolutionTarget)" Projects="$(MSBuildProjectDirectory)\target.csproj" />
+    <MSBuild Properties="TargetVersion=sl40;Configuration=$(Configuration);Platform=$(Platform);" Targets="$(SolutionTarget)" Projects="$(MSBuildProjectDirectory)\target.csproj" />
+    <MSBuild Properties="TargetVersion=pl40;Configuration=$(Configuration);Platform=$(Platform);" Targets="$(SolutionTarget)" Projects="$(MSBuildProjectDirectory)\target.csproj" />
+  </Target>
+
+<!-- **********************************************************************************************
+Targets For Tools
+*********************************************************************************************** -->
+
+  <Target Name="_BuildTools">
+    
+    <MSBuild Targets="Build" ToolsVersion="3.5" Projects="$(ProjectDirectory)\src\ProtocolBuffers.sln" Properties="Configuration=Release;Platform=Any CPU;" />
+    <Copy SourceFiles="%(ToolsOutputItem.Identity)" DestinationFolder="$(BuildOutputDirectory)\tools" />
+
+    <Copy SourceFiles="$(LibDirectory)\NUnit-config\nunit-console.v2.0.config" DestinationFiles="$(NUnitExePath).config" />
+    <Exec 
+      WorkingDirectory="%(ToolsTestContainer.RootDir)%(ToolsTestContainer.Directory)"
+      Command="&quot;$(NUnitExePath)&quot; /nologo /noshadow &quot;%(ToolsTestContainer.Identity)&quot; /xml:&quot;$(BuildTempDirectory)\%(ToolsTestContainer.Filename).xml&quot;" />
+    
+  </Target>
+
+<!-- **********************************************************************************************
+Targets For GenerateSource
+*********************************************************************************************** -->
+
+  <Target Name="_GenerateProjects">
+    <Exec Command="&quot;$(CsProjectProjector)&quot; csproj_templates src\ProtocolBuffersLibrary.sln" WorkingDirectory="$(ProjectDirectory)" />
+  </Target>
+  
+  <Target Name="_CleanTempSource">
+    <MSBuild Projects="$(MSBuildProjectFullPath)" Properties="CleanFolderDirectory=$(SourceTempDirectory);" Targets="_CleanFolder" />
+    <MakeDir Directories="$(SourceTempDirectory)" />
+  </Target>
+  
+  <Target Name="_GenerateSource" DependsOnTargets="_CleanTempSource">
+    <Message Importance="high" Text="Generating source from proto files" />
+    <Exec Command="&quot;$(ProtocExePath)&quot; --proto_path=$(ProtosDirectory) --descriptor_set_out=compiled.pb @(Protos->'%(RelativeDir)%(Filename)%(Extension)', ' ')" WorkingDirectory="$(SourceTempDirectory)" />
+    <Exec Command="&quot;$(ProtogenExePath)&quot; compiled.pb" WorkingDirectory="$(SourceTempDirectory)" />
+  </Target>
+
+  <Target Name="_CopyGeneratedSource" DependsOnTargets="_GenerateSource">
+    <Copy SourceFiles="%(GeneratedSource.Identity)" DestinationFiles="%(GeneratedSource.TargetDirectory)\%(GeneratedSource.Filename)%(GeneratedSource.Extension)" />
+  </Target>
+
+<!-- **********************************************************************************************
+Targets For Package
+*********************************************************************************************** -->
+
+  <Target Name="_PackageAll">
+    <MSBuild Projects="$(MSBuildProjectFullPath)" Properties="SolutionTarget=_Publish;" Targets="_BuildAllConfigurations" />
+  </Target>
+
+  <Target Name="_GeneratePackage">
+    <Copy SourceFiles="@(StaticPackageItem)" DestinationFolder="$(BuildOutputPackage)\%(StaticPackageItem.TargetDirectory)\%(StaticPackageItem.RecursiveDir)" />
+    <Exec Command="&quot;$(ZipExePath)&quot; a -tzip $(BuildTempDirectory)\$(PackageName)-binaries.zip * -x!*.pdb -r" WorkingDirectory="$(BuildOutputPackage)" />
+    <Exec Command="&quot;$(ZipExePath)&quot; a -tzip $(BuildTempDirectory)\$(PackageName)-symbols.zip * -r" WorkingDirectory="$(BuildOutputPackage)" />
+  </Target>
+
+<!-- **********************************************************************************************
+Targets For Benchmark
+*********************************************************************************************** -->
+
+  <Target Name="_RunBenchmarks">
+    <ItemGroup>
+      <BenchmarkParameter Include="Google.ProtocolBuffers.ProtoBench.SizeMessage1,ProtoBench" />
+      <BenchmarkParameter Include="google_message1.dat" />
+      <BenchmarkParameter Include="Google.ProtocolBuffers.ProtoBench.SpeedMessage1,ProtoBench" />
+      <BenchmarkParameter Include="google_message1.dat" />
+      <BenchmarkParameter Include="Google.ProtocolBuffers.ProtoBench.SizeMessage2,ProtoBench" />
+      <BenchmarkParameter Include="google_message2.dat" />
+      <BenchmarkParameter Include="Google.ProtocolBuffers.ProtoBench.SpeedMessage2,ProtoBench" />
+      <BenchmarkParameter Include="google_message2.dat" />
+    </ItemGroup>
+
+    <Message Text="Running ProtoBench.exe" />
+    <Exec Command="ProtoBench.exe $(BenchmarkArgs) @(BenchmarkParameter->'%(Identity)', ' ') &quot;/log:$(BenchmarkOutputFile)&quot;"
+          WorkingDirectory="$(SourceDirectory)\ProtoBench\bin\NET35\Release" />
+
+  </Target>
+
+</Project>

+ 59 - 0
csharp/build/Google.ProtocolBuffers.nuspec

@@ -0,0 +1,59 @@
+<?xml version="1.0"?>
+<package xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="nuspec.xsd">
+  <metadata>
+    <id>Google.ProtocolBuffers</id>
+    <version>$version$</version>
+    <owners>Jon Skeet</owners>
+    <authors>Jon Skeet</authors>
+    <licenseUrl>http://code.google.com/p/protobuf-csharp-port/source/browse/license.txt</licenseUrl>
+    <projectUrl>http://code.google.com/p/protobuf-csharp-port/</projectUrl>
+    <requireLicenseAcceptance>false</requireLicenseAcceptance>
+    <copyright>Copyright 2008 Google Inc.  All rights reserved.</copyright>
+    <tags>Protocol Buffers Binary Serialization Format Google</tags>
+
+    <title>Google.ProtocolBuffers</title>
+    <summary>A managed code generator and library for Google's data interchange format.</summary>
+    <description><![CDATA[
+Protocol Buffers is a binary serialization format and technology, released to the open source community by Google in 2008.  
+Its primary use is to produce small fast binary representations of a 'message' or object for serialization or transportation.
+There are various implementations of Protocol Buffers in .NET. This project is a fairly close port of the Google Java implementation.
+
+There are two main parts:
+
+tools/protoc.exe, which takes the textual representation of the protocol buffer and turns it into a binary representation for use with ProtoGen.exe.
+tools/ProtoGen.exe, which takes binary representations of protocol buffer descriptors (as generated by the "stock" protoc binary supplied by Google) and creates C# source code. This is only required at build time.
+
+lib/*/Google.ProtocolBuffers.dll, which is a supporting library. This is required at execution time.
+lib/*/Google.ProtocolBuffers.Serialization.dll, a supplementary library that provides extensions for reading and writing protocol buffers to xml, json, and others.
+
+LINKS:
+
+Project Home    - http://code.google.com/p/protobuf-csharp-port
+Online Help     - http://help.protobuffers.net
+Developer Guide - http://code.google.com/apis/protocolbuffers/docs/overview.html
+Language Guide  - http://code.google.com/apis/protocolbuffers/docs/proto.html
+
+    ]]></description>
+	
+    <references>
+      <reference file="Google.ProtocolBuffers.dll"/>
+      <reference file="Google.ProtocolBuffers.Serialization.dll"/>
+    </references>
+  
+  </metadata>
+  <files>
+    <!-- Release Binaries -->
+    <file src="..\build_output\Release\**\Google.ProtocolBuffers.???" target="lib\" />
+    <file src="..\build_output\Release\**\Google.ProtocolBuffers.Serialization.???" target="lib\" />
+    <!-- Tools -->
+    <file src="..\build_output\tools\**\*" target="tools\" />
+    <file src="..\build_output\protos\**\*" target="tools\" />
+    <!-- Content -->
+    <file src="..\build_output\CHANGES.txt" target="tools\"/>
+    <file src="..\build_output\license.txt" target="tools\"/>
+    <file src="..\build_output\tools\protoc-license.txt" target="tools\"/>
+    <!-- Source -->
+    <file src="..\src\ProtocolBuffers\**\*.cs" target="src\ProtocolBuffers\"/>
+    <file src="..\src\ProtocolBuffers.Serialization\**\*.cs" target="src\ProtocolBuffers.Serialization\"/>
+  </files>
+</package>

+ 60 - 0
csharp/build/Google.ProtocolBuffersLite.nuspec

@@ -0,0 +1,60 @@
+<?xml version="1.0"?>
+<package xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="nuspec.xsd">
+  <metadata>
+    <id>Google.ProtocolBuffersLite</id>
+    <version>$version$</version>
+    <owners>Jon Skeet</owners>
+    <authors>Jon Skeet</authors>
+    <licenseUrl>http://code.google.com/p/protobuf-csharp-port/source/browse/license.txt</licenseUrl>
+    <projectUrl>http://code.google.com/p/protobuf-csharp-port/</projectUrl>
+    <requireLicenseAcceptance>false</requireLicenseAcceptance>
+    <copyright>Copyright 2008 Google Inc.  All rights reserved.</copyright>
+    <tags>Protocol Buffers Binary Serialization Format Google</tags>
+
+    <title>Google.ProtocolBuffersLite</title>
+    <summary>A managed code generator and library for Google's data interchange format.</summary>
+    <description><![CDATA[
+Protocol Buffers is a binary serialization format and technology, released to the open source community by Google in 2008.  
+Its primary use is to produce small fast binary representations of a 'message' or object for serialization or transportation.
+There are various implementations of Protocol Buffers in .NET. This project is a fairly close port of the Google Java implementation.
+
+There are two main parts:
+
+tools/protoc.exe, which takes the textual representation of the protocol buffer and turns it into a binary representation for use with ProtoGen.exe.
+tools/ProtoGen.exe, which takes binary representations of protocol buffer descriptors (as generated by the "stock" protoc binary supplied by Google) and creates C# source code. This is only required at build time.
+
+lib/*/Google.ProtocolBuffersLite.dll, which is a supporting library. This is required at execution time.
+lib/*/Google.ProtocolBuffersLite.Serialization.dll, a supplementary library that provides extensions for reading and writing protocol buffers to xml, json, and others.
+
+LINKS:
+
+Project Home    - http://code.google.com/p/protobuf-csharp-port
+Online Help     - http://help.protobuffers.net
+Developer Guide - http://code.google.com/apis/protocolbuffers/docs/overview.html
+Language Guide  - http://code.google.com/apis/protocolbuffers/docs/proto.html
+
+    ]]></description>
+	
+    <references>
+      <reference file="Google.ProtocolBuffersLite.dll"/>
+      <reference file="Google.ProtocolBuffersLite.Serialization.dll"/>
+    </references>
+  
+  </metadata>
+
+  <files>
+    <!-- Release Binaries -->
+    <file src="..\build_output\Release\**\Google.ProtocolBuffersLite.???" target="lib\" />
+    <file src="..\build_output\Release\**\Google.ProtocolBuffersLite.Serialization.???" target="lib\" />
+    <!-- Tools -->
+    <file src="..\build_output\tools\**\*" target="tools\" />
+    <file src="..\build_output\protos\**\*" target="tools\" />
+    <!-- Content -->
+    <file src="..\build_output\CHANGES.txt" target="tools\"/>
+    <file src="..\build_output\license.txt" target="tools\"/>
+    <file src="..\build_output\tools\protoc-license.txt" target="tools\"/>
+    <!-- Source -->
+    <file src="..\src\ProtocolBuffers\**\*.cs" target="src\ProtocolBuffers\"/>
+    <file src="..\src\ProtocolBuffers.Serialization\**\*.cs" target="src\ProtocolBuffers.Serialization\"/>
+  </files>
+</package>

+ 2 - 0
csharp/build/RunBenchmarks.bat

@@ -0,0 +1,2 @@
+@echo off
+CMD.exe /Q /C "CD %~dp0 && %WINDIR%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /nologo build.csproj /toolsversion:4.0 /t:RunBenchmarks %1 %2 %3 %4

+ 20 - 0
csharp/build/build.bat

@@ -0,0 +1,20 @@
+@echo off
+SET BUILD_VERSION=%~1
+SET BUILD_TARGET=%~2
+SET BUILD_CONFIG=%~3
+
+IF NOT "%BUILD_VERSION%"=="" GOTO RUN
+ECHO.
+ECHO Usage: build.bat platform [target] [config] [msbuild arguments]
+ECHO.
+ECHO - platform:  CF20, CF35, NET20, NET35, NET40, PL40, SL20, SL30, or SL40
+ECHO - [target]:  Rebuild, Clean, Build, Test, or Publish
+ECHO - [config]:  Debug or Release
+ECHO.
+EXIT /B 1
+
+:RUN
+IF "%BUILD_TARGET%"=="" SET BUILD_TARGET=Rebuild
+IF "%BUILD_CONFIG%"=="" SET BUILD_CONFIG=Debug
+
+CMD.exe /Q /C "CD %~dp0 && %WINDIR%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /nologo target.csproj /toolsversion:4.0 %4 %5 %6 "/t:%BUILD_TARGET%" "/p:Configuration=%BUILD_CONFIG%;TargetVersion=%BUILD_VERSION%"

+ 241 - 0
csharp/build/build.csproj

@@ -0,0 +1,241 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+
+  <!-- build targets -->
+  <Target Name="Clean" DependsOnTargets="_CleanAll" />
+  <Target Name="BuildTools" DependsOnTargets="_BuildTools" />
+  <Target Name="GenerateProjects" DependsOnTargets="_GenerateProjects" />
+  <Target Name="GenerateSource" DependsOnTargets="_GenerateSource;_CopyGeneratedSource" />
+  <Target Name="RebuildSource" DependsOnTargets="Clean;BuildTools;GenerateSource" />
+  <Target Name="Build" DependsOnTargets="GenerateProjects;BuildTools;GenerateSource;_CompileAll" />
+  <Target Name="Rebuild" DependsOnTargets="Clean;Build" />
+  <Target Name="GeneratePackage" DependsOnTargets="_PackageAll;_GeneratePackage" />
+  <Target Name="FullBuild" DependsOnTargets="Rebuild;GeneratePackage" />
+  <!-- misc targets -->
+  <Target Name="RunBenchmarks" DependsOnTargets="_CleanAll;_BuildTools;_RunBenchmarks" />
+
+  <PropertyGroup>
+    <ProjectName>Protocol Buffers</ProjectName>
+    <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">Any CPU</Platform>
+    
+    <!--Directory Paths-->
+    <ProjectDirectory>$(MSBuildProjectDirectory)\..</ProjectDirectory>
+    <SourceDirectory>$(ProjectDirectory)\src</SourceDirectory>
+    <LibDirectory>$(ProjectDirectory)\lib</LibDirectory>
+    <ProtosDirectory>$(ProjectDirectory)\protos</ProtosDirectory>
+
+    <SourceTempDirectory>$(ProjectDirectory)\build_temp\GeneratedSource</SourceTempDirectory>
+    <BuildTempDirectory>$(ProjectDirectory)\build_temp</BuildTempDirectory>
+    <BuildOutputDirectory>$(ProjectDirectory)\build_output</BuildOutputDirectory>
+    <BuildOutputPackage>$(BuildOutputDirectory)</BuildOutputPackage>
+
+    <BenchmarkArgs>/v2 /fast /formats</BenchmarkArgs>
+    <BenchmarkOutputFile>$(BuildTempDirectory)\..\BenchmarkResults.txt</BenchmarkOutputFile>
+    <BenchmarkProtosDirectory>$(ProjectDirectory)\benchmarks</BenchmarkProtosDirectory>
+
+    <PackageName Condition=" '$(PackageName)' == '' ">$(Configuration)</PackageName>
+    
+    <!--Tool Paths-->
+    <ProtocExePath>$(BuildOutputDirectory)\tools\protoc.exe</ProtocExePath>
+    <ProtogenExePath>$(BuildOutputDirectory)\tools\protogen.exe</ProtogenExePath>
+    <NUnitExePath>$(LibDirectory)\NUnit\tools\nunit-console.exe</NUnitExePath>
+    <CsProjectProjector>$(LibDirectory)\CsProjectProjector\CsProjectProjector.exe</CsProjectProjector>
+    <ZipExePath>$(LibDirectory)\7-Zip 9.20\7za.exe</ZipExePath>
+  
+</PropertyGroup>
+
+  <Import Project="Common.targets"/>
+
+  <!-- Proto Files -->
+  <ItemGroup>
+    <Protos Include="$(ProtosDirectory)\extest\unittest_issues.proto" />
+    <Protos Include="$(ProtosDirectory)\extest\unittest_extras.proto" />
+    <Protos Include="$(ProtosDirectory)\extest\unittest_extras_full.proto" />
+    <Protos Include="$(ProtosDirectory)\extest\unittest_extras_lite.proto" />
+    <Protos Include="$(ProtosDirectory)\extest\unittest_extras_xmltest.proto" />
+    <Protos Include="$(ProtosDirectory)\extest\unittest_generic_services.proto" />
+    <Protos Include="$(ProtosDirectory)\extest\unittest_rpc_interop.proto" />
+    <Protos Include="$(ProtosDirectory)\extest\unittest_rpc_interop_lite.proto" />
+    <Protos Include="$(ProtosDirectory)\google\protobuf\descriptor.proto" />
+    <Protos Include="$(ProtosDirectory)\google\protobuf\csharp_options.proto" />
+    <Protos Include="$(ProtosDirectory)\google\protobuf\unittest.proto" />
+    <Protos Include="$(ProtosDirectory)\google\protobuf\unittest_csharp_options.proto" />
+    <Protos Include="$(ProtosDirectory)\google\protobuf\unittest_custom_options.proto" />
+    <Protos Include="$(ProtosDirectory)\google\protobuf\unittest_embed_optimize_for.proto" />
+    <Protos Include="$(ProtosDirectory)\google\protobuf\unittest_empty.proto" />
+    <Protos Include="$(ProtosDirectory)\google\protobuf\unittest_import.proto" />
+    <Protos Include="$(ProtosDirectory)\google\protobuf\unittest_import_lite.proto" />
+    <Protos Include="$(ProtosDirectory)\google\protobuf\unittest_lite.proto" />
+    <Protos Include="$(ProtosDirectory)\google\protobuf\unittest_lite_imports_nonlite.proto" />
+    <Protos Include="$(ProtosDirectory)\google\protobuf\unittest_mset.proto" />
+    <Protos Include="$(ProtosDirectory)\google\protobuf\unittest_no_generic_services.proto" />
+    <Protos Include="$(ProtosDirectory)\google\protobuf\unittest_optimize_for.proto" />
+    <Protos Include="$(ProtosDirectory)\google\test\google_size.proto" />
+    <Protos Include="$(ProtosDirectory)\google\test\google_speed.proto" />
+    <Protos Include="$(ProtosDirectory)\tutorial\addressbook.proto" />
+    <!-- for benchmark -->
+    <Protos Include="$(ProtosDirectory)\benchmarks\google_size.proto" />
+    <Protos Include="$(ProtosDirectory)\benchmarks\google_speed.proto" />
+  </ItemGroup>
+  <!-- Generated Source -->
+  <ItemGroup>
+    <!-- Main protos -->
+    <GeneratedSource Include="$(SourceTempDirectory)\CSharpOptions.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers\DescriptorProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\DescriptorProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers\DescriptorProtos</TargetDirectory>
+    </GeneratedSource>
+        
+    <!-- Address book sample -->
+    <GeneratedSource Include="$(SourceTempDirectory)\AddressBookProtos.cs">
+      <TargetDirectory>$(SourceDirectory)\AddressBook</TargetDirectory>
+    </GeneratedSource>
+    <!-- Unit test -->
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestExtrasProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestExtrasIssuesProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestXmlSerializerTestProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestCSharpOptionsProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestCustomOptionsProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestEmbedOptimizeForProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestEmptyProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestImportLiteProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>  
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestImportProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestMessageSetProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestNoGenericServicesProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestOptimizeForProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestRpcInterop.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestRpcInteropLite.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffersLite.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestGenericServices.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <!-- Lite unit test -->
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestExtrasFullProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffersLite.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestExtrasLiteProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffersLite.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestImportLiteProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffersLite.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestImportProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffersLite.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestLiteImportNonLiteProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffersLite.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestLiteProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffersLite.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffersLite.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestGoogleSizeProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestGoogleSpeedProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\GoogleSizeProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtoBench\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\GoogleSpeedProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtoBench\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestImportProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtoBench\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(SourceTempDirectory)\UnitTestProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtoBench\TestProtos</TargetDirectory>
+    </GeneratedSource>
+  </ItemGroup>
+  <!-- Package Items -->
+  <ItemGroup>
+    <StaticPackageItem Include="$(ProjectDirectory)\CHANGES.txt" />
+    <StaticPackageItem Include="$(ProjectDirectory)\license.txt" />
+    <StaticPackageItem Include="$(ProjectDirectory)\protos\google\protobuf\descriptor.proto">
+      <TargetDirectory>\protos\google\protobuf</TargetDirectory>
+    </StaticPackageItem>
+    <StaticPackageItem Include="$(ProjectDirectory)\protos\google\protobuf\compiler\plugin.proto">
+      <TargetDirectory>\protos\google\protobuf\compiler</TargetDirectory>
+    </StaticPackageItem>
+    <StaticPackageItem Include="$(ProjectDirectory)\protos\google\protobuf\csharp_options.proto">
+      <TargetDirectory>\protos\google\protobuf</TargetDirectory>
+    </StaticPackageItem>
+    <StaticPackageItem Include="$(ProjectDirectory)\protos\tutorial\addressbook.proto">
+      <TargetDirectory>\protos\tutorial</TargetDirectory>
+    </StaticPackageItem>
+  </ItemGroup>
+  <!-- Tools -->
+  <ItemGroup>
+    <ToolsTestContainer Include="$(SourceDirectory)\ProtoGen.Test\bin\NET35\Release\Google.ProtocolBuffers.ProtoGen.Test.dll" />
+
+    <ToolsOutputItem Include="$(SourceDirectory)\ProtocolBuffers\bin\NET35\Release\Google.ProtocolBuffers.dll" />
+    <ToolsOutputItem Include="$(SourceDirectory)\ProtocolBuffers.Serialization\bin\NET35\Release\Google.ProtocolBuffers.Serialization.dll" />
+    <ToolsOutputItem Include="$(SourceDirectory)\ProtoGen\bin\NET35\Release\ProtoGen.exe" />
+    <ToolsOutputItem Include="$(SourceDirectory)\ProtoGen\bin\NET35\Release\ProtoGen.exe.config" />
+    <ToolsOutputItem Include="$(SourceDirectory)\ProtoMunge\bin\NET35\Release\ProtoMunge.exe" />
+    <ToolsOutputItem Include="$(SourceDirectory)\ProtoDump\bin\NET35\Release\ProtoDump.exe" />
+    <ToolsOutputItem Include="$(SourceDirectory)\ProtoBench\bin\NET35\Release\ProtoBench.exe" />
+    <ToolsOutputItem Include="$(LibDirectory)\protoc.exe" />
+    <ToolsOutputItem Include="$(LibDirectory)\protoc-license.txt" />
+  </ItemGroup>
+  <!-- Temporary Directories -->
+  <ItemGroup>
+    <TempBuildFolder Include="$(BuildTempDirectory)" />
+    <TempBuildFolder Include="$(BuildOutputDirectory)" />
+    <TempBuildFolder Include="$(SourceDirectory)\AddressBook\obj" />
+    <TempBuildFolder Include="$(SourceDirectory)\AddressBook\bin" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtoBench\obj" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtoBench\bin" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtocolBuffers\obj" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtocolBuffers\bin" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtocolBuffers.Serialization\obj" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtocolBuffers.Serialization\bin" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtocolBuffers.Test\obj" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtocolBuffers.Test\bin" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtocolBuffersLite.Test\obj" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtocolBuffersLite.Test\bin" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtoDump\obj" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtoDump\bin" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtoGen\obj" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtoGen\bin" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtoGen.Test\obj" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtoGen.Test\bin" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtoMunge\obj" />
+    <TempBuildFolder Include="$(SourceDirectory)\ProtoMunge\bin" />
+  </ItemGroup>
+</Project>

+ 248 - 0
csharp/build/googlecode_upload.py

@@ -0,0 +1,248 @@
+#!/usr/bin/env python
+#
+# Copyright 2006, 2007 Google Inc. All Rights Reserved.
+# Author: danderson@google.com (David Anderson)
+#
+# Script for uploading files to a Google Code project.
+#
+# This is intended to be both a useful script for people who want to
+# streamline project uploads and a reference implementation for
+# uploading files to Google Code projects.
+#
+# To upload a file to Google Code, you need to provide a path to the
+# file on your local machine, a small summary of what the file is, a
+# project name, and a valid account that is a member or owner of that
+# project.  You can optionally provide a list of labels that apply to
+# the file.  The file will be uploaded under the same name that it has
+# in your local filesystem (that is, the "basename" or last path
+# component).  Run the script with '--help' to get the exact syntax
+# and available options.
+#
+# Note that the upload script requests that you enter your
+# googlecode.com password.  This is NOT your Gmail account password!
+# This is the password you use on googlecode.com for committing to
+# Subversion and uploading files.  You can find your password by going
+# to http://code.google.com/hosting/settings when logged in with your
+# Gmail account. If you have already committed to your project's
+# Subversion repository, the script will automatically retrieve your
+# credentials from there (unless disabled, see the output of '--help'
+# for details).
+#
+# If you are looking at this script as a reference for implementing
+# your own Google Code file uploader, then you should take a look at
+# the upload() function, which is the meat of the uploader.  You
+# basically need to build a multipart/form-data POST request with the
+# right fields and send it to https://PROJECT.googlecode.com/files .
+# Authenticate the request using HTTP Basic authentication, as is
+# shown below.
+#
+# Licensed under the terms of the Apache Software License 2.0:
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Questions, comments, feature requests and patches are most welcome.
+# Please direct all of these to the Google Code users group:
+#  http://groups.google.com/group/google-code-hosting
+
+"""Google Code file uploader script.
+"""
+
+__author__ = 'danderson@google.com (David Anderson)'
+
+import httplib
+import os.path
+import optparse
+import getpass
+import base64
+import sys
+
+
+def upload(file, project_name, user_name, password, summary, labels=None):
+  """Upload a file to a Google Code project's file server.
+
+  Args:
+    file: The local path to the file.
+    project_name: The name of your project on Google Code.
+    user_name: Your Google account name.
+    password: The googlecode.com password for your account.
+              Note that this is NOT your global Google Account password!
+    summary: A small description for the file.
+    labels: an optional list of label strings with which to tag the file.
+
+  Returns: a tuple:
+    http_status: 201 if the upload succeeded, something else if an
+                 error occured.
+    http_reason: The human-readable string associated with http_status
+    file_url: If the upload succeeded, the URL of the file on Google
+              Code, None otherwise.
+  """
+  # The login is the user part of user@gmail.com. If the login provided
+  # is in the full user@domain form, strip it down.
+  if user_name.endswith('@gmail.com'):
+    user_name = user_name[:user_name.index('@gmail.com')]
+
+  form_fields = [('summary', summary)]
+  if labels is not None:
+    form_fields.extend([('label', l.strip()) for l in labels])
+
+  content_type, body = encode_upload_request(form_fields, file)
+
+  upload_host = '%s.googlecode.com' % project_name
+  upload_uri = '/files'
+  auth_token = base64.b64encode('%s:%s'% (user_name, password))
+  headers = {
+    'Authorization': 'Basic %s' % auth_token,
+    'User-Agent': 'Googlecode.com uploader v0.9.4',
+    'Content-Type': content_type,
+    }
+
+  server = httplib.HTTPSConnection(upload_host)
+  server.request('POST', upload_uri, body, headers)
+  resp = server.getresponse()
+  server.close()
+
+  if resp.status == 201:
+    location = resp.getheader('Location', None)
+  else:
+    location = None
+  return resp.status, resp.reason, location
+
+
+def encode_upload_request(fields, file_path):
+  """Encode the given fields and file into a multipart form body.
+
+  fields is a sequence of (name, value) pairs. file is the path of
+  the file to upload. The file will be uploaded to Google Code with
+  the same file name.
+
+  Returns: (content_type, body) ready for httplib.HTTP instance
+  """
+  BOUNDARY = '----------Googlecode_boundary_reindeer_flotilla'
+  CRLF = '\r\n'
+
+  body = []
+
+  # Add the metadata about the upload first
+  for key, value in fields:
+    body.extend(
+      ['--' + BOUNDARY,
+       'Content-Disposition: form-data; name="%s"' % key,
+       '',
+       value,
+       ])
+
+  # Now add the file itself
+  file_name = os.path.basename(file_path)
+  f = open(file_path, 'rb')
+  file_content = f.read()
+  f.close()
+
+  body.extend(
+    ['--' + BOUNDARY,
+     'Content-Disposition: form-data; name="filename"; filename="%s"'
+     % file_name,
+     # The upload server determines the mime-type, no need to set it.
+     'Content-Type: application/octet-stream',
+     '',
+     file_content,
+     ])
+
+  # Finalize the form body
+  body.extend(['--' + BOUNDARY + '--', ''])
+
+  return 'multipart/form-data; boundary=%s' % BOUNDARY, CRLF.join(body)
+
+
+def upload_find_auth(file_path, project_name, summary, labels=None,
+                     user_name=None, password=None, tries=3):
+  """Find credentials and upload a file to a Google Code project's file server.
+
+  file_path, project_name, summary, and labels are passed as-is to upload.
+
+  Args:
+    file_path: The local path to the file.
+    project_name: The name of your project on Google Code.
+    summary: A small description for the file.
+    labels: an optional list of label strings with which to tag the file.
+    config_dir: Path to Subversion configuration directory, 'none', or None.
+    user_name: Your Google account name.
+    tries: How many attempts to make.
+  """
+
+  while tries > 0:
+    if user_name is None:
+      # Read username if not specified or loaded from svn config, or on
+      # subsequent tries.
+      sys.stdout.write('Please enter your googlecode.com username: ')
+      sys.stdout.flush()
+      user_name = sys.stdin.readline().rstrip()
+    if password is None:
+      # Read password if not loaded from svn config, or on subsequent tries.
+      print 'Please enter your googlecode.com password.'
+      print '** Note that this is NOT your Gmail account password! **'
+      print 'It is the password you use to access Subversion repositories,'
+      print 'and can be found here: http://code.google.com/hosting/settings'
+      password = getpass.getpass()
+
+    status, reason, url = upload(file_path, project_name, user_name, password,
+                                 summary, labels)
+    # Returns 403 Forbidden instead of 401 Unauthorized for bad
+    # credentials as of 2007-07-17.
+    if status in [httplib.FORBIDDEN, httplib.UNAUTHORIZED]:
+      # Rest for another try.
+      user_name = password = None
+      tries = tries - 1
+    else:
+      # We're done.
+      break
+
+  return status, reason, url
+
+
+def main():
+  parser = optparse.OptionParser(usage='googlecode-upload.py -s SUMMARY '
+                                 '-p PROJECT [options] FILE')
+  parser.add_option('-s', '--summary', dest='summary',
+                    help='Short description of the file')
+  parser.add_option('-p', '--project', dest='project',
+                    help='Google Code project name')
+  parser.add_option('-u', '--user', dest='user',
+                    help='Your Google Code username')
+  parser.add_option('-w', '--password', dest='password',
+                    help='Your Google Code password')
+  parser.add_option('-l', '--labels', dest='labels',
+                    help='An optional list of comma-separated labels to attach '
+                    'to the file')
+
+  options, args = parser.parse_args()
+
+  if not options.summary:
+    parser.error('File summary is missing.')
+  elif not options.project:
+    parser.error('Project name is missing.')
+  elif len(args) < 1:
+    parser.error('File to upload not provided.')
+  elif len(args) > 1:
+    parser.error('Only one file may be specified.')
+
+  file_path = args[0]
+
+  if options.labels:
+    labels = options.labels.split(',')
+  else:
+    labels = None
+
+  status, reason, url = upload_find_auth(file_path, options.project,
+                                         options.summary, labels,
+                                         options.user, options.password)
+  if url:
+    print 'The file was uploaded successfully.'
+    print 'URL: %s' % url
+    return 0
+  else:
+    print 'An error occurred. Your file was not uploaded.'
+    print 'Google Code upload server said: %s (%s)' % (reason, status)
+    return 1
+
+
+if __name__ == '__main__':
+  sys.exit(main())

+ 79 - 0
csharp/build/nuspec.xsd

@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- original location: https://hg01.codeplex.com/nuget/raw-file/tip/src/Core/Authoring/nuspec.xsd -->
+<xs:schema id="nuspec" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+    <xs:element name="package">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="metadata" maxOccurs="1" minOccurs="1">
+                    <xs:complexType>
+                        <xs:all>
+                            <xs:element name="id" maxOccurs="1" minOccurs="1" type="xs:string" />
+                            <xs:element name="version" maxOccurs="1" minOccurs="1" type="xs:string" />
+                            <xs:element name="title" maxOccurs="1" minOccurs="0" type="xs:string" />
+                            <xs:element name="authors" maxOccurs="1" minOccurs="1" type="xs:string" />
+                            <xs:element name="owners" maxOccurs="1" minOccurs="0" type="xs:string" />
+                            <xs:element name="licenseUrl" maxOccurs="1" minOccurs="0" type="xs:anyURI" />
+                            <xs:element name="projectUrl" maxOccurs="1" minOccurs="0" type="xs:anyURI" />
+                            <xs:element name="iconUrl" maxOccurs="1" minOccurs="0" type="xs:anyURI" />
+                            <xs:element name="requireLicenseAcceptance" maxOccurs="1" minOccurs="0" type="xs:boolean" />
+                            <xs:element name="description" maxOccurs="1" minOccurs="1" type="xs:string" />
+                            <xs:element name="summary" maxOccurs="1" minOccurs="0" type="xs:string" />
+                            <xs:element name="releaseNotes" maxOccurs="1" minOccurs="0" type="xs:string" />
+                            <xs:element name="copyright" maxOccurs="1" minOccurs="0" type="xs:string" />
+                            <xs:element name="language" maxOccurs="1" minOccurs="0" type="xs:string" default="en-US" />
+                            <xs:element name="tags" maxOccurs="1" minOccurs="0" type="xs:string" />
+                            <xs:element name="dependencies" maxOccurs="1" minOccurs="0">
+                                <xs:complexType>
+                                    <xs:sequence>
+                                        <xs:element name="dependency" minOccurs="0" maxOccurs="unbounded">
+                                            <xs:complexType>
+                                                <xs:attribute name="id" type="xs:string" use="required" />
+                                                <xs:attribute name="version" type="xs:string" use="optional" />
+                                            </xs:complexType>
+                                        </xs:element>
+                                    </xs:sequence>
+                                </xs:complexType>
+                            </xs:element>
+                            <xs:element name="frameworkAssemblies" maxOccurs="1" minOccurs="0">
+                                <xs:complexType>
+                                    <xs:sequence>
+                                        <xs:element name="frameworkAssembly" minOccurs="0" maxOccurs="unbounded">
+                                            <xs:complexType>
+                                                <xs:attribute name="assemblyName" type="xs:string" use="required" />
+                                                <xs:attribute name="targetFramework" type="xs:string" use="optional" />
+                                            </xs:complexType>
+                                        </xs:element>
+                                    </xs:sequence>
+                                </xs:complexType>
+                            </xs:element>
+                            <xs:element name="references" maxOccurs="1" minOccurs="0">
+                                <xs:complexType>
+                                    <xs:sequence>
+                                        <xs:element name="reference" minOccurs="0" maxOccurs="unbounded">
+                                            <xs:complexType>
+                                                <xs:attribute name="file" type="xs:string" use="required" />
+                                            </xs:complexType>
+                                        </xs:element>
+                                    </xs:sequence>
+                                </xs:complexType>
+                            </xs:element>
+                        </xs:all>
+                    </xs:complexType>
+                </xs:element>
+                <xs:element name="files" minOccurs="0" maxOccurs="1" nillable="true">
+                    <xs:complexType>
+                        <xs:sequence>
+                            <xs:element name="file" minOccurs="0" maxOccurs="unbounded">
+                                <xs:complexType>
+                                    <xs:attribute name="src" use="required" type="xs:string" />
+                                    <xs:attribute name="target" use="optional" type="xs:string" />
+                                    <xs:attribute name="exclude" use="optional" type="xs:string" />
+                                </xs:complexType>
+                            </xs:element>
+                        </xs:sequence>
+                    </xs:complexType>
+                </xs:element>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+</xs:schema>

+ 186 - 0
csharp/build/publish.csproj

@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Publish" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+
+  <!-- build targets -->
+  <Target Name="Clean" DependsOnTargets="_Clean" />
+  <Target Name="Build" DependsOnTargets="_Clean;_Prerequisites;_StampVersion;_GenerateSource;_Build" />
+  <Target Name="Label" DependsOnTargets="_HgLabel" />
+  <Target Name="Package" DependsOnTargets="_HgPack;_NugetPack" />
+  <Target Name="Prepare" DependsOnTargets="Clean;Build;Label;Package" />
+  <Target Name="PushAll" DependsOnTargets="_HgPush;_NugetPush" />
+  <Target Name="Publish" DependsOnTargets="Prepare;PushAll" />
+
+  <PropertyGroup>
+    <ProjectName>Protocol Buffers</ProjectName>
+    <VersionMajor>2</VersionMajor>
+    <VersionMinor>4</VersionMinor>
+    <VersionBuild>1</VersionBuild>
+    <VersionRevision></VersionRevision>
+    <VersionLabel></VersionLabel>
+
+    <PackagePrefix>protobuf-csharp-port-</PackagePrefix>
+    <PublishDebug>false</PublishDebug>
+    
+    <GoogleUsername></GoogleUsername>
+    <GooglePassword></GooglePassword>
+    
+    <!--Directory Paths-->
+    <ProjectDirectory>$(MSBuildProjectDirectory)\..</ProjectDirectory>
+    <BuildTempDirectory>$(ProjectDirectory)\build_temp</BuildTempDirectory>
+    <BuildOutputDirectory>$(ProjectDirectory)\build_output</BuildOutputDirectory>
+    <SourceDirectory>$(ProjectDirectory)\src</SourceDirectory>
+    <LibDirectory>$(ProjectDirectory)\lib</LibDirectory>
+    
+    <!-- File Paths -->
+    <SigningKey>$(ProjectDirectory)\release-key\Google.ProtocolBuffers.snk</SigningKey>
+    
+    <!--Tool Paths-->
+    <HgTool>hg.exe</HgTool>
+    <Python>C:\Python25\python.exe</Python>
+    <SnTool>$(registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A@InstallationFolder)Bin\sn.exe</SnTool>
+    <StampVer>$(LibDirectory)\StampVersion.exe</StampVer>
+    <ZipExePath>$(LibDirectory)\7-Zip 9.20\7za.exe</ZipExePath>
+    <NuGet>$(LibDirectory)\NuGet.exe</NuGet>
+    <ProtogenExePath>$(BuildOutputDirectory)\tools\protogen.exe</ProtogenExePath>
+  </PropertyGroup>
+  
+  <!-- Import user settings -->
+  <Import Project="$(MSBuildProjectFullPath).user" Condition="Exists('$(MSBuildProjectFullPath).user')" />
+
+  <!-- Files -->
+  <ItemGroup>
+  </ItemGroup>
+  
+  <!-- Tasks -->
+
+  <Target Name="_Prerequisites" DependsOnTargets="_CheckEnvironment;_ReadVersion" />
+  
+  <Target Name="_Clean">
+    <MSBuild Properties="Configuration=Debug;" Targets="Clean" Projects="$(MSBuildProjectDirectory)\target.csproj" />
+    <MSBuild Properties="Configuration=Release;" Targets="Clean" Projects="$(MSBuildProjectDirectory)\target.csproj" />
+    <MakeDir Directories="$(BuildTempDirectory)" />
+    <MakeDir Directories="$(BuildOutputDirectory)" />
+  </Target>
+
+  <Target Name="_WriteUserConfig">
+    <ItemGroup>
+      <Lines Include="&lt;Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>" />
+      <Lines Include="  &lt;PropertyGroup>"/>
+      <Lines Include="    &lt;GoogleUsername> (Enter your google-code user/password here) &lt;/GoogleUsername>"/>
+      <Lines Include="    &lt;GooglePassword>&lt;/GooglePassword>"/>
+      <Lines Include="  &lt;/PropertyGroup>" />
+      <Lines Include="&lt;/Project>" />
+    </ItemGroup>
+    <WriteLinesToFile File="$(MSBuildProjectFullPath).user" Lines="@(Lines)" Overwrite="true" Condition="!Exists('$(MSBuildProjectFullPath).user')" />
+    <Exec Command="Notepad.exe $(MSBuildProjectFullPath).user" />
+  </Target>
+  
+  <Target Name="_CheckEnvironment">
+    <!-- Require google credentials -->
+    <CallTarget Targets="_WriteUserConfig" Condition=" '$(GooglePassword)' == '' " />
+    <Error Text="Restart after you verify your credentials in $(MSBuildProjectFullPath).user" Condition=" '$(GooglePassword)' == '' " />
+    <!-- Require Win7.0A SDK to verify strong-name -->
+    <Error Text="Unable to locate Win7SDK Tools: $(SnTool)" Condition="!Exists($(SnTool))" />
+    <!-- Require Python 2.5 installed -->
+    <!-- Error Text="Unable to locate Python 2.5: $(Python)" Condition="!Exists($(Python))" / -->
+    <!-- Require production signing key -->
+    <Exec Command="$(HgTool) clone https://bitbucket.org/rknapp/protobuf-csharp-port-keyfile $(ProjectDirectory)\release-key" Condition="!Exists('$(SigningKey)')" />
+    <Error Text="Unable to locate release signing key: $(SigningKey)" Condition="!Exists($(SigningKey))" />
+  </Target>
+
+  <Target Name="_ReadVersion" Condition=" '$(VersionLabel)' == '' ">
+    <Exec Command="$(HgTool) log -l 1 --template &quot;{rev}&quot; > &quot;$(BuildTempDirectory)\revision.txt&quot;"></Exec>
+    <ReadLinesFromFile File="$(BuildTempDirectory)\revision.txt">
+      <Output TaskParameter="Lines" PropertyName="VersionRevision"/>
+    </ReadLinesFromFile>
+
+    <PropertyGroup>
+      <VersionLabel>$(VersionMajor).$(VersionMinor).$(VersionBuild).$(VersionRevision)</VersionLabel>
+    </PropertyGroup>
+    
+    <Message Text="Building version $(VersionLabel)" Importance="high" />
+  </Target>
+
+  <Target Name="_StampVersion" DependsOnTargets="_Prerequisites">
+    <Exec Command="$(StampVer) /major:$(VersionMajor) /minor:$(VersionMinor) /build:$(VersionBuild) /revision:$(VersionRevision)" WorkingDirectory="$(SourceDirectory)" />
+    <Exec Command="FIND &quot;$(VersionLabel)&quot; ProtocolBuffers\Properties\AssemblyInfo.cs" WorkingDirectory="$(SourceDirectory)" />
+  </Target>
+
+  <Target Name="_GenerateSource" DependsOnTargets="_Prerequisites">
+    <MSBuild Properties="Configuration=Release;AssemblyOriginatorKeyFile=$(SigningKey)" Targets="GenerateProjects;BuildTools;GenerateSource" Projects="$(MSBuildProjectDirectory)\build.csproj" />
+    <Exec Command="&quot;$(SnTool)&quot; -T &quot;$(ProtogenExePath)&quot; > signkey.txt" WorkingDirectory="$(BuildTempDirectory)" />
+    <!-- Make sure we are signing with the correct key -->
+    <Exec Command="FIND &quot;55f7125234beb589&quot; signkey.txt" WorkingDirectory="$(BuildTempDirectory)" />
+  </Target>
+  
+  <Target Name="_Build" DependsOnTargets="_Prerequisites">
+    <!-- Release Build -->
+    <MSBuild Properties="Configuration=Release;AssemblyOriginatorKeyFile=$(SigningKey)" Targets="_CompileAll" Projects="$(MSBuildProjectDirectory)\build.csproj" />
+    <MSBuild Properties="Configuration=Release;AssemblyOriginatorKeyFile=$(SigningKey);PackageName=$(PackagePrefix)$(VersionLabel)-release" Targets="GeneratePackage" Projects="$(MSBuildProjectDirectory)\build.csproj" />
+    <!-- Debug Build -->
+    <MSBuild Condition=" '$(PublishDebug)' == 'true' " Properties="Configuration=Debug;AssemblyOriginatorKeyFile=$(SigningKey)" Targets="_CompileAll" Projects="$(MSBuildProjectDirectory)\build.csproj" />
+    <MSBuild Condition=" '$(PublishDebug)' == 'true' " Properties="Configuration=Debug;AssemblyOriginatorKeyFile=$(SigningKey);PackageName=$(PackagePrefix)$(VersionLabel)-full" Targets="GeneratePackage" Projects="$(MSBuildProjectDirectory)\build.csproj" />
+  </Target>
+
+  <Target Name="_HgPack" DependsOnTargets="_Prerequisites">
+    <Exec Command="$(HgTool) archive $(BuildTempDirectory)\$(PackagePrefix)$(VersionLabel)-source.zip" WorkingDirectory="$(ProjectDirectory)" />
+  </Target>
+  
+  <Target Name="_HgLabel" DependsOnTargets="_Prerequisites">
+    <Exec Command="$(HgTool) commit -m &quot;version $(VersionLabel)&quot;" WorkingDirectory="$(ProjectDirectory)" />
+    <Exec Command="$(HgTool) tag $(VersionLabel)" WorkingDirectory="$(ProjectDirectory)" />
+  </Target>
+  
+  <Target Name="_HgPush" DependsOnTargets="_Prerequisites">
+    <Exec Command="$(HgTool) push" WorkingDirectory="$(ProjectDirectory)" />
+  </Target>
+
+  <Target Name="_PkgPush" DependsOnTargets="_Prerequisites">
+    <PropertyGroup>
+      <UploadPackage>$(Python) "$(MSBuildProjectDirectory)\googlecode_upload.py" --project protobuf-csharp-port --user "$(GoogleUsername)" --password "$(GooglePassword)"</UploadPackage>
+      
+      <SourcePackage>$(BuildTempDirectory)\$(PackagePrefix)$(VersionLabel)-source.zip</SourcePackage>
+      <ReleasePackageBin>$(BuildTempDirectory)\$(PackagePrefix)$(VersionLabel)-release-binaries.zip</ReleasePackageBin>
+      <ReleasePackageSyb>$(BuildTempDirectory)\$(PackagePrefix)$(VersionLabel)-release-symbols.zip</ReleasePackageSyb>
+      <DebugPackageBin>$(BuildTempDirectory)\$(PackagePrefix)$(VersionLabel)-full-binaries.zip</DebugPackageBin>
+      <DebugPackageSyb>$(BuildTempDirectory)\$(PackagePrefix)$(VersionLabel)-full-symbols.zip</DebugPackageSyb>
+    </PropertyGroup>
+
+    <Error Condition="!Exists('$(SourcePackage)')" Text="File not found: $(SourcePackage)" />
+    <Error Condition="!Exists('$(ReleasePackageBin)')" Text="File not found: $(ReleasePackageBin)" />
+    <Error Condition="!Exists('$(ReleasePackageSyb)')" Text="File not found: $(ReleasePackageSyb)" />
+    <Error Condition="'$(PublishDebug)' == 'true' And !Exists('$(DebugPackageBin)')" Text="File not found: $(DebugPackageBin)" />
+    <Error Condition="'$(PublishDebug)' == 'true' And !Exists('$(DebugPackageSyb)')" Text="File not found: $(DebugPackageSyb)" />
+
+    <Exec WorkingDirectory="$(ProjectDirectory)"
+          Command="$(UploadPackage) --labels Type-Source,Featured --summary &quot;Version $(VersionLabel) source&quot; $(SourcePackage)" />
+    
+    <Exec WorkingDirectory="$(ProjectDirectory)"
+          Command="$(UploadPackage) --labels Type-Executable,Featured --summary &quot;Version $(VersionLabel) release binaries only&quot; $(ReleasePackageBin)" />
+    <Exec WorkingDirectory="$(ProjectDirectory)"
+          Command="$(UploadPackage) --labels Type-Executable,Featured --summary &quot;Version $(VersionLabel) release binaries and symbols&quot; $(ReleasePackageSyb)" />
+
+    <Exec WorkingDirectory="$(ProjectDirectory)" Condition=" '$(PublishDebug)' == 'true' "
+          Command="$(UploadPackage) --labels Type-Executable,Featured --summary &quot;Version $(VersionLabel) all binaries&quot; $(DebugPackageBin)" />
+    <Exec WorkingDirectory="$(ProjectDirectory)" Condition=" '$(PublishDebug)' == 'true' "
+          Command="$(UploadPackage) --labels Type-Executable,Featured --summary &quot;Version $(VersionLabel) all binaries and symbols&quot; $(DebugPackageSyb)" />
+  </Target>
+
+  <Target Name="_NugetPack" DependsOnTargets="_Prerequisites">
+    <Exec WorkingDirectory="$(MSBuildProjectDirectory)"
+      Command="$(NuGet) update -self" />
+    <Exec WorkingDirectory="$(MSBuildProjectDirectory)"
+      Command="$(NuGet) pack Google.ProtocolBuffers.nuspec -Symbols -Version $(VersionLabel) -NoPackageAnalysis -OutputDirectory $(BuildTempDirectory)" />
+    <Exec WorkingDirectory="$(MSBuildProjectDirectory)"
+      Command="$(NuGet) pack Google.ProtocolBuffersLite.nuspec -Symbols -Version $(VersionLabel) -NoPackageAnalysis -OutputDirectory $(BuildTempDirectory)" />
+  </Target>
+
+  <Target Name="_NugetPush" DependsOnTargets="_Prerequisites">
+    <Exec WorkingDirectory="$(BuildTempDirectory)" Command="$(NuGet) push Google.ProtocolBuffers.$(VersionLabel).nupkg" ContinueOnError="true" />
+    <Exec WorkingDirectory="$(BuildTempDirectory)" Command="$(NuGet) push Google.ProtocolBuffersLite.$(VersionLabel).nupkg" ContinueOnError="true" />
+
+    <Exec WorkingDirectory="$(BuildTempDirectory)" Command="$(NuGet) push Google.ProtocolBuffers.$(VersionLabel).symbols.nupkg" ContinueOnError="true" />
+    <Exec WorkingDirectory="$(BuildTempDirectory)" Command="$(NuGet) push Google.ProtocolBuffersLite.$(VersionLabel).symbols.nupkg" ContinueOnError="true" />
+  </Target>
+  
+</Project>

+ 167 - 0
csharp/build/target.csproj

@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+
+<!-- **********************************************************************************************
+High-level Targets
+*********************************************************************************************** -->
+
+  <Target Name="Clean" DependsOnTargets="_Clean" />
+  <Target Name="Build" DependsOnTargets="_Compile;_Test" />
+  <Target Name="Test" DependsOnTargets="_Test" />
+  <Target Name="Rebuild" DependsOnTargets="Clean;Build" />
+  <Target Name="Publish" DependsOnTargets="Clean;Build;_Publish" />
+
+  <!-- **********************************************************************************************
+Properties
+*********************************************************************************************** -->
+
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">Any CPU</Platform>
+    <TargetVersion Condition=" '$(TargetVersion)' == '' ">NET20</TargetVersion>
+    <BuildParams></BuildParams>
+
+    <!--Directory Paths-->
+    <ProjectDirectory>$(MSBuildProjectDirectory)\..</ProjectDirectory>
+    <SourceDirectory>$(ProjectDirectory)\src</SourceDirectory>
+    <LibDirectory>$(ProjectDirectory)\lib</LibDirectory>
+
+    <!--File Paths-->
+    <BuildTempDirectory>$(ProjectDirectory)\build_temp\$(Configuration)\$(TargetVersion)</BuildTempDirectory>
+    <BuildOutputDirectory>$(ProjectDirectory)\build_output\$(Configuration)\$(TargetVersion)</BuildOutputDirectory>
+    <SolutionFile>$(SourceDirectory)\ProtocolBuffersLibrary.$(TargetVersion).sln</SolutionFile>
+
+    <!--Tool Paths-->
+    <NUnitExePath>$(LibDirectory)\NUnit\tools\nunit-console.exe</NUnitExePath>
+    <StatLightExePath>$(LibDirectory)\StatLight\tools\StatLight.exe</StatLightExePath>
+  </PropertyGroup>
+
+<!-- **********************************************************************************************
+Target Versions
+*********************************************************************************************** -->
+
+  <PropertyGroup Condition=" '$(TargetVersion)' == 'NET20' ">
+    <BuildTools>3.5</BuildTools>
+    <TestFramework>NUNIT</TestFramework>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(TargetVersion)' == 'NET35' ">
+    <BuildTools>3.5</BuildTools>
+    <TestFramework>NUNIT</TestFramework>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(TargetVersion)' == 'NET40' ">
+    <BuildTools>4.0</BuildTools>
+    <TestFramework>NUNIT</TestFramework>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(TargetVersion)' == 'CF20' ">
+    <BuildTools>3.5</BuildTools>
+    <TestFramework>NONE</TestFramework>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(TargetVersion)' == 'CF35' ">
+    <BuildTools>3.5</BuildTools>
+    <TestFramework>NONE</TestFramework>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(TargetVersion)' == 'SL20' ">
+    <BuildTools>3.5</BuildTools>
+    <TestFramework>SILVERLIGHT</TestFramework>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(TargetVersion)' == 'SL30' ">
+    <BuildTools>3.5</BuildTools>
+    <TestFramework>SILVERLIGHT</TestFramework>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(TargetVersion)' == 'SL40' ">
+    <BuildTools>4.0</BuildTools>
+    <TestFramework>SILVERLIGHT</TestFramework>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(TargetVersion)' == 'PL40' ">
+    <BuildTools>4.0</BuildTools>
+    <TestFramework>SILVERLIGHT</TestFramework>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <BuildOutputDirectory>$(ProjectDirectory)\build_output\$(Configuration)\portable-net40+sl4+sl5+wp7+wp8+win8</BuildOutputDirectory>
+  </PropertyGroup>
+
+<!-- **********************************************************************************************
+File Groups
+*********************************************************************************************** -->
+
+  <ItemGroup>
+    <WorkingDirectories Include="$(BuildTempDirectory)" />
+    <WorkingDirectories Include="$(BuildOutputDirectory)" />
+    
+    <TestContainer Include="$(SourceDirectory)\ProtocolBuffers.Test\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffers.Test.dll" />
+    <TestContainer Include="$(SourceDirectory)\ProtocolBuffersLite.Test\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffersLite.Test.dll" />
+    <TestContainer Include="$(SourceDirectory)\ProtocolBuffersLite.Test\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffersMixedLite.Test.dll" />
+
+    <StatLightTestContainer Include="$(SourceDirectory)\ProtocolBuffers.Test\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffers.Test.xap" />
+    <StatLightTestContainer Include="$(SourceDirectory)\ProtocolBuffersLite.Test\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffersLite.Test.xap" />
+    <StatLightTestContainer Include="$(SourceDirectory)\ProtocolBuffersLite.Test\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffersMixedLite.Test.xap" />
+
+    <PublishItem Include="$(SourceDirectory)\ProtocolBuffers\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffers.dll" />
+    <PublishItem Include="$(SourceDirectory)\ProtocolBuffers\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffers.pdb" />
+    <PublishItem Include="$(SourceDirectory)\ProtocolBuffers\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffers.xml" />
+    <PublishItem Include="$(SourceDirectory)\ProtocolBuffers\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffersLite.dll" />
+    <PublishItem Include="$(SourceDirectory)\ProtocolBuffers\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffersLite.pdb" />
+    <PublishItem Include="$(SourceDirectory)\ProtocolBuffers\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffersLite.xml" />
+    <PublishItem Include="$(SourceDirectory)\ProtocolBuffers.Serialization\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffers.Serialization.dll" />
+    <PublishItem Include="$(SourceDirectory)\ProtocolBuffers.Serialization\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffers.Serialization.pdb" />
+    <PublishItem Include="$(SourceDirectory)\ProtocolBuffers.Serialization\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffers.Serialization.xml" />
+    <PublishItem Include="$(SourceDirectory)\ProtocolBuffers.Serialization\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffersLite.Serialization.dll" />
+    <PublishItem Include="$(SourceDirectory)\ProtocolBuffers.Serialization\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffersLite.Serialization.pdb" />
+    <PublishItem Include="$(SourceDirectory)\ProtocolBuffers.Serialization\bin\$(TargetVersion)\$(Configuration)\Google.ProtocolBuffersLite.Serialization.xml" />
+  </ItemGroup>
+
+<!-- **********************************************************************************************
+Targets For Build
+*********************************************************************************************** -->
+
+  <Target Name="_Configured">
+    <Message Text="Building $(TargetVersion) for configuration $(Configuration), platform $(Platform)" Importance="normal" />
+    <Error Text="Unknown or missing value for TargetVersion=[value]" Condition=" '$(BuildTools)' == '' " />
+  </Target>
+  
+  <Target Name="_Clean" DependsOnTargets="_Configured">
+    <RemoveDir Directories="@(WorkingDirectories)" Condition="Exists(%(WorkingDirectories.Identity))" />
+    <MSBuild Targets="Clean" Projects="$(SolutionFile)" ToolsVersion="$(BuildTools)"
+             Properties="Configuration=$(Configuration);Platform=$(Platform);"
+             />
+  </Target>
+
+  <Target Name="_Compile" DependsOnTargets="_Configured">
+    <MSBuild Targets="Build" Projects="$(SolutionFile)" ToolsVersion="$(BuildTools)"
+             Properties="Configuration=$(Configuration);Platform=$(Platform);$(BuildParams)"
+             />
+  </Target>
+
+  <Target Name="_Publish" DependsOnTargets="_Configured">
+    <MakeDir Directories="$(BuildOutputDirectory)" />
+    <Copy SourceFiles="@(PublishItem)" DestinationFolder="$(BuildOutputDirectory)" />
+  </Target>
+
+<!-- **********************************************************************************************
+Targets For Test
+*********************************************************************************************** -->
+
+  <Target Name="_Test" DependsOnTargets="_Configured">
+    <MakeDir Directories="$(BuildTempDirectory)" />
+    <CallTarget Targets="_RunNunit" Condition=" '$(TestFramework)'=='NUNIT' " />
+    <CallTarget Targets="_RunStatLight" Condition=" '$(TestFramework)'=='SILVERLIGHT' " />
+  </Target>
+
+  <Target Name="_RunNunit">
+    <Copy SourceFiles="$(LibDirectory)\NUnit-config\nunit-console.$(TargetFrameworkVersion).config" DestinationFiles="$(NUnitExePath).config" />
+    <Exec Command="&quot;$(NUnitExePath)&quot; /nologo /noshadow &quot;%(TestContainer.Identity)&quot; /xml:&quot;$(BuildTempDirectory)\%(TestContainer.Filename).xml&quot;" />
+  </Target>
+
+  <Target Name="_RunStatLight">
+    <Exec
+      Command="&quot;$(StatLightExePath)&quot; -x %(StatLightTestContainer.Identity) --ReportOutputFileType=NUnit --ReportOutputFile=$(BuildTempDirectory)\%(StatLightTestContainer.Filename).xml" />
+  </Target>
+
+</Project>

+ 41 - 0
csharp/csproj_templates/CF20.csproj

@@ -0,0 +1,41 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <EnvironmentFlavor>COMPACT_FRAMEWORK</EnvironmentFlavor>
+    <EnvironmentTemplate>CF20</EnvironmentTemplate>
+    <ProjectTypeGuids>{4D628B5B-2FBC-4AA6-8C16-197242AEB884};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <PlatformFamilyName>Smartphone</PlatformFamilyName>
+    <PlatformID>f27da329-3269-4191-98e0-c87d3d7f1db9</PlatformID>
+    <!--<OSVersion>5.2</OSVersion>-->
+    <!--<DeployDirSuffix>CF20</DeployDirSuffix>-->
+    <!--<NativePlatformName>Windows Mobile 6 Standard SDK</NativePlatformName>-->
+    <!--<FormFactorID></FormFactorID>-->
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>bin\CF20\Debug</OutputPath>
+    <IntermediateOutputPath>obj\CF20\Debug\</IntermediateOutputPath>
+    <DefineConstants>$(DefineConstants);NOSERIALIZABLE;NOFILEVERSION;NOEXTENSIONS</DefineConstants>
+    <NoConfig>true</NoConfig>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>bin\CF20\Release</OutputPath>
+    <IntermediateOutputPath>obj\CF20\Release\</IntermediateOutputPath>
+    <DefineConstants>$(DefineConstants);NOSERIALIZABLE;NOFILEVERSION;NOEXTENSIONS</DefineConstants>
+    <NoConfig>true</NoConfig>
+  </PropertyGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CompactFramework.CSharp.targets" />
+  <ProjectExtensions>
+    <VisualStudio>
+      <FlavorProperties GUID="{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}">
+        <HostingProcess disable="1" />
+      </FlavorProperties>
+    </VisualStudio>
+  </ProjectExtensions>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>

+ 44 - 0
csharp/csproj_templates/CF35.csproj

@@ -0,0 +1,44 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <EnvironmentFlavor>COMPACT_FRAMEWORK</EnvironmentFlavor>
+    <EnvironmentTemplate>CF35</EnvironmentTemplate>
+    <ProjectTypeGuids>{4D628B5B-2FBC-4AA6-8C16-197242AEB884};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <PlatformFamilyName>Smartphone</PlatformFamilyName>
+    <PlatformID>f27da329-3269-4191-98e0-c87d3d7f1db9</PlatformID>
+    <!--<OSVersion>5.2</OSVersion>-->
+    <!--<DeployDirSuffix>CF35</DeployDirSuffix>-->
+    <!--<NativePlatformName>Windows Mobile 6 Standard SDK</NativePlatformName>-->
+    <!--<FormFactorID></FormFactorID>-->
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>bin\CF35\Debug</OutputPath>
+    <IntermediateOutputPath>obj\CF35\Debug\</IntermediateOutputPath>
+    <DefineConstants>$(DefineConstants);NOSERIALIZABLE;NOFILEVERSION</DefineConstants>
+    <NoConfig>true</NoConfig>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>bin\CF35\Release</OutputPath>
+    <IntermediateOutputPath>obj\CF35\Release\</IntermediateOutputPath>
+    <DefineConstants>$(DefineConstants);NOSERIALIZABLE;NOFILEVERSION</DefineConstants>
+    <NoConfig>true</NoConfig>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System.Core" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CompactFramework.CSharp.targets" />
+  <ProjectExtensions>
+    <VisualStudio>
+      <FlavorProperties GUID="{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}">
+        <HostingProcess disable="1" />
+      </FlavorProperties>
+    </VisualStudio>
+  </ProjectExtensions>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>

+ 17 - 0
csharp/csproj_templates/NET20.csproj

@@ -0,0 +1,17 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <EnvironmentFlavor>CLIENTPROFILE</EnvironmentFlavor>
+    <EnvironmentTemplate>NET20</EnvironmentTemplate>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>bin\NET20\Debug</OutputPath>
+    <IntermediateOutputPath>obj\NET20\Debug\</IntermediateOutputPath>
+    <DefineConstants>$(DefineConstants);NOEXTENSIONS</DefineConstants>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>bin\NET20\Release</OutputPath>
+    <IntermediateOutputPath>obj\NET20\Release\</IntermediateOutputPath>
+    <DefineConstants>$(DefineConstants);NOEXTENSIONS</DefineConstants>
+  </PropertyGroup>
+</Project>

+ 20 - 0
csharp/csproj_templates/NET35.csproj

@@ -0,0 +1,20 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <EnvironmentFlavor>CLIENTPROFILE</EnvironmentFlavor>
+    <EnvironmentTemplate>NET35</EnvironmentTemplate>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>bin\NET35\Debug</OutputPath>
+    <IntermediateOutputPath>obj\NET35\Debug\</IntermediateOutputPath>
+    <DefineConstants>$(DefineConstants)</DefineConstants>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>bin\NET35\Release</OutputPath>
+    <IntermediateOutputPath>obj\NET35\Release\</IntermediateOutputPath>
+    <DefineConstants>$(DefineConstants)</DefineConstants>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System.Core" />
+  </ItemGroup>
+</Project>

+ 20 - 0
csharp/csproj_templates/NET40.csproj

@@ -0,0 +1,20 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <EnvironmentFlavor>CLIENTPROFILE</EnvironmentFlavor>
+    <EnvironmentTemplate>NET40</EnvironmentTemplate>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>bin\NET40\Debug</OutputPath>
+    <IntermediateOutputPath>obj\NET40\Debug\</IntermediateOutputPath>
+    <DefineConstants>$(DefineConstants)</DefineConstants>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>bin\NET40\Release</OutputPath>
+    <IntermediateOutputPath>obj\NET40\Release\</IntermediateOutputPath>
+    <DefineConstants>$(DefineConstants)</DefineConstants>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System.Core" />
+  </ItemGroup>
+</Project>

+ 51 - 0
csharp/csproj_templates/PL40.csproj

@@ -0,0 +1,51 @@
+<Project ToolsVersion="4.0" DefaultTargets="Build" 
+         xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
+         xmlns:cs="urn:schemas-csharp-project:template">
+  <PropertyGroup>
+    <MinimumVisualStudioVersion>10.0</MinimumVisualStudioVersion>
+    <EnvironmentFlavor>PORTABLE_LIBRARY</EnvironmentFlavor>
+    <EnvironmentTemplate>PL40</EnvironmentTemplate>
+    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkProfile>Profile1</TargetFrameworkProfile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>bin\PL40\Debug</OutputPath>
+    <IntermediateOutputPath>obj\PL40\Debug\</IntermediateOutputPath>
+    <DefineConstants>$(DefineConstants);NOSERIALIZABLE;NOSORTEDLIST</DefineConstants>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>bin\PL40\Release</OutputPath>
+    <IntermediateOutputPath>obj\PL40\Release\</IntermediateOutputPath>
+    <DefineConstants>$(DefineConstants);NOSERIALIZABLE;NOSORTEDLIST</DefineConstants>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System.Core" />
+  </ItemGroup>
+  <Import cs:Precondition=" '$(EnvironmentProjectType)' != 'TEST' "
+          Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
+  <!-- Portable Library will be tested as silverlight -->
+  <PropertyGroup cs:Precondition=" '$(EnvironmentProjectType)' == 'TEST' ">
+    <ProjectTypeGuids>{A1591282-1198-4647-A2B1-27E5FF5F6F3B};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
+    <ValidateXaml>false</ValidateXaml>
+    <ThrowErrorsInValidation>false</ThrowErrorsInValidation>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <cs:Import Project="SLTest.targets" cs:Precondition=" '$(EnvironmentProjectType)' == 'TEST' " />
+  <Import cs:Precondition=" '$(EnvironmentProjectType)' == 'TEST' "
+          Project="$(MSBuildExtensionsPath32)\Microsoft\Silverlight\$(SilverlightVersion)\Microsoft.Silverlight.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <ProjectExtensions cs:Precondition=" '$(EnvironmentProjectType)' == 'TEST' ">
+    <VisualStudio>
+      <FlavorProperties GUID="{A1591282-1198-4647-A2B1-27E5FF5F6F3B}">
+        <SilverlightProjectProperties />
+      </FlavorProperties>
+    </VisualStudio>
+  </ProjectExtensions>
+</Project>

+ 44 - 0
csharp/csproj_templates/SL20.csproj

@@ -0,0 +1,44 @@
+<Project ToolsVersion="3.5" DefaultTargets="Build" 
+         xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
+         xmlns:cs="urn:schemas-csharp-project:template">
+  <PropertyGroup>
+    <EnvironmentFlavor>SILVERLIGHT</EnvironmentFlavor>
+    <EnvironmentTemplate>SL20</EnvironmentTemplate>
+    <ProjectTypeGuids>{A1591282-1198-4647-A2B1-27E5FF5F6F3B};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <SilverlightApplication>false</SilverlightApplication>
+    <ValidateXaml>false</ValidateXaml>
+    <ThrowErrorsInValidation>false</ThrowErrorsInValidation>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>bin\SL20\Debug</OutputPath>
+    <IntermediateOutputPath>obj\SL20\Debug\</IntermediateOutputPath>
+    <DefineConstants>$(DefineConstants);NOSERIALIZABLE;NOSORTEDLIST;NOEXTENSIONS</DefineConstants>
+    <NoConfig>true</NoConfig>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>bin\SL20\Release</OutputPath>
+    <IntermediateOutputPath>obj\SL20\Release\</IntermediateOutputPath>
+    <DefineConstants>$(DefineConstants);NOSERIALIZABLE;NOSORTEDLIST;NOEXTENSIONS</DefineConstants>
+    <NoConfig>true</NoConfig>
+  </PropertyGroup>
+  <!-- Preprocess include of silverlight testing -->
+  <cs:Import Project="SLTest.targets" cs:Precondition=" '$(EnvironmentProjectType)' == 'TEST' " />
+  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Silverlight\v2.0\Microsoft.Silverlight.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <ProjectExtensions>
+    <VisualStudio>
+      <FlavorProperties GUID="{A1591282-1198-4647-A2B1-27E5FF5F6F3B}">
+        <SilverlightProjectProperties>
+          <StartAction>OfflineApplication</StartAction>
+        </SilverlightProjectProperties>
+      </FlavorProperties>
+    </VisualStudio>
+  </ProjectExtensions>
+</Project>

+ 47 - 0
csharp/csproj_templates/SL30.csproj

@@ -0,0 +1,47 @@
+<Project ToolsVersion="3.5" DefaultTargets="Build" 
+         xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
+         xmlns:cs="urn:schemas-csharp-project:template">
+  <PropertyGroup>
+    <EnvironmentFlavor>SILVERLIGHT</EnvironmentFlavor>
+    <EnvironmentTemplate>SL30</EnvironmentTemplate>
+    <ProjectTypeGuids>{A1591282-1198-4647-A2B1-27E5FF5F6F3B};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <SilverlightApplication>false</SilverlightApplication>
+    <ValidateXaml>false</ValidateXaml>
+    <ThrowErrorsInValidation>false</ThrowErrorsInValidation>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>bin\SL30\Debug</OutputPath>
+    <IntermediateOutputPath>obj\SL30\Debug\</IntermediateOutputPath>
+    <DefineConstants>$(DefineConstants);NOSERIALIZABLE;NOSORTEDLIST</DefineConstants>
+    <NoConfig>true</NoConfig>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>bin\SL30\Release</OutputPath>
+    <IntermediateOutputPath>obj\SL30\Release\</IntermediateOutputPath>
+    <DefineConstants>$(DefineConstants);NOSERIALIZABLE;NOSORTEDLIST</DefineConstants>
+    <NoConfig>true</NoConfig>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System.Core" />
+  </ItemGroup>
+  <!-- Preprocess include of silverlight testing -->
+  <cs:Import Project="SLTest.targets" cs:Precondition=" '$(EnvironmentProjectType)' == 'TEST' " />
+  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Silverlight\v3.0\Microsoft.Silverlight.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <ProjectExtensions>
+    <VisualStudio>
+      <FlavorProperties GUID="{A1591282-1198-4647-A2B1-27E5FF5F6F3B}">
+        <SilverlightProjectProperties>
+          <StartAction>OfflineApplication</StartAction>
+        </SilverlightProjectProperties>
+      </FlavorProperties>
+    </VisualStudio>
+  </ProjectExtensions>
+</Project>

+ 48 - 0
csharp/csproj_templates/SL40.csproj

@@ -0,0 +1,48 @@
+<Project ToolsVersion="4.0" DefaultTargets="Build" 
+         xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
+         xmlns:cs="urn:schemas-csharp-project:template">
+  <PropertyGroup>
+    <EnvironmentFlavor>SILVERLIGHT</EnvironmentFlavor>
+    <EnvironmentTemplate>SL40</EnvironmentTemplate>
+    <ProjectTypeGuids>{A1591282-1198-4647-A2B1-27E5FF5F6F3B};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <SilverlightApplication>false</SilverlightApplication>
+    <ValidateXaml>false</ValidateXaml>
+    <ThrowErrorsInValidation>false</ThrowErrorsInValidation>
+    <SilverlightVersion>$(TargetFrameworkVersion)</SilverlightVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>bin\SL40\Debug</OutputPath>
+    <IntermediateOutputPath>obj\SL40\Debug\</IntermediateOutputPath>
+    <DefineConstants>$(DefineConstants);NOSERIALIZABLE;NOSORTEDLIST</DefineConstants>
+    <NoConfig>true</NoConfig>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>bin\SL40\Release</OutputPath>
+    <IntermediateOutputPath>obj\SL40\Release\</IntermediateOutputPath>
+    <DefineConstants>$(DefineConstants);NOSERIALIZABLE;NOSORTEDLIST</DefineConstants>
+    <NoConfig>true</NoConfig>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System.Core" />
+  </ItemGroup>
+  <!-- Preprocess include of silverlight testing -->
+  <cs:Import Project="SLTest.targets" cs:Precondition=" '$(EnvironmentProjectType)' == 'TEST' " />
+  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Silverlight\$(SilverlightVersion)\Microsoft.Silverlight.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <ProjectExtensions>
+    <VisualStudio>
+      <FlavorProperties GUID="{A1591282-1198-4647-A2B1-27E5FF5F6F3B}">
+        <SilverlightProjectProperties>
+          <StartAction>OfflineApplication</StartAction>
+        </SilverlightProjectProperties>
+      </FlavorProperties>
+    </VisualStudio>
+  </ProjectExtensions>
+</Project>

+ 34 - 0
csharp/csproj_templates/SLTest.targets

@@ -0,0 +1,34 @@
+<Project ToolsVersion="3.5" DefaultTargets="Build" 
+         xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
+         xmlns:cs="urn:schemas-csharp-project:template">
+
+  <PropertyGroup>
+    <SilverlightApplication>true</SilverlightApplication>
+    <XapOutputs>true</XapOutputs>
+    <GenerateSilverlightManifest>true</GenerateSilverlightManifest>
+    <XapFilename>$(AssemblyName).xap</XapFilename>
+    <SilverlightManifestTemplate>Properties\AppManifest.xml</SilverlightManifestTemplate>
+    <SilverlightAppEntry>$(RootNamespace).App</SilverlightAppEntry>
+    <TestPageFileName>TestPage.html</TestPageFileName>
+    <CreateTestPage>true</CreateTestPage>
+    <SilverlightVersion>$(TargetFrameworkVersion)</SilverlightVersion>
+    <OutOfBrowserSettingsFile>Properties\OutOfBrowserSettings.xml</OutOfBrowserSettingsFile>
+    <EnableOutOfBrowser>true</EnableOutOfBrowser>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System.Windows" />
+    <Reference Include="System.Windows.Browser" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="App.xaml.cs">
+      <DependentUpon>App.xaml</DependentUpon>
+    </Compile>
+    <None Include="Properties\AppManifest.xml" />
+    <None Include="Properties\OutOfBrowserSettings.xml" />
+    <ApplicationDefinition Include="App.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </ApplicationDefinition>
+  </ItemGroup>
+  
+</Project>

BIN
csharp/keys/Google.ProtocolBuffers.snk


+ 13 - 0
csharp/keys/generate_new_key.bat

@@ -0,0 +1,13 @@
+@ECHO OFF
+IF EXIST "C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\sn.exe" GOTO FOUND
+goto USEPATH
+
+:FOUND
+"C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\sn.exe" -k %~dp0\Google.ProtocolBuffers.snk 
+GOTO EXIT
+
+:USEPATH
+sn.exe -k %~dp0\Google.ProtocolBuffers.snk 
+GOTO EXIT
+
+:EXIT

+ 54 - 0
csharp/lib/NUnit-config/Microsoft.VisualStudio.TestTools.cs

@@ -0,0 +1,54 @@
+
+using System;
+#if CLIENTPROFILE
+namespace Microsoft.VisualStudio.TestTools.UnitTesting
+{
+    [AttributeUsage(AttributeTargets.Class, Inherited = true, AllowMultiple = false)]
+    public sealed class TestClassAttribute : NUnit.Framework.TestFixtureAttribute
+    {
+    }
+
+    [AttributeUsage(AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
+    public sealed class TestMethodAttribute : NUnit.Framework.TestAttribute
+    {
+    }
+
+    [AttributeUsage(AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
+    public sealed class TestInitializeAttribute : NUnit.Framework.SetUpAttribute
+    {
+    }
+
+    [AttributeUsage(AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
+    public sealed class IgnoreAttribute : NUnit.Framework.IgnoreAttribute
+    {
+    }
+
+    [AttributeUsage(AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
+    public sealed class ExpectedExceptionAttribute : NUnit.Framework.ExpectedExceptionAttribute
+    {
+        public ExpectedExceptionAttribute(Type type) : base(type)
+        { }
+    }
+
+    public class Assert : NUnit.Framework.Assert
+    {
+        [Obsolete("Do not use AreEqual on Byte[], use TestUtil.AssertBytesEqual(,)")]
+        public static void AreEqual(byte[] b1, byte[] b2)
+        {
+            NUnit.Framework.Assert.AreEqual(b1, b2);
+        }
+
+        [Obsolete("No not use assert with miss-matched types.")]
+        public static new void AreEqual(object b1, object b2)
+        {
+            NUnit.Framework.Assert.AreEqual(b1, b2);
+        }
+
+        //Allowed if the types match
+        public static void AreEqual<T>(T b1, T b2)
+        {
+            NUnit.Framework.Assert.AreEqual(b1, b2);
+        }
+    }
+}
+#endif

+ 18 - 0
csharp/lib/NUnit-config/nunit-console.v2.0.config

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<configuration>
+
+  <startup>
+    <requiredRuntime version="v2.0.50727" />
+  </startup>
+
+  <runtime>
+    <!-- We need this so test exceptions don't crash NUnit -->
+    <legacyUnhandledExceptionPolicy enabled="1" />
+
+    <!-- Look for addins in the addins directory for now -->
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <probing privatePath="lib;addins"/>
+   </assemblyBinding>
+  </runtime>
+  
+</configuration>

+ 18 - 0
csharp/lib/NUnit-config/nunit-console.v3.5.config

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<configuration>
+
+  <startup>
+    <requiredRuntime version="v2.0.50727" />
+  </startup>
+
+  <runtime>
+    <!-- We need this so test exceptions don't crash NUnit -->
+    <legacyUnhandledExceptionPolicy enabled="1" />
+
+    <!-- Look for addins in the addins directory for now -->
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <probing privatePath="lib;addins"/>
+   </assemblyBinding>
+  </runtime>
+  
+</configuration>

+ 18 - 0
csharp/lib/NUnit-config/nunit-console.v4.0.config

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<configuration>
+
+  <startup useLegacyV2RuntimeActivationPolicy="true">
+    <requiredRuntime version="v4.0.30319" safemode="true"/>
+  </startup>
+
+  <runtime>
+    <!-- We need this so test exceptions don't crash NUnit -->
+    <legacyUnhandledExceptionPolicy enabled="1" />
+
+    <!-- Look for addins in the addins directory for now -->
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <probing privatePath="lib;addins"/>
+   </assemblyBinding>
+  </runtime>
+  
+</configuration>

+ 13 - 0
csharp/lib/README.md

@@ -0,0 +1,13 @@
+This directory used to contain the binary dependencies, but they were removed during a cleanup associated with importing the project
+into google/protobuf repository. Before we figure a better way to manage the dependencies, you will have to manually download the dependencies 
+to be able to build the test projects:
+
+1. Download https://github.com/jskeet/protobuf-csharp-port/archive/2.4.1.555.zip
+2. Open the archive and copy following files into this directory:
+   * `lib/Microsoft.Silverlight.Testing/`
+   * `lib/NUnit/`
+   * `lib/proto.exe`
+
+After that, you should be able to fully build the C# protobufs Visual Studio solutions.
+
+TODO(jtattermusch): the way we pull in dependencies needs to change

+ 37 - 0
csharp/mono/buildall.sh

@@ -0,0 +1,37 @@
+#!/bin/bash
+
+# Adjust these to reflect the location of NUnit in your system,
+# and how you want NUnit to run
+NUNIT=~/protobuf/NUnit-2.5.0.9122/bin/net-2.0/nunit-console.exe
+NUNIT_OPTIONS=-noshadow
+
+# The rest should be okay.
+
+SRC=../src
+LIB=../lib
+KEYFILE=../keys/Google.ProtocolBuffers.snk
+
+rm -rf bin
+mkdir bin
+
+# Running the unit tests requires the dependencies are
+# in the bin directory too
+cp -f $LIB/{Rhino.Mocks.dll,nunit.framework.dll} bin
+
+echo Building main library
+gmcs -target:library -out:bin/Google.ProtocolBuffers.dll `find $SRC/ProtocolBuffers -name '*.cs'` -keyfile:$KEYFILE
+
+echo Building main library tests
+gmcs -target:library -out:bin/Google.ProtocolBuffers.Test.dll `find $SRC/ProtocolBuffers.Test -name '*.cs'` -keyfile:$KEYFILE -r:bin/Google.ProtocolBuffers.dll -r:$LIB/nunit.framework.dll -r:$LIB/Rhino.Mocks.dll
+
+echo Running main library tests
+mono $NUNIT bin/Google.ProtocolBuffers.Test.dll $NUNIT_OPTIONS
+
+echo Building ProtoGen
+gmcs -target:exe -out:bin/ProtoGen.exe `find $SRC/ProtoGen -name '*.cs'` -keyfile:$KEYFILE -r:bin/Google.ProtocolBuffers.dll
+
+echo Building ProtoGen tests
+gmcs -target:library -out:bin/Google.ProtocolBuffers.ProtoGen.Test.dll `find $SRC/ProtoGen.Test -name '*.cs'` -keyfile:$KEYFILE -r:bin/Google.ProtocolBuffers.dll -r:$LIB/nunit.framework.dll -r:bin/ProtoGen.exe
+
+echo Running ProtoGen tests
+mono $NUNIT bin/Google.ProtocolBuffers.ProtoGen.Test.dll $NUNIT_OPTIONS

+ 29 - 0
csharp/mono/generatesource.sh

@@ -0,0 +1,29 @@
+#!/bin/bash
+
+echo Compiling protobufs
+rm -rf tmp
+mkdir tmp
+PROTOS_DIR=../protos
+
+./protoc --proto_path=$PROTOS_DIR --descriptor_set_out=tmp/compiled.pb \
+  $PROTOS_DIR/google/protobuf/descriptor.proto \
+  $PROTOS_DIR/google/protobuf/csharp_options.proto \
+  $PROTOS_DIR/google/protobuf/unittest.proto \
+  $PROTOS_DIR/google/protobuf/unittest_csharp_options.proto \
+  $PROTOS_DIR/google/protobuf/unittest_custom_options.proto \
+  $PROTOS_DIR/google/protobuf/unittest_embed_optimize_for.proto \
+  $PROTOS_DIR/google/protobuf/unittest_import.proto \
+  $PROTOS_DIR/google/protobuf/unittest_mset.proto \
+  $PROTOS_DIR/google/protobuf/unittest_optimize_for.proto \
+  $PROTOS_DIR/tutorial/addressbook.proto
+
+cd tmp
+echo Generating new source
+mono ../bin/ProtoGen.exe compiled.pb
+
+echo Copying source into place
+cp DescriptorProtoFile.cs CSharpOptions.cs ../../src/ProtocolBuffers/DescriptorProtos
+cp UnitTest*.cs ../../src/ProtocolBuffers.Test/TestProtos
+cp AddressBookProtos.cs ../../src/AddressBook
+cd ..
+rm -rf tmp

+ 91 - 0
csharp/mono/readme.txt

@@ -0,0 +1,91 @@
+Getting started with Protocol Buffers on Mono
+---------------------------------------------
+
+Prerequisites:
+
+o Mono 2.4 or higher. Earlier versions of Mono had too
+  many issues with the weird and wonderful generic type
+  relationships in Protocol Buffers. (Even Mono 2.4 *did*
+  have a few compile-time problems, but I've worked round them.)
+
+o Some sort of Linux/Unix system
+  You can try running with Bash on Windows via MINGW32 or
+  something similar, but you're on your own :) It's easier
+  to build and test everything with .NET if you're on
+  Windows.
+
+o The native Protocol Buffers build for your system.
+  Get it from http://code.google.com/p/protobuf/
+  After building it, copy the executable protoc
+  file into this directory.
+  
+o The NUnit binaries from http://nunit.org
+  I generally just download the latest version, which
+  may not be the one which goes with nunit.framework.dll
+  in ../lib, but I've never found this to be a problem.
+  
+Building the code with current sources
+--------------------------------------
+
+1) Edit buildall.sh to tell it where to find nunit-console.exe
+   (and possibly change other options)
+   
+2) Run buildall.sh from this directory. It should build the
+   main library code + tests and ProtoGen code + tests, running
+   each set of tests after building it.
+   
+Note that currently one test is ignored in ServiceTest.cs. This
+made the Mono VM blow up - I suspect it's some interaction with
+Rhino which doesn't quite work on Mono 2.4. If you want to see a
+truly nasty stack trace, just comment out the Ignore attribute in
+ServiceTest.cs and rerun.
+
+The binaries will be produced in a bin directory under this one. The
+build currently starts from scratch each time, cleaning out the bin
+directory first. Once I've decided on a full NAnt or xbuild
+strategy, I'll do something a little cleaner.
+
+Rebuilding sources for generated code
+-------------------------------------
+
+1) Build the current code first. The bootstrapping issue is why
+   the generated source code is in the source repository :) See
+   the steps above.
+   
+2) Run generatesource.sh from this directory. This will create a
+   temporary directory, compile the .proto files into a binary
+   format, then run ProtoGen to generate .cs files from the binary
+   format. It will copy these files to the right places in the tree,
+   and finally delete the temporary directory.
+   
+3) Rebuild to test that your newly generated sources work. (Optionally
+   regenerate as well, and hash the generated files to check that
+   the new build generates the same code as the old build :)
+   
+Running the code
+----------------
+
+Once you've built the binaries, you should be able to use them just
+as if you'd built them with .NET. (And indeed, you should be able to
+use binaries built with .NET as if you'd built them with Mono :)
+
+See the getting started guide for more information:
+http://code.google.com/p/protobuf-csharp-port/wiki/GettingStarted
+
+FAQ (Frequently Anticipated Questions)
+--------------------------------------
+
+Q) This build process sucks! Why aren't you doing X, Y, Z?
+A) My Mono skills are limited. My NAnt skills are limited. My
+   MSBuild/xbuild skils are limited. My shell script skills are
+   limited. Any help is *very* welcome!
+   
+Q) Why doesn't it build ProtoBench etc?
+A) This is a first initial "release" I'll add more bits to
+   the build script. I'll be interested to see the results
+   of benchmarking it on Mono :)
+
+Any further questions or suggestions? Please email skeet@pobox.com
+or leave a request at
+http://code.google.com/p/protobuf-csharp-port/issues/list
+

+ 140 - 0
csharp/protos/benchmarks/google_size.proto

@@ -0,0 +1,140 @@
+import "google/protobuf/csharp_options.proto";
+option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.ProtoBench";
+option (google.protobuf.csharp_file_options).umbrella_classname = "GoogleSizeProtoFile";
+
+package benchmarks;
+
+option java_outer_classname = "GoogleSize";
+option optimize_for = CODE_SIZE;
+
+message SizeMessage1 {
+  required string field1 = 1;
+  optional string field9 = 9;
+  optional string field18 = 18;
+  optional bool field80 = 80 [default=false];
+  optional bool field81 = 81 [default=true];
+  required int32 field2 = 2;
+  required int32 field3 = 3;
+  optional int32 field280 = 280;
+  optional int32 field6 = 6 [default=0];
+  optional int64 field22 = 22;
+  optional string field4 = 4;
+  repeated fixed64 field5 = 5;
+  optional bool field59 = 59 [default=false];
+  optional string field7 = 7;
+  optional int32 field16 = 16;
+  optional int32 field130 = 130 [default=0];
+  optional bool field12 = 12 [default=true];
+  optional bool field17 = 17 [default=true];
+  optional bool field13 = 13 [default=true];
+  optional bool field14 = 14 [default=true];
+  optional int32 field104 = 104 [default=0];
+  optional int32 field100 = 100 [default=0];
+  optional int32 field101 = 101 [default=0];
+  optional string field102 = 102;
+  optional string field103 = 103;
+  optional int32 field29 = 29 [default=0];
+  optional bool field30 = 30 [default=false];
+  optional int32 field60 = 60 [default=-1];
+  optional int32 field271 = 271 [default=-1];
+  optional int32 field272 = 272 [default=-1];
+  optional int32 field150 = 150;
+  optional int32 field23 = 23 [default=0];
+  optional bool field24 = 24 [default=false];
+  optional int32 field25 = 25 [default=0];
+  optional SizeMessage1SubMessage field15 = 15;
+  optional bool field78 = 78;
+  optional int32 field67 = 67 [default=0];
+  optional int32 field68 = 68;
+  optional int32 field128 = 128 [default=0];
+  optional string field129 = 129 [default="xxxxxxxxxxxxxxxxxxxxx"];
+  optional int32 field131 = 131 [default=0];
+}
+
+message SizeMessage1SubMessage {
+  optional int32 field1 = 1 [default=0];
+  optional int32 field2 = 2 [default=0];
+  optional int32 field3 = 3 [default=0];
+  optional string field15 = 15;
+  optional bool field12 = 12 [default=true];
+  optional int64 field13 = 13;
+  optional int64 field14 = 14;
+  optional int32 field16 = 16;
+  optional int32 field19 = 19 [default=2];
+  optional bool field20  = 20 [default=true];
+  optional bool field28 = 28 [default=true];
+  optional fixed64 field21 = 21;
+  optional int32 field22 = 22;
+  optional bool field23 = 23 [ default=false ];
+  optional bool field206 = 206 [default=false];
+  optional fixed32 field203 = 203;
+  optional int32 field204 = 204;
+  optional string field205 = 205;
+  optional uint64 field207 = 207;
+  optional uint64 field300 = 300;
+}
+
+message SizeMessage2 {
+  optional string field1 = 1;
+  optional int64 field3 = 3;
+  optional int64 field4 = 4;
+  optional int64 field30 = 30;
+  optional bool field75  = 75 [default=false];
+  optional string field6 = 6;
+  optional bytes field2 = 2;
+  optional int32 field21 = 21 [default=0];
+  optional int32 field71 = 71;
+  optional float field25 = 25;
+  optional int32 field109 = 109 [default=0];
+  optional int32 field210 = 210 [default=0];
+  optional int32 field211 = 211 [default=0];
+  optional int32 field212 = 212 [default=0];
+  optional int32 field213 = 213 [default=0];
+  optional int32 field216 = 216 [default=0];
+  optional int32 field217 = 217 [default=0];
+  optional int32 field218 = 218 [default=0];
+  optional int32 field220 = 220 [default=0];
+  optional int32 field221 = 221 [default=0];
+  optional float field222 = 222 [default=0.0];
+  optional int32 field63 = 63;
+
+  repeated group Group1 = 10 {
+    required float field11 = 11;
+    optional float field26 = 26;
+    optional string field12 = 12;
+    optional string field13 = 13;
+    repeated string field14 = 14;
+    required uint64 field15 = 15;
+    optional int32 field5 = 5;
+    optional string field27 = 27;
+    optional int32 field28 = 28;
+    optional string field29 = 29;
+    optional string field16 = 16;
+    repeated string field22 = 22;
+    repeated int32 field73 = 73;
+    optional int32 field20 = 20 [default=0];
+    optional string field24 = 24;
+    optional SizeMessage2GroupedMessage field31 = 31;
+  }
+  repeated string field128 = 128;
+  optional int64 field131 = 131;
+  repeated string field127 = 127;
+  optional int32 field129 = 129;
+  repeated int64 field130 = 130;
+  optional bool field205 = 205 [default=false];
+  optional bool field206 = 206 [default=false];
+}
+
+message SizeMessage2GroupedMessage {
+  optional float field1 = 1;
+  optional float field2 = 2;
+  optional float field3 = 3 [default=0.0];
+  optional bool field4 = 4;
+  optional bool field5 = 5;
+  optional bool field6 = 6 [default=true];
+  optional bool field7 = 7 [default=false];
+  optional float field8 = 8;
+  optional bool field9 = 9;
+  optional float field10 = 10;
+  optional int64 field11 = 11;
+}

+ 140 - 0
csharp/protos/benchmarks/google_speed.proto

@@ -0,0 +1,140 @@
+import "google/protobuf/csharp_options.proto";
+option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.ProtoBench";
+option (google.protobuf.csharp_file_options).umbrella_classname = "GoogleSpeedProtoFile";
+
+package benchmarks;
+
+option java_outer_classname = "GoogleSpeed";
+option optimize_for = SPEED;
+
+message SpeedMessage1 {
+  required string field1 = 1;
+  optional string field9 = 9;
+  optional string field18 = 18;
+  optional bool field80 = 80 [default=false];
+  optional bool field81 = 81 [default=true];
+  required int32 field2 = 2;
+  required int32 field3 = 3;
+  optional int32 field280 = 280;
+  optional int32 field6 = 6 [default=0];
+  optional int64 field22 = 22;
+  optional string field4 = 4;
+  repeated fixed64 field5 = 5;
+  optional bool field59 = 59 [default=false];
+  optional string field7 = 7;
+  optional int32 field16 = 16;
+  optional int32 field130 = 130 [default=0];
+  optional bool field12 = 12 [default=true];
+  optional bool field17 = 17 [default=true];
+  optional bool field13 = 13 [default=true];
+  optional bool field14 = 14 [default=true];
+  optional int32 field104 = 104 [default=0];
+  optional int32 field100 = 100 [default=0];
+  optional int32 field101 = 101 [default=0];
+  optional string field102 = 102;
+  optional string field103 = 103;
+  optional int32 field29 = 29 [default=0];
+  optional bool field30 = 30 [default=false];
+  optional int32 field60 = 60 [default=-1];
+  optional int32 field271 = 271 [default=-1];
+  optional int32 field272 = 272 [default=-1];
+  optional int32 field150 = 150;
+  optional int32 field23 = 23 [default=0];
+  optional bool field24 = 24 [default=false];
+  optional int32 field25 = 25 [default=0];
+  optional SpeedMessage1SubMessage field15 = 15;
+  optional bool field78 = 78;
+  optional int32 field67 = 67 [default=0];
+  optional int32 field68 = 68;
+  optional int32 field128 = 128 [default=0];
+  optional string field129 = 129 [default="xxxxxxxxxxxxxxxxxxxxx"];
+  optional int32 field131 = 131 [default=0];
+}
+
+message SpeedMessage1SubMessage {
+  optional int32 field1 = 1 [default=0];
+  optional int32 field2 = 2 [default=0];
+  optional int32 field3 = 3 [default=0];
+  optional string field15 = 15;
+  optional bool field12 = 12 [default=true];
+  optional int64 field13 = 13;
+  optional int64 field14 = 14;
+  optional int32 field16 = 16;
+  optional int32 field19 = 19 [default=2];
+  optional bool field20  = 20 [default=true];
+  optional bool field28 = 28 [default=true];
+  optional fixed64 field21 = 21;
+  optional int32 field22 = 22;
+  optional bool field23 = 23 [ default=false ];
+  optional bool field206 = 206 [default=false];
+  optional fixed32 field203 = 203;
+  optional int32 field204 = 204;
+  optional string field205 = 205;
+  optional uint64 field207 = 207;
+  optional uint64 field300 = 300;
+}
+
+message SpeedMessage2 {
+  optional string field1 = 1;
+  optional int64 field3 = 3;
+  optional int64 field4 = 4;
+  optional int64 field30 = 30;
+  optional bool field75  = 75 [default=false];
+  optional string field6 = 6;
+  optional bytes field2 = 2;
+  optional int32 field21 = 21 [default=0];
+  optional int32 field71 = 71;
+  optional float field25 = 25;
+  optional int32 field109 = 109 [default=0];
+  optional int32 field210 = 210 [default=0];
+  optional int32 field211 = 211 [default=0];
+  optional int32 field212 = 212 [default=0];
+  optional int32 field213 = 213 [default=0];
+  optional int32 field216 = 216 [default=0];
+  optional int32 field217 = 217 [default=0];
+  optional int32 field218 = 218 [default=0];
+  optional int32 field220 = 220 [default=0];
+  optional int32 field221 = 221 [default=0];
+  optional float field222 = 222 [default=0.0];
+  optional int32 field63 = 63;
+
+  repeated group Group1 = 10 {
+    required float field11 = 11;
+    optional float field26 = 26;
+    optional string field12 = 12;
+    optional string field13 = 13;
+    repeated string field14 = 14;
+    required uint64 field15 = 15;
+    optional int32 field5 = 5;
+    optional string field27 = 27;
+    optional int32 field28 = 28;
+    optional string field29 = 29;
+    optional string field16 = 16;
+    repeated string field22 = 22;
+    repeated int32 field73 = 73;
+    optional int32 field20 = 20 [default=0];
+    optional string field24 = 24;
+    optional SpeedMessage2GroupedMessage field31 = 31;
+  }
+  repeated string field128 = 128;
+  optional int64 field131 = 131;
+  repeated string field127 = 127;
+  optional int32 field129 = 129;
+  repeated int64 field130 = 130;
+  optional bool field205 = 205 [default=false];
+  optional bool field206 = 206 [default=false];
+}
+
+message SpeedMessage2GroupedMessage {
+  optional float field1 = 1;
+  optional float field2 = 2;
+  optional float field3 = 3 [default=0.0];
+  optional bool field4 = 4;
+  optional bool field5 = 5;
+  optional bool field6 = 6 [default=true];
+  optional bool field7 = 7 [default=false];
+  optional float field8 = 8;
+  optional bool field9 = 9;
+  optional float field10 = 10;
+  optional int64 field11 = 11;
+}

+ 37 - 0
csharp/protos/extest/unittest_extras.proto

@@ -0,0 +1,37 @@
+// Additional options required for C# generation. File from copyright
+// line onwards is as per original distribution.
+import "google/protobuf/csharp_options.proto";
+option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos";
+option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestExtrasProtoFile";
+option (google.protobuf.csharp_file_options).add_serializable = true;
+
+package protobuf_unittest_extra;
+
+option java_package = "com.google.protobuf";
+
+message TestUnpackedExtensions {
+  extensions 1 to max;
+}
+
+extend TestUnpackedExtensions {
+  repeated    int32 unpacked_int32_extension    =  90;
+  repeated    int64 unpacked_int64_extension    =  91;
+  repeated   uint32 unpacked_uint32_extension   =  92;
+  repeated   uint64 unpacked_uint64_extension   =  93;
+  repeated   sint32 unpacked_sint32_extension   =  94;
+  repeated   sint64 unpacked_sint64_extension   =  95;
+  repeated  fixed32 unpacked_fixed32_extension  =  96;
+  repeated  fixed64 unpacked_fixed64_extension  =  97;
+  repeated sfixed32 unpacked_sfixed32_extension =  98;
+  repeated sfixed64 unpacked_sfixed64_extension =  99;
+  repeated    float unpacked_float_extension    = 100;
+  repeated   double unpacked_double_extension   = 101;
+  repeated     bool unpacked_bool_extension     = 102;
+  repeated UnpackedExtensionsForeignEnum unpacked_enum_extension  = 103;
+}
+
+enum UnpackedExtensionsForeignEnum {
+  FOREIGN_FOO = 4;
+  FOREIGN_BAR = 5;
+  FOREIGN_BAZ = 6;
+}

+ 72 - 0
csharp/protos/extest/unittest_extras_full.proto

@@ -0,0 +1,72 @@
+// Additional options required for C# generation. File from copyright
+// line onwards is as per original distribution.
+import "google/protobuf/csharp_options.proto";
+option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos";
+option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestExtrasFullProtoFile";
+
+package protobuf_unittest_extra;
+
+option optimize_for = CODE_SIZE;
+
+option java_package = "com.google.protobuf";
+
+message TestInteropPerson {
+  required string name = 1;
+  required int32 id = 2;
+  optional string email = 3;
+  repeated int32 codes = 10 [packed=true];
+
+  enum PhoneType {
+    MOBILE = 0;
+    HOME = 1;
+    WORK = 2;
+  }
+
+  message PhoneNumber {
+    required string number = 1;
+    optional PhoneType type = 2 [default = HOME];
+  }
+
+  repeated PhoneNumber phone = 4;
+  
+  repeated group Addresses = 5 {
+    required string address = 1;
+    optional string address2 = 2;
+    required string city = 3;
+    required string state = 4;
+    required fixed32 zip = 5;
+  }
+
+  extensions 100 to 199;
+}
+
+message  TestInteropEmployeeId {
+  required string number = 1;
+}
+  
+extend TestInteropPerson {
+  required TestInteropEmployeeId employee_id = 126;
+}
+
+message TestMissingFieldsA {
+  required string name = 1;
+  required int32 id = 2;
+  optional string email = 3;
+  
+  message SubA {
+    required int32 count = 5;
+    repeated string values = 6;
+  }
+  optional SubA testA = 11;
+}
+
+message TestMissingFieldsB {
+  required string name = 1;
+  required int32 id = 2;
+  optional string website = 4;
+  
+  message SubB {
+    repeated string values = 7;
+  }
+  optional SubB testB = 12;
+}

+ 117 - 0
csharp/protos/extest/unittest_extras_lite.proto

@@ -0,0 +1,117 @@
+// Additional options required for C# generation. File from copyright
+// line onwards is as per original distribution.
+import "google/protobuf/csharp_options.proto";
+option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos";
+option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestExtrasLiteProtoFile";
+option (google.protobuf.csharp_file_options).add_serializable = true;
+
+package protobuf_unittest_extra;
+
+option optimize_for = LITE_RUNTIME;
+
+option java_package = "com.google.protobuf";
+
+message TestRequiredLite {
+  required int32 d = 1;
+  required ExtraEnum en = 2 [default = DEFAULT];
+}
+
+enum ExtraEnum {
+  DEFAULT = 10;
+  EXLITE_FOO = 7;
+  EXLITE_BAR = 8;
+  EXLITE_BAZ = 9;
+}
+
+message TestInteropPersonLite {
+  required string name = 1;
+  required int32 id = 2;
+  optional string email = 3;
+  repeated int32 codes = 10 [packed=true];
+
+  enum PhoneType {
+    MOBILE = 0;
+    HOME = 1;
+    WORK = 2;
+  }
+
+  message PhoneNumber {
+    required string number = 1;
+    optional PhoneType type = 2 [default = HOME];
+  }
+
+  repeated PhoneNumber phone = 4;
+  
+  repeated group Addresses = 5 {
+    required string address = 1;
+    optional string address2 = 2;
+    required string city = 3;
+    required string state = 4;
+    required fixed32 zip = 5;
+  }
+
+  extensions 100 to 199;
+}
+
+message  TestInteropEmployeeIdLite {
+  required string number = 1;
+}
+  
+extend TestInteropPersonLite {
+  required TestInteropEmployeeIdLite employee_id_lite = 126;
+}
+
+/* Removed from unittest_lite.proto and added back here */
+
+message TestUnpackedExtensionsLite {
+  extensions 1 to max;
+}
+
+message TestUnpackedTypesLite {
+  repeated    int32 unpacked_int32    =  90;
+  repeated    int64 unpacked_int64    =  91;
+  repeated   uint32 unpacked_uint32   =  92;
+  repeated   uint64 unpacked_uint64   =  93;
+  repeated   sint32 unpacked_sint32   =  94;
+  repeated   sint64 unpacked_sint64   =  95;
+  repeated  fixed32 unpacked_fixed32  =  96;
+  repeated  fixed64 unpacked_fixed64  =  97;
+  repeated sfixed32 unpacked_sfixed32 =  98;
+  repeated sfixed64 unpacked_sfixed64 =  99;
+  repeated    float unpacked_float    = 100;
+  repeated   double unpacked_double   = 101;
+  repeated     bool unpacked_bool     = 102;
+  repeated UnpackedTypesForeignEnumLite unpacked_enum  = 103;
+}
+
+extend TestUnpackedExtensionsLite {
+  repeated    int32 unpacked_int32_extension_lite    =  90;
+  repeated    int64 unpacked_int64_extension_lite    =  91;
+  repeated   uint32 unpacked_uint32_extension_lite   =  92;
+  repeated   uint64 unpacked_uint64_extension_lite   =  93;
+  repeated   sint32 unpacked_sint32_extension_lite   =  94;
+  repeated   sint64 unpacked_sint64_extension_lite   =  95;
+  repeated  fixed32 unpacked_fixed32_extension_lite  =  96;
+  repeated  fixed64 unpacked_fixed64_extension_lite  =  97;
+  repeated sfixed32 unpacked_sfixed32_extension_lite =  98;
+  repeated sfixed64 unpacked_sfixed64_extension_lite =  99;
+  repeated    float unpacked_float_extension_lite    = 100;
+  repeated   double unpacked_double_extension_lite   = 101;
+  repeated     bool unpacked_bool_extension_lite     = 102;
+  repeated UnpackedTypesForeignEnumLite unpacked_enum_extension_lite = 103;
+}
+
+enum UnpackedTypesForeignEnumLite {
+  FOREIGN_LITE_FOO = 4;
+  FOREIGN_LITE_BAR = 5;
+  FOREIGN_LITE_BAZ = 6;
+}
+
+message BucketOfBytes {
+    optional bytes value = 1;
+    
+}
+message BucketOfBytesEx {
+    optional bytes value = 1;
+    optional bytes value2 = 255;
+}

+ 54 - 0
csharp/protos/extest/unittest_extras_xmltest.proto

@@ -0,0 +1,54 @@
+import "google/protobuf/csharp_options.proto";
+option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos";
+option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestXmlSerializerTestProtoFile";
+option (google.protobuf.csharp_file_options).add_serializable = true;
+
+package protobuf_unittest_extra;
+
+option optimize_for = SPEED;
+
+enum EnumOptions {
+  ONE = 0;
+  TWO = 1;
+  THREE = 2;
+}
+
+message TestXmlChild {
+  repeated EnumOptions options = 3;
+  optional bytes binary = 4;
+}
+
+message TestXmlNoFields {
+}
+
+message TestXmlRescursive {
+  optional TestXmlRescursive child = 1;
+}
+
+message TestXmlMessage {
+
+  optional int64 number = 6;
+  repeated int32 numbers = 2;
+  optional string text = 3;
+  repeated string textlines = 700;
+  optional bool valid = 5;
+
+  optional TestXmlChild child = 1;
+  repeated group Children = 401 {
+    repeated EnumOptions options = 3;
+    optional bytes binary = 4;
+  }
+
+extensions 100 to 199;
+}
+
+message  TestXmlExtension {
+  required int32 number = 1;
+}
+
+extend TestXmlMessage {
+  optional EnumOptions extension_enum = 101;
+  optional string extension_text = 102;
+  repeated int32 extension_number = 103 [packed = true];
+  optional TestXmlExtension extension_message = 199;
+}

+ 29 - 0
csharp/protos/extest/unittest_generic_services.proto

@@ -0,0 +1,29 @@
+// Additional options required for C# generation. File from copyright
+// line onwards is as per original distribution.
+import "google/protobuf/csharp_options.proto";
+import "google/protobuf/unittest.proto";
+import "google/protobuf/unittest_custom_options.proto";
+option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos";
+option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestGenericServices";
+
+option (google.protobuf.csharp_file_options).service_generator_type = GENERIC;
+
+// We don't put this in a package within proto2 because we need to make sure
+// that the generated code doesn't depend on being in the proto2 namespace.
+package protobuf_unittest;
+
+option optimize_for = SPEED;
+
+service TestGenericService {
+  rpc Foo(FooRequest) returns (FooResponse);
+  rpc Bar(BarRequest) returns (BarResponse);
+}
+
+service TestGenericServiceWithCustomOptions {
+  option (service_opt1) = -9876543210;
+
+  rpc Foo(CustomOptionFooRequest) returns (CustomOptionFooResponse) {
+    option (method_opt1) = METHODOPT1_VAL2;
+  }
+}
+

+ 137 - 0
csharp/protos/extest/unittest_issues.proto

@@ -0,0 +1,137 @@
+// These proto descriptors have at one time been reported as an issue or defect.
+// They are kept here to replicate the issue, and continue to verify the fix.
+import "google/protobuf/csharp_options.proto";
+
+// Issue: Non-"Google.Protobuffers" namespace will ensure that protobuffer library types are qualified
+option (google.protobuf.csharp_file_options).namespace = "UnitTest.Issues.TestProtos";
+option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestExtrasIssuesProtoFile";
+
+package unittest_issues;
+option optimize_for = SPEED;
+
+// The following is a representative set of features
+/*
+enum EnumOptions {
+    ONE = 0;
+    TWO = 1;
+    THREE = 2;
+}
+
+message TestBasicChild
+{
+    repeated EnumOptions options = 3;
+    optional bytes binary = 4;
+}
+
+message TestBasicNoFields {
+}
+
+message TestBasicRescursive {
+    optional TestBasicRescursive child = 1;
+}
+
+message TestBasicMessage {
+
+    optional int64 number = 6;
+    repeated int32 numbers = 2;
+    optional string text = 3;
+    repeated string textlines = 700;
+    optional bool valid = 5;
+    
+    optional TestBasicChild child = 1;
+    repeated group Children = 401 
+    {
+        repeated EnumOptions options = 3;
+        optional bytes binary = 4;
+    }
+
+    extensions 100 to 199;
+}
+
+message  TestBasicExtension {
+  required int32 number = 1;
+}
+  
+extend TestBasicMessage {
+  optional EnumOptions extension_enum = 101;
+  optional string extension_text = 102;
+  repeated int32 extension_number = 103 [packed = true];
+  optional TestBasicExtension extension_message = 199;
+}
+
+// Issue for non-qualified type reference in new services generation
+option (google.protobuf.csharp_file_options).service_generator_type = IRPCDISPATCH;
+
+service TestGenericService {
+  rpc Foo(TestBasicNoFields) returns (TestBasicMessage);
+  rpc Bar(TestBasicNoFields) returns (TestBasicMessage);
+}
+*/
+// Issue 13: http://code.google.com/p/protobuf-csharp-port/issues/detail?id=13
+ 
+message A {
+    optional int32 _A = 1;
+}
+
+message B {
+    optional int32 B_ = 1;
+}
+
+message AB {
+    optional int32 a_b = 1;
+}
+
+// Similar issue with numeric names
+message NumberField {
+    optional int32 _01 = 1;
+}
+
+// Issue 28: Circular message dependencies result in null defaults for DefaultInstance
+
+message MyMessageAReferenceB {
+    required MyMessageBReferenceA value = 1;
+}
+
+message MyMessageBReferenceA {
+    required MyMessageAReferenceB value = 1;
+}
+
+// issue 19 - negative enum values
+
+enum NegativeEnum {
+    FiveBelow = -5;
+    MinusOne = -1;
+    Zero = 0;
+}
+
+message NegativeEnumMessage { 
+    optional NegativeEnum value = 1;
+    repeated NegativeEnum values = 2;
+    repeated NegativeEnum packed_values = 3 [packed=true];
+}
+
+// Issue 21: http://code.google.com/p/protobuf-csharp-port/issues/detail?id=21
+// Decorate fields with [deprecated=true] as [System.Obsolete]
+
+message DeprecatedChild {
+}
+
+enum DeprecatedEnum {
+    one = 1;
+}
+
+message DeprecatedFieldsMessage {
+    optional int32 PrimitiveValue = 1 [deprecated = true];
+    repeated int32 PrimitiveArray = 2 [deprecated = true];
+
+    optional DeprecatedChild MessageValue = 3 [deprecated = true];
+    repeated DeprecatedChild MessageArray = 4 [deprecated = true];
+
+    optional DeprecatedEnum EnumValue = 5 [deprecated = true];
+    repeated DeprecatedEnum EnumArray = 6 [deprecated = true];
+}
+
+// Issue 45: http://code.google.com/p/protobuf-csharp-port/issues/detail?id=45
+message ItemField {
+  optional int32 item = 1;
+}

+ 41 - 0
csharp/protos/extest/unittest_rpc_interop.proto

@@ -0,0 +1,41 @@
+// Additional options required for C# generation. File from copyright
+// line onwards is as per original distribution.
+import "google/protobuf/csharp_options.proto";
+option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos";
+option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestRpcInterop";
+
+option (google.protobuf.csharp_file_options).service_generator_type = IRPCDISPATCH;
+
+option optimize_for = SPEED;
+
+message SearchRequest {
+  repeated string Criteria = 1;
+}
+
+message SearchResponse {
+  message ResultItem {
+    required string url = 1;
+    optional string name = 2;
+  }
+  
+  repeated ResultItem results = 1;
+}
+
+message RefineSearchRequest {
+  repeated string Criteria = 1;
+  required SearchResponse previous_results = 2;
+}
+
+service SearchService {
+  /*
+  Add this option to specify the GuidAttribute on the service interface
+  option (google.protobuf.csharp_service_options).interface_id = "{A65F0925-FD11-4f94-B166-89AC4F027205}";
+  */
+  rpc Search (SearchRequest) returns (SearchResponse) 
+  /*
+  Add this option to specify the DispIdAttribute on the service interface
+  { option (google.protobuf.csharp_method_options).dispatch_id = 5; } 
+  */ ;
+  
+  rpc RefineSearch (RefineSearchRequest) returns (SearchResponse);
+}

+ 42 - 0
csharp/protos/extest/unittest_rpc_interop_lite.proto

@@ -0,0 +1,42 @@
+// Additional options required for C# generation. File from copyright
+// line onwards is as per original distribution.
+import "google/protobuf/csharp_options.proto";
+option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos";
+option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestRpcInteropLite";
+
+option (google.protobuf.csharp_file_options).service_generator_type = IRPCDISPATCH;
+
+option optimize_for = LITE_RUNTIME;
+package unittest_rpc_interop_lite;
+
+message SearchRequest {
+  repeated string Criteria = 1;
+}
+
+message SearchResponse {
+  message ResultItem {
+    required string url = 1;
+    optional string name = 2;
+  }
+  
+  repeated ResultItem results = 1;
+}
+
+message RefineSearchRequest {
+  repeated string Criteria = 1;
+  required SearchResponse previous_results = 2;
+}
+
+service SearchService {
+  /*
+  Add this option to specify the GuidAttribute on the service interface
+  option (google.protobuf.csharp_service_options).interface_id = "{A65F0925-FD11-4f94-B166-89AC4F027205}";
+  */
+  rpc Search (SearchRequest) returns (SearchResponse) 
+  /*
+  Add this option to specify the DispIdAttribute on the service interface
+  { option (google.protobuf.csharp_method_options).dispatch_id = 5; } 
+  */ ;
+  
+  rpc RefineSearch (RefineSearchRequest) returns (SearchResponse);
+}

+ 147 - 0
csharp/protos/google/protobuf/compiler/plugin.proto

@@ -0,0 +1,147 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Author: kenton@google.com (Kenton Varda)
+//
+// WARNING:  The plugin interface is currently EXPERIMENTAL and is subject to
+//   change.
+//
+// protoc (aka the Protocol Compiler) can be extended via plugins.  A plugin is
+// just a program that reads a CodeGeneratorRequest from stdin and writes a
+// CodeGeneratorResponse to stdout.
+//
+// Plugins written using C++ can use google/protobuf/compiler/plugin.h instead
+// of dealing with the raw protocol defined here.
+//
+// A plugin executable needs only to be placed somewhere in the path.  The
+// plugin should be named "protoc-gen-$NAME", and will then be used when the
+// flag "--${NAME}_out" is passed to protoc.
+
+package google.protobuf.compiler;
+option java_package = "com.google.protobuf.compiler";
+option java_outer_classname = "PluginProtos";
+
+import "google/protobuf/descriptor.proto";
+
+// An encoded CodeGeneratorRequest is written to the plugin's stdin.
+message CodeGeneratorRequest {
+  // The .proto files that were explicitly listed on the command-line.  The
+  // code generator should generate code only for these files.  Each file's
+  // descriptor will be included in proto_file, below.
+  repeated string file_to_generate = 1;
+
+  // The generator parameter passed on the command-line.
+  optional string parameter = 2;
+
+  // FileDescriptorProtos for all files in files_to_generate and everything
+  // they import.  The files will appear in topological order, so each file
+  // appears before any file that imports it.
+  //
+  // protoc guarantees that all proto_files will be written after
+  // the fields above, even though this is not technically guaranteed by the
+  // protobuf wire format.  This theoretically could allow a plugin to stream
+  // in the FileDescriptorProtos and handle them one by one rather than read
+  // the entire set into memory at once.  However, as of this writing, this
+  // is not similarly optimized on protoc's end -- it will store all fields in
+  // memory at once before sending them to the plugin.
+  repeated FileDescriptorProto proto_file = 15;
+}
+
+// The plugin writes an encoded CodeGeneratorResponse to stdout.
+message CodeGeneratorResponse {
+  // Error message.  If non-empty, code generation failed.  The plugin process
+  // should exit with status code zero even if it reports an error in this way.
+  //
+  // This should be used to indicate errors in .proto files which prevent the
+  // code generator from generating correct code.  Errors which indicate a
+  // problem in protoc itself -- such as the input CodeGeneratorRequest being
+  // unparseable -- should be reported by writing a message to stderr and
+  // exiting with a non-zero status code.
+  optional string error = 1;
+
+  // Represents a single generated file.
+  message File {
+    // The file name, relative to the output directory.  The name must not
+    // contain "." or ".." components and must be relative, not be absolute (so,
+    // the file cannot lie outside the output directory).  "/" must be used as
+    // the path separator, not "\".
+    //
+    // If the name is omitted, the content will be appended to the previous
+    // file.  This allows the generator to break large files into small chunks,
+    // and allows the generated text to be streamed back to protoc so that large
+    // files need not reside completely in memory at one time.  Note that as of
+    // this writing protoc does not optimize for this -- it will read the entire
+    // CodeGeneratorResponse before writing files to disk.
+    optional string name = 1;
+
+    // If non-empty, indicates that the named file should already exist, and the
+    // content here is to be inserted into that file at a defined insertion
+    // point.  This feature allows a code generator to extend the output
+    // produced by another code generator.  The original generator may provide
+    // insertion points by placing special annotations in the file that look
+    // like:
+    //   @@protoc_insertion_point(NAME)
+    // The annotation can have arbitrary text before and after it on the line,
+    // which allows it to be placed in a comment.  NAME should be replaced with
+    // an identifier naming the point -- this is what other generators will use
+    // as the insertion_point.  Code inserted at this point will be placed
+    // immediately above the line containing the insertion point (thus multiple
+    // insertions to the same point will come out in the order they were added).
+    // The double-@ is intended to make it unlikely that the generated code
+    // could contain things that look like insertion points by accident.
+    //
+    // For example, the C++ code generator places the following line in the
+    // .pb.h files that it generates:
+    //   // @@protoc_insertion_point(namespace_scope)
+    // This line appears within the scope of the file's package namespace, but
+    // outside of any particular class.  Another plugin can then specify the
+    // insertion_point "namespace_scope" to generate additional classes or
+    // other declarations that should be placed in this scope.
+    //
+    // Note that if the line containing the insertion point begins with
+    // whitespace, the same whitespace will be added to every line of the
+    // inserted text.  This is useful for languages like Python, where
+    // indentation matters.  In these languages, the insertion point comment
+    // should be indented the same amount as any inserted code will need to be
+    // in order to work correctly in that context.
+    //
+    // The code generator that generates the initial file and the one which
+    // inserts into it must both run as part of a single invocation of protoc.
+    // Code generators are executed in the order in which they appear on the
+    // command line.
+    //
+    // If |insertion_point| is present, |name| must also be present.
+    optional string insertion_point = 2;
+
+    // The file contents.
+    optional string content = 15;
+  }
+  repeated File file = 15;
+}

+ 115 - 0
csharp/protos/google/protobuf/csharp_options.proto

@@ -0,0 +1,115 @@
+// Extra options for C# generator
+
+import "google/protobuf/descriptor.proto";
+
+package google.protobuf;
+
+message CSharpFileOptions {
+
+  // Namespace for generated classes; defaults to the package.
+  optional string namespace = 1;
+  
+  // Name of the "umbrella" class used for metadata about all
+  // the messages within this file. Default is based on the name
+  // of the file.
+  optional string umbrella_classname = 2;
+  
+  // Whether classes should be public (true) or internal (false)
+  optional bool public_classes = 3 [default = true];
+
+  // Whether to generate a single file for everything within the
+  // .proto file (false), or one file per message (true).
+  // This option is not currently honored; please log a feature
+  // request if you really want it.
+  optional bool multiple_files = 4;
+
+  // Whether to nest messages within a single umbrella class (true)
+  // or create the umbrella class as a peer, with messages as
+  // top-level classes in the namespace (false)
+  optional bool nest_classes = 5;
+  
+  // Generate appropriate support for Code Contracts
+  // (Ongoing; support should improve over time)
+  optional bool code_contracts = 6;
+  
+  // Create subdirectories for namespaces, e.g. namespace "Foo.Bar"
+  // would generate files within [output directory]/Foo/Bar
+  optional bool expand_namespace_directories = 7;
+
+  // Generate attributes indicating non-CLS-compliance
+  optional bool cls_compliance = 8 [default = true];
+  
+  // Generate messages/builders with the [Serializable] attribute
+  optional bool add_serializable = 9 [default = false];
+  
+  // Generates a private ctor for Message types
+  optional bool generate_private_ctor = 10 [default = true];
+
+  // The extension that should be appended to the umbrella_classname when creating files.
+  optional string file_extension = 221 [default = ".cs"];
+  
+  // A nested namespace for the umbrella class.  Helpful for name collisions caused by 
+  // umbrella_classname conflicting with an existing type.  This will be automatically
+  // set to 'Proto' if a collision is detected with types being generated.  This value
+  // is ignored when nest_classes == true
+  optional string umbrella_namespace = 222;
+  
+  // The output path for the source file(s) generated
+  optional string output_directory = 223 [default = "."];
+
+  // Will ignore the type generations and remove dependencies for the descriptor proto
+  // files that declare their package to be "google.protobuf"
+  optional bool ignore_google_protobuf = 224 [default = false];
+
+  // Controls how services are generated, GENERIC is the deprecated original implementation
+  // INTERFACE generates service interfaces only, RPCINTEROP generates interfaces and 
+  // implementations using the included Windows RPC interop libarary.
+  optional CSharpServiceType service_generator_type = 225 [default = NONE];
+  
+  // Used to add the System.Runtime.CompilerServices.CompilerGeneratedAttribute and 
+  // System.CodeDom.Compiler.GeneratedCodeAttribute attributes to generated code.
+  optional bool generated_code_attributes = 226 [default = false];
+}
+
+enum CSharpServiceType {
+  // Services are ignored by the generator
+  NONE = 0;
+  // Generates the original Java generic service implementations
+  GENERIC = 1;
+  // Generates an interface for the service and nothing else
+  INTERFACE = 2;
+  // Generates an interface for the service and client/server wrappers for the interface
+  IRPCDISPATCH = 3;
+}
+
+extend FileOptions {
+  optional CSharpFileOptions csharp_file_options = 1000;
+}
+
+extend FieldOptions {
+  optional CSharpFieldOptions csharp_field_options = 1000;
+}
+
+message CSharpFieldOptions {
+  // Provides the ability to override the name of the property
+  // generated for this field. This is applied to all properties
+  // and methods to do with this field, including HasFoo, FooCount,
+  // FooList etc.
+  optional string property_name = 1;
+}
+
+message CSharpServiceOptions {
+  optional string interface_id = 1;
+}
+
+extend ServiceOptions {
+  optional CSharpServiceOptions csharp_service_options = 1000;
+}
+
+message CSharpMethodOptions {
+  optional int32 dispatch_id = 1;
+}
+
+extend MethodOptions {
+  optional CSharpMethodOptions csharp_method_options = 1000;
+}

+ 533 - 0
csharp/protos/google/protobuf/descriptor.proto

@@ -0,0 +1,533 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Author: kenton@google.com (Kenton Varda)
+//  Based on original Protocol Buffers design by
+//  Sanjay Ghemawat, Jeff Dean, and others.
+//
+// The messages in this file describe the definitions found in .proto files.
+// A valid .proto file can be translated directly to a FileDescriptorProto
+// without any other information (e.g. without reading its imports).
+
+
+
+package google.protobuf;
+option java_package = "com.google.protobuf";
+option java_outer_classname = "DescriptorProtos";
+
+// descriptor.proto must be optimized for speed because reflection-based
+// algorithms don't work during bootstrapping.
+option optimize_for = SPEED;
+
+// The protocol compiler can output a FileDescriptorSet containing the .proto
+// files it parses.
+message FileDescriptorSet {
+  repeated FileDescriptorProto file = 1;
+}
+
+// Describes a complete .proto file.
+message FileDescriptorProto {
+  optional string name = 1;       // file name, relative to root of source tree
+  optional string package = 2;    // e.g. "foo", "foo.bar", etc.
+
+  // Names of files imported by this file.
+  repeated string dependency = 3;
+
+  // All top-level definitions in this file.
+  repeated DescriptorProto message_type = 4;
+  repeated EnumDescriptorProto enum_type = 5;
+  repeated ServiceDescriptorProto service = 6;
+  repeated FieldDescriptorProto extension = 7;
+
+  optional FileOptions options = 8;
+
+  // This field contains optional information about the original source code.
+  // You may safely remove this entire field whithout harming runtime
+  // functionality of the descriptors -- the information is needed only by
+  // development tools.
+  optional SourceCodeInfo source_code_info = 9;
+}
+
+// Describes a message type.
+message DescriptorProto {
+  optional string name = 1;
+
+  repeated FieldDescriptorProto field = 2;
+  repeated FieldDescriptorProto extension = 6;
+
+  repeated DescriptorProto nested_type = 3;
+  repeated EnumDescriptorProto enum_type = 4;
+
+  message ExtensionRange {
+    optional int32 start = 1;
+    optional int32 end = 2;
+  }
+  repeated ExtensionRange extension_range = 5;
+
+  optional MessageOptions options = 7;
+}
+
+// Describes a field within a message.
+message FieldDescriptorProto {
+  enum Type {
+    // 0 is reserved for errors.
+    // Order is weird for historical reasons.
+    TYPE_DOUBLE         = 1;
+    TYPE_FLOAT          = 2;
+    TYPE_INT64          = 3;   // Not ZigZag encoded.  Negative numbers
+                               // take 10 bytes.  Use TYPE_SINT64 if negative
+                               // values are likely.
+    TYPE_UINT64         = 4;
+    TYPE_INT32          = 5;   // Not ZigZag encoded.  Negative numbers
+                               // take 10 bytes.  Use TYPE_SINT32 if negative
+                               // values are likely.
+    TYPE_FIXED64        = 6;
+    TYPE_FIXED32        = 7;
+    TYPE_BOOL           = 8;
+    TYPE_STRING         = 9;
+    TYPE_GROUP          = 10;  // Tag-delimited aggregate.
+    TYPE_MESSAGE        = 11;  // Length-delimited aggregate.
+
+    // New in version 2.
+    TYPE_BYTES          = 12;
+    TYPE_UINT32         = 13;
+    TYPE_ENUM           = 14;
+    TYPE_SFIXED32       = 15;
+    TYPE_SFIXED64       = 16;
+    TYPE_SINT32         = 17;  // Uses ZigZag encoding.
+    TYPE_SINT64         = 18;  // Uses ZigZag encoding.
+  };
+
+  enum Label {
+    // 0 is reserved for errors
+    LABEL_OPTIONAL      = 1;
+    LABEL_REQUIRED      = 2;
+    LABEL_REPEATED      = 3;
+    // TODO(sanjay): Should we add LABEL_MAP?
+  };
+
+  optional string name = 1;
+  optional int32 number = 3;
+  optional Label label = 4;
+
+  // If type_name is set, this need not be set.  If both this and type_name
+  // are set, this must be either TYPE_ENUM or TYPE_MESSAGE.
+  optional Type type = 5;
+
+  // For message and enum types, this is the name of the type.  If the name
+  // starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping
+  // rules are used to find the type (i.e. first the nested types within this
+  // message are searched, then within the parent, on up to the root
+  // namespace).
+  optional string type_name = 6;
+
+  // For extensions, this is the name of the type being extended.  It is
+  // resolved in the same manner as type_name.
+  optional string extendee = 2;
+
+  // For numeric types, contains the original text representation of the value.
+  // For booleans, "true" or "false".
+  // For strings, contains the default text contents (not escaped in any way).
+  // For bytes, contains the C escaped value.  All bytes >= 128 are escaped.
+  // TODO(kenton):  Base-64 encode?
+  optional string default_value = 7;
+
+  optional FieldOptions options = 8;
+}
+
+// Describes an enum type.
+message EnumDescriptorProto {
+  optional string name = 1;
+
+  repeated EnumValueDescriptorProto value = 2;
+
+  optional EnumOptions options = 3;
+}
+
+// Describes a value within an enum.
+message EnumValueDescriptorProto {
+  optional string name = 1;
+  optional int32 number = 2;
+
+  optional EnumValueOptions options = 3;
+}
+
+// Describes a service.
+message ServiceDescriptorProto {
+  optional string name = 1;
+  repeated MethodDescriptorProto method = 2;
+
+  optional ServiceOptions options = 3;
+}
+
+// Describes a method of a service.
+message MethodDescriptorProto {
+  optional string name = 1;
+
+  // Input and output type names.  These are resolved in the same way as
+  // FieldDescriptorProto.type_name, but must refer to a message type.
+  optional string input_type = 2;
+  optional string output_type = 3;
+
+  optional MethodOptions options = 4;
+}
+
+// ===================================================================
+// Options
+
+// Each of the definitions above may have "options" attached.  These are
+// just annotations which may cause code to be generated slightly differently
+// or may contain hints for code that manipulates protocol messages.
+//
+// Clients may define custom options as extensions of the *Options messages.
+// These extensions may not yet be known at parsing time, so the parser cannot
+// store the values in them.  Instead it stores them in a field in the *Options
+// message called uninterpreted_option. This field must have the same name
+// across all *Options messages. We then use this field to populate the
+// extensions when we build a descriptor, at which point all protos have been
+// parsed and so all extensions are known.
+//
+// Extension numbers for custom options may be chosen as follows:
+// * For options which will only be used within a single application or
+//   organization, or for experimental options, use field numbers 50000
+//   through 99999.  It is up to you to ensure that you do not use the
+//   same number for multiple options.
+// * For options which will be published and used publicly by multiple
+//   independent entities, e-mail kenton@google.com to reserve extension
+//   numbers.  Simply tell me how many you need and I'll send you back a
+//   set of numbers to use -- there's no need to explain how you intend to
+//   use them.  If this turns out to be popular, a web service will be set up
+//   to automatically assign option numbers.
+
+
+message FileOptions {
+
+  // Sets the Java package where classes generated from this .proto will be
+  // placed.  By default, the proto package is used, but this is often
+  // inappropriate because proto packages do not normally start with backwards
+  // domain names.
+  optional string java_package = 1;
+
+
+  // If set, all the classes from the .proto file are wrapped in a single
+  // outer class with the given name.  This applies to both Proto1
+  // (equivalent to the old "--one_java_file" option) and Proto2 (where
+  // a .proto always translates to a single class, but you may want to
+  // explicitly choose the class name).
+  optional string java_outer_classname = 8;
+
+  // If set true, then the Java code generator will generate a separate .java
+  // file for each top-level message, enum, and service defined in the .proto
+  // file.  Thus, these types will *not* be nested inside the outer class
+  // named by java_outer_classname.  However, the outer class will still be
+  // generated to contain the file's getDescriptor() method as well as any
+  // top-level extensions defined in the file.
+  optional bool java_multiple_files = 10 [default=false];
+
+  // If set true, then the Java code generator will generate equals() and
+  // hashCode() methods for all messages defined in the .proto file. This is
+  // purely a speed optimization, as the AbstractMessage base class includes
+  // reflection-based implementations of these methods.
+  optional bool java_generate_equals_and_hash = 20 [default=false];
+
+  // Generated classes can be optimized for speed or code size.
+  enum OptimizeMode {
+    SPEED = 1;        // Generate complete code for parsing, serialization,
+                      // etc.
+    CODE_SIZE = 2;    // Use ReflectionOps to implement these methods.
+    LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime.
+  }
+  optional OptimizeMode optimize_for = 9 [default=SPEED];
+
+
+
+
+  // Should generic services be generated in each language?  "Generic" services
+  // are not specific to any particular RPC system.  They are generated by the
+  // main code generators in each language (without additional plugins).
+  // Generic services were the only kind of service generation supported by
+  // early versions of proto2.
+  //
+  // Generic services are now considered deprecated in favor of using plugins
+  // that generate code specific to your particular RPC system.  Therefore,
+  // these default to false.  Old code which depends on generic services should
+  // explicitly set them to true.
+  optional bool cc_generic_services = 16 [default=false];
+  optional bool java_generic_services = 17 [default=false];
+  optional bool py_generic_services = 18 [default=false];
+
+  // The parser stores options it doesn't recognize here. See above.
+  repeated UninterpretedOption uninterpreted_option = 999;
+
+  // Clients can define custom options in extensions of this message. See above.
+  extensions 1000 to max;
+}
+
+message MessageOptions {
+  // Set true to use the old proto1 MessageSet wire format for extensions.
+  // This is provided for backwards-compatibility with the MessageSet wire
+  // format.  You should not use this for any other reason:  It's less
+  // efficient, has fewer features, and is more complicated.
+  //
+  // The message must be defined exactly as follows:
+  //   message Foo {
+  //     option message_set_wire_format = true;
+  //     extensions 4 to max;
+  //   }
+  // Note that the message cannot have any defined fields; MessageSets only
+  // have extensions.
+  //
+  // All extensions of your type must be singular messages; e.g. they cannot
+  // be int32s, enums, or repeated messages.
+  //
+  // Because this is an option, the above two restrictions are not enforced by
+  // the protocol compiler.
+  optional bool message_set_wire_format = 1 [default=false];
+
+  // Disables the generation of the standard "descriptor()" accessor, which can
+  // conflict with a field of the same name.  This is meant to make migration
+  // from proto1 easier; new code should avoid fields named "descriptor".
+  optional bool no_standard_descriptor_accessor = 2 [default=false];
+
+  // The parser stores options it doesn't recognize here. See above.
+  repeated UninterpretedOption uninterpreted_option = 999;
+
+  // Clients can define custom options in extensions of this message. See above.
+  extensions 1000 to max;
+}
+
+message FieldOptions {
+  // The ctype option instructs the C++ code generator to use a different
+  // representation of the field than it normally would.  See the specific
+  // options below.  This option is not yet implemented in the open source
+  // release -- sorry, we'll try to include it in a future version!
+  optional CType ctype = 1 [default = STRING];
+  enum CType {
+    // Default mode.
+    STRING = 0;
+
+    CORD = 1;
+
+    STRING_PIECE = 2;
+  }
+  // The packed option can be enabled for repeated primitive fields to enable
+  // a more efficient representation on the wire. Rather than repeatedly
+  // writing the tag and type for each element, the entire array is encoded as
+  // a single length-delimited blob.
+  optional bool packed = 2;
+
+
+  // Is this field deprecated?
+  // Depending on the target platform, this can emit Deprecated annotations
+  // for accessors, or it will be completely ignored; in the very least, this
+  // is a formalization for deprecating fields.
+  optional bool deprecated = 3 [default=false];
+
+  // EXPERIMENTAL.  DO NOT USE.
+  // For "map" fields, the name of the field in the enclosed type that
+  // is the key for this map.  For example, suppose we have:
+  //   message Item {
+  //     required string name = 1;
+  //     required string value = 2;
+  //   }
+  //   message Config {
+  //     repeated Item items = 1 [experimental_map_key="name"];
+  //   }
+  // In this situation, the map key for Item will be set to "name".
+  // TODO: Fully-implement this, then remove the "experimental_" prefix.
+  optional string experimental_map_key = 9;
+
+  // The parser stores options it doesn't recognize here. See above.
+  repeated UninterpretedOption uninterpreted_option = 999;
+
+  // Clients can define custom options in extensions of this message. See above.
+  extensions 1000 to max;
+}
+
+message EnumOptions {
+
+  // The parser stores options it doesn't recognize here. See above.
+  repeated UninterpretedOption uninterpreted_option = 999;
+
+  // Clients can define custom options in extensions of this message. See above.
+  extensions 1000 to max;
+}
+
+message EnumValueOptions {
+  // The parser stores options it doesn't recognize here. See above.
+  repeated UninterpretedOption uninterpreted_option = 999;
+
+  // Clients can define custom options in extensions of this message. See above.
+  extensions 1000 to max;
+}
+
+message ServiceOptions {
+
+  // Note:  Field numbers 1 through 32 are reserved for Google's internal RPC
+  //   framework.  We apologize for hoarding these numbers to ourselves, but
+  //   we were already using them long before we decided to release Protocol
+  //   Buffers.
+
+  // The parser stores options it doesn't recognize here. See above.
+  repeated UninterpretedOption uninterpreted_option = 999;
+
+  // Clients can define custom options in extensions of this message. See above.
+  extensions 1000 to max;
+}
+
+message MethodOptions {
+
+  // Note:  Field numbers 1 through 32 are reserved for Google's internal RPC
+  //   framework.  We apologize for hoarding these numbers to ourselves, but
+  //   we were already using them long before we decided to release Protocol
+  //   Buffers.
+
+  // The parser stores options it doesn't recognize here. See above.
+  repeated UninterpretedOption uninterpreted_option = 999;
+
+  // Clients can define custom options in extensions of this message. See above.
+  extensions 1000 to max;
+}
+
+// A message representing a option the parser does not recognize. This only
+// appears in options protos created by the compiler::Parser class.
+// DescriptorPool resolves these when building Descriptor objects. Therefore,
+// options protos in descriptor objects (e.g. returned by Descriptor::options(),
+// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions
+// in them.
+message UninterpretedOption {
+  // The name of the uninterpreted option.  Each string represents a segment in
+  // a dot-separated name.  is_extension is true iff a segment represents an
+  // extension (denoted with parentheses in options specs in .proto files).
+  // E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents
+  // "foo.(bar.baz).qux".
+  message NamePart {
+    required string name_part = 1;
+    required bool is_extension = 2;
+  }
+  repeated NamePart name = 2;
+
+  // The value of the uninterpreted option, in whatever type the tokenizer
+  // identified it as during parsing. Exactly one of these should be set.
+  optional string identifier_value = 3;
+  optional uint64 positive_int_value = 4;
+  optional int64 negative_int_value = 5;
+  optional double double_value = 6;
+  optional bytes string_value = 7;
+  optional string aggregate_value = 8;
+}
+
+// ===================================================================
+// Optional source code info
+
+// Encapsulates information about the original source file from which a
+// FileDescriptorProto was generated.
+message SourceCodeInfo {
+  // A Location identifies a piece of source code in a .proto file which
+  // corresponds to a particular definition.  This information is intended
+  // to be useful to IDEs, code indexers, documentation generators, and similar
+  // tools.
+  //
+  // For example, say we have a file like:
+  //   message Foo {
+  //     optional string foo = 1;
+  //   }
+  // Let's look at just the field definition:
+  //   optional string foo = 1;
+  //   ^       ^^     ^^  ^  ^^^
+  //   a       bc     de  f  ghi
+  // We have the following locations:
+  //   span   path               represents
+  //   [a,i)  [ 4, 0, 2, 0 ]     The whole field definition.
+  //   [a,b)  [ 4, 0, 2, 0, 4 ]  The label (optional).
+  //   [c,d)  [ 4, 0, 2, 0, 5 ]  The type (string).
+  //   [e,f)  [ 4, 0, 2, 0, 1 ]  The name (foo).
+  //   [g,h)  [ 4, 0, 2, 0, 3 ]  The number (1).
+  //
+  // Notes:
+  // - A location may refer to a repeated field itself (i.e. not to any
+  //   particular index within it).  This is used whenever a set of elements are
+  //   logically enclosed in a single code segment.  For example, an entire
+  //   extend block (possibly containing multiple extension definitions) will
+  //   have an outer location whose path refers to the "extensions" repeated
+  //   field without an index.
+  // - Multiple locations may have the same path.  This happens when a single
+  //   logical declaration is spread out across multiple places.  The most
+  //   obvious example is the "extend" block again -- there may be multiple
+  //   extend blocks in the same scope, each of which will have the same path.
+  // - A location's span is not always a subset of its parent's span.  For
+  //   example, the "extendee" of an extension declaration appears at the
+  //   beginning of the "extend" block and is shared by all extensions within
+  //   the block.
+  // - Just because a location's span is a subset of some other location's span
+  //   does not mean that it is a descendent.  For example, a "group" defines
+  //   both a type and a field in a single declaration.  Thus, the locations
+  //   corresponding to the type and field and their components will overlap.
+  // - Code which tries to interpret locations should probably be designed to
+  //   ignore those that it doesn't understand, as more types of locations could
+  //   be recorded in the future.
+  repeated Location location = 1;
+  message Location {
+    // Identifies which part of the FileDescriptorProto was defined at this
+    // location.
+    //
+    // Each element is a field number or an index.  They form a path from
+    // the root FileDescriptorProto to the place where the definition.  For
+    // example, this path:
+    //   [ 4, 3, 2, 7, 1 ]
+    // refers to:
+    //   file.message_type(3)  // 4, 3
+    //       .field(7)         // 2, 7
+    //       .name()           // 1
+    // This is because FileDescriptorProto.message_type has field number 4:
+    //   repeated DescriptorProto message_type = 4;
+    // and DescriptorProto.field has field number 2:
+    //   repeated FieldDescriptorProto field = 2;
+    // and FieldDescriptorProto.name has field number 1:
+    //   optional string name = 1;
+    //
+    // Thus, the above path gives the location of a field name.  If we removed
+    // the last element:
+    //   [ 4, 3, 2, 7 ]
+    // this path refers to the whole field declaration (from the beginning
+    // of the label to the terminating semicolon).
+    repeated int32 path = 1 [packed=true];
+
+    // Always has exactly three or four elements: start line, start column,
+    // end line (optional, otherwise assumed same as start line), end column.
+    // These are packed into a single field for efficiency.  Note that line
+    // and column numbers are zero-based -- typically you will want to add
+    // 1 to each before displaying to a user.
+    repeated int32 span = 2 [packed=true];
+
+    // TODO(kenton):  Record comments appearing before and after the
+    // declaration.
+  }
+}

+ 636 - 0
csharp/protos/google/protobuf/unittest.proto

@@ -0,0 +1,636 @@
+// Additional options required for C# generation. File from copyright
+// line onwards is as per original distribution.
+import "google/protobuf/csharp_options.proto";
+option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos";
+option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestProtoFile";
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Author: kenton@google.com (Kenton Varda)
+//  Based on original Protocol Buffers design by
+//  Sanjay Ghemawat, Jeff Dean, and others.
+//
+// A proto file we will use for unit testing.
+
+
+// Some generic_services option(s) added automatically.
+// See:  http://go/proto2-generic-services-default
+option cc_generic_services = true;     // auto-added
+option java_generic_services = true;   // auto-added
+option py_generic_services = true;     // auto-added
+
+import "google/protobuf/unittest_import.proto";
+
+// We don't put this in a package within proto2 because we need to make sure
+// that the generated code doesn't depend on being in the proto2 namespace.
+// In test_util.h we do "using namespace unittest = protobuf_unittest".
+package protobuf_unittest;
+
+// Protos optimized for SPEED use a strict superset of the generated code
+// of equivalent ones optimized for CODE_SIZE, so we should optimize all our
+// tests for speed unless explicitly testing code size optimization.
+option optimize_for = SPEED;
+
+option java_outer_classname = "UnittestProto";
+
+// This proto includes every type of field in both singular and repeated
+// forms.
+message TestAllTypes {
+  message NestedMessage {
+    // The field name "b" fails to compile in proto1 because it conflicts with
+    // a local variable named "b" in one of the generated methods.  Doh.
+    // This file needs to compile in proto1 to test backwards-compatibility.
+    optional int32 bb = 1;
+  }
+
+  enum NestedEnum {
+    FOO = 1;
+    BAR = 2;
+    BAZ = 3;
+  }
+
+  // Singular
+  optional    int32 optional_int32    =  1;
+  optional    int64 optional_int64    =  2;
+  optional   uint32 optional_uint32   =  3;
+  optional   uint64 optional_uint64   =  4;
+  optional   sint32 optional_sint32   =  5;
+  optional   sint64 optional_sint64   =  6;
+  optional  fixed32 optional_fixed32  =  7;
+  optional  fixed64 optional_fixed64  =  8;
+  optional sfixed32 optional_sfixed32 =  9;
+  optional sfixed64 optional_sfixed64 = 10;
+  optional    float optional_float    = 11;
+  optional   double optional_double   = 12;
+  optional     bool optional_bool     = 13;
+  optional   string optional_string   = 14;
+  optional    bytes optional_bytes    = 15;
+
+  optional group OptionalGroup = 16 {
+    optional int32 a = 17;
+  }
+
+  optional NestedMessage                        optional_nested_message  = 18;
+  optional ForeignMessage                       optional_foreign_message = 19;
+  optional protobuf_unittest_import.ImportMessage optional_import_message  = 20;
+
+  optional NestedEnum                           optional_nested_enum     = 21;
+  optional ForeignEnum                          optional_foreign_enum    = 22;
+  optional protobuf_unittest_import.ImportEnum    optional_import_enum     = 23;
+
+  optional string optional_string_piece = 24 [ctype=STRING_PIECE];
+  optional string optional_cord = 25 [ctype=CORD];
+
+  // Repeated
+  repeated    int32 repeated_int32    = 31;
+  repeated    int64 repeated_int64    = 32;
+  repeated   uint32 repeated_uint32   = 33;
+  repeated   uint64 repeated_uint64   = 34;
+  repeated   sint32 repeated_sint32   = 35;
+  repeated   sint64 repeated_sint64   = 36;
+  repeated  fixed32 repeated_fixed32  = 37;
+  repeated  fixed64 repeated_fixed64  = 38;
+  repeated sfixed32 repeated_sfixed32 = 39;
+  repeated sfixed64 repeated_sfixed64 = 40;
+  repeated    float repeated_float    = 41;
+  repeated   double repeated_double   = 42;
+  repeated     bool repeated_bool     = 43;
+  repeated   string repeated_string   = 44;
+  repeated    bytes repeated_bytes    = 45;
+
+  repeated group RepeatedGroup = 46 {
+    optional int32 a = 47;
+  }
+
+  repeated NestedMessage                        repeated_nested_message  = 48;
+  repeated ForeignMessage                       repeated_foreign_message = 49;
+  repeated protobuf_unittest_import.ImportMessage repeated_import_message  = 50;
+
+  repeated NestedEnum                           repeated_nested_enum     = 51;
+  repeated ForeignEnum                          repeated_foreign_enum    = 52;
+  repeated protobuf_unittest_import.ImportEnum    repeated_import_enum     = 53;
+
+  repeated string repeated_string_piece = 54 [ctype=STRING_PIECE];
+  repeated string repeated_cord = 55 [ctype=CORD];
+
+  // Singular with defaults
+  optional    int32 default_int32    = 61 [default =  41    ];
+  optional    int64 default_int64    = 62 [default =  42    ];
+  optional   uint32 default_uint32   = 63 [default =  43    ];
+  optional   uint64 default_uint64   = 64 [default =  44    ];
+  optional   sint32 default_sint32   = 65 [default = -45    ];
+  optional   sint64 default_sint64   = 66 [default =  46    ];
+  optional  fixed32 default_fixed32  = 67 [default =  47    ];
+  optional  fixed64 default_fixed64  = 68 [default =  48    ];
+  optional sfixed32 default_sfixed32 = 69 [default =  49    ];
+  optional sfixed64 default_sfixed64 = 70 [default = -50    ];
+  optional    float default_float    = 71 [default =  51.5  ];
+  optional   double default_double   = 72 [default =  52e3  ];
+  optional     bool default_bool     = 73 [default = true   ];
+  optional   string default_string   = 74 [default = "hello"];
+  optional    bytes default_bytes    = 75 [default = "world"];
+
+  optional NestedEnum  default_nested_enum  = 81 [default = BAR        ];
+  optional ForeignEnum default_foreign_enum = 82 [default = FOREIGN_BAR];
+  optional protobuf_unittest_import.ImportEnum
+      default_import_enum = 83 [default = IMPORT_BAR];
+
+  optional string default_string_piece = 84 [ctype=STRING_PIECE,default="abc"];
+  optional string default_cord = 85 [ctype=CORD,default="123"];
+}
+
+message TestDeprecatedFields {
+  optional int32 deprecated_int32 = 1 [deprecated=true];
+}
+
+// Define these after TestAllTypes to make sure the compiler can handle
+// that.
+message ForeignMessage {
+  optional int32 c = 1;
+}
+
+enum ForeignEnum {
+  FOREIGN_FOO = 4;
+  FOREIGN_BAR = 5;
+  FOREIGN_BAZ = 6;
+}
+
+message TestAllExtensions {
+  extensions 1 to max;
+}
+
+extend TestAllExtensions {
+  // Singular
+  optional    int32 optional_int32_extension    =  1;
+  optional    int64 optional_int64_extension    =  2;
+  optional   uint32 optional_uint32_extension   =  3;
+  optional   uint64 optional_uint64_extension   =  4;
+  optional   sint32 optional_sint32_extension   =  5;
+  optional   sint64 optional_sint64_extension   =  6;
+  optional  fixed32 optional_fixed32_extension  =  7;
+  optional  fixed64 optional_fixed64_extension  =  8;
+  optional sfixed32 optional_sfixed32_extension =  9;
+  optional sfixed64 optional_sfixed64_extension = 10;
+  optional    float optional_float_extension    = 11;
+  optional   double optional_double_extension   = 12;
+  optional     bool optional_bool_extension     = 13;
+  optional   string optional_string_extension   = 14;
+  optional    bytes optional_bytes_extension    = 15;
+
+  optional group OptionalGroup_extension = 16 {
+    optional int32 a = 17;
+  }
+
+  optional TestAllTypes.NestedMessage optional_nested_message_extension = 18;
+  optional ForeignMessage optional_foreign_message_extension = 19;
+  optional protobuf_unittest_import.ImportMessage
+    optional_import_message_extension = 20;
+
+  optional TestAllTypes.NestedEnum optional_nested_enum_extension = 21;
+  optional ForeignEnum optional_foreign_enum_extension = 22;
+  optional protobuf_unittest_import.ImportEnum
+    optional_import_enum_extension = 23;
+
+  optional string optional_string_piece_extension = 24 [ctype=STRING_PIECE];
+  optional string optional_cord_extension = 25 [ctype=CORD];
+
+  // Repeated
+  repeated    int32 repeated_int32_extension    = 31;
+  repeated    int64 repeated_int64_extension    = 32;
+  repeated   uint32 repeated_uint32_extension   = 33;
+  repeated   uint64 repeated_uint64_extension   = 34;
+  repeated   sint32 repeated_sint32_extension   = 35;
+  repeated   sint64 repeated_sint64_extension   = 36;
+  repeated  fixed32 repeated_fixed32_extension  = 37;
+  repeated  fixed64 repeated_fixed64_extension  = 38;
+  repeated sfixed32 repeated_sfixed32_extension = 39;
+  repeated sfixed64 repeated_sfixed64_extension = 40;
+  repeated    float repeated_float_extension    = 41;
+  repeated   double repeated_double_extension   = 42;
+  repeated     bool repeated_bool_extension     = 43;
+  repeated   string repeated_string_extension   = 44;
+  repeated    bytes repeated_bytes_extension    = 45;
+
+  repeated group RepeatedGroup_extension = 46 {
+    optional int32 a = 47;
+  }
+
+  repeated TestAllTypes.NestedMessage repeated_nested_message_extension = 48;
+  repeated ForeignMessage repeated_foreign_message_extension = 49;
+  repeated protobuf_unittest_import.ImportMessage
+    repeated_import_message_extension = 50;
+
+  repeated TestAllTypes.NestedEnum repeated_nested_enum_extension = 51;
+  repeated ForeignEnum repeated_foreign_enum_extension = 52;
+  repeated protobuf_unittest_import.ImportEnum
+    repeated_import_enum_extension = 53;
+
+  repeated string repeated_string_piece_extension = 54 [ctype=STRING_PIECE];
+  repeated string repeated_cord_extension = 55 [ctype=CORD];
+
+  // Singular with defaults
+  optional    int32 default_int32_extension    = 61 [default =  41    ];
+  optional    int64 default_int64_extension    = 62 [default =  42    ];
+  optional   uint32 default_uint32_extension   = 63 [default =  43    ];
+  optional   uint64 default_uint64_extension   = 64 [default =  44    ];
+  optional   sint32 default_sint32_extension   = 65 [default = -45    ];
+  optional   sint64 default_sint64_extension   = 66 [default =  46    ];
+  optional  fixed32 default_fixed32_extension  = 67 [default =  47    ];
+  optional  fixed64 default_fixed64_extension  = 68 [default =  48    ];
+  optional sfixed32 default_sfixed32_extension = 69 [default =  49    ];
+  optional sfixed64 default_sfixed64_extension = 70 [default = -50    ];
+  optional    float default_float_extension    = 71 [default =  51.5  ];
+  optional   double default_double_extension   = 72 [default =  52e3  ];
+  optional     bool default_bool_extension     = 73 [default = true   ];
+  optional   string default_string_extension   = 74 [default = "hello"];
+  optional    bytes default_bytes_extension    = 75 [default = "world"];
+
+  optional TestAllTypes.NestedEnum
+    default_nested_enum_extension = 81 [default = BAR];
+  optional ForeignEnum
+    default_foreign_enum_extension = 82 [default = FOREIGN_BAR];
+  optional protobuf_unittest_import.ImportEnum
+    default_import_enum_extension = 83 [default = IMPORT_BAR];
+
+  optional string default_string_piece_extension = 84 [ctype=STRING_PIECE,
+                                                       default="abc"];
+  optional string default_cord_extension = 85 [ctype=CORD, default="123"];
+}
+
+message TestNestedExtension {
+  extend TestAllExtensions {
+    // Check for bug where string extensions declared in tested scope did not
+    // compile.
+    optional string test = 1002 [default="test"];
+  }
+}
+
+// We have separate messages for testing required fields because it's
+// annoying to have to fill in required fields in TestProto in order to
+// do anything with it.  Note that we don't need to test every type of
+// required filed because the code output is basically identical to
+// optional fields for all types.
+message TestRequired {
+  required int32 a = 1;
+  optional int32 dummy2 = 2;
+  required int32 b = 3;
+
+  extend TestAllExtensions {
+    optional TestRequired single = 1000;
+    repeated TestRequired multi  = 1001;
+  }
+
+  // Pad the field count to 32 so that we can test that IsInitialized()
+  // properly checks multiple elements of has_bits_.
+  optional int32 dummy4  =  4;
+  optional int32 dummy5  =  5;
+  optional int32 dummy6  =  6;
+  optional int32 dummy7  =  7;
+  optional int32 dummy8  =  8;
+  optional int32 dummy9  =  9;
+  optional int32 dummy10 = 10;
+  optional int32 dummy11 = 11;
+  optional int32 dummy12 = 12;
+  optional int32 dummy13 = 13;
+  optional int32 dummy14 = 14;
+  optional int32 dummy15 = 15;
+  optional int32 dummy16 = 16;
+  optional int32 dummy17 = 17;
+  optional int32 dummy18 = 18;
+  optional int32 dummy19 = 19;
+  optional int32 dummy20 = 20;
+  optional int32 dummy21 = 21;
+  optional int32 dummy22 = 22;
+  optional int32 dummy23 = 23;
+  optional int32 dummy24 = 24;
+  optional int32 dummy25 = 25;
+  optional int32 dummy26 = 26;
+  optional int32 dummy27 = 27;
+  optional int32 dummy28 = 28;
+  optional int32 dummy29 = 29;
+  optional int32 dummy30 = 30;
+  optional int32 dummy31 = 31;
+  optional int32 dummy32 = 32;
+
+  required int32 c = 33;
+}
+
+message TestRequiredForeign {
+  optional TestRequired optional_message = 1;
+  repeated TestRequired repeated_message = 2;
+  optional int32 dummy = 3;
+}
+
+// Test that we can use NestedMessage from outside TestAllTypes.
+message TestForeignNested {
+  optional TestAllTypes.NestedMessage foreign_nested = 1;
+}
+
+// TestEmptyMessage is used to test unknown field support.
+message TestEmptyMessage {
+}
+
+// Like above, but declare all field numbers as potential extensions.  No
+// actual extensions should ever be defined for this type.
+message TestEmptyMessageWithExtensions {
+  extensions 1 to max;
+}
+
+message TestMultipleExtensionRanges {
+  extensions 42;
+  extensions 4143 to 4243;
+  extensions 65536 to max;
+}
+
+// Test that really large tag numbers don't break anything.
+message TestReallyLargeTagNumber {
+  // The largest possible tag number is 2^28 - 1, since the wire format uses
+  // three bits to communicate wire type.
+  optional int32 a = 1;
+  optional int32 bb = 268435455;
+}
+
+message TestRecursiveMessage {
+  optional TestRecursiveMessage a = 1;
+  optional int32 i = 2;
+}
+
+// Test that mutual recursion works.
+message TestMutualRecursionA {
+  optional TestMutualRecursionB bb = 1;
+}
+
+message TestMutualRecursionB {
+  optional TestMutualRecursionA a = 1;
+  optional int32 optional_int32 = 2;
+}
+
+// Test that groups have disjoint field numbers from their siblings and
+// parents.  This is NOT possible in proto1; only proto2.  When attempting
+// to compile with proto1, this will emit an error; so we only include it
+// in protobuf_unittest_proto.
+message TestDupFieldNumber {                        // NO_PROTO1
+  optional int32 a = 1;                             // NO_PROTO1
+  optional group Foo = 2 { optional int32 a = 1; }  // NO_PROTO1
+  optional group Bar = 3 { optional int32 a = 1; }  // NO_PROTO1
+}                                                   // NO_PROTO1
+
+
+// Needed for a Python test.
+message TestNestedMessageHasBits {
+  message NestedMessage {
+    repeated int32 nestedmessage_repeated_int32 = 1;
+    repeated ForeignMessage nestedmessage_repeated_foreignmessage = 2;
+  }
+  optional NestedMessage optional_nested_message = 1;
+}
+
+
+// Test an enum that has multiple values with the same number.
+enum TestEnumWithDupValue {
+  FOO1 = 1;
+  BAR1 = 2;
+  BAZ = 3;
+  FOO2 = 1;
+  BAR2 = 2;
+}
+
+// Test an enum with large, unordered values.
+enum TestSparseEnum {
+  SPARSE_A = 123;
+  SPARSE_B = 62374;
+  SPARSE_C = 12589234;
+  SPARSE_D = -15;
+  SPARSE_E = -53452;
+  SPARSE_F = 0;
+  SPARSE_G = 2;
+}
+
+// Test message with CamelCase field names.  This violates Protocol Buffer
+// standard style.
+message TestCamelCaseFieldNames {
+  optional int32 PrimitiveField = 1;
+  optional string StringField = 2;
+  optional ForeignEnum EnumField = 3;
+  optional ForeignMessage MessageField = 4;
+  optional string StringPieceField = 5 [ctype=STRING_PIECE];
+  optional string CordField = 6 [ctype=CORD];
+
+  repeated int32 RepeatedPrimitiveField = 7;
+  repeated string RepeatedStringField = 8;
+  repeated ForeignEnum RepeatedEnumField = 9;
+  repeated ForeignMessage RepeatedMessageField = 10;
+  repeated string RepeatedStringPieceField = 11 [ctype=STRING_PIECE];
+  repeated string RepeatedCordField = 12 [ctype=CORD];
+}
+
+
+// We list fields out of order, to ensure that we're using field number and not
+// field index to determine serialization order.
+message TestFieldOrderings {
+  optional string my_string = 11;
+  extensions 2 to 10;
+  optional int64 my_int = 1;
+  extensions 12 to 100;
+  optional float my_float = 101;
+}
+
+
+extend TestFieldOrderings {
+  optional string my_extension_string = 50;
+  optional int32 my_extension_int = 5;
+}
+
+
+message TestExtremeDefaultValues {
+  optional bytes escaped_bytes = 1 [default = "\0\001\a\b\f\n\r\t\v\\\'\"\xfe"];
+  optional uint32 large_uint32 = 2 [default = 0xFFFFFFFF];
+  optional uint64 large_uint64 = 3 [default = 0xFFFFFFFFFFFFFFFF];
+  optional  int32 small_int32  = 4 [default = -0x7FFFFFFF];
+  optional  int64 small_int64  = 5 [default = -0x7FFFFFFFFFFFFFFF];
+
+  // The default value here is UTF-8 for "\u1234".  (We could also just type
+  // the UTF-8 text directly into this text file rather than escape it, but
+  // lots of people use editors that would be confused by this.)
+  optional string utf8_string = 6 [default = "\341\210\264"];
+
+  // Tests for single-precision floating-point values.
+  optional float zero_float = 7 [default = 0];
+  optional float one_float = 8 [default = 1];
+  optional float small_float = 9 [default = 1.5];
+  optional float negative_one_float = 10 [default = -1];
+  optional float negative_float = 11 [default = -1.5];
+  // Using exponents
+  optional float large_float = 12 [default = 2E8];
+  optional float small_negative_float = 13 [default = -8e-28];
+
+  // Text for nonfinite floating-point values.
+  optional double inf_double = 14 [default = inf];
+  optional double neg_inf_double = 15 [default = -inf];
+  optional double nan_double = 16 [default = nan];
+  optional float inf_float = 17 [default = inf];
+  optional float neg_inf_float = 18 [default = -inf];
+  optional float nan_float = 19 [default = nan];
+
+  // Tests for C++ trigraphs.
+  // Trigraphs should be escaped in C++ generated files, but they should not be
+  // escaped for other languages.
+  // Note that in .proto file, "\?" is a valid way to escape ? in string
+  // literals.
+  optional string cpp_trigraph = 20 [default = "? \? ?? \?? \??? ??/ ?\?-"];
+}
+
+message SparseEnumMessage {
+  optional TestSparseEnum sparse_enum = 1;
+}
+
+// Test String and Bytes: string is for valid UTF-8 strings
+message OneString {
+  optional string data = 1;
+}
+
+message OneBytes {
+  optional bytes data = 1;
+}
+
+// Test messages for packed fields
+
+message TestPackedTypes {
+  repeated    int32 packed_int32    =  90 [packed = true];
+  repeated    int64 packed_int64    =  91 [packed = true];
+  repeated   uint32 packed_uint32   =  92 [packed = true];
+  repeated   uint64 packed_uint64   =  93 [packed = true];
+  repeated   sint32 packed_sint32   =  94 [packed = true];
+  repeated   sint64 packed_sint64   =  95 [packed = true];
+  repeated  fixed32 packed_fixed32  =  96 [packed = true];
+  repeated  fixed64 packed_fixed64  =  97 [packed = true];
+  repeated sfixed32 packed_sfixed32 =  98 [packed = true];
+  repeated sfixed64 packed_sfixed64 =  99 [packed = true];
+  repeated    float packed_float    = 100 [packed = true];
+  repeated   double packed_double   = 101 [packed = true];
+  repeated     bool packed_bool     = 102 [packed = true];
+  repeated ForeignEnum packed_enum  = 103 [packed = true];
+}
+
+// A message with the same fields as TestPackedTypes, but without packing. Used
+// to test packed <-> unpacked wire compatibility.
+message TestUnpackedTypes {
+  repeated    int32 unpacked_int32    =  90 [packed = false];
+  repeated    int64 unpacked_int64    =  91 [packed = false];
+  repeated   uint32 unpacked_uint32   =  92 [packed = false];
+  repeated   uint64 unpacked_uint64   =  93 [packed = false];
+  repeated   sint32 unpacked_sint32   =  94 [packed = false];
+  repeated   sint64 unpacked_sint64   =  95 [packed = false];
+  repeated  fixed32 unpacked_fixed32  =  96 [packed = false];
+  repeated  fixed64 unpacked_fixed64  =  97 [packed = false];
+  repeated sfixed32 unpacked_sfixed32 =  98 [packed = false];
+  repeated sfixed64 unpacked_sfixed64 =  99 [packed = false];
+  repeated    float unpacked_float    = 100 [packed = false];
+  repeated   double unpacked_double   = 101 [packed = false];
+  repeated     bool unpacked_bool     = 102 [packed = false];
+  repeated ForeignEnum unpacked_enum  = 103 [packed = false];
+}
+
+message TestPackedExtensions {
+  extensions 1 to max;
+}
+
+extend TestPackedExtensions {
+  repeated    int32 packed_int32_extension    =  90 [packed = true];
+  repeated    int64 packed_int64_extension    =  91 [packed = true];
+  repeated   uint32 packed_uint32_extension   =  92 [packed = true];
+  repeated   uint64 packed_uint64_extension   =  93 [packed = true];
+  repeated   sint32 packed_sint32_extension   =  94 [packed = true];
+  repeated   sint64 packed_sint64_extension   =  95 [packed = true];
+  repeated  fixed32 packed_fixed32_extension  =  96 [packed = true];
+  repeated  fixed64 packed_fixed64_extension  =  97 [packed = true];
+  repeated sfixed32 packed_sfixed32_extension =  98 [packed = true];
+  repeated sfixed64 packed_sfixed64_extension =  99 [packed = true];
+  repeated    float packed_float_extension    = 100 [packed = true];
+  repeated   double packed_double_extension   = 101 [packed = true];
+  repeated     bool packed_bool_extension     = 102 [packed = true];
+  repeated ForeignEnum packed_enum_extension  = 103 [packed = true];
+}
+
+// Used by ExtensionSetTest/DynamicExtensions.  The test actually builds
+// a set of extensions to TestAllExtensions dynamically, based on the fields
+// of this message type.
+message TestDynamicExtensions {
+  enum DynamicEnumType {
+    DYNAMIC_FOO = 2200;
+    DYNAMIC_BAR = 2201;
+    DYNAMIC_BAZ = 2202;
+  }
+  message DynamicMessageType {
+    optional int32 dynamic_field = 2100;
+  }
+
+  optional fixed32 scalar_extension = 2000;
+  optional ForeignEnum enum_extension = 2001;
+  optional DynamicEnumType dynamic_enum_extension = 2002;
+
+  optional ForeignMessage message_extension = 2003;
+  optional DynamicMessageType dynamic_message_extension = 2004;
+
+  repeated string repeated_extension = 2005;
+  repeated sint32 packed_extension = 2006 [packed = true];
+}
+
+message TestRepeatedScalarDifferentTagSizes {
+  // Parsing repeated fixed size values used to fail. This message needs to be
+  // used in order to get a tag of the right size; all of the repeated fields
+  // in TestAllTypes didn't trigger the check.
+  repeated fixed32 repeated_fixed32 = 12;
+  // Check for a varint type, just for good measure.
+  repeated int32   repeated_int32   = 13;
+
+  // These have two-byte tags.
+  repeated fixed64 repeated_fixed64 = 2046;
+  repeated int64   repeated_int64   = 2047;
+
+  // Three byte tags.
+  repeated float   repeated_float   = 262142;
+  repeated uint64  repeated_uint64  = 262143;
+}
+
+
+// Test that RPC services work.
+message FooRequest  {}
+message FooResponse {}
+
+service TestService {
+  rpc Foo(FooRequest) returns (FooResponse);
+  rpc Bar(BarRequest) returns (BarResponse);
+}
+
+
+message BarRequest  {}
+message BarResponse {}

+ 52 - 0
csharp/protos/google/protobuf/unittest_csharp_options.proto

@@ -0,0 +1,52 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Author: jonskeet@google.com (Jon Skeet)
+//
+// A proto file for unit testing the custom C# options
+
+import "google/protobuf/csharp_options.proto";
+option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos";
+option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestCSharpOptionsProtoFile";
+//option (google.protobuf.csharp_file_options).nest_classes = true;
+
+package protobuf_unittest;
+
+message OptionsMessage {
+
+  // Will be left as Normal
+  optional string normal = 1;
+
+  // Will be converted to OptionsMessage_
+  optional string options_message = 2;
+  
+  // Will be converted to CustomName
+  optional string customized = 3 [(google.protobuf.csharp_field_options).property_name = "CustomName"];
+}

+ 372 - 0
csharp/protos/google/protobuf/unittest_custom_options.proto

@@ -0,0 +1,372 @@
+// Additional options required for C# generation. File from copyright
+// line onwards is as per original distribution.
+import "google/protobuf/csharp_options.proto";
+option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos";
+option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestCustomOptionsProtoFile";
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Author: benjy@google.com (Benjy Weinberger)
+//  Based on original Protocol Buffers design by
+//  Sanjay Ghemawat, Jeff Dean, and others.
+//
+// A proto file used to test the "custom options" feature of proto2.
+
+
+// Some generic_services option(s) added automatically.
+// See:  http://go/proto2-generic-services-default
+option cc_generic_services = true;     // auto-added
+option java_generic_services = true;   // auto-added
+option py_generic_services = true;
+
+// A custom file option (defined below).
+option (file_opt1) = 9876543210;
+
+import "google/protobuf/descriptor.proto";
+
+// We don't put this in a package within proto2 because we need to make sure
+// that the generated code doesn't depend on being in the proto2 namespace.
+package protobuf_unittest;
+
+
+// Some simple test custom options of various types.
+
+extend google.protobuf.FileOptions {
+  optional uint64 file_opt1 = 7736974;
+}
+
+extend google.protobuf.MessageOptions {
+  optional int32 message_opt1 = 7739036;
+}
+
+extend google.protobuf.FieldOptions {
+  optional fixed64 field_opt1 = 7740936;
+  // This is useful for testing that we correctly register default values for
+  // extension options.
+  optional int32 field_opt2 = 7753913 [default=42];
+}
+
+extend google.protobuf.EnumOptions {
+  optional sfixed32 enum_opt1 = 7753576;
+}
+
+extend google.protobuf.EnumValueOptions {
+  optional int32 enum_value_opt1 = 1560678;
+}
+
+extend google.protobuf.ServiceOptions {
+  optional sint64 service_opt1 = 7887650;
+}
+
+enum MethodOpt1 {
+  METHODOPT1_VAL1 = 1;
+  METHODOPT1_VAL2 = 2;
+}
+
+extend google.protobuf.MethodOptions {
+  optional MethodOpt1 method_opt1 = 7890860;
+}
+
+// A test message with custom options at all possible locations (and also some
+// regular options, to make sure they interact nicely).
+message TestMessageWithCustomOptions {
+  option message_set_wire_format = false;
+
+  option (message_opt1) = -56;
+
+  optional string field1 = 1 [ctype=CORD,
+                              (field_opt1)=8765432109];
+
+  enum AnEnum {
+    option (enum_opt1) = -789;
+
+    ANENUM_VAL1 = 1;
+    ANENUM_VAL2 = 2 [(enum_value_opt1) = 123];
+  }
+}
+
+
+// A test RPC service with custom options at all possible locations (and also
+// some regular options, to make sure they interact nicely).
+message CustomOptionFooRequest {
+}
+
+message CustomOptionFooResponse {
+}
+
+service TestServiceWithCustomOptions {
+  option (service_opt1) = -9876543210;
+
+  rpc Foo(CustomOptionFooRequest) returns (CustomOptionFooResponse) {
+    option (method_opt1) = METHODOPT1_VAL2;
+  }
+}
+
+
+
+// Options of every possible field type, so we can test them all exhaustively.
+
+message DummyMessageContainingEnum {
+  enum TestEnumType {
+    TEST_OPTION_ENUM_TYPE1 = 22;
+    TEST_OPTION_ENUM_TYPE2 = -23;
+  }
+}
+
+message DummyMessageInvalidAsOptionType {
+}
+
+extend google.protobuf.MessageOptions {
+  optional         bool     bool_opt = 7706090;
+  optional        int32    int32_opt = 7705709;
+  optional        int64    int64_opt = 7705542;
+  optional       uint32   uint32_opt = 7704880;
+  optional       uint64   uint64_opt = 7702367;
+  optional       sint32   sint32_opt = 7701568;
+  optional       sint64   sint64_opt = 7700863;
+  optional      fixed32  fixed32_opt = 7700307;
+  optional      fixed64  fixed64_opt = 7700194;
+  optional     sfixed32 sfixed32_opt = 7698645;
+  optional     sfixed64 sfixed64_opt = 7685475;
+  optional        float    float_opt = 7675390;
+  optional       double   double_opt = 7673293;
+  optional       string   string_opt = 7673285;
+  optional        bytes    bytes_opt = 7673238;
+  optional DummyMessageContainingEnum.TestEnumType enum_opt = 7673233;
+  optional DummyMessageInvalidAsOptionType message_type_opt = 7665967;
+}
+
+message CustomOptionMinIntegerValues {
+  option     (bool_opt) = false;
+  option    (int32_opt) = -0x80000000;
+  option    (int64_opt) = -0x8000000000000000;
+  option   (uint32_opt) = 0;
+  option   (uint64_opt) = 0;
+  option   (sint32_opt) = -0x80000000;
+  option   (sint64_opt) = -0x8000000000000000;
+  option  (fixed32_opt) = 0;
+  option  (fixed64_opt) = 0;
+  option (sfixed32_opt) = -0x80000000;
+  option (sfixed64_opt) = -0x8000000000000000;
+}
+
+message CustomOptionMaxIntegerValues {
+  option     (bool_opt) = true;
+  option    (int32_opt) = 0x7FFFFFFF;
+  option    (int64_opt) = 0x7FFFFFFFFFFFFFFF;
+  option   (uint32_opt) = 0xFFFFFFFF;
+  option   (uint64_opt) = 0xFFFFFFFFFFFFFFFF;
+  option   (sint32_opt) = 0x7FFFFFFF;
+  option   (sint64_opt) = 0x7FFFFFFFFFFFFFFF;
+  option  (fixed32_opt) = 0xFFFFFFFF;
+  option  (fixed64_opt) = 0xFFFFFFFFFFFFFFFF;
+  option (sfixed32_opt) = 0x7FFFFFFF;
+  option (sfixed64_opt) = 0x7FFFFFFFFFFFFFFF;
+}
+
+message CustomOptionOtherValues {
+  option  (int32_opt) = -100;  // To test sign-extension.
+  option  (float_opt) = 12.3456789;
+  option (double_opt) = 1.234567890123456789;
+  option (string_opt) = "Hello, \"World\"";
+  option  (bytes_opt) = "Hello\0World";
+  option   (enum_opt) = TEST_OPTION_ENUM_TYPE2;
+}
+
+message SettingRealsFromPositiveInts {
+  option  (float_opt) = 12;
+  option (double_opt) = 154;
+}
+
+message SettingRealsFromNegativeInts {
+  option  (float_opt) = -12;
+  option  (double_opt) = -154;
+}
+
+// Options of complex message types, themselves combined and extended in
+// various ways.
+
+message ComplexOptionType1 {
+  optional int32 foo = 1;
+  optional int32 foo2 = 2;
+  optional int32 foo3 = 3;
+
+  extensions 100 to max;
+}
+
+message ComplexOptionType2 {
+  optional ComplexOptionType1 bar = 1;
+  optional int32 baz = 2;
+
+  message ComplexOptionType4 {
+    optional int32 waldo = 1;
+
+    extend google.protobuf.MessageOptions {
+      optional ComplexOptionType4 complex_opt4 = 7633546;
+    }
+  }
+
+  optional ComplexOptionType4 fred = 3;
+
+  extensions 100 to max;
+}
+
+message ComplexOptionType3 {
+  optional int32 qux = 1;
+
+  optional group ComplexOptionType5 = 2 {
+    optional int32 plugh = 3;
+  }
+}
+
+extend ComplexOptionType1 {
+  optional int32 quux = 7663707;
+  optional ComplexOptionType3 corge = 7663442;
+}
+
+extend ComplexOptionType2 {
+  optional int32 grault = 7650927;
+  optional ComplexOptionType1 garply = 7649992;
+}
+
+extend google.protobuf.MessageOptions {
+  optional protobuf_unittest.ComplexOptionType1 complex_opt1 = 7646756;
+  optional ComplexOptionType2 complex_opt2 = 7636949;
+  optional ComplexOptionType3 complex_opt3 = 7636463;
+  optional group ComplexOpt6 = 7595468 {
+    optional int32 xyzzy = 7593951;
+  }
+}
+
+// Note that we try various different ways of naming the same extension.
+message VariousComplexOptions {
+  option (.protobuf_unittest.complex_opt1).foo = 42;
+  option (protobuf_unittest.complex_opt1).(.protobuf_unittest.quux) = 324;
+  option (.protobuf_unittest.complex_opt1).(protobuf_unittest.corge).qux = 876;
+  option (complex_opt2).baz = 987;
+  option (complex_opt2).(grault) = 654;
+  option (complex_opt2).bar.foo = 743;
+  option (complex_opt2).bar.(quux) = 1999;
+  option (complex_opt2).bar.(protobuf_unittest.corge).qux = 2008;
+  option (complex_opt2).(garply).foo = 741;
+  option (complex_opt2).(garply).(.protobuf_unittest.quux) = 1998;
+  option (complex_opt2).(protobuf_unittest.garply).(corge).qux = 2121;
+  option (ComplexOptionType2.ComplexOptionType4.complex_opt4).waldo = 1971;
+  option (complex_opt2).fred.waldo = 321;
+  option (protobuf_unittest.complex_opt3).qux = 9;
+  option (complex_opt3).complexoptiontype5.plugh = 22;
+  option (complexopt6).xyzzy = 24;
+}
+
+// ------------------------------------------------------
+// Definitions for testing aggregate option parsing.
+// See descriptor_unittest.cc.
+
+message AggregateMessageSet {
+  option message_set_wire_format = true;
+  extensions 4 to max;
+}
+
+message AggregateMessageSetElement {
+  extend AggregateMessageSet {
+    optional AggregateMessageSetElement message_set_extension = 15447542;
+  }
+  optional string s = 1;
+}
+
+// A helper type used to test aggregate option parsing
+message Aggregate {
+  optional int32 i = 1;
+  optional string s = 2;
+
+  // A nested object
+  optional Aggregate sub = 3;
+
+  // To test the parsing of extensions inside aggregate values
+  optional google.protobuf.FileOptions file = 4;
+  extend google.protobuf.FileOptions {
+    optional Aggregate nested = 15476903;
+  }
+
+  // An embedded message set
+  optional AggregateMessageSet mset = 5;
+}
+
+// Allow Aggregate to be used as an option at all possible locations
+// in the .proto grammer.
+extend google.protobuf.FileOptions      { optional Aggregate fileopt    = 15478479; }
+extend google.protobuf.MessageOptions   { optional Aggregate msgopt     = 15480088; }
+extend google.protobuf.FieldOptions     { optional Aggregate fieldopt   = 15481374; }
+extend google.protobuf.EnumOptions      { optional Aggregate enumopt_renamed    = 15483218; }
+extend google.protobuf.EnumValueOptions { optional Aggregate enumvalopt = 15486921; }
+extend google.protobuf.ServiceOptions   { optional Aggregate serviceopt = 15497145; }
+extend google.protobuf.MethodOptions    { optional Aggregate methodopt  = 15512713; }
+
+// Try using AggregateOption at different points in the proto grammar
+option (fileopt) = {
+  s: 'FileAnnotation'
+  // Also test the handling of comments
+  /* of both types */ i: 100
+
+  sub { s: 'NestedFileAnnotation' }
+
+  // Include a google.protobuf.FileOptions and recursively extend it with
+  // another fileopt.
+  file {
+    [protobuf_unittest.fileopt] {
+      s:'FileExtensionAnnotation'
+    }
+  }
+
+  // A message set inside an option value
+  mset {
+    [protobuf_unittest.AggregateMessageSetElement.message_set_extension] {
+      s: 'EmbeddedMessageSetElement'
+    }
+  }
+};
+
+message AggregateMessage {
+  option (msgopt) = { i:101 s:'MessageAnnotation' };
+  optional int32 fieldname = 1 [(fieldopt) = { s:'FieldAnnotation' }];
+}
+
+service AggregateService {
+  option (serviceopt) = { s:'ServiceAnnotation' };
+  rpc Method (AggregateMessage) returns (AggregateMessage) {
+    option (methodopt) = { s:'MethodAnnotation' };
+  }
+}
+
+enum AggregateEnum {
+  option (enumopt_renamed) = { s:'EnumAnnotation' };
+  VALUE = 1 [(enumvalopt) = { s:'EnumValueAnnotation' }];
+}

+ 56 - 0
csharp/protos/google/protobuf/unittest_embed_optimize_for.proto

@@ -0,0 +1,56 @@
+// Additional options required for C# generation. File from copyright
+// line onwards is as per original distribution.
+import "google/protobuf/csharp_options.proto";
+option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos";
+option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestEmbedOptimizeForProtoFile";
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Author: kenton@google.com (Kenton Varda)
+//  Based on original Protocol Buffers design by
+//  Sanjay Ghemawat, Jeff Dean, and others.
+//
+// A proto file which imports a proto file that uses optimize_for = CODE_SIZE.
+
+import "google/protobuf/unittest_optimize_for.proto";
+
+package protobuf_unittest;
+
+// We optimize for speed here, but we are importing a proto that is optimized
+// for code size.
+option optimize_for = SPEED;
+
+message TestEmbedOptimizedForSize {
+  // Test that embedding a message which has optimize_for = CODE_SIZE into
+  // one optimized for speed works.
+  optional TestOptimizedForSize optional_message = 1;
+  repeated TestOptimizedForSize repeated_message = 2;
+}

+ 43 - 0
csharp/protos/google/protobuf/unittest_empty.proto

@@ -0,0 +1,43 @@
+// Additional options required for C# generation. File from copyright
+// line onwards is as per original distribution.
+import "google/protobuf/csharp_options.proto";
+option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos";
+option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestEmptyProtoFile";
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Author: kenton@google.com (Kenton Varda)
+//  Based on original Protocol Buffers design by
+//  Sanjay Ghemawat, Jeff Dean, and others.
+//
+// This file intentionally left blank.  (At one point this wouldn't compile
+// correctly.)
+

+ 1052 - 0
csharp/protos/google/protobuf/unittest_enormous_descriptor.proto

@@ -0,0 +1,1052 @@
+// Additional options required for C# generation. File from copyright
+// line onwards is as per original distribution.
+import "google/protobuf/csharp_options.proto";
+option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos";
+option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestEnormousDescriptorProtoFile";
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Author: kenton@google.com (Kenton Varda)
+//  Based on original Protocol Buffers design by
+//  Sanjay Ghemawat, Jeff Dean, and others.
+//
+// A proto file that has an extremely large descriptor.  Used to test that
+// descriptors over 64k don't break the string literal length limit in Java.
+
+
+package google.protobuf;
+option java_package = "com.google.protobuf";
+
+// Avoid generating insanely long methods.
+option optimize_for = CODE_SIZE;
+
+message TestEnormousDescriptor {
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_1 = 1 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_2 = 2 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_3 = 3 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_4 = 4 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_5 = 5 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_6 = 6 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_7 = 7 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_8 = 8 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_9 = 9 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_10 = 10 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_11 = 11 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_12 = 12 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_13 = 13 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_14 = 14 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_15 = 15 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_16 = 16 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_17 = 17 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_18 = 18 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_19 = 19 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_20 = 20 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_21 = 21 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_22 = 22 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_23 = 23 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_24 = 24 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_25 = 25 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_26 = 26 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_27 = 27 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_28 = 28 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_29 = 29 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_30 = 30 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_31 = 31 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_32 = 32 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_33 = 33 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_34 = 34 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_35 = 35 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_36 = 36 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_37 = 37 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_38 = 38 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_39 = 39 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_40 = 40 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_41 = 41 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_42 = 42 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_43 = 43 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_44 = 44 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_45 = 45 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_46 = 46 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_47 = 47 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_48 = 48 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_49 = 49 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_50 = 50 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_51 = 51 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_52 = 52 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_53 = 53 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_54 = 54 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_55 = 55 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_56 = 56 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_57 = 57 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_58 = 58 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_59 = 59 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_60 = 60 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_61 = 61 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_62 = 62 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_63 = 63 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_64 = 64 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_65 = 65 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_66 = 66 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_67 = 67 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_68 = 68 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_69 = 69 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_70 = 70 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_71 = 71 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_72 = 72 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_73 = 73 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_74 = 74 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_75 = 75 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_76 = 76 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_77 = 77 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_78 = 78 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_79 = 79 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_80 = 80 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_81 = 81 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_82 = 82 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_83 = 83 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_84 = 84 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_85 = 85 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_86 = 86 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_87 = 87 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_88 = 88 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_89 = 89 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_90 = 90 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_91 = 91 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_92 = 92 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_93 = 93 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_94 = 94 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_95 = 95 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_96 = 96 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_97 = 97 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_98 = 98 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_99 = 99 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_100 = 100 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_101 = 101 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_102 = 102 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_103 = 103 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_104 = 104 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_105 = 105 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_106 = 106 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_107 = 107 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_108 = 108 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_109 = 109 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_110 = 110 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_111 = 111 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_112 = 112 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_113 = 113 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_114 = 114 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_115 = 115 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_116 = 116 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_117 = 117 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_118 = 118 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_119 = 119 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_120 = 120 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_121 = 121 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_122 = 122 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_123 = 123 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_124 = 124 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_125 = 125 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_126 = 126 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_127 = 127 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_128 = 128 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_129 = 129 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_130 = 130 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_131 = 131 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_132 = 132 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_133 = 133 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_134 = 134 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_135 = 135 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_136 = 136 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_137 = 137 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_138 = 138 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_139 = 139 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_140 = 140 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_141 = 141 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_142 = 142 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_143 = 143 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_144 = 144 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_145 = 145 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_146 = 146 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_147 = 147 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_148 = 148 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_149 = 149 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_150 = 150 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_151 = 151 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_152 = 152 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_153 = 153 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_154 = 154 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_155 = 155 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_156 = 156 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_157 = 157 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_158 = 158 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_159 = 159 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_160 = 160 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_161 = 161 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_162 = 162 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_163 = 163 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_164 = 164 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_165 = 165 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_166 = 166 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_167 = 167 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_168 = 168 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_169 = 169 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_170 = 170 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_171 = 171 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_172 = 172 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_173 = 173 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_174 = 174 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_175 = 175 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_176 = 176 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_177 = 177 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_178 = 178 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_179 = 179 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_180 = 180 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_181 = 181 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_182 = 182 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_183 = 183 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_184 = 184 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_185 = 185 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_186 = 186 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_187 = 187 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_188 = 188 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_189 = 189 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_190 = 190 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_191 = 191 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_192 = 192 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_193 = 193 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_194 = 194 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_195 = 195 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_196 = 196 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_197 = 197 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_198 = 198 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_199 = 199 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_200 = 200 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_201 = 201 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_202 = 202 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_203 = 203 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_204 = 204 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_205 = 205 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_206 = 206 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_207 = 207 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_208 = 208 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_209 = 209 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_210 = 210 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_211 = 211 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_212 = 212 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_213 = 213 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_214 = 214 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_215 = 215 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_216 = 216 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_217 = 217 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_218 = 218 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_219 = 219 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_220 = 220 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_221 = 221 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_222 = 222 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_223 = 223 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_224 = 224 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_225 = 225 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_226 = 226 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_227 = 227 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_228 = 228 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_229 = 229 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_230 = 230 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_231 = 231 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_232 = 232 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_233 = 233 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_234 = 234 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_235 = 235 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_236 = 236 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_237 = 237 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_238 = 238 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_239 = 239 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_240 = 240 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_241 = 241 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_242 = 242 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_243 = 243 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_244 = 244 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_245 = 245 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_246 = 246 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_247 = 247 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_248 = 248 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_249 = 249 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_250 = 250 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_251 = 251 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_252 = 252 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_253 = 253 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_254 = 254 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_255 = 255 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_256 = 256 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_257 = 257 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_258 = 258 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_259 = 259 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_260 = 260 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_261 = 261 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_262 = 262 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_263 = 263 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_264 = 264 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_265 = 265 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_266 = 266 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_267 = 267 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_268 = 268 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_269 = 269 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_270 = 270 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_271 = 271 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_272 = 272 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_273 = 273 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_274 = 274 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_275 = 275 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_276 = 276 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_277 = 277 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_278 = 278 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_279 = 279 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_280 = 280 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_281 = 281 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_282 = 282 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_283 = 283 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_284 = 284 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_285 = 285 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_286 = 286 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_287 = 287 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_288 = 288 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_289 = 289 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_290 = 290 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_291 = 291 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_292 = 292 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_293 = 293 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_294 = 294 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_295 = 295 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_296 = 296 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_297 = 297 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_298 = 298 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_299 = 299 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_300 = 300 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_301 = 301 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_302 = 302 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_303 = 303 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_304 = 304 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_305 = 305 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_306 = 306 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_307 = 307 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_308 = 308 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_309 = 309 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_310 = 310 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_311 = 311 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_312 = 312 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_313 = 313 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_314 = 314 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_315 = 315 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_316 = 316 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_317 = 317 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_318 = 318 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_319 = 319 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_320 = 320 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_321 = 321 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_322 = 322 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_323 = 323 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_324 = 324 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_325 = 325 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_326 = 326 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_327 = 327 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_328 = 328 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_329 = 329 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_330 = 330 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_331 = 331 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_332 = 332 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_333 = 333 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_334 = 334 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_335 = 335 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_336 = 336 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_337 = 337 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_338 = 338 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_339 = 339 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_340 = 340 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_341 = 341 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_342 = 342 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_343 = 343 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_344 = 344 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_345 = 345 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_346 = 346 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_347 = 347 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_348 = 348 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_349 = 349 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_350 = 350 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_351 = 351 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_352 = 352 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_353 = 353 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_354 = 354 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_355 = 355 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_356 = 356 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_357 = 357 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_358 = 358 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_359 = 359 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_360 = 360 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_361 = 361 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_362 = 362 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_363 = 363 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_364 = 364 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_365 = 365 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_366 = 366 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_367 = 367 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_368 = 368 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_369 = 369 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_370 = 370 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_371 = 371 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_372 = 372 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_373 = 373 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_374 = 374 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_375 = 375 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_376 = 376 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_377 = 377 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_378 = 378 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_379 = 379 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_380 = 380 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_381 = 381 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_382 = 382 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_383 = 383 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_384 = 384 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_385 = 385 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_386 = 386 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_387 = 387 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_388 = 388 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_389 = 389 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_390 = 390 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_391 = 391 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_392 = 392 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_393 = 393 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_394 = 394 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_395 = 395 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_396 = 396 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_397 = 397 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_398 = 398 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_399 = 399 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_400 = 400 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_401 = 401 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_402 = 402 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_403 = 403 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_404 = 404 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_405 = 405 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_406 = 406 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_407 = 407 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_408 = 408 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_409 = 409 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_410 = 410 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_411 = 411 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_412 = 412 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_413 = 413 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_414 = 414 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_415 = 415 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_416 = 416 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_417 = 417 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_418 = 418 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_419 = 419 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_420 = 420 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_421 = 421 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_422 = 422 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_423 = 423 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_424 = 424 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_425 = 425 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_426 = 426 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_427 = 427 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_428 = 428 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_429 = 429 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_430 = 430 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_431 = 431 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_432 = 432 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_433 = 433 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_434 = 434 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_435 = 435 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_436 = 436 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_437 = 437 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_438 = 438 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_439 = 439 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_440 = 440 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_441 = 441 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_442 = 442 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_443 = 443 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_444 = 444 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_445 = 445 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_446 = 446 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_447 = 447 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_448 = 448 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_449 = 449 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_450 = 450 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_451 = 451 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_452 = 452 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_453 = 453 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_454 = 454 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_455 = 455 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_456 = 456 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_457 = 457 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_458 = 458 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_459 = 459 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_460 = 460 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_461 = 461 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_462 = 462 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_463 = 463 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_464 = 464 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_465 = 465 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_466 = 466 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_467 = 467 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_468 = 468 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_469 = 469 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_470 = 470 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_471 = 471 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_472 = 472 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_473 = 473 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_474 = 474 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_475 = 475 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_476 = 476 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_477 = 477 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_478 = 478 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_479 = 479 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_480 = 480 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_481 = 481 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_482 = 482 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_483 = 483 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_484 = 484 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_485 = 485 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_486 = 486 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_487 = 487 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_488 = 488 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_489 = 489 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_490 = 490 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_491 = 491 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_492 = 492 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_493 = 493 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_494 = 494 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_495 = 495 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_496 = 496 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_497 = 497 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_498 = 498 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_499 = 499 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_500 = 500 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_501 = 501 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_502 = 502 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_503 = 503 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_504 = 504 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_505 = 505 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_506 = 506 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_507 = 507 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_508 = 508 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_509 = 509 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_510 = 510 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_511 = 511 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_512 = 512 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_513 = 513 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_514 = 514 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_515 = 515 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_516 = 516 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_517 = 517 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_518 = 518 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_519 = 519 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_520 = 520 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_521 = 521 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_522 = 522 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_523 = 523 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_524 = 524 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_525 = 525 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_526 = 526 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_527 = 527 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_528 = 528 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_529 = 529 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_530 = 530 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_531 = 531 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_532 = 532 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_533 = 533 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_534 = 534 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_535 = 535 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_536 = 536 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_537 = 537 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_538 = 538 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_539 = 539 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_540 = 540 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_541 = 541 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_542 = 542 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_543 = 543 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_544 = 544 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_545 = 545 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_546 = 546 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_547 = 547 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_548 = 548 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_549 = 549 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_550 = 550 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_551 = 551 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_552 = 552 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_553 = 553 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_554 = 554 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_555 = 555 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_556 = 556 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_557 = 557 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_558 = 558 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_559 = 559 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_560 = 560 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_561 = 561 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_562 = 562 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_563 = 563 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_564 = 564 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_565 = 565 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_566 = 566 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_567 = 567 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_568 = 568 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_569 = 569 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_570 = 570 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_571 = 571 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_572 = 572 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_573 = 573 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_574 = 574 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_575 = 575 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_576 = 576 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_577 = 577 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_578 = 578 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_579 = 579 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_580 = 580 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_581 = 581 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_582 = 582 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_583 = 583 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_584 = 584 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_585 = 585 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_586 = 586 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_587 = 587 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_588 = 588 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_589 = 589 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_590 = 590 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_591 = 591 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_592 = 592 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_593 = 593 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_594 = 594 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_595 = 595 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_596 = 596 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_597 = 597 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_598 = 598 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_599 = 599 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_600 = 600 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_601 = 601 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_602 = 602 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_603 = 603 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_604 = 604 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_605 = 605 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_606 = 606 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_607 = 607 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_608 = 608 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_609 = 609 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_610 = 610 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_611 = 611 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_612 = 612 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_613 = 613 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_614 = 614 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_615 = 615 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_616 = 616 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_617 = 617 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_618 = 618 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_619 = 619 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_620 = 620 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_621 = 621 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_622 = 622 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_623 = 623 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_624 = 624 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_625 = 625 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_626 = 626 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_627 = 627 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_628 = 628 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_629 = 629 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_630 = 630 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_631 = 631 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_632 = 632 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_633 = 633 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_634 = 634 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_635 = 635 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_636 = 636 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_637 = 637 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_638 = 638 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_639 = 639 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_640 = 640 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_641 = 641 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_642 = 642 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_643 = 643 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_644 = 644 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_645 = 645 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_646 = 646 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_647 = 647 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_648 = 648 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_649 = 649 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_650 = 650 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_651 = 651 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_652 = 652 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_653 = 653 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_654 = 654 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_655 = 655 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_656 = 656 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_657 = 657 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_658 = 658 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_659 = 659 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_660 = 660 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_661 = 661 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_662 = 662 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_663 = 663 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_664 = 664 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_665 = 665 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_666 = 666 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_667 = 667 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_668 = 668 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_669 = 669 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_670 = 670 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_671 = 671 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_672 = 672 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_673 = 673 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_674 = 674 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_675 = 675 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_676 = 676 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_677 = 677 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_678 = 678 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_679 = 679 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_680 = 680 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_681 = 681 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_682 = 682 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_683 = 683 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_684 = 684 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_685 = 685 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_686 = 686 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_687 = 687 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_688 = 688 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_689 = 689 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_690 = 690 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_691 = 691 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_692 = 692 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_693 = 693 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_694 = 694 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_695 = 695 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_696 = 696 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_697 = 697 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_698 = 698 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_699 = 699 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_700 = 700 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_701 = 701 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_702 = 702 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_703 = 703 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_704 = 704 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_705 = 705 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_706 = 706 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_707 = 707 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_708 = 708 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_709 = 709 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_710 = 710 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_711 = 711 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_712 = 712 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_713 = 713 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_714 = 714 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_715 = 715 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_716 = 716 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_717 = 717 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_718 = 718 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_719 = 719 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_720 = 720 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_721 = 721 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_722 = 722 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_723 = 723 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_724 = 724 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_725 = 725 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_726 = 726 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_727 = 727 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_728 = 728 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_729 = 729 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_730 = 730 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_731 = 731 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_732 = 732 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_733 = 733 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_734 = 734 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_735 = 735 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_736 = 736 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_737 = 737 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_738 = 738 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_739 = 739 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_740 = 740 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_741 = 741 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_742 = 742 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_743 = 743 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_744 = 744 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_745 = 745 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_746 = 746 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_747 = 747 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_748 = 748 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_749 = 749 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_750 = 750 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_751 = 751 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_752 = 752 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_753 = 753 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_754 = 754 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_755 = 755 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_756 = 756 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_757 = 757 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_758 = 758 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_759 = 759 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_760 = 760 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_761 = 761 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_762 = 762 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_763 = 763 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_764 = 764 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_765 = 765 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_766 = 766 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_767 = 767 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_768 = 768 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_769 = 769 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_770 = 770 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_771 = 771 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_772 = 772 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_773 = 773 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_774 = 774 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_775 = 775 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_776 = 776 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_777 = 777 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_778 = 778 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_779 = 779 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_780 = 780 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_781 = 781 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_782 = 782 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_783 = 783 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_784 = 784 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_785 = 785 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_786 = 786 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_787 = 787 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_788 = 788 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_789 = 789 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_790 = 790 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_791 = 791 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_792 = 792 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_793 = 793 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_794 = 794 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_795 = 795 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_796 = 796 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_797 = 797 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_798 = 798 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_799 = 799 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_800 = 800 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_801 = 801 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_802 = 802 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_803 = 803 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_804 = 804 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_805 = 805 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_806 = 806 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_807 = 807 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_808 = 808 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_809 = 809 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_810 = 810 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_811 = 811 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_812 = 812 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_813 = 813 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_814 = 814 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_815 = 815 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_816 = 816 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_817 = 817 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_818 = 818 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_819 = 819 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_820 = 820 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_821 = 821 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_822 = 822 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_823 = 823 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_824 = 824 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_825 = 825 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_826 = 826 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_827 = 827 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_828 = 828 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_829 = 829 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_830 = 830 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_831 = 831 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_832 = 832 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_833 = 833 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_834 = 834 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_835 = 835 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_836 = 836 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_837 = 837 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_838 = 838 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_839 = 839 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_840 = 840 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_841 = 841 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_842 = 842 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_843 = 843 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_844 = 844 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_845 = 845 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_846 = 846 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_847 = 847 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_848 = 848 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_849 = 849 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_850 = 850 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_851 = 851 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_852 = 852 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_853 = 853 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_854 = 854 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_855 = 855 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_856 = 856 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_857 = 857 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_858 = 858 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_859 = 859 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_860 = 860 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_861 = 861 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_862 = 862 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_863 = 863 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_864 = 864 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_865 = 865 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_866 = 866 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_867 = 867 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_868 = 868 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_869 = 869 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_870 = 870 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_871 = 871 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_872 = 872 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_873 = 873 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_874 = 874 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_875 = 875 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_876 = 876 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_877 = 877 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_878 = 878 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_879 = 879 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_880 = 880 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_881 = 881 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_882 = 882 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_883 = 883 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_884 = 884 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_885 = 885 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_886 = 886 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_887 = 887 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_888 = 888 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_889 = 889 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_890 = 890 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_891 = 891 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_892 = 892 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_893 = 893 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_894 = 894 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_895 = 895 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_896 = 896 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_897 = 897 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_898 = 898 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_899 = 899 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_900 = 900 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_901 = 901 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_902 = 902 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_903 = 903 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_904 = 904 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_905 = 905 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_906 = 906 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_907 = 907 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_908 = 908 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_909 = 909 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_910 = 910 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_911 = 911 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_912 = 912 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_913 = 913 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_914 = 914 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_915 = 915 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_916 = 916 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_917 = 917 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_918 = 918 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_919 = 919 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_920 = 920 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_921 = 921 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_922 = 922 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_923 = 923 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_924 = 924 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_925 = 925 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_926 = 926 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_927 = 927 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_928 = 928 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_929 = 929 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_930 = 930 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_931 = 931 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_932 = 932 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_933 = 933 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_934 = 934 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_935 = 935 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_936 = 936 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_937 = 937 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_938 = 938 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_939 = 939 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_940 = 940 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_941 = 941 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_942 = 942 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_943 = 943 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_944 = 944 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_945 = 945 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_946 = 946 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_947 = 947 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_948 = 948 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_949 = 949 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_950 = 950 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_951 = 951 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_952 = 952 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_953 = 953 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_954 = 954 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_955 = 955 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_956 = 956 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_957 = 957 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_958 = 958 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_959 = 959 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_960 = 960 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_961 = 961 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_962 = 962 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_963 = 963 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_964 = 964 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_965 = 965 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_966 = 966 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_967 = 967 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_968 = 968 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_969 = 969 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_970 = 970 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_971 = 971 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_972 = 972 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_973 = 973 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_974 = 974 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_975 = 975 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_976 = 976 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_977 = 977 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_978 = 978 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_979 = 979 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_980 = 980 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_981 = 981 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_982 = 982 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_983 = 983 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_984 = 984 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_985 = 985 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_986 = 986 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_987 = 987 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_988 = 988 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_989 = 989 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_990 = 990 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_991 = 991 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_992 = 992 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_993 = 993 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_994 = 994 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_995 = 995 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_996 = 996 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_997 = 997 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_998 = 998 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_999 = 999 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_1000 = 1000 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"];
+}

+ 67 - 0
csharp/protos/google/protobuf/unittest_import.proto

@@ -0,0 +1,67 @@
+// Additional options required for C# generation. File from copyright
+// line onwards is as per original distribution.
+import "google/protobuf/csharp_options.proto";
+option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos";
+option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestImportProtoFile";
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Author: kenton@google.com (Kenton Varda)
+//  Based on original Protocol Buffers design by
+//  Sanjay Ghemawat, Jeff Dean, and others.
+//
+// A proto file which is imported by unittest.proto to test importing.
+
+
+// We don't put this in a package within proto2 because we need to make sure
+// that the generated code doesn't depend on being in the proto2 namespace.
+// In test_util.h we do
+// "using namespace unittest_import = protobuf_unittest_import".
+package protobuf_unittest_import;
+
+option optimize_for = SPEED;
+
+// Excercise the java_package option.
+option java_package = "com.google.protobuf.test";
+
+// Do not set a java_outer_classname here to verify that Proto2 works without
+// one.
+
+message ImportMessage {
+  optional int32 d = 1;
+}
+
+enum ImportEnum {
+  IMPORT_FOO = 7;
+  IMPORT_BAR = 8;
+  IMPORT_BAZ = 9;
+}
+

+ 55 - 0
csharp/protos/google/protobuf/unittest_import_lite.proto

@@ -0,0 +1,55 @@
+// Additional options required for C# generation. File from copyright
+// line onwards is as per original distribution.
+import "google/protobuf/csharp_options.proto";
+option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos";
+option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestImportLiteProtoFile";
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Author: kenton@google.com (Kenton Varda)
+//
+// This is like unittest_import.proto but with optimize_for = LITE_RUNTIME.
+
+package protobuf_unittest_import;
+
+option optimize_for = LITE_RUNTIME;
+
+option java_package = "com.google.protobuf";
+
+message ImportMessageLite {
+  optional int32 d = 1;
+}
+
+enum ImportEnumLite {
+  IMPORT_LITE_FOO = 7;
+  IMPORT_LITE_BAR = 8;
+  IMPORT_LITE_BAZ = 9;
+}

+ 318 - 0
csharp/protos/google/protobuf/unittest_lite.proto

@@ -0,0 +1,318 @@
+// Additional options required for C# generation. File from copyright
+// line onwards is as per original distribution.
+import "google/protobuf/csharp_options.proto";
+option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos";
+option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestLiteProtoFile";
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Author: kenton@google.com (Kenton Varda)
+//
+// This is like unittest.proto but with optimize_for = LITE_RUNTIME.
+
+package protobuf_unittest;
+
+import "google/protobuf/unittest_import_lite.proto";
+
+option optimize_for = LITE_RUNTIME;
+
+option java_package = "com.google.protobuf";
+
+// Same as TestAllTypes but with the lite runtime.
+message TestAllTypesLite {
+  message NestedMessage {
+    optional int32 bb = 1;
+  }
+
+  enum NestedEnum {
+    FOO = 1;
+    BAR = 2;
+    BAZ = 3;
+  }
+
+  // Singular
+  optional    int32 optional_int32    =  1;
+  optional    int64 optional_int64    =  2;
+  optional   uint32 optional_uint32   =  3;
+  optional   uint64 optional_uint64   =  4;
+  optional   sint32 optional_sint32   =  5;
+  optional   sint64 optional_sint64   =  6;
+  optional  fixed32 optional_fixed32  =  7;
+  optional  fixed64 optional_fixed64  =  8;
+  optional sfixed32 optional_sfixed32 =  9;
+  optional sfixed64 optional_sfixed64 = 10;
+  optional    float optional_float    = 11;
+  optional   double optional_double   = 12;
+  optional     bool optional_bool     = 13;
+  optional   string optional_string   = 14;
+  optional    bytes optional_bytes    = 15;
+
+  optional group OptionalGroup = 16 {
+    optional int32 a = 17;
+  }
+
+  optional NestedMessage      optional_nested_message  = 18;
+  optional ForeignMessageLite optional_foreign_message = 19;
+  optional protobuf_unittest_import.ImportMessageLite
+    optional_import_message = 20;
+
+  optional NestedEnum      optional_nested_enum     = 21;
+  optional ForeignEnumLite optional_foreign_enum    = 22;
+  optional protobuf_unittest_import.ImportEnumLite optional_import_enum = 23;
+
+  optional string optional_string_piece = 24 [ctype=STRING_PIECE];
+  optional string optional_cord = 25 [ctype=CORD];
+
+  // Repeated
+  repeated    int32 repeated_int32    = 31;
+  repeated    int64 repeated_int64    = 32;
+  repeated   uint32 repeated_uint32   = 33;
+  repeated   uint64 repeated_uint64   = 34;
+  repeated   sint32 repeated_sint32   = 35;
+  repeated   sint64 repeated_sint64   = 36;
+  repeated  fixed32 repeated_fixed32  = 37;
+  repeated  fixed64 repeated_fixed64  = 38;
+  repeated sfixed32 repeated_sfixed32 = 39;
+  repeated sfixed64 repeated_sfixed64 = 40;
+  repeated    float repeated_float    = 41;
+  repeated   double repeated_double   = 42;
+  repeated     bool repeated_bool     = 43;
+  repeated   string repeated_string   = 44;
+  repeated    bytes repeated_bytes    = 45;
+
+  repeated group RepeatedGroup = 46 {
+    optional int32 a = 47;
+  }
+
+  repeated NestedMessage      repeated_nested_message  = 48;
+  repeated ForeignMessageLite repeated_foreign_message = 49;
+  repeated protobuf_unittest_import.ImportMessageLite
+    repeated_import_message = 50;
+
+  repeated NestedEnum      repeated_nested_enum  = 51;
+  repeated ForeignEnumLite repeated_foreign_enum = 52;
+  repeated protobuf_unittest_import.ImportEnumLite repeated_import_enum = 53;
+
+  repeated string repeated_string_piece = 54 [ctype=STRING_PIECE];
+  repeated string repeated_cord = 55 [ctype=CORD];
+
+  // Singular with defaults
+  optional    int32 default_int32    = 61 [default =  41    ];
+  optional    int64 default_int64    = 62 [default =  42    ];
+  optional   uint32 default_uint32   = 63 [default =  43    ];
+  optional   uint64 default_uint64   = 64 [default =  44    ];
+  optional   sint32 default_sint32   = 65 [default = -45    ];
+  optional   sint64 default_sint64   = 66 [default =  46    ];
+  optional  fixed32 default_fixed32  = 67 [default =  47    ];
+  optional  fixed64 default_fixed64  = 68 [default =  48    ];
+  optional sfixed32 default_sfixed32 = 69 [default =  49    ];
+  optional sfixed64 default_sfixed64 = 70 [default = -50    ];
+  optional    float default_float    = 71 [default =  51.5  ];
+  optional   double default_double   = 72 [default =  52e3  ];
+  optional     bool default_bool     = 73 [default = true   ];
+  optional   string default_string   = 74 [default = "hello"];
+  optional    bytes default_bytes    = 75 [default = "world"];
+
+  optional NestedEnum default_nested_enum = 81 [default = BAR];
+  optional ForeignEnumLite default_foreign_enum = 82
+      [default = FOREIGN_LITE_BAR];
+  optional protobuf_unittest_import.ImportEnumLite
+      default_import_enum = 83 [default = IMPORT_LITE_BAR];
+
+  optional string default_string_piece = 84 [ctype=STRING_PIECE,default="abc"];
+  optional string default_cord = 85 [ctype=CORD,default="123"];
+}
+
+message ForeignMessageLite {
+  optional int32 c = 1;
+}
+
+enum ForeignEnumLite {
+  FOREIGN_LITE_FOO = 4;
+  FOREIGN_LITE_BAR = 5;
+  FOREIGN_LITE_BAZ = 6;
+}
+
+message TestPackedTypesLite {
+  repeated    int32 packed_int32    =  90 [packed = true];
+  repeated    int64 packed_int64    =  91 [packed = true];
+  repeated   uint32 packed_uint32   =  92 [packed = true];
+  repeated   uint64 packed_uint64   =  93 [packed = true];
+  repeated   sint32 packed_sint32   =  94 [packed = true];
+  repeated   sint64 packed_sint64   =  95 [packed = true];
+  repeated  fixed32 packed_fixed32  =  96 [packed = true];
+  repeated  fixed64 packed_fixed64  =  97 [packed = true];
+  repeated sfixed32 packed_sfixed32 =  98 [packed = true];
+  repeated sfixed64 packed_sfixed64 =  99 [packed = true];
+  repeated    float packed_float    = 100 [packed = true];
+  repeated   double packed_double   = 101 [packed = true];
+  repeated     bool packed_bool     = 102 [packed = true];
+  repeated ForeignEnumLite packed_enum  = 103 [packed = true];
+}
+
+message TestAllExtensionsLite {
+  extensions 1 to max;
+}
+
+extend TestAllExtensionsLite {
+  // Singular
+  optional    int32 optional_int32_extension_lite    =  1;
+  optional    int64 optional_int64_extension_lite    =  2;
+  optional   uint32 optional_uint32_extension_lite   =  3;
+  optional   uint64 optional_uint64_extension_lite   =  4;
+  optional   sint32 optional_sint32_extension_lite   =  5;
+  optional   sint64 optional_sint64_extension_lite   =  6;
+  optional  fixed32 optional_fixed32_extension_lite  =  7;
+  optional  fixed64 optional_fixed64_extension_lite  =  8;
+  optional sfixed32 optional_sfixed32_extension_lite =  9;
+  optional sfixed64 optional_sfixed64_extension_lite = 10;
+  optional    float optional_float_extension_lite    = 11;
+  optional   double optional_double_extension_lite   = 12;
+  optional     bool optional_bool_extension_lite     = 13;
+  optional   string optional_string_extension_lite   = 14;
+  optional    bytes optional_bytes_extension_lite    = 15;
+
+  optional group OptionalGroup_extension_lite = 16 {
+    optional int32 a = 17;
+  }
+
+  optional TestAllTypesLite.NestedMessage optional_nested_message_extension_lite
+      = 18;
+  optional ForeignMessageLite optional_foreign_message_extension_lite = 19;
+  optional protobuf_unittest_import.ImportMessageLite
+    optional_import_message_extension_lite = 20;
+
+  optional TestAllTypesLite.NestedEnum optional_nested_enum_extension_lite = 21;
+  optional ForeignEnumLite optional_foreign_enum_extension_lite = 22;
+  optional protobuf_unittest_import.ImportEnumLite
+    optional_import_enum_extension_lite = 23;
+
+  optional string optional_string_piece_extension_lite = 24
+      [ctype=STRING_PIECE];
+  optional string optional_cord_extension_lite = 25 [ctype=CORD];
+
+  // Repeated
+  repeated    int32 repeated_int32_extension_lite    = 31;
+  repeated    int64 repeated_int64_extension_lite    = 32;
+  repeated   uint32 repeated_uint32_extension_lite   = 33;
+  repeated   uint64 repeated_uint64_extension_lite   = 34;
+  repeated   sint32 repeated_sint32_extension_lite   = 35;
+  repeated   sint64 repeated_sint64_extension_lite   = 36;
+  repeated  fixed32 repeated_fixed32_extension_lite  = 37;
+  repeated  fixed64 repeated_fixed64_extension_lite  = 38;
+  repeated sfixed32 repeated_sfixed32_extension_lite = 39;
+  repeated sfixed64 repeated_sfixed64_extension_lite = 40;
+  repeated    float repeated_float_extension_lite    = 41;
+  repeated   double repeated_double_extension_lite   = 42;
+  repeated     bool repeated_bool_extension_lite     = 43;
+  repeated   string repeated_string_extension_lite   = 44;
+  repeated    bytes repeated_bytes_extension_lite    = 45;
+
+  repeated group RepeatedGroup_extension_lite = 46 {
+    optional int32 a = 47;
+  }
+
+  repeated TestAllTypesLite.NestedMessage repeated_nested_message_extension_lite
+      = 48;
+  repeated ForeignMessageLite repeated_foreign_message_extension_lite = 49;
+  repeated protobuf_unittest_import.ImportMessageLite
+    repeated_import_message_extension_lite = 50;
+
+  repeated TestAllTypesLite.NestedEnum repeated_nested_enum_extension_lite = 51;
+  repeated ForeignEnumLite repeated_foreign_enum_extension_lite = 52;
+  repeated protobuf_unittest_import.ImportEnumLite
+    repeated_import_enum_extension_lite = 53;
+
+  repeated string repeated_string_piece_extension_lite = 54
+      [ctype=STRING_PIECE];
+  repeated string repeated_cord_extension_lite = 55 [ctype=CORD];
+
+  // Singular with defaults
+  optional    int32 default_int32_extension_lite    = 61 [default =  41    ];
+  optional    int64 default_int64_extension_lite    = 62 [default =  42    ];
+  optional   uint32 default_uint32_extension_lite   = 63 [default =  43    ];
+  optional   uint64 default_uint64_extension_lite   = 64 [default =  44    ];
+  optional   sint32 default_sint32_extension_lite   = 65 [default = -45    ];
+  optional   sint64 default_sint64_extension_lite   = 66 [default =  46    ];
+  optional  fixed32 default_fixed32_extension_lite  = 67 [default =  47    ];
+  optional  fixed64 default_fixed64_extension_lite  = 68 [default =  48    ];
+  optional sfixed32 default_sfixed32_extension_lite = 69 [default =  49    ];
+  optional sfixed64 default_sfixed64_extension_lite = 70 [default = -50    ];
+  optional    float default_float_extension_lite    = 71 [default =  51.5  ];
+  optional   double default_double_extension_lite   = 72 [default =  52e3  ];
+  optional     bool default_bool_extension_lite     = 73 [default = true   ];
+  optional   string default_string_extension_lite   = 74 [default = "hello"];
+  optional    bytes default_bytes_extension_lite    = 75 [default = "world"];
+
+  optional TestAllTypesLite.NestedEnum
+    default_nested_enum_extension_lite = 81 [default = BAR];
+  optional ForeignEnumLite
+    default_foreign_enum_extension_lite = 82 [default = FOREIGN_LITE_BAR];
+  optional protobuf_unittest_import.ImportEnumLite
+    default_import_enum_extension_lite = 83 [default = IMPORT_LITE_BAR];
+
+  optional string default_string_piece_extension_lite = 84 [ctype=STRING_PIECE,
+                                                            default="abc"];
+  optional string default_cord_extension_lite = 85 [ctype=CORD, default="123"];
+}
+
+message TestPackedExtensionsLite {
+  extensions 1 to max;
+}
+
+extend TestPackedExtensionsLite {
+  repeated    int32 packed_int32_extension_lite    =  90 [packed = true];
+  repeated    int64 packed_int64_extension_lite    =  91 [packed = true];
+  repeated   uint32 packed_uint32_extension_lite   =  92 [packed = true];
+  repeated   uint64 packed_uint64_extension_lite   =  93 [packed = true];
+  repeated   sint32 packed_sint32_extension_lite   =  94 [packed = true];
+  repeated   sint64 packed_sint64_extension_lite   =  95 [packed = true];
+  repeated  fixed32 packed_fixed32_extension_lite  =  96 [packed = true];
+  repeated  fixed64 packed_fixed64_extension_lite  =  97 [packed = true];
+  repeated sfixed32 packed_sfixed32_extension_lite =  98 [packed = true];
+  repeated sfixed64 packed_sfixed64_extension_lite =  99 [packed = true];
+  repeated    float packed_float_extension_lite    = 100 [packed = true];
+  repeated   double packed_double_extension_lite   = 101 [packed = true];
+  repeated     bool packed_bool_extension_lite     = 102 [packed = true];
+  repeated ForeignEnumLite packed_enum_extension_lite = 103 [packed = true];
+}
+
+message TestNestedExtensionLite {
+  extend TestAllExtensionsLite {
+    optional int32 nested_extension = 12345;
+  }
+}
+
+// Test that deprecated fields work.  We only verify that they compile (at one
+// point this failed).
+message TestDeprecatedLite {
+  optional int32 deprecated_field = 1 [deprecated = true];
+}

+ 49 - 0
csharp/protos/google/protobuf/unittest_lite_imports_nonlite.proto

@@ -0,0 +1,49 @@
+// Additional options required for C# generation. File from copyright
+// line onwards is as per original distribution.
+import "google/protobuf/csharp_options.proto";
+option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos";
+option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestLiteImportNonLiteProtoFile";
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Author: kenton@google.com (Kenton Varda)
+//
+// Tests that a "lite" message can import a regular message.
+
+package protobuf_unittest;
+
+import "google/protobuf/unittest.proto";
+
+option optimize_for = LITE_RUNTIME;
+
+message TestLiteImportsNonlite {
+  optional TestAllTypes message = 1;
+}

+ 78 - 0
csharp/protos/google/protobuf/unittest_mset.proto

@@ -0,0 +1,78 @@
+// Additional options required for C# generation. File from copyright
+// line onwards is as per original distribution.
+import "google/protobuf/csharp_options.proto";
+option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos";
+option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestMessageSetProtoFile";
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Author: kenton@google.com (Kenton Varda)
+//  Based on original Protocol Buffers design by
+//  Sanjay Ghemawat, Jeff Dean, and others.
+//
+// This file contains messages for testing message_set_wire_format.
+
+package protobuf_unittest;
+
+option optimize_for = SPEED;
+
+// A message with message_set_wire_format.
+message TestMessageSet {
+  option message_set_wire_format = true;
+  extensions 4 to max;
+}
+
+message TestMessageSetContainer {
+  optional TestMessageSet message_set = 1;
+}
+
+message TestMessageSetExtension1 {
+  extend TestMessageSet {
+    optional TestMessageSetExtension1 message_set_extension = 1545008;
+  }
+  optional int32 i = 15;
+}
+
+message TestMessageSetExtension2 {
+  extend TestMessageSet {
+    optional TestMessageSetExtension2 message_set_extension = 1547769;
+  }
+  optional string str = 25;
+}
+
+// MessageSet wire format is equivalent to this.
+message RawMessageSet {
+  repeated group Item = 1 {
+    required int32 type_id = 2;
+    required bytes message = 3;
+  }
+}
+

+ 58 - 0
csharp/protos/google/protobuf/unittest_no_generic_services.proto

@@ -0,0 +1,58 @@
+// Additional options required for C# generation. File from copyright
+// line onwards is as per original distribution.
+import "google/protobuf/csharp_options.proto";
+option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos.NoGenericService";
+option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestNoGenericServicesProtoFile";
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Author: kenton@google.com (Kenton Varda)
+
+package google.protobuf.no_generic_services_test;
+
+// *_generic_services are false by default.
+
+message TestMessage {
+  optional int32 a = 1;
+  extensions 1000 to max;
+}
+
+enum TestEnum {
+  FOO = 1;
+}
+
+extend TestMessage {
+  optional int32 test_extension = 1000;
+}
+
+service TestService {
+  rpc Foo(TestMessage) returns(TestMessage);
+}

+ 67 - 0
csharp/protos/google/protobuf/unittest_optimize_for.proto

@@ -0,0 +1,67 @@
+// Additional options required for C# generation. File from copyright
+// line onwards is as per original distribution.
+import "google/protobuf/csharp_options.proto";
+option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos";
+option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestOptimizeForProtoFile";
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Author: kenton@google.com (Kenton Varda)
+//  Based on original Protocol Buffers design by
+//  Sanjay Ghemawat, Jeff Dean, and others.
+//
+// A proto file which uses optimize_for = CODE_SIZE.
+
+import "google/protobuf/unittest.proto";
+
+package protobuf_unittest;
+
+option optimize_for = CODE_SIZE;
+
+message TestOptimizedForSize {
+  optional int32 i = 1;
+  optional ForeignMessage msg = 19;
+
+  extensions 1000 to max;
+
+  extend TestOptimizedForSize {
+    optional int32 test_extension = 1234;
+    optional TestRequiredOptimizedForSize test_extension2 = 1235;
+  }
+}
+
+message TestRequiredOptimizedForSize {
+  required int32 x = 1;
+}
+ 
+message TestOptionalOptimizedForSize {
+  optional TestRequiredOptimizedForSize o = 1;
+}

+ 140 - 0
csharp/protos/google/test/google_size.proto

@@ -0,0 +1,140 @@
+package unittest_google_size;
+
+import "google/protobuf/csharp_options.proto";
+option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos";
+option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestGoogleSizeProtoFile";
+
+option java_outer_classname = "GoogleSize";
+option optimize_for = CODE_SIZE;
+
+message SizeMessage1 {
+  required string field1 = 1;
+  optional string field9 = 9;
+  optional string field18 = 18;
+  optional bool field80 = 80 [default=false];
+  optional bool field81 = 81 [default=true];
+  required int32 field2 = 2;
+  required int32 field3 = 3;
+  optional int32 field280 = 280;
+  optional int32 field6 = 6 [default=0];
+  optional int64 field22 = 22;
+  optional string field4 = 4;
+  repeated fixed64 field5 = 5;
+  optional bool field59 = 59 [default=false];
+  optional string field7 = 7;
+  optional int32 field16 = 16;
+  optional int32 field130 = 130 [default=0];
+  optional bool field12 = 12 [default=true];
+  optional bool field17 = 17 [default=true];
+  optional bool field13 = 13 [default=true];
+  optional bool field14 = 14 [default=true];
+  optional int32 field104 = 104 [default=0];
+  optional int32 field100 = 100 [default=0];
+  optional int32 field101 = 101 [default=0];
+  optional string field102 = 102;
+  optional string field103 = 103;
+  optional int32 field29 = 29 [default=0];
+  optional bool field30 = 30 [default=false];
+  optional int32 field60 = 60 [default=-1];
+  optional int32 field271 = 271 [default=-1];
+  optional int32 field272 = 272 [default=-1];
+  optional int32 field150 = 150;
+  optional int32 field23 = 23 [default=0];
+  optional bool field24 = 24 [default=false];
+  optional int32 field25 = 25 [default=0];
+  optional SizeMessage1SubMessage field15 = 15;
+  optional bool field78 = 78;
+  optional int32 field67 = 67 [default=0];
+  optional int32 field68 = 68;
+  optional int32 field128 = 128 [default=0];
+  optional string field129 = 129 [default="xxxxxxxxxxxxxxxxxxxxx"];
+  optional int32 field131 = 131 [default=0];
+}
+
+message SizeMessage1SubMessage {
+  optional int32 field1 = 1 [default=0];
+  optional int32 field2 = 2 [default=0];
+  optional int32 field3 = 3 [default=0];
+  optional string field15 = 15;
+  optional bool field12 = 12 [default=true];
+  optional int64 field13 = 13;
+  optional int64 field14 = 14;
+  optional int32 field16 = 16;
+  optional int32 field19 = 19 [default=2];
+  optional bool field20  = 20 [default=true];
+  optional bool field28 = 28 [default=true];
+  optional fixed64 field21 = 21;
+  optional int32 field22 = 22;
+  optional bool field23 = 23 [ default=false ];
+  optional bool field206 = 206 [default=false];
+  optional fixed32 field203 = 203;
+  optional int32 field204 = 204;
+  optional string field205 = 205;
+  optional uint64 field207 = 207;
+  optional uint64 field300 = 300;
+}
+
+message SizeMessage2 {
+  optional string field1 = 1;
+  optional int64 field3 = 3;
+  optional int64 field4 = 4;
+  optional int64 field30 = 30;
+  optional bool field75  = 75 [default=false];
+  optional string field6 = 6;
+  optional bytes field2 = 2;
+  optional int32 field21 = 21 [default=0];
+  optional int32 field71 = 71;
+  optional float field25 = 25;
+  optional int32 field109 = 109 [default=0];
+  optional int32 field210 = 210 [default=0];
+  optional int32 field211 = 211 [default=0];
+  optional int32 field212 = 212 [default=0];
+  optional int32 field213 = 213 [default=0];
+  optional int32 field216 = 216 [default=0];
+  optional int32 field217 = 217 [default=0];
+  optional int32 field218 = 218 [default=0];
+  optional int32 field220 = 220 [default=0];
+  optional int32 field221 = 221 [default=0];
+  optional float field222 = 222 [default=0.0];
+  optional int32 field63 = 63;
+
+  repeated group Group1 = 10 {
+    required float field11 = 11;
+    optional float field26 = 26;
+    optional string field12 = 12;
+    optional string field13 = 13;
+    repeated string field14 = 14;
+    required uint64 field15 = 15;
+    optional int32 field5 = 5;
+    optional string field27 = 27;
+    optional int32 field28 = 28;
+    optional string field29 = 29;
+    optional string field16 = 16;
+    repeated string field22 = 22;
+    repeated int32 field73 = 73;
+    optional int32 field20 = 20 [default=0];
+    optional string field24 = 24;
+    optional SizeMessage2GroupedMessage field31 = 31;
+  }
+  repeated string field128 = 128;
+  optional int64 field131 = 131;
+  repeated string field127 = 127;
+  optional int32 field129 = 129;
+  repeated int64 field130 = 130;
+  optional bool field205 = 205 [default=false];
+  optional bool field206 = 206 [default=false];
+}
+
+message SizeMessage2GroupedMessage {
+  optional float field1 = 1;
+  optional float field2 = 2;
+  optional float field3 = 3 [default=0.0];
+  optional bool field4 = 4;
+  optional bool field5 = 5;
+  optional bool field6 = 6 [default=true];
+  optional bool field7 = 7 [default=false];
+  optional float field8 = 8;
+  optional bool field9 = 9;
+  optional float field10 = 10;
+  optional int64 field11 = 11;
+}

+ 140 - 0
csharp/protos/google/test/google_speed.proto

@@ -0,0 +1,140 @@
+package unittest_google_speed;
+
+import "google/protobuf/csharp_options.proto";
+option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos";
+option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestGoogleSpeedProtoFile";
+
+option java_outer_classname = "GoogleSpeed";
+option optimize_for = SPEED;
+
+message SpeedMessage1 {
+  required string field1 = 1;
+  optional string field9 = 9;
+  optional string field18 = 18;
+  optional bool field80 = 80 [default=false];
+  optional bool field81 = 81 [default=true];
+  required int32 field2 = 2;
+  required int32 field3 = 3;
+  optional int32 field280 = 280;
+  optional int32 field6 = 6 [default=0];
+  optional int64 field22 = 22;
+  optional string field4 = 4;
+  repeated fixed64 field5 = 5;
+  optional bool field59 = 59 [default=false];
+  optional string field7 = 7;
+  optional int32 field16 = 16;
+  optional int32 field130 = 130 [default=0];
+  optional bool field12 = 12 [default=true];
+  optional bool field17 = 17 [default=true];
+  optional bool field13 = 13 [default=true];
+  optional bool field14 = 14 [default=true];
+  optional int32 field104 = 104 [default=0];
+  optional int32 field100 = 100 [default=0];
+  optional int32 field101 = 101 [default=0];
+  optional string field102 = 102;
+  optional string field103 = 103;
+  optional int32 field29 = 29 [default=0];
+  optional bool field30 = 30 [default=false];
+  optional int32 field60 = 60 [default=-1];
+  optional int32 field271 = 271 [default=-1];
+  optional int32 field272 = 272 [default=-1];
+  optional int32 field150 = 150;
+  optional int32 field23 = 23 [default=0];
+  optional bool field24 = 24 [default=false];
+  optional int32 field25 = 25 [default=0];
+  optional SpeedMessage1SubMessage field15 = 15;
+  optional bool field78 = 78;
+  optional int32 field67 = 67 [default=0];
+  optional int32 field68 = 68;
+  optional int32 field128 = 128 [default=0];
+  optional string field129 = 129 [default="xxxxxxxxxxxxxxxxxxxxx"];
+  optional int32 field131 = 131 [default=0];
+}
+
+message SpeedMessage1SubMessage {
+  optional int32 field1 = 1 [default=0];
+  optional int32 field2 = 2 [default=0];
+  optional int32 field3 = 3 [default=0];
+  optional string field15 = 15;
+  optional bool field12 = 12 [default=true];
+  optional int64 field13 = 13;
+  optional int64 field14 = 14;
+  optional int32 field16 = 16;
+  optional int32 field19 = 19 [default=2];
+  optional bool field20  = 20 [default=true];
+  optional bool field28 = 28 [default=true];
+  optional fixed64 field21 = 21;
+  optional int32 field22 = 22;
+  optional bool field23 = 23 [ default=false ];
+  optional bool field206 = 206 [default=false];
+  optional fixed32 field203 = 203;
+  optional int32 field204 = 204;
+  optional string field205 = 205;
+  optional uint64 field207 = 207;
+  optional uint64 field300 = 300;
+}
+
+message SpeedMessage2 {
+  optional string field1 = 1;
+  optional int64 field3 = 3;
+  optional int64 field4 = 4;
+  optional int64 field30 = 30;
+  optional bool field75  = 75 [default=false];
+  optional string field6 = 6;
+  optional bytes field2 = 2;
+  optional int32 field21 = 21 [default=0];
+  optional int32 field71 = 71;
+  optional float field25 = 25;
+  optional int32 field109 = 109 [default=0];
+  optional int32 field210 = 210 [default=0];
+  optional int32 field211 = 211 [default=0];
+  optional int32 field212 = 212 [default=0];
+  optional int32 field213 = 213 [default=0];
+  optional int32 field216 = 216 [default=0];
+  optional int32 field217 = 217 [default=0];
+  optional int32 field218 = 218 [default=0];
+  optional int32 field220 = 220 [default=0];
+  optional int32 field221 = 221 [default=0];
+  optional float field222 = 222 [default=0.0];
+  optional int32 field63 = 63;
+
+  repeated group Group1 = 10 {
+    required float field11 = 11;
+    optional float field26 = 26;
+    optional string field12 = 12;
+    optional string field13 = 13;
+    repeated string field14 = 14;
+    required uint64 field15 = 15;
+    optional int32 field5 = 5;
+    optional string field27 = 27;
+    optional int32 field28 = 28;
+    optional string field29 = 29;
+    optional string field16 = 16;
+    repeated string field22 = 22;
+    repeated int32 field73 = 73;
+    optional int32 field20 = 20 [default=0];
+    optional string field24 = 24;
+    optional SpeedMessage2GroupedMessage field31 = 31;
+  }
+  repeated string field128 = 128;
+  optional int64 field131 = 131;
+  repeated string field127 = 127;
+  optional int32 field129 = 129;
+  repeated int64 field130 = 130;
+  optional bool field205 = 205 [default=false];
+  optional bool field206 = 206 [default=false];
+}
+
+message SpeedMessage2GroupedMessage {
+  optional float field1 = 1;
+  optional float field2 = 2;
+  optional float field3 = 3 [default=0.0];
+  optional bool field4 = 4;
+  optional bool field5 = 5;
+  optional bool field6 = 6 [default=true];
+  optional bool field7 = 7 [default=false];
+  optional float field8 = 8;
+  optional bool field9 = 9;
+  optional float field10 = 10;
+  optional int64 field11 = 11;
+}

+ 44 - 0
csharp/protos/npp.language.xml

@@ -0,0 +1,44 @@
+<NotepadPlus>
+<!--
+Defines syntax highlighting for Notepad++.
+1. Install Notepad++ from http://notepad-plus-plus.org
+2. Open Notepad++, from the View menu, select "User-Defined Dialog..."
+3. Click the "Import..." button and select this file
+4. Restart Notepad++
+5. Open and edit any *.proto file
+-->
+    <UserLang name="Proto Buffer" ext="proto">
+        <Settings>
+            <Global caseIgnored="no" />
+            <TreatAsSymbol comment="no" commentLine="yes" />
+            <Prefix words1="no" words2="no" words3="no" words4="yes" />
+        </Settings>
+        <KeywordLists>
+            <Keywords name="Delimiters">[00]00</Keywords>
+            <Keywords name="Folder+">{</Keywords>
+            <Keywords name="Folder-">}</Keywords>
+            <Keywords name="Operators">=</Keywords>
+            <Keywords name="Comment"> 1option 1package 1import 2; 0//</Keywords>
+            <Keywords name="Words1">message enum service extend</Keywords>
+            <Keywords name="Words2">required optional repeated extensions to rpc returns</Keywords>
+            <Keywords name="Words3">double float int32 int64 uint32 uint64 sint32 sint64 fixed32 fixed64 sfixed32 sfixed64 bool string bytes</Keywords>
+            <Keywords name="Words4"></Keywords>
+        </KeywordLists>
+        <Styles>
+            <WordsStyle name="DEFAULT" styleID="11" fgColor="000000" bgColor="FFFFFF" fontStyle="0" />
+            <WordsStyle name="FOLDEROPEN" styleID="12" fgColor="000000" bgColor="FFFFFF" fontStyle="1" />
+            <WordsStyle name="FOLDERCLOSE" styleID="13" fgColor="000000" bgColor="FFFFFF" fontStyle="1" />
+            <WordsStyle name="KEYWORD1" styleID="5" fgColor="0000FF" bgColor="FFFFFF" fontStyle="0" />
+            <WordsStyle name="KEYWORD2" styleID="6" fgColor="0080C0" bgColor="FFFFFF" fontStyle="0" />
+            <WordsStyle name="KEYWORD3" styleID="7" fgColor="0000FF" bgColor="FFFFFF" fontStyle="0" />
+            <WordsStyle name="KEYWORD4" styleID="8" fgColor="008040" bgColor="FFFFFF" fontStyle="0" />
+            <WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontStyle="0" />
+            <WordsStyle name="COMMENT LINE" styleID="2" fgColor="949494" bgColor="FFFFFF" fontStyle="0" />
+            <WordsStyle name="NUMBER" styleID="4" fgColor="FF0000" bgColor="FFFFFF" fontStyle="0" />
+            <WordsStyle name="OPERATOR" styleID="10" fgColor="000000" bgColor="FFFFFF" fontStyle="0" />
+            <WordsStyle name="DELIMINER1" styleID="14" fgColor="800080" bgColor="FFFFFF" fontStyle="0" />
+            <WordsStyle name="DELIMINER2" styleID="15" fgColor="808080" bgColor="FFFFFF" fontStyle="0" />
+            <WordsStyle name="DELIMINER3" styleID="16" fgColor="000000" bgColor="FFFFFF" fontStyle="0" />
+        </Styles>
+    </UserLang>
+</NotepadPlus>

+ 31 - 0
csharp/protos/tutorial/addressbook.proto

@@ -0,0 +1,31 @@
+package tutorial;
+ 
+import "google/protobuf/csharp_options.proto";
+option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.Examples.AddressBook";
+option (google.protobuf.csharp_file_options).umbrella_classname = "AddressBookProtos";
+
+option optimize_for = SPEED;
+
+message Person {
+  required string name = 1;
+  required int32 id = 2;        // Unique ID number for this person.
+  optional string email = 3;
+ 
+  enum PhoneType {
+    MOBILE = 0;
+    HOME = 1;
+    WORK = 2;
+  }
+ 
+  message PhoneNumber {
+    required string number = 1;
+    optional PhoneType type = 2 [default = HOME];
+  }
+ 
+  repeated PhoneNumber phone = 4;
+}
+ 
+// Our address book file is just one of these.
+message AddressBook {
+  repeated Person person = 1;
+}

+ 136 - 0
csharp/src/AddressBook/AddPerson.cs

@@ -0,0 +1,136 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+using System.IO;
+
+namespace Google.ProtocolBuffers.Examples.AddressBook
+{
+    internal class AddPerson
+    {
+        /// <summary>
+        /// Builds a person based on user input
+        /// </summary>
+        private static Person PromptForAddress(TextReader input, TextWriter output)
+        {
+            Person.Builder person = Person.CreateBuilder();
+
+            output.Write("Enter person ID: ");
+            person.Id = int.Parse(input.ReadLine());
+
+            output.Write("Enter name: ");
+            person.Name = input.ReadLine();
+
+            output.Write("Enter email address (blank for none): ");
+            string email = input.ReadLine();
+            if (email.Length > 0)
+            {
+                person.Email = email;
+            }
+
+            while (true)
+            {
+                output.Write("Enter a phone number (or leave blank to finish): ");
+                string number = input.ReadLine();
+                if (number.Length == 0)
+                {
+                    break;
+                }
+
+                Person.Types.PhoneNumber.Builder phoneNumber =
+                    Person.Types.PhoneNumber.CreateBuilder().SetNumber(number);
+
+                output.Write("Is this a mobile, home, or work phone? ");
+                String type = input.ReadLine();
+                switch (type)
+                {
+                    case "mobile":
+                        phoneNumber.Type = Person.Types.PhoneType.MOBILE;
+                        break;
+                    case "home":
+                        phoneNumber.Type = Person.Types.PhoneType.HOME;
+                        break;
+                    case "work":
+                        phoneNumber.Type = Person.Types.PhoneType.WORK;
+                        break;
+                    default:
+                        output.Write("Unknown phone type. Using default.");
+                        break;
+                }
+
+                person.AddPhone(phoneNumber);
+            }
+            return person.Build();
+        }
+
+        /// <summary>
+        /// Entry point - loads an existing addressbook or creates a new one,
+        /// then writes it back to the file.
+        /// </summary>
+        public static int Main(string[] args)
+        {
+            if (args.Length != 1)
+            {
+                Console.Error.WriteLine("Usage:  AddPerson ADDRESS_BOOK_FILE");
+                return -1;
+            }
+
+            AddressBook.Builder addressBook = AddressBook.CreateBuilder();
+
+            if (File.Exists(args[0]))
+            {
+                using (Stream file = File.OpenRead(args[0]))
+                {
+                    addressBook.MergeFrom(file);
+                }
+            }
+            else
+            {
+                Console.WriteLine("{0}: File not found. Creating a new file.", args[0]);
+            }
+
+            // Add an address.
+            addressBook.AddPerson(PromptForAddress(Console.In, Console.Out));
+
+            // Write the new address book back to disk.
+            using (Stream output = File.OpenWrite(args[0]))
+            {
+                addressBook.Build().WriteTo(output);
+            }
+            return 0;
+        }
+    }
+}

+ 75 - 0
csharp/src/AddressBook/AddressBook.csproj

@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <EnvironmentFlavor>CLIENTPROFILE</EnvironmentFlavor>
+    <EnvironmentTemplate>NET35</EnvironmentTemplate>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{A31F5FB2-4FF3-432A-B35B-5CD203606311}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Google.ProtocolBuffers.Examples.AddressBook</RootNamespace>
+    <AssemblyName>AddressBook</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <StartupObject>Google.ProtocolBuffers.Examples.AddressBook.Program</StartupObject>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\NET35\Debug</OutputPath>
+    <IntermediateOutputPath>obj\NET35\Debug\</IntermediateOutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
+    <NoStdLib>true</NoStdLib>
+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\NET35\Release</OutputPath>
+    <IntermediateOutputPath>obj\NET35\Release\</IntermediateOutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
+    <NoStdLib>true</NoStdLib>
+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="mscorlib" />
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AddPerson.cs" />
+    <Compile Include="AddressBookProtos.cs" />
+    <Compile Include="SampleUsage.cs" />
+    <Compile Include="ListPeople.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\ProtocolBuffers\ProtocolBuffers.csproj">
+      <Project>{6908BDCE-D925-43F3-94AC-A531E6DF2591}</Project>
+      <Name>ProtocolBuffers</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="app.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>

+ 1160 - 0
csharp/src/AddressBook/AddressBookProtos.cs

@@ -0,0 +1,1160 @@
+// Generated by ProtoGen, Version=2.4.1.555, Culture=neutral, PublicKeyToken=55f7125234beb589.  DO NOT EDIT!
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.ProtocolBuffers;
+using pbc = global::Google.ProtocolBuffers.Collections;
+using pbd = global::Google.ProtocolBuffers.Descriptors;
+using scg = global::System.Collections.Generic;
+namespace Google.ProtocolBuffers.Examples.AddressBook {
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public static partial class AddressBookProtos {
+  
+    #region Extension registration
+    public static void RegisterAllExtensions(pb::ExtensionRegistry registry) {
+    }
+    #endregion
+    #region Static variables
+    internal static pbd::MessageDescriptor internal__static_tutorial_Person__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.Examples.AddressBook.Person, global::Google.ProtocolBuffers.Examples.AddressBook.Person.Builder> internal__static_tutorial_Person__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_tutorial_Person_PhoneNumber__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber, global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber.Builder> internal__static_tutorial_Person_PhoneNumber__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_tutorial_AddressBook__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.Examples.AddressBook.AddressBook, global::Google.ProtocolBuffers.Examples.AddressBook.AddressBook.Builder> internal__static_tutorial_AddressBook__FieldAccessorTable;
+    #endregion
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbd::FileDescriptor descriptor;
+    
+    static AddressBookProtos() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Chp0dXRvcmlhbC9hZGRyZXNzYm9vay5wcm90bxIIdHV0b3JpYWwaJGdvb2ds", 
+            "ZS9wcm90b2J1Zi9jc2hhcnBfb3B0aW9ucy5wcm90byLaAQoGUGVyc29uEgwK", 
+            "BG5hbWUYASACKAkSCgoCaWQYAiACKAUSDQoFZW1haWwYAyABKAkSKwoFcGhv", 
+            "bmUYBCADKAsyHC50dXRvcmlhbC5QZXJzb24uUGhvbmVOdW1iZXIaTQoLUGhv", 
+            "bmVOdW1iZXISDgoGbnVtYmVyGAEgAigJEi4KBHR5cGUYAiABKA4yGi50dXRv", 
+            "cmlhbC5QZXJzb24uUGhvbmVUeXBlOgRIT01FIisKCVBob25lVHlwZRIKCgZN", 
+            "T0JJTEUQABIICgRIT01FEAESCAoEV09SSxACIi8KC0FkZHJlc3NCb29rEiAK", 
+            "BnBlcnNvbhgBIAMoCzIQLnR1dG9yaWFsLlBlcnNvbkJFSAHCPkAKK0dvb2ds", 
+            "ZS5Qcm90b2NvbEJ1ZmZlcnMuRXhhbXBsZXMuQWRkcmVzc0Jvb2sSEUFkZHJl", 
+          "c3NCb29rUHJvdG9z"));
+      pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) {
+        descriptor = root;
+        internal__static_tutorial_Person__Descriptor = Descriptor.MessageTypes[0];
+        internal__static_tutorial_Person__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.Examples.AddressBook.Person, global::Google.ProtocolBuffers.Examples.AddressBook.Person.Builder>(internal__static_tutorial_Person__Descriptor,
+                new string[] { "Name", "Id", "Email", "Phone", });
+        internal__static_tutorial_Person_PhoneNumber__Descriptor = internal__static_tutorial_Person__Descriptor.NestedTypes[0];
+        internal__static_tutorial_Person_PhoneNumber__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber, global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber.Builder>(internal__static_tutorial_Person_PhoneNumber__Descriptor,
+                new string[] { "Number", "Type", });
+        internal__static_tutorial_AddressBook__Descriptor = Descriptor.MessageTypes[1];
+        internal__static_tutorial_AddressBook__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.Examples.AddressBook.AddressBook, global::Google.ProtocolBuffers.Examples.AddressBook.AddressBook.Builder>(internal__static_tutorial_AddressBook__Descriptor,
+                new string[] { "Person", });
+        pb::ExtensionRegistry registry = pb::ExtensionRegistry.CreateInstance();
+        RegisterAllExtensions(registry);
+        global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.RegisterAllExtensions(registry);
+        return registry;
+      };
+      pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,
+          new pbd::FileDescriptor[] {
+          global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.Descriptor, 
+          }, assigner);
+    }
+    #endregion
+    
+  }
+  #region Messages
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class Person : pb::GeneratedMessage<Person, Person.Builder> {
+    private Person() { }
+    private static readonly Person defaultInstance = new Person().MakeReadOnly();
+    private static readonly string[] _personFieldNames = new string[] { "email", "id", "name", "phone" };
+    private static readonly uint[] _personFieldTags = new uint[] { 26, 16, 10, 34 };
+    public static Person DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override Person DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override Person ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.Examples.AddressBook.AddressBookProtos.internal__static_tutorial_Person__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<Person, Person.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.Examples.AddressBook.AddressBookProtos.internal__static_tutorial_Person__FieldAccessorTable; }
+    }
+    
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public static partial class Types {
+      public enum PhoneType {
+        MOBILE = 0,
+        HOME = 1,
+        WORK = 2,
+      }
+      
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class PhoneNumber : pb::GeneratedMessage<PhoneNumber, PhoneNumber.Builder> {
+        private PhoneNumber() { }
+        private static readonly PhoneNumber defaultInstance = new PhoneNumber().MakeReadOnly();
+        private static readonly string[] _phoneNumberFieldNames = new string[] { "number", "type" };
+        private static readonly uint[] _phoneNumberFieldTags = new uint[] { 10, 16 };
+        public static PhoneNumber DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override PhoneNumber DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+        
+        protected override PhoneNumber ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.Examples.AddressBook.AddressBookProtos.internal__static_tutorial_Person_PhoneNumber__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<PhoneNumber, PhoneNumber.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.Examples.AddressBook.AddressBookProtos.internal__static_tutorial_Person_PhoneNumber__FieldAccessorTable; }
+        }
+        
+        public const int NumberFieldNumber = 1;
+        private bool hasNumber;
+        private string number_ = "";
+        public bool HasNumber {
+          get { return hasNumber; }
+        }
+        public string Number {
+          get { return number_; }
+        }
+        
+        public const int TypeFieldNumber = 2;
+        private bool hasType;
+        private global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneType type_ = global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneType.HOME;
+        public bool HasType {
+          get { return hasType; }
+        }
+        public global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneType Type {
+          get { return type_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasNumber) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          CalcSerializedSize();
+          string[] field_names = _phoneNumberFieldNames;
+          if (hasNumber) {
+            output.WriteString(1, field_names[0], Number);
+          }
+          if (hasType) {
+            output.WriteEnum(2, field_names[1], (int) Type, Type);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            return CalcSerializedSize();
+          }
+        }
+        
+        private int CalcSerializedSize() {
+          int size = memoizedSerializedSize;
+          if (size != -1) return size;
+          
+          size = 0;
+          if (hasNumber) {
+            size += pb::CodedOutputStream.ComputeStringSize(1, Number);
+          }
+          if (hasType) {
+            size += pb::CodedOutputStream.ComputeEnumSize(2, (int) Type);
+          }
+          size += UnknownFields.SerializedSize;
+          memoizedSerializedSize = size;
+          return size;
+        }
+        public static PhoneNumber ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static PhoneNumber ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static PhoneNumber ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static PhoneNumber ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static PhoneNumber ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static PhoneNumber ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static PhoneNumber ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static PhoneNumber ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static PhoneNumber ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static PhoneNumber ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private PhoneNumber MakeReadOnly() {
+          return this;
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(PhoneNumber prototype) {
+          return new Builder(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public sealed partial class Builder : pb::GeneratedBuilder<PhoneNumber, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(PhoneNumber cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+          
+          private bool resultIsReadOnly;
+          private PhoneNumber result;
+          
+          private PhoneNumber PrepareBuilder() {
+            if (resultIsReadOnly) {
+              PhoneNumber original = result;
+              result = new PhoneNumber();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+          
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+          
+          protected override PhoneNumber MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+          
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+          
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber.Descriptor; }
+          }
+          
+          public override PhoneNumber DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber.DefaultInstance; }
+          }
+          
+          public override PhoneNumber BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is PhoneNumber) {
+              return MergeFrom((PhoneNumber) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(PhoneNumber other) {
+            if (other == global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasNumber) {
+              Number = other.Number;
+            }
+            if (other.HasType) {
+              Type = other.Type;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_phoneNumberFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _phoneNumberFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 10: {
+                  result.hasNumber = input.ReadString(ref result.number_);
+                  break;
+                }
+                case 16: {
+                  object unknown;
+                  if(input.ReadEnum(ref result.type_, out unknown)) {
+                    result.hasType = true;
+                  } else if(unknown is int) {
+                    if (unknownFields == null) {
+                      unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                    }
+                    unknownFields.MergeVarintField(2, (ulong)(int)unknown);
+                  }
+                  break;
+                }
+              }
+            }
+            
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+          
+          
+          public bool HasNumber {
+            get { return result.hasNumber; }
+          }
+          public string Number {
+            get { return result.Number; }
+            set { SetNumber(value); }
+          }
+          public Builder SetNumber(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasNumber = true;
+            result.number_ = value;
+            return this;
+          }
+          public Builder ClearNumber() {
+            PrepareBuilder();
+            result.hasNumber = false;
+            result.number_ = "";
+            return this;
+          }
+          
+          public bool HasType {
+           get { return result.hasType; }
+          }
+          public global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneType Type {
+            get { return result.Type; }
+            set { SetType(value); }
+          }
+          public Builder SetType(global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneType value) {
+            PrepareBuilder();
+            result.hasType = true;
+            result.type_ = value;
+            return this;
+          }
+          public Builder ClearType() {
+            PrepareBuilder();
+            result.hasType = false;
+            result.type_ = global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneType.HOME;
+            return this;
+          }
+        }
+        static PhoneNumber() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.Examples.AddressBook.AddressBookProtos.Descriptor, null);
+        }
+      }
+      
+    }
+    #endregion
+    
+    public const int NameFieldNumber = 1;
+    private bool hasName;
+    private string name_ = "";
+    public bool HasName {
+      get { return hasName; }
+    }
+    public string Name {
+      get { return name_; }
+    }
+    
+    public const int IdFieldNumber = 2;
+    private bool hasId;
+    private int id_;
+    public bool HasId {
+      get { return hasId; }
+    }
+    public int Id {
+      get { return id_; }
+    }
+    
+    public const int EmailFieldNumber = 3;
+    private bool hasEmail;
+    private string email_ = "";
+    public bool HasEmail {
+      get { return hasEmail; }
+    }
+    public string Email {
+      get { return email_; }
+    }
+    
+    public const int PhoneFieldNumber = 4;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber> phone_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber>();
+    public scg::IList<global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber> PhoneList {
+      get { return phone_; }
+    }
+    public int PhoneCount {
+      get { return phone_.Count; }
+    }
+    public global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber GetPhone(int index) {
+      return phone_[index];
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (!hasName) return false;
+        if (!hasId) return false;
+        foreach (global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber element in PhoneList) {
+          if (!element.IsInitialized) return false;
+        }
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _personFieldNames;
+      if (hasName) {
+        output.WriteString(1, field_names[2], Name);
+      }
+      if (hasId) {
+        output.WriteInt32(2, field_names[1], Id);
+      }
+      if (hasEmail) {
+        output.WriteString(3, field_names[0], Email);
+      }
+      if (phone_.Count > 0) {
+        output.WriteMessageArray(4, field_names[3], phone_);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+      
+      size = 0;
+      if (hasName) {
+        size += pb::CodedOutputStream.ComputeStringSize(1, Name);
+      }
+      if (hasId) {
+        size += pb::CodedOutputStream.ComputeInt32Size(2, Id);
+      }
+      if (hasEmail) {
+        size += pb::CodedOutputStream.ComputeStringSize(3, Email);
+      }
+      foreach (global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber element in PhoneList) {
+        size += pb::CodedOutputStream.ComputeMessageSize(4, element);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static Person ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static Person ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static Person ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static Person ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static Person ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static Person ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static Person ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static Person ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static Person ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static Person ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private Person MakeReadOnly() {
+      phone_.MakeReadOnly();
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(Person prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<Person, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(Person cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private Person result;
+      
+      private Person PrepareBuilder() {
+        if (resultIsReadOnly) {
+          Person original = result;
+          result = new Person();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override Person MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.Examples.AddressBook.Person.Descriptor; }
+      }
+      
+      public override Person DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.Examples.AddressBook.Person.DefaultInstance; }
+      }
+      
+      public override Person BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is Person) {
+          return MergeFrom((Person) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(Person other) {
+        if (other == global::Google.ProtocolBuffers.Examples.AddressBook.Person.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasName) {
+          Name = other.Name;
+        }
+        if (other.HasId) {
+          Id = other.Id;
+        }
+        if (other.HasEmail) {
+          Email = other.Email;
+        }
+        if (other.phone_.Count != 0) {
+          result.phone_.Add(other.phone_);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_personFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _personFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              result.hasName = input.ReadString(ref result.name_);
+              break;
+            }
+            case 16: {
+              result.hasId = input.ReadInt32(ref result.id_);
+              break;
+            }
+            case 26: {
+              result.hasEmail = input.ReadString(ref result.email_);
+              break;
+            }
+            case 34: {
+              input.ReadMessageArray(tag, field_name, result.phone_, global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber.DefaultInstance, extensionRegistry);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public bool HasName {
+        get { return result.hasName; }
+      }
+      public string Name {
+        get { return result.Name; }
+        set { SetName(value); }
+      }
+      public Builder SetName(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasName = true;
+        result.name_ = value;
+        return this;
+      }
+      public Builder ClearName() {
+        PrepareBuilder();
+        result.hasName = false;
+        result.name_ = "";
+        return this;
+      }
+      
+      public bool HasId {
+        get { return result.hasId; }
+      }
+      public int Id {
+        get { return result.Id; }
+        set { SetId(value); }
+      }
+      public Builder SetId(int value) {
+        PrepareBuilder();
+        result.hasId = true;
+        result.id_ = value;
+        return this;
+      }
+      public Builder ClearId() {
+        PrepareBuilder();
+        result.hasId = false;
+        result.id_ = 0;
+        return this;
+      }
+      
+      public bool HasEmail {
+        get { return result.hasEmail; }
+      }
+      public string Email {
+        get { return result.Email; }
+        set { SetEmail(value); }
+      }
+      public Builder SetEmail(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasEmail = true;
+        result.email_ = value;
+        return this;
+      }
+      public Builder ClearEmail() {
+        PrepareBuilder();
+        result.hasEmail = false;
+        result.email_ = "";
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber> PhoneList {
+        get { return PrepareBuilder().phone_; }
+      }
+      public int PhoneCount {
+        get { return result.PhoneCount; }
+      }
+      public global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber GetPhone(int index) {
+        return result.GetPhone(index);
+      }
+      public Builder SetPhone(int index, global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.phone_[index] = value;
+        return this;
+      }
+      public Builder SetPhone(int index, global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.phone_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddPhone(global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.phone_.Add(value);
+        return this;
+      }
+      public Builder AddPhone(global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.phone_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangePhone(scg::IEnumerable<global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneNumber> values) {
+        PrepareBuilder();
+        result.phone_.Add(values);
+        return this;
+      }
+      public Builder ClearPhone() {
+        PrepareBuilder();
+        result.phone_.Clear();
+        return this;
+      }
+    }
+    static Person() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.Examples.AddressBook.AddressBookProtos.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class AddressBook : pb::GeneratedMessage<AddressBook, AddressBook.Builder> {
+    private AddressBook() { }
+    private static readonly AddressBook defaultInstance = new AddressBook().MakeReadOnly();
+    private static readonly string[] _addressBookFieldNames = new string[] { "person" };
+    private static readonly uint[] _addressBookFieldTags = new uint[] { 10 };
+    public static AddressBook DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override AddressBook DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override AddressBook ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.Examples.AddressBook.AddressBookProtos.internal__static_tutorial_AddressBook__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<AddressBook, AddressBook.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.Examples.AddressBook.AddressBookProtos.internal__static_tutorial_AddressBook__FieldAccessorTable; }
+    }
+    
+    public const int PersonFieldNumber = 1;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.Examples.AddressBook.Person> person_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.Examples.AddressBook.Person>();
+    public scg::IList<global::Google.ProtocolBuffers.Examples.AddressBook.Person> PersonList {
+      get { return person_; }
+    }
+    public int PersonCount {
+      get { return person_.Count; }
+    }
+    public global::Google.ProtocolBuffers.Examples.AddressBook.Person GetPerson(int index) {
+      return person_[index];
+    }
+    
+    public override bool IsInitialized {
+      get {
+        foreach (global::Google.ProtocolBuffers.Examples.AddressBook.Person element in PersonList) {
+          if (!element.IsInitialized) return false;
+        }
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _addressBookFieldNames;
+      if (person_.Count > 0) {
+        output.WriteMessageArray(1, field_names[0], person_);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+      
+      size = 0;
+      foreach (global::Google.ProtocolBuffers.Examples.AddressBook.Person element in PersonList) {
+        size += pb::CodedOutputStream.ComputeMessageSize(1, element);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static AddressBook ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static AddressBook ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static AddressBook ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static AddressBook ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static AddressBook ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static AddressBook ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static AddressBook ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static AddressBook ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static AddressBook ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static AddressBook ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private AddressBook MakeReadOnly() {
+      person_.MakeReadOnly();
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(AddressBook prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<AddressBook, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(AddressBook cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private AddressBook result;
+      
+      private AddressBook PrepareBuilder() {
+        if (resultIsReadOnly) {
+          AddressBook original = result;
+          result = new AddressBook();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override AddressBook MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.Examples.AddressBook.AddressBook.Descriptor; }
+      }
+      
+      public override AddressBook DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.Examples.AddressBook.AddressBook.DefaultInstance; }
+      }
+      
+      public override AddressBook BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is AddressBook) {
+          return MergeFrom((AddressBook) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(AddressBook other) {
+        if (other == global::Google.ProtocolBuffers.Examples.AddressBook.AddressBook.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.person_.Count != 0) {
+          result.person_.Add(other.person_);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_addressBookFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _addressBookFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              input.ReadMessageArray(tag, field_name, result.person_, global::Google.ProtocolBuffers.Examples.AddressBook.Person.DefaultInstance, extensionRegistry);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.Examples.AddressBook.Person> PersonList {
+        get { return PrepareBuilder().person_; }
+      }
+      public int PersonCount {
+        get { return result.PersonCount; }
+      }
+      public global::Google.ProtocolBuffers.Examples.AddressBook.Person GetPerson(int index) {
+        return result.GetPerson(index);
+      }
+      public Builder SetPerson(int index, global::Google.ProtocolBuffers.Examples.AddressBook.Person value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.person_[index] = value;
+        return this;
+      }
+      public Builder SetPerson(int index, global::Google.ProtocolBuffers.Examples.AddressBook.Person.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.person_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddPerson(global::Google.ProtocolBuffers.Examples.AddressBook.Person value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.person_.Add(value);
+        return this;
+      }
+      public Builder AddPerson(global::Google.ProtocolBuffers.Examples.AddressBook.Person.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.person_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangePerson(scg::IEnumerable<global::Google.ProtocolBuffers.Examples.AddressBook.Person> values) {
+        PrepareBuilder();
+        result.person_.Add(values);
+        return this;
+      }
+      public Builder ClearPerson() {
+        PrepareBuilder();
+        result.person_.Clear();
+        return this;
+      }
+    }
+    static AddressBook() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.Examples.AddressBook.AddressBookProtos.Descriptor, null);
+    }
+  }
+  
+  #endregion
+  
+}
+
+#endregion Designer generated code

+ 103 - 0
csharp/src/AddressBook/ListPeople.cs

@@ -0,0 +1,103 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+using System.IO;
+
+namespace Google.ProtocolBuffers.Examples.AddressBook
+{
+    internal class ListPeople
+    {
+        /// <summary>
+        /// Iterates though all people in the AddressBook and prints info about them.
+        /// </summary>
+        private static void Print(AddressBook addressBook)
+        {
+            foreach (Person person in addressBook.PersonList)
+            {
+                Console.WriteLine("Person ID: {0}", person.Id);
+                Console.WriteLine("  Name: {0}", person.Name);
+                if (person.HasEmail)
+                {
+                    Console.WriteLine("  E-mail address: {0}", person.Email);
+                }
+
+                foreach (Person.Types.PhoneNumber phoneNumber in person.PhoneList)
+                {
+                    switch (phoneNumber.Type)
+                    {
+                        case Person.Types.PhoneType.MOBILE:
+                            Console.Write("  Mobile phone #: ");
+                            break;
+                        case Person.Types.PhoneType.HOME:
+                            Console.Write("  Home phone #: ");
+                            break;
+                        case Person.Types.PhoneType.WORK:
+                            Console.Write("  Work phone #: ");
+                            break;
+                    }
+                    Console.WriteLine(phoneNumber.Number);
+                }
+            }
+        }
+
+        /// <summary>
+        /// Entry point - loads the addressbook and then displays it.
+        /// </summary>
+        public static int Main(string[] args)
+        {
+            if (args.Length != 1)
+            {
+                Console.Error.WriteLine("Usage:  ListPeople ADDRESS_BOOK_FILE");
+                return 1;
+            }
+
+            if (!File.Exists(args[0]))
+            {
+                Console.WriteLine("{0} doesn't exist. Add a person to create the file first.", args[0]);
+                return 0;
+            }
+
+            // Read the existing address book.
+            using (Stream stream = File.OpenRead(args[0]))
+            {
+                AddressBook addressBook = AddressBook.ParseFrom(stream);
+                Print(addressBook);
+            }
+            return 0;
+        }
+    }
+}

+ 99 - 0
csharp/src/AddressBook/Program.cs

@@ -0,0 +1,99 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+
+namespace Google.ProtocolBuffers.Examples.AddressBook
+{
+    /// <summary>
+    /// Entry point. Repeatedly prompts user for an action to take, delegating actual behaviour
+    /// to individual actions. Each action has its own Main method, so that it can be used as an
+    /// invidual complete program.
+    /// </summary>
+    internal class Program
+    {
+        private static int Main(string[] args)
+        {
+            if (args.Length > 1)
+            {
+                Console.Error.WriteLine("Usage: AddressBook [file]");
+                Console.Error.WriteLine("If the filename isn't specified, \"addressbook.data\" is used instead.");
+                return 1;
+            }
+            string addressBookFile = args.Length > 0 ? args[0] : "addressbook.data";
+
+            bool stopping = false;
+            while (!stopping)
+            {
+                Console.WriteLine("Options:");
+                Console.WriteLine("  L: List contents");
+                Console.WriteLine("  A: Add new person");
+                Console.WriteLine("  Q: Quit");
+                Console.Write("Action? ");
+                Console.Out.Flush();
+                char choice = Console.ReadKey().KeyChar;
+                Console.WriteLine();
+                try
+                {
+                    switch (choice)
+                    {
+                        case 'A':
+                        case 'a':
+                            AddPerson.Main(new string[] {addressBookFile});
+                            break;
+                        case 'L':
+                        case 'l':
+                            ListPeople.Main(new string[] {addressBookFile});
+                            break;
+                        case 'Q':
+                        case 'q':
+                            stopping = true;
+                            break;
+                        default:
+                            Console.WriteLine("Unknown option: {0}", choice);
+                            break;
+                    }
+                }
+                catch (Exception e)
+                {
+                    Console.WriteLine("Exception executing action: {0}", e);
+                }
+                Console.WriteLine();
+            }
+            return 0;
+        }
+    }
+}

+ 29 - 0
csharp/src/AddressBook/Properties/AssemblyInfo.cs

@@ -0,0 +1,29 @@
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+
+[assembly: AssemblyTitle("AddressBook")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("AddressBook")]
+[assembly: AssemblyCopyright("Copyright ©  2008")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("2.4.1.555")]
+
+[assembly: AssemblyVersion("2.4.1.555")]
+[assembly: AssemblyFileVersion("2.4.1.555")]

+ 44 - 0
csharp/src/AddressBook/SampleUsage.cs

@@ -0,0 +1,44 @@
+using System;
+using System.IO;
+
+namespace Google.ProtocolBuffers.Examples.AddressBook
+{
+    internal class SampleUsage
+    {
+        private static void Main()
+        {
+            byte[] bytes;
+            //Create a builder to start building a message
+            Person.Builder newContact = Person.CreateBuilder();
+            //Set the primitive properties
+            newContact.SetId(1)
+                .SetName("Foo")
+                .SetEmail("foo@bar");
+            //Now add an item to a list (repeating) field
+            newContact.AddPhone(
+                //Create the child message inline
+                Person.Types.PhoneNumber.CreateBuilder().SetNumber("555-1212").Build()
+                );
+            //Now build the final message:
+            Person person = newContact.Build();
+            //The builder is no longer valid (at least not now, scheduled for 2.4):
+            newContact = null;
+            using (MemoryStream stream = new MemoryStream())
+            {
+                //Save the person to a stream
+                person.WriteTo(stream);
+                bytes = stream.ToArray();
+            }
+            //Create another builder, merge the byte[], and build the message:
+            Person copy = Person.CreateBuilder().MergeFrom(bytes).Build();
+
+            //A more streamlined approach might look like this:
+            bytes = AddressBook.CreateBuilder().AddPerson(copy).Build().ToByteArray();
+            //And read the address book back again
+            AddressBook restored = AddressBook.CreateBuilder().MergeFrom(bytes).Build();
+            //The message performs a deep-comparison on equality:
+            if (restored.PersonCount != 1 || !person.Equals(restored.PersonList[0]))
+                throw new ApplicationException("There is a bad person in here!");
+        }
+    }
+}

+ 3 - 0
csharp/src/AddressBook/app.config

@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<configuration>
+	<startup/></configuration>

+ 538 - 0
csharp/src/ProtoBench/Program.cs

@@ -0,0 +1,538 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Runtime.Serialization.Json;
+using System.Text;
+using System.Threading;
+using System.Xml;
+using Google.ProtocolBuffers.Serialization;
+using Google.ProtocolBuffers.TestProtos;
+
+namespace Google.ProtocolBuffers.ProtoBench
+{
+    /// <summary>
+    /// Simple benchmarking of arbitrary messages.
+    /// </summary>
+    public sealed class Program
+    {
+        private static TimeSpan MinSampleTime = TimeSpan.FromSeconds(2);
+        private static TimeSpan TargetTime = TimeSpan.FromSeconds(30);
+        private static bool Verbose = false, FastTest = false, OtherFormats = false;
+        // Avoid a .NET 3.5 dependency
+        private delegate void Action();
+
+        private delegate void BenchmarkTest(string name, long dataSize, Action action);
+
+        private static BenchmarkTest RunBenchmark;
+
+        private static string _logFile;
+        static void WriteLine(string format, params object[] arg)
+        {
+            if (arg.Length > 0) format = String.Format(format, arg);
+            Console.Out.WriteLine(format);
+            if (!String.IsNullOrEmpty(_logFile))
+                File.AppendAllText(_logFile, format + Environment.NewLine);
+        }
+
+        [STAThread]
+        public static int Main(string[] args)
+        {
+            List<string> temp = new List<string>(args);
+
+            Verbose = temp.Remove("/verbose") || temp.Remove("-verbose");
+            OtherFormats = temp.Remove("/formats") || temp.Remove("-formats");
+
+            foreach (string arg in temp)
+            {
+                if (arg.StartsWith("/log:", StringComparison.OrdinalIgnoreCase) || arg.StartsWith("-log:", StringComparison.OrdinalIgnoreCase))
+                {
+                    _logFile = arg.Substring(5);
+                    if (!String.IsNullOrEmpty(_logFile))
+                        File.AppendAllText(_logFile, Environment.NewLine + "Started benchmarks at " + DateTime.Now + Environment.NewLine);
+                    temp.Remove(arg);
+                    break;
+                }
+            }
+
+            if (true == (FastTest = (temp.Remove("/fast") || temp.Remove("-fast"))))
+            {
+                TargetTime = TimeSpan.FromSeconds(10);
+            }
+
+            RunBenchmark = BenchmarkV1;
+            if (temp.Remove("/v2") || temp.Remove("-v2"))
+            {
+                Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime;
+                Process.GetCurrentProcess().ProcessorAffinity = new IntPtr(1);
+                RunBenchmark = BenchmarkV2;
+            }
+            if (temp.Remove("/all") || temp.Remove("-all"))
+            {
+                if (FastTest)
+                {
+                    TargetTime = TimeSpan.FromSeconds(5);
+                }
+                foreach (KeyValuePair<string, string> item in MakeTests())
+                {
+                    temp.Add(item.Key);
+                    temp.Add(item.Value);
+                }
+            }
+            args = temp.ToArray();
+
+            if (args.Length < 2 || (args.Length%2) != 0)
+            {
+                Console.Error.WriteLine("Usage: ProtoBench [/fast] <descriptor type name> <input data>");
+                Console.Error.WriteLine("The descriptor type name is the fully-qualified message name,");
+                Console.Error.WriteLine(
+                    "including assembly - e.g. Google.ProtocolBuffers.BenchmarkProtos.Message1,ProtoBench");
+                Console.Error.WriteLine("(You can specify multiple pairs of descriptor type name and input data.)");
+                return 1;
+            }
+
+            bool success = true;
+            for (int i = 0; i < args.Length; i += 2)
+            {
+                success &= RunTest(args[i], args[i + 1], null);
+            }
+            return success ? 0 : 1;
+        }
+
+        /// <summary>
+        /// Runs a single test. Error messages are displayed to Console.Error, and the return value indicates
+        /// general success/failure.
+        /// </summary>
+        public static bool RunTest(string typeName, string file, byte[] inputData)
+        {
+            WriteLine("Benchmarking {0} with file {1}", typeName, file);
+            IMessage defaultMessage;
+            try
+            {
+                defaultMessage = MessageUtil.GetDefaultMessage(typeName);
+            }
+            catch (ArgumentException e)
+            {
+                Console.Error.WriteLine(e.Message);
+                return false;
+            }
+            try
+            {
+                ExtensionRegistry registry = ExtensionRegistry.Empty;
+                inputData = inputData ?? File.ReadAllBytes(file);
+                MemoryStream inputStream = new MemoryStream(inputData);
+                ByteString inputString = ByteString.CopyFrom(inputData);
+                IMessage sampleMessage =
+                    defaultMessage.WeakCreateBuilderForType().WeakMergeFrom(inputString, registry).WeakBuild();
+
+                IDictionary<string, object> dictionary = null;
+                byte[] jsonBytes = null, xmlBytes = null; /*no pun intended, well... maybe for xml*/
+                if (OtherFormats)
+                {
+                    using (MemoryStream temp = new MemoryStream())
+                    {
+                        XmlFormatWriter.CreateInstance(temp).WriteMessage(sampleMessage);
+                        xmlBytes = temp.ToArray();
+                    }
+                    using (MemoryStream temp = new MemoryStream())
+                    {
+                        JsonFormatWriter.CreateInstance(temp).WriteMessage(sampleMessage);
+                        jsonBytes = temp.ToArray();
+                    }
+                    dictionary = new Dictionary<string, object>(StringComparer.Ordinal);
+                    new DictionaryWriter(dictionary).WriteMessage(sampleMessage);
+                }
+
+                //Serializers
+                if (!FastTest)
+                {
+                    RunBenchmark("Serialize to byte string", inputData.Length, () => sampleMessage.ToByteString());
+                }
+                RunBenchmark("Serialize to byte array", inputData.Length, () => sampleMessage.ToByteArray());
+                if (!FastTest)
+                {
+                    RunBenchmark("Serialize to memory stream", inputData.Length,
+                                 () => sampleMessage.WriteTo(new MemoryStream()));
+                }
+
+                if (OtherFormats)
+                {
+                    RunBenchmark("Serialize to xml", xmlBytes.Length,
+                                 () =>
+                                     {
+                                         XmlFormatWriter.CreateInstance(new MemoryStream(), Encoding.UTF8).WriteMessage(sampleMessage);
+                                     });
+                    RunBenchmark("Serialize to json", jsonBytes.Length,
+                                 () => { JsonFormatWriter.CreateInstance().WriteMessage(sampleMessage); });
+                    RunBenchmark("Serialize to json via xml", jsonBytes.Length,
+                                 () =>
+                                 XmlFormatWriter.CreateInstance(
+                                     JsonReaderWriterFactory.CreateJsonWriter(new MemoryStream(), Encoding.UTF8))
+                                     .SetOptions(XmlWriterOptions.OutputJsonTypes)
+                                     .WriteMessage(sampleMessage)
+                        );
+
+                    RunBenchmark("Serialize to dictionary", sampleMessage.SerializedSize,
+                                 () => new DictionaryWriter().WriteMessage(sampleMessage));
+                }
+                //Deserializers
+                if (!FastTest)
+                {
+                    RunBenchmark("Deserialize from byte string", inputData.Length,
+                                 () => defaultMessage.WeakCreateBuilderForType()
+                                           .WeakMergeFrom(inputString, registry)
+                                           .WeakBuild()
+                        );
+                }
+
+                RunBenchmark("Deserialize from byte array", inputData.Length,
+                             () => defaultMessage.WeakCreateBuilderForType()
+                                       .WeakMergeFrom(CodedInputStream.CreateInstance(inputData), registry)
+                                       .WeakBuild()
+                    );
+                if (!FastTest)
+                {
+                    RunBenchmark("Deserialize from memory stream", inputData.Length,
+                                 () =>
+                                     {
+                                         inputStream.Position = 0;
+                                         defaultMessage.WeakCreateBuilderForType().WeakMergeFrom(
+                                             CodedInputStream.CreateInstance(inputStream), registry)
+                                             .WeakBuild();
+                                     });
+                }
+
+                if (OtherFormats)
+                {
+                    RunBenchmark("Deserialize from xml", xmlBytes.Length,
+                                 () =>
+                                 XmlFormatReader.CreateInstance(xmlBytes).Merge(
+                                     defaultMessage.WeakCreateBuilderForType()).WeakBuild());
+                    RunBenchmark("Deserialize from json", jsonBytes.Length,
+                                 () =>
+                                 JsonFormatReader.CreateInstance(jsonBytes).Merge(
+                                     defaultMessage.WeakCreateBuilderForType()).WeakBuild());
+                    RunBenchmark("Deserialize from json via xml", jsonBytes.Length,
+                                 () =>
+                                 XmlFormatReader.CreateInstance(JsonReaderWriterFactory.CreateJsonReader(jsonBytes, XmlDictionaryReaderQuotas.Max))
+                                     .SetOptions(XmlReaderOptions.ReadNestedArrays).Merge(
+                                         defaultMessage.WeakCreateBuilderForType()).WeakBuild());
+
+                    RunBenchmark("Deserialize from dictionary", sampleMessage.SerializedSize,
+                                 () =>
+                                 new DictionaryReader(dictionary).Merge(defaultMessage.WeakCreateBuilderForType()).
+                                     WeakBuild());
+                }
+                WriteLine(String.Empty);
+                return true;
+            }
+            catch (Exception e)
+            {
+                Console.Error.WriteLine("Error: {0}", e.Message);
+                Console.Error.WriteLine();
+                Console.Error.WriteLine("Detailed exception information: {0}", e);
+                return false;
+            }
+        }
+
+        private static void BenchmarkV2(string name, long dataSize, Action action)
+        {
+            Thread.BeginThreadAffinity();
+            TimeSpan elapsed = TimeSpan.Zero;
+            long runs = 0;
+            long totalCount = 0;
+            double best = double.MinValue, worst = double.MaxValue;
+
+            action();
+            // Run it progressively more times until we've got a reasonable sample
+
+            int iterations = 100;
+            elapsed = TimeAction(action, iterations);
+            while (elapsed.TotalMilliseconds < 1000)
+            {
+                elapsed += TimeAction(action, iterations);
+                iterations *= 2;
+            }
+
+            TimeSpan target = TimeSpan.FromSeconds(1);
+
+            elapsed = TimeAction(action, iterations);
+            iterations = (int) ((target.Ticks*iterations)/(double) elapsed.Ticks);
+            elapsed = TimeAction(action, iterations);
+            iterations = (int) ((target.Ticks*iterations)/(double) elapsed.Ticks);
+            elapsed = TimeAction(action, iterations);
+            iterations = (int) ((target.Ticks*iterations)/(double) elapsed.Ticks);
+
+            double first = (iterations*dataSize)/(elapsed.TotalSeconds*1024*1024);
+            if (Verbose)
+            {
+                WriteLine("Round ---: Count = {1,6}, Bps = {2,8:f3}", 0, iterations, first);
+            }
+            elapsed = TimeSpan.Zero;
+            int max = (int) TargetTime.TotalSeconds;
+
+            while (runs < max)
+            {
+                TimeSpan cycle = TimeAction(action, iterations);
+                // Accumulate and scale for next cycle.
+
+                double bps = (iterations*dataSize)/(cycle.TotalSeconds*1024*1024);
+                if (Verbose)
+                {
+                    WriteLine("Round {1,3}: Count = {2,6}, Bps = {3,8:f3}",
+                                      0, runs, iterations, bps);
+                }
+
+                best = Math.Max(best, bps);
+                worst = Math.Min(worst, bps);
+
+                runs++;
+                elapsed += cycle;
+                totalCount += iterations;
+                iterations = (int) ((target.Ticks*totalCount)/(double) elapsed.Ticks);
+            }
+
+            Thread.EndThreadAffinity();
+            WriteLine(
+                "{1}: averages {2} per {3:f3}s for {4} runs; avg: {5:f3}mbps; best: {6:f3}mbps; worst: {7:f3}mbps",
+                0, name, totalCount/runs, elapsed.TotalSeconds/runs, runs,
+                (totalCount*dataSize)/(elapsed.TotalSeconds*1024*1024), best, worst);
+        }
+
+        private static void BenchmarkV1(string name, long dataSize, Action action)
+        {
+            // Make sure it's JITted
+            action();
+            // Run it progressively more times until we've got a reasonable sample
+
+            int iterations = 1;
+            TimeSpan elapsed = TimeAction(action, iterations);
+            while (elapsed < MinSampleTime)
+            {
+                iterations *= 2;
+                elapsed = TimeAction(action, iterations);
+            }
+            // Upscale the sample to the target time. Do this in floating point arithmetic
+            // to avoid overflow issues.
+            iterations = (int) ((TargetTime.Ticks/(double) elapsed.Ticks)*iterations);
+            elapsed = TimeAction(action, iterations);
+            WriteLine("{0}: {1} iterations in {2:f3}s; {3:f3}MB/s",
+                              name, iterations, elapsed.TotalSeconds,
+                              (iterations*dataSize)/(elapsed.TotalSeconds*1024*1024));
+        }
+
+        private static TimeSpan TimeAction(Action action, int iterations)
+        {
+            GC.Collect();
+            GC.GetTotalMemory(true);
+            GC.WaitForPendingFinalizers();
+
+            Stopwatch sw = Stopwatch.StartNew();
+            for (int i = 0; i < iterations; i++)
+            {
+                action();
+            }
+            sw.Stop();
+            return sw.Elapsed;
+        }
+
+        private static IEnumerable<KeyValuePair<string, string>> MakeTests()
+        {
+            //Aggregate Tests
+            yield return MakeWorkItem("all-types", MakeTestAllTypes());
+            yield return MakeWorkItem("repeated-100", MakeRepeatedTestAllTypes(100));
+            yield return MakeWorkItem("packed-100", MakeTestPackedTypes(100));
+
+            //Discrete Tests
+            foreach (KeyValuePair<string, Action<TestAllTypes.Builder>> item in MakeTestAllTypes())
+            {
+                yield return MakeWorkItem(item.Key, new[] {item});
+            }
+
+            foreach (KeyValuePair<string, Action<TestAllTypes.Builder>> item in MakeRepeatedTestAllTypes(100))
+            {
+                yield return MakeWorkItem(item.Key, new[] {item});
+            }
+
+            foreach (KeyValuePair<string, Action<TestPackedTypes.Builder>> item in MakeTestPackedTypes(100))
+            {
+                yield return MakeWorkItem(item.Key, new[] {item});
+            }
+        }
+
+        private static IEnumerable<KeyValuePair<string, Action<TestAllTypes.Builder>>> MakeTestAllTypes()
+        {
+            // Many of the raw type serializers below perform poorly due to the numerous fields defined
+            // in TestAllTypes.
+
+            //single values
+            yield return MakeItem<TestAllTypes.Builder>("int32", 1, x => x.SetOptionalInt32(1001));
+            yield return MakeItem<TestAllTypes.Builder>("int64", 1, x => x.SetOptionalInt64(1001));
+            yield return MakeItem<TestAllTypes.Builder>("uint32", 1, x => x.SetOptionalUint32(1001));
+            yield return MakeItem<TestAllTypes.Builder>("uint64", 1, x => x.SetOptionalUint64(1001));
+            yield return MakeItem<TestAllTypes.Builder>("sint32", 1, x => x.SetOptionalSint32(-1001));
+            yield return MakeItem<TestAllTypes.Builder>("sint64", 1, x => x.SetOptionalSint64(-1001));
+            yield return MakeItem<TestAllTypes.Builder>("fixed32", 1, x => x.SetOptionalFixed32(1001));
+            yield return MakeItem<TestAllTypes.Builder>("fixed64", 1, x => x.SetOptionalFixed64(1001));
+            yield return MakeItem<TestAllTypes.Builder>("sfixed32", 1, x => x.SetOptionalSfixed32(-1001));
+            yield return MakeItem<TestAllTypes.Builder>("sfixed64", 1, x => x.SetOptionalSfixed64(-1001));
+            yield return MakeItem<TestAllTypes.Builder>("float", 1, x => x.SetOptionalFloat(1001.1001f));
+            yield return MakeItem<TestAllTypes.Builder>("double", 1, x => x.SetOptionalDouble(1001.1001));
+            yield return MakeItem<TestAllTypes.Builder>("bool", 1, x => x.SetOptionalBool(true));
+            yield return MakeItem<TestAllTypes.Builder>("string", 1, x => x.SetOptionalString("this is a string value"))
+                ;
+            yield return
+                MakeItem<TestAllTypes.Builder>("bytes", 1,
+                                               x =>
+                                               x.SetOptionalBytes(ByteString.CopyFromUtf8("this is an array of bytes")))
+                ;
+            yield return
+                MakeItem<TestAllTypes.Builder>("group", 1,
+                                               x =>
+                                               x.SetOptionalGroup(
+                                                   new TestAllTypes.Types.OptionalGroup.Builder().SetA(1001)));
+            yield return
+                MakeItem<TestAllTypes.Builder>("message", 1,
+                                               x =>
+                                               x.SetOptionalNestedMessage(
+                                                   new TestAllTypes.Types.NestedMessage.Builder().SetBb(1001)));
+            yield return
+                MakeItem<TestAllTypes.Builder>("enum", 1,
+                                               x => x.SetOptionalNestedEnum(TestAllTypes.Types.NestedEnum.FOO));
+        }
+
+        private static IEnumerable<KeyValuePair<string, Action<TestAllTypes.Builder>>> MakeRepeatedTestAllTypes(int size)
+        {
+            //repeated values
+            yield return MakeItem<TestAllTypes.Builder>("repeated-int32", size, x => x.AddRepeatedInt32(1001));
+            yield return MakeItem<TestAllTypes.Builder>("repeated-int64", size, x => x.AddRepeatedInt64(1001));
+            yield return MakeItem<TestAllTypes.Builder>("repeated-uint32", size, x => x.AddRepeatedUint32(1001));
+            yield return MakeItem<TestAllTypes.Builder>("repeated-uint64", size, x => x.AddRepeatedUint64(1001));
+            yield return MakeItem<TestAllTypes.Builder>("repeated-sint32", size, x => x.AddRepeatedSint32(-1001));
+            yield return MakeItem<TestAllTypes.Builder>("repeated-sint64", size, x => x.AddRepeatedSint64(-1001));
+            yield return MakeItem<TestAllTypes.Builder>("repeated-fixed32", size, x => x.AddRepeatedFixed32(1001));
+            yield return MakeItem<TestAllTypes.Builder>("repeated-fixed64", size, x => x.AddRepeatedFixed64(1001));
+            yield return MakeItem<TestAllTypes.Builder>("repeated-sfixed32", size, x => x.AddRepeatedSfixed32(-1001));
+            yield return MakeItem<TestAllTypes.Builder>("repeated-sfixed64", size, x => x.AddRepeatedSfixed64(-1001));
+            yield return MakeItem<TestAllTypes.Builder>("repeated-float", size, x => x.AddRepeatedFloat(1001.1001f));
+            yield return MakeItem<TestAllTypes.Builder>("repeated-double", size, x => x.AddRepeatedDouble(1001.1001));
+            yield return MakeItem<TestAllTypes.Builder>("repeated-bool", size, x => x.AddRepeatedBool(true));
+            yield return
+                MakeItem<TestAllTypes.Builder>("repeated-string", size,
+                                               x => x.AddRepeatedString("this is a string value"));
+            yield return
+                MakeItem<TestAllTypes.Builder>("repeated-bytes", size,
+                                               x =>
+                                               x.AddRepeatedBytes(ByteString.CopyFromUtf8("this is an array of bytes")))
+                ;
+            yield return
+                MakeItem<TestAllTypes.Builder>("repeated-group", size,
+                                               x =>
+                                               x.AddRepeatedGroup(
+                                                   new TestAllTypes.Types.RepeatedGroup.Builder().SetA(1001)));
+            yield return
+                MakeItem<TestAllTypes.Builder>("repeated-message", size,
+                                               x =>
+                                               x.AddRepeatedNestedMessage(
+                                                   new TestAllTypes.Types.NestedMessage.Builder().SetBb(1001)));
+            yield return
+                MakeItem<TestAllTypes.Builder>("repeated-enum", size,
+                                               x => x.AddRepeatedNestedEnum(TestAllTypes.Types.NestedEnum.FOO));
+        }
+
+        private static IEnumerable<KeyValuePair<string, Action<TestPackedTypes.Builder>>> MakeTestPackedTypes(int size)
+        {
+            //packed values
+            yield return MakeItem<TestPackedTypes.Builder>("packed-int32", size, x => x.AddPackedInt32(1001));
+            yield return MakeItem<TestPackedTypes.Builder>("packed-int64", size, x => x.AddPackedInt64(1001));
+            yield return MakeItem<TestPackedTypes.Builder>("packed-uint32", size, x => x.AddPackedUint32(1001));
+            yield return MakeItem<TestPackedTypes.Builder>("packed-uint64", size, x => x.AddPackedUint64(1001));
+            yield return MakeItem<TestPackedTypes.Builder>("packed-sint32", size, x => x.AddPackedSint32(-1001));
+            yield return MakeItem<TestPackedTypes.Builder>("packed-sint64", size, x => x.AddPackedSint64(-1001));
+            yield return MakeItem<TestPackedTypes.Builder>("packed-fixed32", size, x => x.AddPackedFixed32(1001));
+            yield return MakeItem<TestPackedTypes.Builder>("packed-fixed64", size, x => x.AddPackedFixed64(1001));
+            yield return MakeItem<TestPackedTypes.Builder>("packed-sfixed32", size, x => x.AddPackedSfixed32(-1001));
+            yield return MakeItem<TestPackedTypes.Builder>("packed-sfixed64", size, x => x.AddPackedSfixed64(-1001));
+            yield return MakeItem<TestPackedTypes.Builder>("packed-float", size, x => x.AddPackedFloat(1001.1001f));
+            yield return MakeItem<TestPackedTypes.Builder>("packed-double", size, x => x.AddPackedDouble(1001.1001));
+            yield return MakeItem<TestPackedTypes.Builder>("packed-bool", size, x => x.AddPackedBool(true));
+            yield return
+                MakeItem<TestPackedTypes.Builder>("packed-enum", size, x => x.AddPackedEnum(ForeignEnum.FOREIGN_FOO));
+        }
+
+        private static KeyValuePair<string, Action<T>> MakeItem<T>(string name, int repeated, Action<T> build)
+            where T : IBuilderLite, new()
+        {
+            if (repeated == 1)
+            {
+                return new KeyValuePair<string, Action<T>>(name, build);
+            }
+
+            return new KeyValuePair<string, Action<T>>(
+                String.Format("{0}[{1}]", name, repeated),
+                x =>
+                    {
+                        for (int i = 0; i < repeated; i++)
+                        {
+                            build(x);
+                        }
+                    }
+                );
+        }
+
+        private static KeyValuePair<string, string> MakeWorkItem<T>(string name,
+                                                                    IEnumerable<KeyValuePair<string, Action<T>>>
+                                                                        builders) where T : IBuilderLite, new()
+        {
+            T builder = new T();
+
+            foreach (KeyValuePair<string, Action<T>> item in builders)
+            {
+                item.Value(builder);
+            }
+
+            IMessageLite msg = builder.WeakBuild();
+            string fname = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "unittest_" + name + ".dat");
+            File.WriteAllBytes(fname, msg.ToByteArray());
+            return
+                new KeyValuePair<string, string>(
+                    String.Format("{0},{1}", msg.GetType().FullName, msg.GetType().Assembly.GetName().Name), fname);
+        }
+    }
+}

+ 32 - 0
csharp/src/ProtoBench/Properties/AssemblyInfo.cs

@@ -0,0 +1,32 @@
+using System;
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+
+[assembly: AssemblyTitle("ProtoBench")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("ProtoBench")]
+[assembly: AssemblyCopyright("Copyright ©  2009")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+[assembly: CLSCompliant(true)]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("2.4.1.555")]
+
+[assembly: AssemblyVersion("2.4.1.555")]
+[assembly: AssemblyFileVersion("2.4.1.555")]

+ 88 - 0
csharp/src/ProtoBench/ProtoBench.csproj

@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <EnvironmentFlavor>CLIENTPROFILE</EnvironmentFlavor>
+    <EnvironmentTemplate>NET35</EnvironmentTemplate>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{C7A4A435-2813-41C8-AA87-BD914BA5223D}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Google.ProtocolBuffers.ProtoBench</RootNamespace>
+    <AssemblyName>ProtoBench</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\NET35\Debug</OutputPath>
+    <IntermediateOutputPath>obj\NET35\Debug\</IntermediateOutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
+    <NoStdLib>true</NoStdLib>
+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\NET35\Release</OutputPath>
+    <IntermediateOutputPath>obj\NET35\Release\</IntermediateOutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
+    <NoStdLib>true</NoStdLib>
+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="mscorlib" />
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Runtime.Serialization" />
+    <Reference Include="System.ServiceModel" />
+    <Reference Include="System.ServiceModel.Web" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="TestProtos\GoogleSizeProtoFile.cs" />
+    <Compile Include="TestProtos\GoogleSpeedProtoFile.cs" />
+    <Compile Include="TestProtos\UnitTestImportProtoFile.cs" />
+    <Compile Include="TestProtos\UnitTestProtoFile.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\ProtocolBuffers.Serialization\ProtocolBuffers.Serialization.csproj">
+      <Project>{231391AF-449C-4a39-986C-AD7F270F4750}</Project>
+      <Name>ProtocolBuffers.Serialization</Name>
+      <Private>True</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\ProtocolBuffers\ProtocolBuffers.csproj">
+      <Project>{6908BDCE-D925-43F3-94AC-A531E6DF2591}</Project>
+      <Name>ProtocolBuffers</Name>
+      <Private>True</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="google_message1.dat">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+    <None Include="google_message2.dat">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>

+ 4572 - 0
csharp/src/ProtoBench/TestProtos/GoogleSizeProtoFile.cs

@@ -0,0 +1,4572 @@
+// Generated by ProtoGen, Version=2.4.1.555, Culture=neutral, PublicKeyToken=55f7125234beb589.  DO NOT EDIT!
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.ProtocolBuffers;
+using pbc = global::Google.ProtocolBuffers.Collections;
+using pbd = global::Google.ProtocolBuffers.Descriptors;
+using scg = global::System.Collections.Generic;
+namespace Google.ProtocolBuffers.ProtoBench {
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public static partial class GoogleSizeProtoFile {
+  
+    #region Extension registration
+    public static void RegisterAllExtensions(pb::ExtensionRegistry registry) {
+    }
+    #endregion
+    #region Static variables
+    internal static pbd::MessageDescriptor internal__static_benchmarks_SizeMessage1__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.ProtoBench.SizeMessage1, global::Google.ProtocolBuffers.ProtoBench.SizeMessage1.Builder> internal__static_benchmarks_SizeMessage1__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_benchmarks_SizeMessage1SubMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.ProtoBench.SizeMessage1SubMessage, global::Google.ProtocolBuffers.ProtoBench.SizeMessage1SubMessage.Builder> internal__static_benchmarks_SizeMessage1SubMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_benchmarks_SizeMessage2__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.ProtoBench.SizeMessage2, global::Google.ProtocolBuffers.ProtoBench.SizeMessage2.Builder> internal__static_benchmarks_SizeMessage2__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_benchmarks_SizeMessage2_Group1__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.ProtoBench.SizeMessage2.Types.Group1, global::Google.ProtocolBuffers.ProtoBench.SizeMessage2.Types.Group1.Builder> internal__static_benchmarks_SizeMessage2_Group1__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_benchmarks_SizeMessage2GroupedMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.ProtoBench.SizeMessage2GroupedMessage, global::Google.ProtocolBuffers.ProtoBench.SizeMessage2GroupedMessage.Builder> internal__static_benchmarks_SizeMessage2GroupedMessage__FieldAccessorTable;
+    #endregion
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbd::FileDescriptor descriptor;
+    
+    static GoogleSizeProtoFile() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "ChxiZW5jaG1hcmtzL2dvb2dsZV9zaXplLnByb3RvEgpiZW5jaG1hcmtzGiRn", 
+            "b29nbGUvcHJvdG9idWYvY3NoYXJwX29wdGlvbnMucHJvdG8i9gYKDFNpemVN", 
+            "ZXNzYWdlMRIOCgZmaWVsZDEYASACKAkSDgoGZmllbGQ5GAkgASgJEg8KB2Zp", 
+            "ZWxkMTgYEiABKAkSFgoHZmllbGQ4MBhQIAEoCDoFZmFsc2USFQoHZmllbGQ4", 
+            "MRhRIAEoCDoEdHJ1ZRIOCgZmaWVsZDIYAiACKAUSDgoGZmllbGQzGAMgAigF", 
+            "EhEKCGZpZWxkMjgwGJgCIAEoBRIRCgZmaWVsZDYYBiABKAU6ATASDwoHZmll", 
+            "bGQyMhgWIAEoAxIOCgZmaWVsZDQYBCABKAkSDgoGZmllbGQ1GAUgAygGEhYK", 
+            "B2ZpZWxkNTkYOyABKAg6BWZhbHNlEg4KBmZpZWxkNxgHIAEoCRIPCgdmaWVs", 
+            "ZDE2GBAgASgFEhQKCGZpZWxkMTMwGIIBIAEoBToBMBIVCgdmaWVsZDEyGAwg", 
+            "ASgIOgR0cnVlEhUKB2ZpZWxkMTcYESABKAg6BHRydWUSFQoHZmllbGQxMxgN", 
+            "IAEoCDoEdHJ1ZRIVCgdmaWVsZDE0GA4gASgIOgR0cnVlEhMKCGZpZWxkMTA0", 
+            "GGggASgFOgEwEhMKCGZpZWxkMTAwGGQgASgFOgEwEhMKCGZpZWxkMTAxGGUg", 
+            "ASgFOgEwEhAKCGZpZWxkMTAyGGYgASgJEhAKCGZpZWxkMTAzGGcgASgJEhIK", 
+            "B2ZpZWxkMjkYHSABKAU6ATASFgoHZmllbGQzMBgeIAEoCDoFZmFsc2USEwoH", 
+            "ZmllbGQ2MBg8IAEoBToCLTESFQoIZmllbGQyNzEYjwIgASgFOgItMRIVCghm", 
+            "aWVsZDI3MhiQAiABKAU6Ai0xEhEKCGZpZWxkMTUwGJYBIAEoBRISCgdmaWVs", 
+            "ZDIzGBcgASgFOgEwEhYKB2ZpZWxkMjQYGCABKAg6BWZhbHNlEhIKB2ZpZWxk", 
+            "MjUYGSABKAU6ATASMwoHZmllbGQxNRgPIAEoCzIiLmJlbmNobWFya3MuU2l6", 
+            "ZU1lc3NhZ2UxU3ViTWVzc2FnZRIPCgdmaWVsZDc4GE4gASgIEhIKB2ZpZWxk", 
+            "NjcYQyABKAU6ATASDwoHZmllbGQ2OBhEIAEoBRIUCghmaWVsZDEyOBiAASAB", 
+            "KAU6ATASKAoIZmllbGQxMjkYgQEgASgJOhV4eHh4eHh4eHh4eHh4eHh4eHh4", 
+            "eHgSFAoIZmllbGQxMzEYgwEgASgFOgEwIqEDChZTaXplTWVzc2FnZTFTdWJN", 
+            "ZXNzYWdlEhEKBmZpZWxkMRgBIAEoBToBMBIRCgZmaWVsZDIYAiABKAU6ATAS", 
+            "EQoGZmllbGQzGAMgASgFOgEwEg8KB2ZpZWxkMTUYDyABKAkSFQoHZmllbGQx", 
+            "MhgMIAEoCDoEdHJ1ZRIPCgdmaWVsZDEzGA0gASgDEg8KB2ZpZWxkMTQYDiAB", 
+            "KAMSDwoHZmllbGQxNhgQIAEoBRISCgdmaWVsZDE5GBMgASgFOgEyEhUKB2Zp", 
+            "ZWxkMjAYFCABKAg6BHRydWUSFQoHZmllbGQyOBgcIAEoCDoEdHJ1ZRIPCgdm", 
+            "aWVsZDIxGBUgASgGEg8KB2ZpZWxkMjIYFiABKAUSFgoHZmllbGQyMxgXIAEo", 
+            "CDoFZmFsc2USGAoIZmllbGQyMDYYzgEgASgIOgVmYWxzZRIRCghmaWVsZDIw", 
+            "MxjLASABKAcSEQoIZmllbGQyMDQYzAEgASgFEhEKCGZpZWxkMjA1GM0BIAEo", 
+            "CRIRCghmaWVsZDIwNxjPASABKAQSEQoIZmllbGQzMDAYrAIgASgEIscHCgxT", 
+            "aXplTWVzc2FnZTISDgoGZmllbGQxGAEgASgJEg4KBmZpZWxkMxgDIAEoAxIO", 
+            "CgZmaWVsZDQYBCABKAMSDwoHZmllbGQzMBgeIAEoAxIWCgdmaWVsZDc1GEsg", 
+            "ASgIOgVmYWxzZRIOCgZmaWVsZDYYBiABKAkSDgoGZmllbGQyGAIgASgMEhIK", 
+            "B2ZpZWxkMjEYFSABKAU6ATASDwoHZmllbGQ3MRhHIAEoBRIPCgdmaWVsZDI1", 
+            "GBkgASgCEhMKCGZpZWxkMTA5GG0gASgFOgEwEhQKCGZpZWxkMjEwGNIBIAEo", 
+            "BToBMBIUCghmaWVsZDIxMRjTASABKAU6ATASFAoIZmllbGQyMTIY1AEgASgF", 
+            "OgEwEhQKCGZpZWxkMjEzGNUBIAEoBToBMBIUCghmaWVsZDIxNhjYASABKAU6", 
+            "ATASFAoIZmllbGQyMTcY2QEgASgFOgEwEhQKCGZpZWxkMjE4GNoBIAEoBToB", 
+            "MBIUCghmaWVsZDIyMBjcASABKAU6ATASFAoIZmllbGQyMjEY3QEgASgFOgEw", 
+            "EhQKCGZpZWxkMjIyGN4BIAEoAjoBMBIPCgdmaWVsZDYzGD8gASgFEi8KBmdy", 
+            "b3VwMRgKIAMoCjIfLmJlbmNobWFya3MuU2l6ZU1lc3NhZ2UyLkdyb3VwMRIR", 
+            "CghmaWVsZDEyOBiAASADKAkSEQoIZmllbGQxMzEYgwEgASgDEhAKCGZpZWxk", 
+            "MTI3GH8gAygJEhEKCGZpZWxkMTI5GIEBIAEoBRIRCghmaWVsZDEzMBiCASAD", 
+            "KAMSGAoIZmllbGQyMDUYzQEgASgIOgVmYWxzZRIYCghmaWVsZDIwNhjOASAB", 
+            "KAg6BWZhbHNlGsICCgZHcm91cDESDwoHZmllbGQxMRgLIAIoAhIPCgdmaWVs", 
+            "ZDI2GBogASgCEg8KB2ZpZWxkMTIYDCABKAkSDwoHZmllbGQxMxgNIAEoCRIP", 
+            "CgdmaWVsZDE0GA4gAygJEg8KB2ZpZWxkMTUYDyACKAQSDgoGZmllbGQ1GAUg", 
+            "ASgFEg8KB2ZpZWxkMjcYGyABKAkSDwoHZmllbGQyOBgcIAEoBRIPCgdmaWVs", 
+            "ZDI5GB0gASgJEg8KB2ZpZWxkMTYYECABKAkSDwoHZmllbGQyMhgWIAMoCRIP", 
+            "CgdmaWVsZDczGEkgAygFEhIKB2ZpZWxkMjAYFCABKAU6ATASDwoHZmllbGQy", 
+            "NBgYIAEoCRI3CgdmaWVsZDMxGB8gASgLMiYuYmVuY2htYXJrcy5TaXplTWVz", 
+            "c2FnZTJHcm91cGVkTWVzc2FnZSLeAQoaU2l6ZU1lc3NhZ2UyR3JvdXBlZE1l", 
+            "c3NhZ2USDgoGZmllbGQxGAEgASgCEg4KBmZpZWxkMhgCIAEoAhIRCgZmaWVs", 
+            "ZDMYAyABKAI6ATASDgoGZmllbGQ0GAQgASgIEg4KBmZpZWxkNRgFIAEoCBIU", 
+            "CgZmaWVsZDYYBiABKAg6BHRydWUSFQoGZmllbGQ3GAcgASgIOgVmYWxzZRIO", 
+            "CgZmaWVsZDgYCCABKAISDgoGZmllbGQ5GAkgASgIEg8KB2ZpZWxkMTAYCiAB", 
+            "KAISDwoHZmllbGQxMRgLIAEoA0JJQgpHb29nbGVTaXplSALCPjgKIUdvb2ds", 
+            "ZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaBITR29vZ2xlU2l6ZVByb3Rv", 
+          "RmlsZQ=="));
+      pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) {
+        descriptor = root;
+        internal__static_benchmarks_SizeMessage1__Descriptor = Descriptor.MessageTypes[0];
+        internal__static_benchmarks_SizeMessage1__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.ProtoBench.SizeMessage1, global::Google.ProtocolBuffers.ProtoBench.SizeMessage1.Builder>(internal__static_benchmarks_SizeMessage1__Descriptor,
+                new string[] { "Field1", "Field9", "Field18", "Field80", "Field81", "Field2", "Field3", "Field280", "Field6", "Field22", "Field4", "Field5", "Field59", "Field7", "Field16", "Field130", "Field12", "Field17", "Field13", "Field14", "Field104", "Field100", "Field101", "Field102", "Field103", "Field29", "Field30", "Field60", "Field271", "Field272", "Field150", "Field23", "Field24", "Field25", "Field15", "Field78", "Field67", "Field68", "Field128", "Field129", "Field131", });
+        internal__static_benchmarks_SizeMessage1SubMessage__Descriptor = Descriptor.MessageTypes[1];
+        internal__static_benchmarks_SizeMessage1SubMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.ProtoBench.SizeMessage1SubMessage, global::Google.ProtocolBuffers.ProtoBench.SizeMessage1SubMessage.Builder>(internal__static_benchmarks_SizeMessage1SubMessage__Descriptor,
+                new string[] { "Field1", "Field2", "Field3", "Field15", "Field12", "Field13", "Field14", "Field16", "Field19", "Field20", "Field28", "Field21", "Field22", "Field23", "Field206", "Field203", "Field204", "Field205", "Field207", "Field300", });
+        internal__static_benchmarks_SizeMessage2__Descriptor = Descriptor.MessageTypes[2];
+        internal__static_benchmarks_SizeMessage2__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.ProtoBench.SizeMessage2, global::Google.ProtocolBuffers.ProtoBench.SizeMessage2.Builder>(internal__static_benchmarks_SizeMessage2__Descriptor,
+                new string[] { "Field1", "Field3", "Field4", "Field30", "Field75", "Field6", "Field2", "Field21", "Field71", "Field25", "Field109", "Field210", "Field211", "Field212", "Field213", "Field216", "Field217", "Field218", "Field220", "Field221", "Field222", "Field63", "Group1", "Field128", "Field131", "Field127", "Field129", "Field130", "Field205", "Field206", });
+        internal__static_benchmarks_SizeMessage2_Group1__Descriptor = internal__static_benchmarks_SizeMessage2__Descriptor.NestedTypes[0];
+        internal__static_benchmarks_SizeMessage2_Group1__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.ProtoBench.SizeMessage2.Types.Group1, global::Google.ProtocolBuffers.ProtoBench.SizeMessage2.Types.Group1.Builder>(internal__static_benchmarks_SizeMessage2_Group1__Descriptor,
+                new string[] { "Field11", "Field26", "Field12", "Field13", "Field14", "Field15", "Field5", "Field27", "Field28", "Field29", "Field16", "Field22", "Field73", "Field20", "Field24", "Field31", });
+        internal__static_benchmarks_SizeMessage2GroupedMessage__Descriptor = Descriptor.MessageTypes[3];
+        internal__static_benchmarks_SizeMessage2GroupedMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.ProtoBench.SizeMessage2GroupedMessage, global::Google.ProtocolBuffers.ProtoBench.SizeMessage2GroupedMessage.Builder>(internal__static_benchmarks_SizeMessage2GroupedMessage__Descriptor,
+                new string[] { "Field1", "Field2", "Field3", "Field4", "Field5", "Field6", "Field7", "Field8", "Field9", "Field10", "Field11", });
+        pb::ExtensionRegistry registry = pb::ExtensionRegistry.CreateInstance();
+        RegisterAllExtensions(registry);
+        global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.RegisterAllExtensions(registry);
+        return registry;
+      };
+      pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,
+          new pbd::FileDescriptor[] {
+          global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.Descriptor, 
+          }, assigner);
+    }
+    #endregion
+    
+  }
+  #region Messages
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class SizeMessage1 : pb::GeneratedMessage<SizeMessage1, SizeMessage1.Builder> {
+    private SizeMessage1() { }
+    private static readonly SizeMessage1 defaultInstance = new SizeMessage1().MakeReadOnly();
+    public static SizeMessage1 DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override SizeMessage1 DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override SizeMessage1 ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.ProtoBench.GoogleSizeProtoFile.internal__static_benchmarks_SizeMessage1__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<SizeMessage1, SizeMessage1.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.ProtoBench.GoogleSizeProtoFile.internal__static_benchmarks_SizeMessage1__FieldAccessorTable; }
+    }
+    
+    public const int Field1FieldNumber = 1;
+    private bool hasField1;
+    private string field1_ = "";
+    public bool HasField1 {
+      get { return hasField1; }
+    }
+    public string Field1 {
+      get { return field1_; }
+    }
+    
+    public const int Field9FieldNumber = 9;
+    private bool hasField9;
+    private string field9_ = "";
+    public bool HasField9 {
+      get { return hasField9; }
+    }
+    public string Field9 {
+      get { return field9_; }
+    }
+    
+    public const int Field18FieldNumber = 18;
+    private bool hasField18;
+    private string field18_ = "";
+    public bool HasField18 {
+      get { return hasField18; }
+    }
+    public string Field18 {
+      get { return field18_; }
+    }
+    
+    public const int Field80FieldNumber = 80;
+    private bool hasField80;
+    private bool field80_;
+    public bool HasField80 {
+      get { return hasField80; }
+    }
+    public bool Field80 {
+      get { return field80_; }
+    }
+    
+    public const int Field81FieldNumber = 81;
+    private bool hasField81;
+    private bool field81_ = true;
+    public bool HasField81 {
+      get { return hasField81; }
+    }
+    public bool Field81 {
+      get { return field81_; }
+    }
+    
+    public const int Field2FieldNumber = 2;
+    private bool hasField2;
+    private int field2_;
+    public bool HasField2 {
+      get { return hasField2; }
+    }
+    public int Field2 {
+      get { return field2_; }
+    }
+    
+    public const int Field3FieldNumber = 3;
+    private bool hasField3;
+    private int field3_;
+    public bool HasField3 {
+      get { return hasField3; }
+    }
+    public int Field3 {
+      get { return field3_; }
+    }
+    
+    public const int Field280FieldNumber = 280;
+    private bool hasField280;
+    private int field280_;
+    public bool HasField280 {
+      get { return hasField280; }
+    }
+    public int Field280 {
+      get { return field280_; }
+    }
+    
+    public const int Field6FieldNumber = 6;
+    private bool hasField6;
+    private int field6_;
+    public bool HasField6 {
+      get { return hasField6; }
+    }
+    public int Field6 {
+      get { return field6_; }
+    }
+    
+    public const int Field22FieldNumber = 22;
+    private bool hasField22;
+    private long field22_;
+    public bool HasField22 {
+      get { return hasField22; }
+    }
+    public long Field22 {
+      get { return field22_; }
+    }
+    
+    public const int Field4FieldNumber = 4;
+    private bool hasField4;
+    private string field4_ = "";
+    public bool HasField4 {
+      get { return hasField4; }
+    }
+    public string Field4 {
+      get { return field4_; }
+    }
+    
+    public const int Field5FieldNumber = 5;
+    private pbc::PopsicleList<ulong> field5_ = new pbc::PopsicleList<ulong>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<ulong> Field5List {
+      get { return pbc::Lists.AsReadOnly(field5_); }
+    }
+    public int Field5Count {
+      get { return field5_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong GetField5(int index) {
+      return field5_[index];
+    }
+    
+    public const int Field59FieldNumber = 59;
+    private bool hasField59;
+    private bool field59_;
+    public bool HasField59 {
+      get { return hasField59; }
+    }
+    public bool Field59 {
+      get { return field59_; }
+    }
+    
+    public const int Field7FieldNumber = 7;
+    private bool hasField7;
+    private string field7_ = "";
+    public bool HasField7 {
+      get { return hasField7; }
+    }
+    public string Field7 {
+      get { return field7_; }
+    }
+    
+    public const int Field16FieldNumber = 16;
+    private bool hasField16;
+    private int field16_;
+    public bool HasField16 {
+      get { return hasField16; }
+    }
+    public int Field16 {
+      get { return field16_; }
+    }
+    
+    public const int Field130FieldNumber = 130;
+    private bool hasField130;
+    private int field130_;
+    public bool HasField130 {
+      get { return hasField130; }
+    }
+    public int Field130 {
+      get { return field130_; }
+    }
+    
+    public const int Field12FieldNumber = 12;
+    private bool hasField12;
+    private bool field12_ = true;
+    public bool HasField12 {
+      get { return hasField12; }
+    }
+    public bool Field12 {
+      get { return field12_; }
+    }
+    
+    public const int Field17FieldNumber = 17;
+    private bool hasField17;
+    private bool field17_ = true;
+    public bool HasField17 {
+      get { return hasField17; }
+    }
+    public bool Field17 {
+      get { return field17_; }
+    }
+    
+    public const int Field13FieldNumber = 13;
+    private bool hasField13;
+    private bool field13_ = true;
+    public bool HasField13 {
+      get { return hasField13; }
+    }
+    public bool Field13 {
+      get { return field13_; }
+    }
+    
+    public const int Field14FieldNumber = 14;
+    private bool hasField14;
+    private bool field14_ = true;
+    public bool HasField14 {
+      get { return hasField14; }
+    }
+    public bool Field14 {
+      get { return field14_; }
+    }
+    
+    public const int Field104FieldNumber = 104;
+    private bool hasField104;
+    private int field104_;
+    public bool HasField104 {
+      get { return hasField104; }
+    }
+    public int Field104 {
+      get { return field104_; }
+    }
+    
+    public const int Field100FieldNumber = 100;
+    private bool hasField100;
+    private int field100_;
+    public bool HasField100 {
+      get { return hasField100; }
+    }
+    public int Field100 {
+      get { return field100_; }
+    }
+    
+    public const int Field101FieldNumber = 101;
+    private bool hasField101;
+    private int field101_;
+    public bool HasField101 {
+      get { return hasField101; }
+    }
+    public int Field101 {
+      get { return field101_; }
+    }
+    
+    public const int Field102FieldNumber = 102;
+    private bool hasField102;
+    private string field102_ = "";
+    public bool HasField102 {
+      get { return hasField102; }
+    }
+    public string Field102 {
+      get { return field102_; }
+    }
+    
+    public const int Field103FieldNumber = 103;
+    private bool hasField103;
+    private string field103_ = "";
+    public bool HasField103 {
+      get { return hasField103; }
+    }
+    public string Field103 {
+      get { return field103_; }
+    }
+    
+    public const int Field29FieldNumber = 29;
+    private bool hasField29;
+    private int field29_;
+    public bool HasField29 {
+      get { return hasField29; }
+    }
+    public int Field29 {
+      get { return field29_; }
+    }
+    
+    public const int Field30FieldNumber = 30;
+    private bool hasField30;
+    private bool field30_;
+    public bool HasField30 {
+      get { return hasField30; }
+    }
+    public bool Field30 {
+      get { return field30_; }
+    }
+    
+    public const int Field60FieldNumber = 60;
+    private bool hasField60;
+    private int field60_ = -1;
+    public bool HasField60 {
+      get { return hasField60; }
+    }
+    public int Field60 {
+      get { return field60_; }
+    }
+    
+    public const int Field271FieldNumber = 271;
+    private bool hasField271;
+    private int field271_ = -1;
+    public bool HasField271 {
+      get { return hasField271; }
+    }
+    public int Field271 {
+      get { return field271_; }
+    }
+    
+    public const int Field272FieldNumber = 272;
+    private bool hasField272;
+    private int field272_ = -1;
+    public bool HasField272 {
+      get { return hasField272; }
+    }
+    public int Field272 {
+      get { return field272_; }
+    }
+    
+    public const int Field150FieldNumber = 150;
+    private bool hasField150;
+    private int field150_;
+    public bool HasField150 {
+      get { return hasField150; }
+    }
+    public int Field150 {
+      get { return field150_; }
+    }
+    
+    public const int Field23FieldNumber = 23;
+    private bool hasField23;
+    private int field23_;
+    public bool HasField23 {
+      get { return hasField23; }
+    }
+    public int Field23 {
+      get { return field23_; }
+    }
+    
+    public const int Field24FieldNumber = 24;
+    private bool hasField24;
+    private bool field24_;
+    public bool HasField24 {
+      get { return hasField24; }
+    }
+    public bool Field24 {
+      get { return field24_; }
+    }
+    
+    public const int Field25FieldNumber = 25;
+    private bool hasField25;
+    private int field25_;
+    public bool HasField25 {
+      get { return hasField25; }
+    }
+    public int Field25 {
+      get { return field25_; }
+    }
+    
+    public const int Field15FieldNumber = 15;
+    private bool hasField15;
+    private global::Google.ProtocolBuffers.ProtoBench.SizeMessage1SubMessage field15_;
+    public bool HasField15 {
+      get { return hasField15; }
+    }
+    public global::Google.ProtocolBuffers.ProtoBench.SizeMessage1SubMessage Field15 {
+      get { return field15_ ?? global::Google.ProtocolBuffers.ProtoBench.SizeMessage1SubMessage.DefaultInstance; }
+    }
+    
+    public const int Field78FieldNumber = 78;
+    private bool hasField78;
+    private bool field78_;
+    public bool HasField78 {
+      get { return hasField78; }
+    }
+    public bool Field78 {
+      get { return field78_; }
+    }
+    
+    public const int Field67FieldNumber = 67;
+    private bool hasField67;
+    private int field67_;
+    public bool HasField67 {
+      get { return hasField67; }
+    }
+    public int Field67 {
+      get { return field67_; }
+    }
+    
+    public const int Field68FieldNumber = 68;
+    private bool hasField68;
+    private int field68_;
+    public bool HasField68 {
+      get { return hasField68; }
+    }
+    public int Field68 {
+      get { return field68_; }
+    }
+    
+    public const int Field128FieldNumber = 128;
+    private bool hasField128;
+    private int field128_;
+    public bool HasField128 {
+      get { return hasField128; }
+    }
+    public int Field128 {
+      get { return field128_; }
+    }
+    
+    public const int Field129FieldNumber = 129;
+    private bool hasField129;
+    private string field129_ = "xxxxxxxxxxxxxxxxxxxxx";
+    public bool HasField129 {
+      get { return hasField129; }
+    }
+    public string Field129 {
+      get { return field129_; }
+    }
+    
+    public const int Field131FieldNumber = 131;
+    private bool hasField131;
+    private int field131_;
+    public bool HasField131 {
+      get { return hasField131; }
+    }
+    public int Field131 {
+      get { return field131_; }
+    }
+    
+    public static SizeMessage1 ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SizeMessage1 ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage1 ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SizeMessage1 ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage1 ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SizeMessage1 ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage1 ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static SizeMessage1 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static SizeMessage1 ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SizeMessage1 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private SizeMessage1 MakeReadOnly() {
+      field5_.MakeReadOnly();
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(SizeMessage1 prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<SizeMessage1, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(SizeMessage1 cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private SizeMessage1 result;
+      
+      private SizeMessage1 PrepareBuilder() {
+        if (resultIsReadOnly) {
+          SizeMessage1 original = result;
+          result = new SizeMessage1();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override SizeMessage1 MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.ProtoBench.SizeMessage1.Descriptor; }
+      }
+      
+      public override SizeMessage1 DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.ProtoBench.SizeMessage1.DefaultInstance; }
+      }
+      
+      public override SizeMessage1 BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      
+      public bool HasField1 {
+        get { return result.hasField1; }
+      }
+      public string Field1 {
+        get { return result.Field1; }
+        set { SetField1(value); }
+      }
+      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;
+      }
+      
+      public bool HasField9 {
+        get { return result.hasField9; }
+      }
+      public string Field9 {
+        get { return result.Field9; }
+        set { SetField9(value); }
+      }
+      public Builder SetField9(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField9 = true;
+        result.field9_ = value;
+        return this;
+      }
+      public Builder ClearField9() {
+        PrepareBuilder();
+        result.hasField9 = false;
+        result.field9_ = "";
+        return this;
+      }
+      
+      public bool HasField18 {
+        get { return result.hasField18; }
+      }
+      public string Field18 {
+        get { return result.Field18; }
+        set { SetField18(value); }
+      }
+      public Builder SetField18(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField18 = true;
+        result.field18_ = value;
+        return this;
+      }
+      public Builder ClearField18() {
+        PrepareBuilder();
+        result.hasField18 = false;
+        result.field18_ = "";
+        return this;
+      }
+      
+      public bool HasField80 {
+        get { return result.hasField80; }
+      }
+      public bool Field80 {
+        get { return result.Field80; }
+        set { SetField80(value); }
+      }
+      public Builder SetField80(bool value) {
+        PrepareBuilder();
+        result.hasField80 = true;
+        result.field80_ = value;
+        return this;
+      }
+      public Builder ClearField80() {
+        PrepareBuilder();
+        result.hasField80 = false;
+        result.field80_ = false;
+        return this;
+      }
+      
+      public bool HasField81 {
+        get { return result.hasField81; }
+      }
+      public bool Field81 {
+        get { return result.Field81; }
+        set { SetField81(value); }
+      }
+      public Builder SetField81(bool value) {
+        PrepareBuilder();
+        result.hasField81 = true;
+        result.field81_ = value;
+        return this;
+      }
+      public Builder ClearField81() {
+        PrepareBuilder();
+        result.hasField81 = false;
+        result.field81_ = true;
+        return this;
+      }
+      
+      public bool HasField2 {
+        get { return result.hasField2; }
+      }
+      public int Field2 {
+        get { return result.Field2; }
+        set { SetField2(value); }
+      }
+      public Builder SetField2(int value) {
+        PrepareBuilder();
+        result.hasField2 = true;
+        result.field2_ = value;
+        return this;
+      }
+      public Builder ClearField2() {
+        PrepareBuilder();
+        result.hasField2 = false;
+        result.field2_ = 0;
+        return this;
+      }
+      
+      public bool HasField3 {
+        get { return result.hasField3; }
+      }
+      public int Field3 {
+        get { return result.Field3; }
+        set { SetField3(value); }
+      }
+      public Builder SetField3(int value) {
+        PrepareBuilder();
+        result.hasField3 = true;
+        result.field3_ = value;
+        return this;
+      }
+      public Builder ClearField3() {
+        PrepareBuilder();
+        result.hasField3 = false;
+        result.field3_ = 0;
+        return this;
+      }
+      
+      public bool HasField280 {
+        get { return result.hasField280; }
+      }
+      public int Field280 {
+        get { return result.Field280; }
+        set { SetField280(value); }
+      }
+      public Builder SetField280(int value) {
+        PrepareBuilder();
+        result.hasField280 = true;
+        result.field280_ = value;
+        return this;
+      }
+      public Builder ClearField280() {
+        PrepareBuilder();
+        result.hasField280 = false;
+        result.field280_ = 0;
+        return this;
+      }
+      
+      public bool HasField6 {
+        get { return result.hasField6; }
+      }
+      public int Field6 {
+        get { return result.Field6; }
+        set { SetField6(value); }
+      }
+      public Builder SetField6(int value) {
+        PrepareBuilder();
+        result.hasField6 = true;
+        result.field6_ = value;
+        return this;
+      }
+      public Builder ClearField6() {
+        PrepareBuilder();
+        result.hasField6 = false;
+        result.field6_ = 0;
+        return this;
+      }
+      
+      public bool HasField22 {
+        get { return result.hasField22; }
+      }
+      public long Field22 {
+        get { return result.Field22; }
+        set { SetField22(value); }
+      }
+      public Builder SetField22(long value) {
+        PrepareBuilder();
+        result.hasField22 = true;
+        result.field22_ = value;
+        return this;
+      }
+      public Builder ClearField22() {
+        PrepareBuilder();
+        result.hasField22 = false;
+        result.field22_ = 0L;
+        return this;
+      }
+      
+      public bool HasField4 {
+        get { return result.hasField4; }
+      }
+      public string Field4 {
+        get { return result.Field4; }
+        set { SetField4(value); }
+      }
+      public Builder SetField4(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField4 = true;
+        result.field4_ = value;
+        return this;
+      }
+      public Builder ClearField4() {
+        PrepareBuilder();
+        result.hasField4 = false;
+        result.field4_ = "";
+        return this;
+      }
+      
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<ulong> Field5List {
+        get { return PrepareBuilder().field5_; }
+      }
+      public int Field5Count {
+        get { return result.Field5Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong GetField5(int index) {
+        return result.GetField5(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetField5(int index, ulong value) {
+        PrepareBuilder();
+        result.field5_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddField5(ulong value) {
+        PrepareBuilder();
+        result.field5_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangeField5(scg::IEnumerable<ulong> values) {
+        PrepareBuilder();
+        result.field5_.Add(values);
+        return this;
+      }
+      public Builder ClearField5() {
+        PrepareBuilder();
+        result.field5_.Clear();
+        return this;
+      }
+      
+      public bool HasField59 {
+        get { return result.hasField59; }
+      }
+      public bool Field59 {
+        get { return result.Field59; }
+        set { SetField59(value); }
+      }
+      public Builder SetField59(bool value) {
+        PrepareBuilder();
+        result.hasField59 = true;
+        result.field59_ = value;
+        return this;
+      }
+      public Builder ClearField59() {
+        PrepareBuilder();
+        result.hasField59 = false;
+        result.field59_ = false;
+        return this;
+      }
+      
+      public bool HasField7 {
+        get { return result.hasField7; }
+      }
+      public string Field7 {
+        get { return result.Field7; }
+        set { SetField7(value); }
+      }
+      public Builder SetField7(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField7 = true;
+        result.field7_ = value;
+        return this;
+      }
+      public Builder ClearField7() {
+        PrepareBuilder();
+        result.hasField7 = false;
+        result.field7_ = "";
+        return this;
+      }
+      
+      public bool HasField16 {
+        get { return result.hasField16; }
+      }
+      public int Field16 {
+        get { return result.Field16; }
+        set { SetField16(value); }
+      }
+      public Builder SetField16(int value) {
+        PrepareBuilder();
+        result.hasField16 = true;
+        result.field16_ = value;
+        return this;
+      }
+      public Builder ClearField16() {
+        PrepareBuilder();
+        result.hasField16 = false;
+        result.field16_ = 0;
+        return this;
+      }
+      
+      public bool HasField130 {
+        get { return result.hasField130; }
+      }
+      public int Field130 {
+        get { return result.Field130; }
+        set { SetField130(value); }
+      }
+      public Builder SetField130(int value) {
+        PrepareBuilder();
+        result.hasField130 = true;
+        result.field130_ = value;
+        return this;
+      }
+      public Builder ClearField130() {
+        PrepareBuilder();
+        result.hasField130 = false;
+        result.field130_ = 0;
+        return this;
+      }
+      
+      public bool HasField12 {
+        get { return result.hasField12; }
+      }
+      public bool Field12 {
+        get { return result.Field12; }
+        set { SetField12(value); }
+      }
+      public Builder SetField12(bool value) {
+        PrepareBuilder();
+        result.hasField12 = true;
+        result.field12_ = value;
+        return this;
+      }
+      public Builder ClearField12() {
+        PrepareBuilder();
+        result.hasField12 = false;
+        result.field12_ = true;
+        return this;
+      }
+      
+      public bool HasField17 {
+        get { return result.hasField17; }
+      }
+      public bool Field17 {
+        get { return result.Field17; }
+        set { SetField17(value); }
+      }
+      public Builder SetField17(bool value) {
+        PrepareBuilder();
+        result.hasField17 = true;
+        result.field17_ = value;
+        return this;
+      }
+      public Builder ClearField17() {
+        PrepareBuilder();
+        result.hasField17 = false;
+        result.field17_ = true;
+        return this;
+      }
+      
+      public bool HasField13 {
+        get { return result.hasField13; }
+      }
+      public bool Field13 {
+        get { return result.Field13; }
+        set { SetField13(value); }
+      }
+      public Builder SetField13(bool value) {
+        PrepareBuilder();
+        result.hasField13 = true;
+        result.field13_ = value;
+        return this;
+      }
+      public Builder ClearField13() {
+        PrepareBuilder();
+        result.hasField13 = false;
+        result.field13_ = true;
+        return this;
+      }
+      
+      public bool HasField14 {
+        get { return result.hasField14; }
+      }
+      public bool Field14 {
+        get { return result.Field14; }
+        set { SetField14(value); }
+      }
+      public Builder SetField14(bool value) {
+        PrepareBuilder();
+        result.hasField14 = true;
+        result.field14_ = value;
+        return this;
+      }
+      public Builder ClearField14() {
+        PrepareBuilder();
+        result.hasField14 = false;
+        result.field14_ = true;
+        return this;
+      }
+      
+      public bool HasField104 {
+        get { return result.hasField104; }
+      }
+      public int Field104 {
+        get { return result.Field104; }
+        set { SetField104(value); }
+      }
+      public Builder SetField104(int value) {
+        PrepareBuilder();
+        result.hasField104 = true;
+        result.field104_ = value;
+        return this;
+      }
+      public Builder ClearField104() {
+        PrepareBuilder();
+        result.hasField104 = false;
+        result.field104_ = 0;
+        return this;
+      }
+      
+      public bool HasField100 {
+        get { return result.hasField100; }
+      }
+      public int Field100 {
+        get { return result.Field100; }
+        set { SetField100(value); }
+      }
+      public Builder SetField100(int value) {
+        PrepareBuilder();
+        result.hasField100 = true;
+        result.field100_ = value;
+        return this;
+      }
+      public Builder ClearField100() {
+        PrepareBuilder();
+        result.hasField100 = false;
+        result.field100_ = 0;
+        return this;
+      }
+      
+      public bool HasField101 {
+        get { return result.hasField101; }
+      }
+      public int Field101 {
+        get { return result.Field101; }
+        set { SetField101(value); }
+      }
+      public Builder SetField101(int value) {
+        PrepareBuilder();
+        result.hasField101 = true;
+        result.field101_ = value;
+        return this;
+      }
+      public Builder ClearField101() {
+        PrepareBuilder();
+        result.hasField101 = false;
+        result.field101_ = 0;
+        return this;
+      }
+      
+      public bool HasField102 {
+        get { return result.hasField102; }
+      }
+      public string Field102 {
+        get { return result.Field102; }
+        set { SetField102(value); }
+      }
+      public Builder SetField102(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField102 = true;
+        result.field102_ = value;
+        return this;
+      }
+      public Builder ClearField102() {
+        PrepareBuilder();
+        result.hasField102 = false;
+        result.field102_ = "";
+        return this;
+      }
+      
+      public bool HasField103 {
+        get { return result.hasField103; }
+      }
+      public string Field103 {
+        get { return result.Field103; }
+        set { SetField103(value); }
+      }
+      public Builder SetField103(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField103 = true;
+        result.field103_ = value;
+        return this;
+      }
+      public Builder ClearField103() {
+        PrepareBuilder();
+        result.hasField103 = false;
+        result.field103_ = "";
+        return this;
+      }
+      
+      public bool HasField29 {
+        get { return result.hasField29; }
+      }
+      public int Field29 {
+        get { return result.Field29; }
+        set { SetField29(value); }
+      }
+      public Builder SetField29(int value) {
+        PrepareBuilder();
+        result.hasField29 = true;
+        result.field29_ = value;
+        return this;
+      }
+      public Builder ClearField29() {
+        PrepareBuilder();
+        result.hasField29 = false;
+        result.field29_ = 0;
+        return this;
+      }
+      
+      public bool HasField30 {
+        get { return result.hasField30; }
+      }
+      public bool Field30 {
+        get { return result.Field30; }
+        set { SetField30(value); }
+      }
+      public Builder SetField30(bool value) {
+        PrepareBuilder();
+        result.hasField30 = true;
+        result.field30_ = value;
+        return this;
+      }
+      public Builder ClearField30() {
+        PrepareBuilder();
+        result.hasField30 = false;
+        result.field30_ = false;
+        return this;
+      }
+      
+      public bool HasField60 {
+        get { return result.hasField60; }
+      }
+      public int Field60 {
+        get { return result.Field60; }
+        set { SetField60(value); }
+      }
+      public Builder SetField60(int value) {
+        PrepareBuilder();
+        result.hasField60 = true;
+        result.field60_ = value;
+        return this;
+      }
+      public Builder ClearField60() {
+        PrepareBuilder();
+        result.hasField60 = false;
+        result.field60_ = -1;
+        return this;
+      }
+      
+      public bool HasField271 {
+        get { return result.hasField271; }
+      }
+      public int Field271 {
+        get { return result.Field271; }
+        set { SetField271(value); }
+      }
+      public Builder SetField271(int value) {
+        PrepareBuilder();
+        result.hasField271 = true;
+        result.field271_ = value;
+        return this;
+      }
+      public Builder ClearField271() {
+        PrepareBuilder();
+        result.hasField271 = false;
+        result.field271_ = -1;
+        return this;
+      }
+      
+      public bool HasField272 {
+        get { return result.hasField272; }
+      }
+      public int Field272 {
+        get { return result.Field272; }
+        set { SetField272(value); }
+      }
+      public Builder SetField272(int value) {
+        PrepareBuilder();
+        result.hasField272 = true;
+        result.field272_ = value;
+        return this;
+      }
+      public Builder ClearField272() {
+        PrepareBuilder();
+        result.hasField272 = false;
+        result.field272_ = -1;
+        return this;
+      }
+      
+      public bool HasField150 {
+        get { return result.hasField150; }
+      }
+      public int Field150 {
+        get { return result.Field150; }
+        set { SetField150(value); }
+      }
+      public Builder SetField150(int value) {
+        PrepareBuilder();
+        result.hasField150 = true;
+        result.field150_ = value;
+        return this;
+      }
+      public Builder ClearField150() {
+        PrepareBuilder();
+        result.hasField150 = false;
+        result.field150_ = 0;
+        return this;
+      }
+      
+      public bool HasField23 {
+        get { return result.hasField23; }
+      }
+      public int Field23 {
+        get { return result.Field23; }
+        set { SetField23(value); }
+      }
+      public Builder SetField23(int value) {
+        PrepareBuilder();
+        result.hasField23 = true;
+        result.field23_ = value;
+        return this;
+      }
+      public Builder ClearField23() {
+        PrepareBuilder();
+        result.hasField23 = false;
+        result.field23_ = 0;
+        return this;
+      }
+      
+      public bool HasField24 {
+        get { return result.hasField24; }
+      }
+      public bool Field24 {
+        get { return result.Field24; }
+        set { SetField24(value); }
+      }
+      public Builder SetField24(bool value) {
+        PrepareBuilder();
+        result.hasField24 = true;
+        result.field24_ = value;
+        return this;
+      }
+      public Builder ClearField24() {
+        PrepareBuilder();
+        result.hasField24 = false;
+        result.field24_ = false;
+        return this;
+      }
+      
+      public bool HasField25 {
+        get { return result.hasField25; }
+      }
+      public int Field25 {
+        get { return result.Field25; }
+        set { SetField25(value); }
+      }
+      public Builder SetField25(int value) {
+        PrepareBuilder();
+        result.hasField25 = true;
+        result.field25_ = value;
+        return this;
+      }
+      public Builder ClearField25() {
+        PrepareBuilder();
+        result.hasField25 = false;
+        result.field25_ = 0;
+        return this;
+      }
+      
+      public bool HasField15 {
+       get { return result.hasField15; }
+      }
+      public global::Google.ProtocolBuffers.ProtoBench.SizeMessage1SubMessage Field15 {
+        get { return result.Field15; }
+        set { SetField15(value); }
+      }
+      public Builder SetField15(global::Google.ProtocolBuffers.ProtoBench.SizeMessage1SubMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField15 = true;
+        result.field15_ = value;
+        return this;
+      }
+      public Builder SetField15(global::Google.ProtocolBuffers.ProtoBench.SizeMessage1SubMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasField15 = true;
+        result.field15_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeField15(global::Google.ProtocolBuffers.ProtoBench.SizeMessage1SubMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasField15 &&
+            result.field15_ != global::Google.ProtocolBuffers.ProtoBench.SizeMessage1SubMessage.DefaultInstance) {
+            result.field15_ = global::Google.ProtocolBuffers.ProtoBench.SizeMessage1SubMessage.CreateBuilder(result.field15_).MergeFrom(value).BuildPartial();
+        } else {
+          result.field15_ = value;
+        }
+        result.hasField15 = true;
+        return this;
+      }
+      public Builder ClearField15() {
+        PrepareBuilder();
+        result.hasField15 = false;
+        result.field15_ = null;
+        return this;
+      }
+      
+      public bool HasField78 {
+        get { return result.hasField78; }
+      }
+      public bool Field78 {
+        get { return result.Field78; }
+        set { SetField78(value); }
+      }
+      public Builder SetField78(bool value) {
+        PrepareBuilder();
+        result.hasField78 = true;
+        result.field78_ = value;
+        return this;
+      }
+      public Builder ClearField78() {
+        PrepareBuilder();
+        result.hasField78 = false;
+        result.field78_ = false;
+        return this;
+      }
+      
+      public bool HasField67 {
+        get { return result.hasField67; }
+      }
+      public int Field67 {
+        get { return result.Field67; }
+        set { SetField67(value); }
+      }
+      public Builder SetField67(int value) {
+        PrepareBuilder();
+        result.hasField67 = true;
+        result.field67_ = value;
+        return this;
+      }
+      public Builder ClearField67() {
+        PrepareBuilder();
+        result.hasField67 = false;
+        result.field67_ = 0;
+        return this;
+      }
+      
+      public bool HasField68 {
+        get { return result.hasField68; }
+      }
+      public int Field68 {
+        get { return result.Field68; }
+        set { SetField68(value); }
+      }
+      public Builder SetField68(int value) {
+        PrepareBuilder();
+        result.hasField68 = true;
+        result.field68_ = value;
+        return this;
+      }
+      public Builder ClearField68() {
+        PrepareBuilder();
+        result.hasField68 = false;
+        result.field68_ = 0;
+        return this;
+      }
+      
+      public bool HasField128 {
+        get { return result.hasField128; }
+      }
+      public int Field128 {
+        get { return result.Field128; }
+        set { SetField128(value); }
+      }
+      public Builder SetField128(int value) {
+        PrepareBuilder();
+        result.hasField128 = true;
+        result.field128_ = value;
+        return this;
+      }
+      public Builder ClearField128() {
+        PrepareBuilder();
+        result.hasField128 = false;
+        result.field128_ = 0;
+        return this;
+      }
+      
+      public bool HasField129 {
+        get { return result.hasField129; }
+      }
+      public string Field129 {
+        get { return result.Field129; }
+        set { SetField129(value); }
+      }
+      public Builder SetField129(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField129 = true;
+        result.field129_ = value;
+        return this;
+      }
+      public Builder ClearField129() {
+        PrepareBuilder();
+        result.hasField129 = false;
+        result.field129_ = "xxxxxxxxxxxxxxxxxxxxx";
+        return this;
+      }
+      
+      public bool HasField131 {
+        get { return result.hasField131; }
+      }
+      public int Field131 {
+        get { return result.Field131; }
+        set { SetField131(value); }
+      }
+      public Builder SetField131(int value) {
+        PrepareBuilder();
+        result.hasField131 = true;
+        result.field131_ = value;
+        return this;
+      }
+      public Builder ClearField131() {
+        PrepareBuilder();
+        result.hasField131 = false;
+        result.field131_ = 0;
+        return this;
+      }
+    }
+    static SizeMessage1() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.ProtoBench.GoogleSizeProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class SizeMessage1SubMessage : pb::GeneratedMessage<SizeMessage1SubMessage, SizeMessage1SubMessage.Builder> {
+    private SizeMessage1SubMessage() { }
+    private static readonly SizeMessage1SubMessage defaultInstance = new SizeMessage1SubMessage().MakeReadOnly();
+    public static SizeMessage1SubMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override SizeMessage1SubMessage DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override SizeMessage1SubMessage ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.ProtoBench.GoogleSizeProtoFile.internal__static_benchmarks_SizeMessage1SubMessage__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<SizeMessage1SubMessage, SizeMessage1SubMessage.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.ProtoBench.GoogleSizeProtoFile.internal__static_benchmarks_SizeMessage1SubMessage__FieldAccessorTable; }
+    }
+    
+    public const int Field1FieldNumber = 1;
+    private bool hasField1;
+    private int field1_;
+    public bool HasField1 {
+      get { return hasField1; }
+    }
+    public int Field1 {
+      get { return field1_; }
+    }
+    
+    public const int Field2FieldNumber = 2;
+    private bool hasField2;
+    private int field2_;
+    public bool HasField2 {
+      get { return hasField2; }
+    }
+    public int Field2 {
+      get { return field2_; }
+    }
+    
+    public const int Field3FieldNumber = 3;
+    private bool hasField3;
+    private int field3_;
+    public bool HasField3 {
+      get { return hasField3; }
+    }
+    public int Field3 {
+      get { return field3_; }
+    }
+    
+    public const int Field15FieldNumber = 15;
+    private bool hasField15;
+    private string field15_ = "";
+    public bool HasField15 {
+      get { return hasField15; }
+    }
+    public string Field15 {
+      get { return field15_; }
+    }
+    
+    public const int Field12FieldNumber = 12;
+    private bool hasField12;
+    private bool field12_ = true;
+    public bool HasField12 {
+      get { return hasField12; }
+    }
+    public bool Field12 {
+      get { return field12_; }
+    }
+    
+    public const int Field13FieldNumber = 13;
+    private bool hasField13;
+    private long field13_;
+    public bool HasField13 {
+      get { return hasField13; }
+    }
+    public long Field13 {
+      get { return field13_; }
+    }
+    
+    public const int Field14FieldNumber = 14;
+    private bool hasField14;
+    private long field14_;
+    public bool HasField14 {
+      get { return hasField14; }
+    }
+    public long Field14 {
+      get { return field14_; }
+    }
+    
+    public const int Field16FieldNumber = 16;
+    private bool hasField16;
+    private int field16_;
+    public bool HasField16 {
+      get { return hasField16; }
+    }
+    public int Field16 {
+      get { return field16_; }
+    }
+    
+    public const int Field19FieldNumber = 19;
+    private bool hasField19;
+    private int field19_ = 2;
+    public bool HasField19 {
+      get { return hasField19; }
+    }
+    public int Field19 {
+      get { return field19_; }
+    }
+    
+    public const int Field20FieldNumber = 20;
+    private bool hasField20;
+    private bool field20_ = true;
+    public bool HasField20 {
+      get { return hasField20; }
+    }
+    public bool Field20 {
+      get { return field20_; }
+    }
+    
+    public const int Field28FieldNumber = 28;
+    private bool hasField28;
+    private bool field28_ = true;
+    public bool HasField28 {
+      get { return hasField28; }
+    }
+    public bool Field28 {
+      get { return field28_; }
+    }
+    
+    public const int Field21FieldNumber = 21;
+    private bool hasField21;
+    private ulong field21_;
+    public bool HasField21 {
+      get { return hasField21; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong Field21 {
+      get { return field21_; }
+    }
+    
+    public const int Field22FieldNumber = 22;
+    private bool hasField22;
+    private int field22_;
+    public bool HasField22 {
+      get { return hasField22; }
+    }
+    public int Field22 {
+      get { return field22_; }
+    }
+    
+    public const int Field23FieldNumber = 23;
+    private bool hasField23;
+    private bool field23_;
+    public bool HasField23 {
+      get { return hasField23; }
+    }
+    public bool Field23 {
+      get { return field23_; }
+    }
+    
+    public const int Field206FieldNumber = 206;
+    private bool hasField206;
+    private bool field206_;
+    public bool HasField206 {
+      get { return hasField206; }
+    }
+    public bool Field206 {
+      get { return field206_; }
+    }
+    
+    public const int Field203FieldNumber = 203;
+    private bool hasField203;
+    private uint field203_;
+    public bool HasField203 {
+      get { return hasField203; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint Field203 {
+      get { return field203_; }
+    }
+    
+    public const int Field204FieldNumber = 204;
+    private bool hasField204;
+    private int field204_;
+    public bool HasField204 {
+      get { return hasField204; }
+    }
+    public int Field204 {
+      get { return field204_; }
+    }
+    
+    public const int Field205FieldNumber = 205;
+    private bool hasField205;
+    private string field205_ = "";
+    public bool HasField205 {
+      get { return hasField205; }
+    }
+    public string Field205 {
+      get { return field205_; }
+    }
+    
+    public const int Field207FieldNumber = 207;
+    private bool hasField207;
+    private ulong field207_;
+    public bool HasField207 {
+      get { return hasField207; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong Field207 {
+      get { return field207_; }
+    }
+    
+    public const int Field300FieldNumber = 300;
+    private bool hasField300;
+    private ulong field300_;
+    public bool HasField300 {
+      get { return hasField300; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong Field300 {
+      get { return field300_; }
+    }
+    
+    public static SizeMessage1SubMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SizeMessage1SubMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage1SubMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SizeMessage1SubMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage1SubMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SizeMessage1SubMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage1SubMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static SizeMessage1SubMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static SizeMessage1SubMessage ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SizeMessage1SubMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private SizeMessage1SubMessage MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(SizeMessage1SubMessage prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<SizeMessage1SubMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(SizeMessage1SubMessage cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private SizeMessage1SubMessage result;
+      
+      private SizeMessage1SubMessage PrepareBuilder() {
+        if (resultIsReadOnly) {
+          SizeMessage1SubMessage original = result;
+          result = new SizeMessage1SubMessage();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override SizeMessage1SubMessage MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.ProtoBench.SizeMessage1SubMessage.Descriptor; }
+      }
+      
+      public override SizeMessage1SubMessage DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.ProtoBench.SizeMessage1SubMessage.DefaultInstance; }
+      }
+      
+      public override SizeMessage1SubMessage BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      
+      public bool HasField1 {
+        get { return result.hasField1; }
+      }
+      public int Field1 {
+        get { return result.Field1; }
+        set { SetField1(value); }
+      }
+      public Builder SetField1(int value) {
+        PrepareBuilder();
+        result.hasField1 = true;
+        result.field1_ = value;
+        return this;
+      }
+      public Builder ClearField1() {
+        PrepareBuilder();
+        result.hasField1 = false;
+        result.field1_ = 0;
+        return this;
+      }
+      
+      public bool HasField2 {
+        get { return result.hasField2; }
+      }
+      public int Field2 {
+        get { return result.Field2; }
+        set { SetField2(value); }
+      }
+      public Builder SetField2(int value) {
+        PrepareBuilder();
+        result.hasField2 = true;
+        result.field2_ = value;
+        return this;
+      }
+      public Builder ClearField2() {
+        PrepareBuilder();
+        result.hasField2 = false;
+        result.field2_ = 0;
+        return this;
+      }
+      
+      public bool HasField3 {
+        get { return result.hasField3; }
+      }
+      public int Field3 {
+        get { return result.Field3; }
+        set { SetField3(value); }
+      }
+      public Builder SetField3(int value) {
+        PrepareBuilder();
+        result.hasField3 = true;
+        result.field3_ = value;
+        return this;
+      }
+      public Builder ClearField3() {
+        PrepareBuilder();
+        result.hasField3 = false;
+        result.field3_ = 0;
+        return this;
+      }
+      
+      public bool HasField15 {
+        get { return result.hasField15; }
+      }
+      public string Field15 {
+        get { return result.Field15; }
+        set { SetField15(value); }
+      }
+      public Builder SetField15(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField15 = true;
+        result.field15_ = value;
+        return this;
+      }
+      public Builder ClearField15() {
+        PrepareBuilder();
+        result.hasField15 = false;
+        result.field15_ = "";
+        return this;
+      }
+      
+      public bool HasField12 {
+        get { return result.hasField12; }
+      }
+      public bool Field12 {
+        get { return result.Field12; }
+        set { SetField12(value); }
+      }
+      public Builder SetField12(bool value) {
+        PrepareBuilder();
+        result.hasField12 = true;
+        result.field12_ = value;
+        return this;
+      }
+      public Builder ClearField12() {
+        PrepareBuilder();
+        result.hasField12 = false;
+        result.field12_ = true;
+        return this;
+      }
+      
+      public bool HasField13 {
+        get { return result.hasField13; }
+      }
+      public long Field13 {
+        get { return result.Field13; }
+        set { SetField13(value); }
+      }
+      public Builder SetField13(long value) {
+        PrepareBuilder();
+        result.hasField13 = true;
+        result.field13_ = value;
+        return this;
+      }
+      public Builder ClearField13() {
+        PrepareBuilder();
+        result.hasField13 = false;
+        result.field13_ = 0L;
+        return this;
+      }
+      
+      public bool HasField14 {
+        get { return result.hasField14; }
+      }
+      public long Field14 {
+        get { return result.Field14; }
+        set { SetField14(value); }
+      }
+      public Builder SetField14(long value) {
+        PrepareBuilder();
+        result.hasField14 = true;
+        result.field14_ = value;
+        return this;
+      }
+      public Builder ClearField14() {
+        PrepareBuilder();
+        result.hasField14 = false;
+        result.field14_ = 0L;
+        return this;
+      }
+      
+      public bool HasField16 {
+        get { return result.hasField16; }
+      }
+      public int Field16 {
+        get { return result.Field16; }
+        set { SetField16(value); }
+      }
+      public Builder SetField16(int value) {
+        PrepareBuilder();
+        result.hasField16 = true;
+        result.field16_ = value;
+        return this;
+      }
+      public Builder ClearField16() {
+        PrepareBuilder();
+        result.hasField16 = false;
+        result.field16_ = 0;
+        return this;
+      }
+      
+      public bool HasField19 {
+        get { return result.hasField19; }
+      }
+      public int Field19 {
+        get { return result.Field19; }
+        set { SetField19(value); }
+      }
+      public Builder SetField19(int value) {
+        PrepareBuilder();
+        result.hasField19 = true;
+        result.field19_ = value;
+        return this;
+      }
+      public Builder ClearField19() {
+        PrepareBuilder();
+        result.hasField19 = false;
+        result.field19_ = 2;
+        return this;
+      }
+      
+      public bool HasField20 {
+        get { return result.hasField20; }
+      }
+      public bool Field20 {
+        get { return result.Field20; }
+        set { SetField20(value); }
+      }
+      public Builder SetField20(bool value) {
+        PrepareBuilder();
+        result.hasField20 = true;
+        result.field20_ = value;
+        return this;
+      }
+      public Builder ClearField20() {
+        PrepareBuilder();
+        result.hasField20 = false;
+        result.field20_ = true;
+        return this;
+      }
+      
+      public bool HasField28 {
+        get { return result.hasField28; }
+      }
+      public bool Field28 {
+        get { return result.Field28; }
+        set { SetField28(value); }
+      }
+      public Builder SetField28(bool value) {
+        PrepareBuilder();
+        result.hasField28 = true;
+        result.field28_ = value;
+        return this;
+      }
+      public Builder ClearField28() {
+        PrepareBuilder();
+        result.hasField28 = false;
+        result.field28_ = true;
+        return this;
+      }
+      
+      public bool HasField21 {
+        get { return result.hasField21; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong Field21 {
+        get { return result.Field21; }
+        set { SetField21(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetField21(ulong value) {
+        PrepareBuilder();
+        result.hasField21 = true;
+        result.field21_ = value;
+        return this;
+      }
+      public Builder ClearField21() {
+        PrepareBuilder();
+        result.hasField21 = false;
+        result.field21_ = 0;
+        return this;
+      }
+      
+      public bool HasField22 {
+        get { return result.hasField22; }
+      }
+      public int Field22 {
+        get { return result.Field22; }
+        set { SetField22(value); }
+      }
+      public Builder SetField22(int value) {
+        PrepareBuilder();
+        result.hasField22 = true;
+        result.field22_ = value;
+        return this;
+      }
+      public Builder ClearField22() {
+        PrepareBuilder();
+        result.hasField22 = false;
+        result.field22_ = 0;
+        return this;
+      }
+      
+      public bool HasField23 {
+        get { return result.hasField23; }
+      }
+      public bool Field23 {
+        get { return result.Field23; }
+        set { SetField23(value); }
+      }
+      public Builder SetField23(bool value) {
+        PrepareBuilder();
+        result.hasField23 = true;
+        result.field23_ = value;
+        return this;
+      }
+      public Builder ClearField23() {
+        PrepareBuilder();
+        result.hasField23 = false;
+        result.field23_ = false;
+        return this;
+      }
+      
+      public bool HasField206 {
+        get { return result.hasField206; }
+      }
+      public bool Field206 {
+        get { return result.Field206; }
+        set { SetField206(value); }
+      }
+      public Builder SetField206(bool value) {
+        PrepareBuilder();
+        result.hasField206 = true;
+        result.field206_ = value;
+        return this;
+      }
+      public Builder ClearField206() {
+        PrepareBuilder();
+        result.hasField206 = false;
+        result.field206_ = false;
+        return this;
+      }
+      
+      public bool HasField203 {
+        get { return result.hasField203; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint Field203 {
+        get { return result.Field203; }
+        set { SetField203(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetField203(uint value) {
+        PrepareBuilder();
+        result.hasField203 = true;
+        result.field203_ = value;
+        return this;
+      }
+      public Builder ClearField203() {
+        PrepareBuilder();
+        result.hasField203 = false;
+        result.field203_ = 0;
+        return this;
+      }
+      
+      public bool HasField204 {
+        get { return result.hasField204; }
+      }
+      public int Field204 {
+        get { return result.Field204; }
+        set { SetField204(value); }
+      }
+      public Builder SetField204(int value) {
+        PrepareBuilder();
+        result.hasField204 = true;
+        result.field204_ = value;
+        return this;
+      }
+      public Builder ClearField204() {
+        PrepareBuilder();
+        result.hasField204 = false;
+        result.field204_ = 0;
+        return this;
+      }
+      
+      public bool HasField205 {
+        get { return result.hasField205; }
+      }
+      public string Field205 {
+        get { return result.Field205; }
+        set { SetField205(value); }
+      }
+      public Builder SetField205(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField205 = true;
+        result.field205_ = value;
+        return this;
+      }
+      public Builder ClearField205() {
+        PrepareBuilder();
+        result.hasField205 = false;
+        result.field205_ = "";
+        return this;
+      }
+      
+      public bool HasField207 {
+        get { return result.hasField207; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong Field207 {
+        get { return result.Field207; }
+        set { SetField207(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetField207(ulong value) {
+        PrepareBuilder();
+        result.hasField207 = true;
+        result.field207_ = value;
+        return this;
+      }
+      public Builder ClearField207() {
+        PrepareBuilder();
+        result.hasField207 = false;
+        result.field207_ = 0UL;
+        return this;
+      }
+      
+      public bool HasField300 {
+        get { return result.hasField300; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong Field300 {
+        get { return result.Field300; }
+        set { SetField300(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetField300(ulong value) {
+        PrepareBuilder();
+        result.hasField300 = true;
+        result.field300_ = value;
+        return this;
+      }
+      public Builder ClearField300() {
+        PrepareBuilder();
+        result.hasField300 = false;
+        result.field300_ = 0UL;
+        return this;
+      }
+    }
+    static SizeMessage1SubMessage() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.ProtoBench.GoogleSizeProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class SizeMessage2 : pb::GeneratedMessage<SizeMessage2, SizeMessage2.Builder> {
+    private SizeMessage2() { }
+    private static readonly SizeMessage2 defaultInstance = new SizeMessage2().MakeReadOnly();
+    public static SizeMessage2 DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override SizeMessage2 DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override SizeMessage2 ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.ProtoBench.GoogleSizeProtoFile.internal__static_benchmarks_SizeMessage2__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<SizeMessage2, SizeMessage2.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.ProtoBench.GoogleSizeProtoFile.internal__static_benchmarks_SizeMessage2__FieldAccessorTable; }
+    }
+    
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public static partial class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class Group1 : pb::GeneratedMessage<Group1, Group1.Builder> {
+        private Group1() { }
+        private static readonly Group1 defaultInstance = new Group1().MakeReadOnly();
+        public static Group1 DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override Group1 DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+        
+        protected override Group1 ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.ProtoBench.GoogleSizeProtoFile.internal__static_benchmarks_SizeMessage2_Group1__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<Group1, Group1.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.ProtoBench.GoogleSizeProtoFile.internal__static_benchmarks_SizeMessage2_Group1__FieldAccessorTable; }
+        }
+        
+        public const int Field11FieldNumber = 11;
+        private bool hasField11;
+        private float field11_;
+        public bool HasField11 {
+          get { return hasField11; }
+        }
+        public float Field11 {
+          get { return field11_; }
+        }
+        
+        public const int Field26FieldNumber = 26;
+        private bool hasField26;
+        private float field26_;
+        public bool HasField26 {
+          get { return hasField26; }
+        }
+        public float Field26 {
+          get { return field26_; }
+        }
+        
+        public const int Field12FieldNumber = 12;
+        private bool hasField12;
+        private string field12_ = "";
+        public bool HasField12 {
+          get { return hasField12; }
+        }
+        public string Field12 {
+          get { return field12_; }
+        }
+        
+        public const int Field13FieldNumber = 13;
+        private bool hasField13;
+        private string field13_ = "";
+        public bool HasField13 {
+          get { return hasField13; }
+        }
+        public string Field13 {
+          get { return field13_; }
+        }
+        
+        public const int Field14FieldNumber = 14;
+        private pbc::PopsicleList<string> field14_ = new pbc::PopsicleList<string>();
+        public scg::IList<string> Field14List {
+          get { return pbc::Lists.AsReadOnly(field14_); }
+        }
+        public int Field14Count {
+          get { return field14_.Count; }
+        }
+        public string GetField14(int index) {
+          return field14_[index];
+        }
+        
+        public const int Field15FieldNumber = 15;
+        private bool hasField15;
+        private ulong field15_;
+        public bool HasField15 {
+          get { return hasField15; }
+        }
+        [global::System.CLSCompliant(false)]
+        public ulong Field15 {
+          get { return field15_; }
+        }
+        
+        public const int Field5FieldNumber = 5;
+        private bool hasField5;
+        private int field5_;
+        public bool HasField5 {
+          get { return hasField5; }
+        }
+        public int Field5 {
+          get { return field5_; }
+        }
+        
+        public const int Field27FieldNumber = 27;
+        private bool hasField27;
+        private string field27_ = "";
+        public bool HasField27 {
+          get { return hasField27; }
+        }
+        public string Field27 {
+          get { return field27_; }
+        }
+        
+        public const int Field28FieldNumber = 28;
+        private bool hasField28;
+        private int field28_;
+        public bool HasField28 {
+          get { return hasField28; }
+        }
+        public int Field28 {
+          get { return field28_; }
+        }
+        
+        public const int Field29FieldNumber = 29;
+        private bool hasField29;
+        private string field29_ = "";
+        public bool HasField29 {
+          get { return hasField29; }
+        }
+        public string Field29 {
+          get { return field29_; }
+        }
+        
+        public const int Field16FieldNumber = 16;
+        private bool hasField16;
+        private string field16_ = "";
+        public bool HasField16 {
+          get { return hasField16; }
+        }
+        public string Field16 {
+          get { return field16_; }
+        }
+        
+        public const int Field22FieldNumber = 22;
+        private pbc::PopsicleList<string> field22_ = new pbc::PopsicleList<string>();
+        public scg::IList<string> Field22List {
+          get { return pbc::Lists.AsReadOnly(field22_); }
+        }
+        public int Field22Count {
+          get { return field22_.Count; }
+        }
+        public string GetField22(int index) {
+          return field22_[index];
+        }
+        
+        public const int Field73FieldNumber = 73;
+        private pbc::PopsicleList<int> field73_ = new pbc::PopsicleList<int>();
+        public scg::IList<int> Field73List {
+          get { return pbc::Lists.AsReadOnly(field73_); }
+        }
+        public int Field73Count {
+          get { return field73_.Count; }
+        }
+        public int GetField73(int index) {
+          return field73_[index];
+        }
+        
+        public const int Field20FieldNumber = 20;
+        private bool hasField20;
+        private int field20_;
+        public bool HasField20 {
+          get { return hasField20; }
+        }
+        public int Field20 {
+          get { return field20_; }
+        }
+        
+        public const int Field24FieldNumber = 24;
+        private bool hasField24;
+        private string field24_ = "";
+        public bool HasField24 {
+          get { return hasField24; }
+        }
+        public string Field24 {
+          get { return field24_; }
+        }
+        
+        public const int Field31FieldNumber = 31;
+        private bool hasField31;
+        private global::Google.ProtocolBuffers.ProtoBench.SizeMessage2GroupedMessage field31_;
+        public bool HasField31 {
+          get { return hasField31; }
+        }
+        public global::Google.ProtocolBuffers.ProtoBench.SizeMessage2GroupedMessage Field31 {
+          get { return field31_ ?? global::Google.ProtocolBuffers.ProtoBench.SizeMessage2GroupedMessage.DefaultInstance; }
+        }
+        
+        public static Group1 ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static Group1 ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static Group1 ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static Group1 ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static Group1 ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static Group1 ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static Group1 ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static Group1 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static Group1 ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static Group1 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private Group1 MakeReadOnly() {
+          field14_.MakeReadOnly();
+          field22_.MakeReadOnly();
+          field73_.MakeReadOnly();
+          return this;
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(Group1 prototype) {
+          return new Builder(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public sealed partial class Builder : pb::GeneratedBuilder<Group1, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(Group1 cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+          
+          private bool resultIsReadOnly;
+          private Group1 result;
+          
+          private Group1 PrepareBuilder() {
+            if (resultIsReadOnly) {
+              Group1 original = result;
+              result = new Group1();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+          
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+          
+          protected override Group1 MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+          
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+          
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.ProtoBench.SizeMessage2.Types.Group1.Descriptor; }
+          }
+          
+          public override Group1 DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.ProtoBench.SizeMessage2.Types.Group1.DefaultInstance; }
+          }
+          
+          public override Group1 BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+          
+          
+          public bool HasField11 {
+            get { return result.hasField11; }
+          }
+          public float Field11 {
+            get { return result.Field11; }
+            set { SetField11(value); }
+          }
+          public Builder SetField11(float value) {
+            PrepareBuilder();
+            result.hasField11 = true;
+            result.field11_ = value;
+            return this;
+          }
+          public Builder ClearField11() {
+            PrepareBuilder();
+            result.hasField11 = false;
+            result.field11_ = 0F;
+            return this;
+          }
+          
+          public bool HasField26 {
+            get { return result.hasField26; }
+          }
+          public float Field26 {
+            get { return result.Field26; }
+            set { SetField26(value); }
+          }
+          public Builder SetField26(float value) {
+            PrepareBuilder();
+            result.hasField26 = true;
+            result.field26_ = value;
+            return this;
+          }
+          public Builder ClearField26() {
+            PrepareBuilder();
+            result.hasField26 = false;
+            result.field26_ = 0F;
+            return this;
+          }
+          
+          public bool HasField12 {
+            get { return result.hasField12; }
+          }
+          public string Field12 {
+            get { return result.Field12; }
+            set { SetField12(value); }
+          }
+          public Builder SetField12(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasField12 = true;
+            result.field12_ = value;
+            return this;
+          }
+          public Builder ClearField12() {
+            PrepareBuilder();
+            result.hasField12 = false;
+            result.field12_ = "";
+            return this;
+          }
+          
+          public bool HasField13 {
+            get { return result.hasField13; }
+          }
+          public string Field13 {
+            get { return result.Field13; }
+            set { SetField13(value); }
+          }
+          public Builder SetField13(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasField13 = true;
+            result.field13_ = value;
+            return this;
+          }
+          public Builder ClearField13() {
+            PrepareBuilder();
+            result.hasField13 = false;
+            result.field13_ = "";
+            return this;
+          }
+          
+          public pbc::IPopsicleList<string> Field14List {
+            get { return PrepareBuilder().field14_; }
+          }
+          public int Field14Count {
+            get { return result.Field14Count; }
+          }
+          public string GetField14(int index) {
+            return result.GetField14(index);
+          }
+          public Builder SetField14(int index, string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.field14_[index] = value;
+            return this;
+          }
+          public Builder AddField14(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.field14_.Add(value);
+            return this;
+          }
+          public Builder AddRangeField14(scg::IEnumerable<string> values) {
+            PrepareBuilder();
+            result.field14_.Add(values);
+            return this;
+          }
+          public Builder ClearField14() {
+            PrepareBuilder();
+            result.field14_.Clear();
+            return this;
+          }
+          
+          public bool HasField15 {
+            get { return result.hasField15; }
+          }
+          [global::System.CLSCompliant(false)]
+          public ulong Field15 {
+            get { return result.Field15; }
+            set { SetField15(value); }
+          }
+          [global::System.CLSCompliant(false)]
+          public Builder SetField15(ulong value) {
+            PrepareBuilder();
+            result.hasField15 = true;
+            result.field15_ = value;
+            return this;
+          }
+          public Builder ClearField15() {
+            PrepareBuilder();
+            result.hasField15 = false;
+            result.field15_ = 0UL;
+            return this;
+          }
+          
+          public bool HasField5 {
+            get { return result.hasField5; }
+          }
+          public int Field5 {
+            get { return result.Field5; }
+            set { SetField5(value); }
+          }
+          public Builder SetField5(int value) {
+            PrepareBuilder();
+            result.hasField5 = true;
+            result.field5_ = value;
+            return this;
+          }
+          public Builder ClearField5() {
+            PrepareBuilder();
+            result.hasField5 = false;
+            result.field5_ = 0;
+            return this;
+          }
+          
+          public bool HasField27 {
+            get { return result.hasField27; }
+          }
+          public string Field27 {
+            get { return result.Field27; }
+            set { SetField27(value); }
+          }
+          public Builder SetField27(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasField27 = true;
+            result.field27_ = value;
+            return this;
+          }
+          public Builder ClearField27() {
+            PrepareBuilder();
+            result.hasField27 = false;
+            result.field27_ = "";
+            return this;
+          }
+          
+          public bool HasField28 {
+            get { return result.hasField28; }
+          }
+          public int Field28 {
+            get { return result.Field28; }
+            set { SetField28(value); }
+          }
+          public Builder SetField28(int value) {
+            PrepareBuilder();
+            result.hasField28 = true;
+            result.field28_ = value;
+            return this;
+          }
+          public Builder ClearField28() {
+            PrepareBuilder();
+            result.hasField28 = false;
+            result.field28_ = 0;
+            return this;
+          }
+          
+          public bool HasField29 {
+            get { return result.hasField29; }
+          }
+          public string Field29 {
+            get { return result.Field29; }
+            set { SetField29(value); }
+          }
+          public Builder SetField29(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasField29 = true;
+            result.field29_ = value;
+            return this;
+          }
+          public Builder ClearField29() {
+            PrepareBuilder();
+            result.hasField29 = false;
+            result.field29_ = "";
+            return this;
+          }
+          
+          public bool HasField16 {
+            get { return result.hasField16; }
+          }
+          public string Field16 {
+            get { return result.Field16; }
+            set { SetField16(value); }
+          }
+          public Builder SetField16(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasField16 = true;
+            result.field16_ = value;
+            return this;
+          }
+          public Builder ClearField16() {
+            PrepareBuilder();
+            result.hasField16 = false;
+            result.field16_ = "";
+            return this;
+          }
+          
+          public pbc::IPopsicleList<string> Field22List {
+            get { return PrepareBuilder().field22_; }
+          }
+          public int Field22Count {
+            get { return result.Field22Count; }
+          }
+          public string GetField22(int index) {
+            return result.GetField22(index);
+          }
+          public Builder SetField22(int index, string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.field22_[index] = value;
+            return this;
+          }
+          public Builder AddField22(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.field22_.Add(value);
+            return this;
+          }
+          public Builder AddRangeField22(scg::IEnumerable<string> values) {
+            PrepareBuilder();
+            result.field22_.Add(values);
+            return this;
+          }
+          public Builder ClearField22() {
+            PrepareBuilder();
+            result.field22_.Clear();
+            return this;
+          }
+          
+          public pbc::IPopsicleList<int> Field73List {
+            get { return PrepareBuilder().field73_; }
+          }
+          public int Field73Count {
+            get { return result.Field73Count; }
+          }
+          public int GetField73(int index) {
+            return result.GetField73(index);
+          }
+          public Builder SetField73(int index, int value) {
+            PrepareBuilder();
+            result.field73_[index] = value;
+            return this;
+          }
+          public Builder AddField73(int value) {
+            PrepareBuilder();
+            result.field73_.Add(value);
+            return this;
+          }
+          public Builder AddRangeField73(scg::IEnumerable<int> values) {
+            PrepareBuilder();
+            result.field73_.Add(values);
+            return this;
+          }
+          public Builder ClearField73() {
+            PrepareBuilder();
+            result.field73_.Clear();
+            return this;
+          }
+          
+          public bool HasField20 {
+            get { return result.hasField20; }
+          }
+          public int Field20 {
+            get { return result.Field20; }
+            set { SetField20(value); }
+          }
+          public Builder SetField20(int value) {
+            PrepareBuilder();
+            result.hasField20 = true;
+            result.field20_ = value;
+            return this;
+          }
+          public Builder ClearField20() {
+            PrepareBuilder();
+            result.hasField20 = false;
+            result.field20_ = 0;
+            return this;
+          }
+          
+          public bool HasField24 {
+            get { return result.hasField24; }
+          }
+          public string Field24 {
+            get { return result.Field24; }
+            set { SetField24(value); }
+          }
+          public Builder SetField24(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasField24 = true;
+            result.field24_ = value;
+            return this;
+          }
+          public Builder ClearField24() {
+            PrepareBuilder();
+            result.hasField24 = false;
+            result.field24_ = "";
+            return this;
+          }
+          
+          public bool HasField31 {
+           get { return result.hasField31; }
+          }
+          public global::Google.ProtocolBuffers.ProtoBench.SizeMessage2GroupedMessage Field31 {
+            get { return result.Field31; }
+            set { SetField31(value); }
+          }
+          public Builder SetField31(global::Google.ProtocolBuffers.ProtoBench.SizeMessage2GroupedMessage value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasField31 = true;
+            result.field31_ = value;
+            return this;
+          }
+          public Builder SetField31(global::Google.ProtocolBuffers.ProtoBench.SizeMessage2GroupedMessage.Builder builderForValue) {
+            pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+            PrepareBuilder();
+            result.hasField31 = true;
+            result.field31_ = builderForValue.Build();
+            return this;
+          }
+          public Builder MergeField31(global::Google.ProtocolBuffers.ProtoBench.SizeMessage2GroupedMessage value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            if (result.hasField31 &&
+                result.field31_ != global::Google.ProtocolBuffers.ProtoBench.SizeMessage2GroupedMessage.DefaultInstance) {
+                result.field31_ = global::Google.ProtocolBuffers.ProtoBench.SizeMessage2GroupedMessage.CreateBuilder(result.field31_).MergeFrom(value).BuildPartial();
+            } else {
+              result.field31_ = value;
+            }
+            result.hasField31 = true;
+            return this;
+          }
+          public Builder ClearField31() {
+            PrepareBuilder();
+            result.hasField31 = false;
+            result.field31_ = null;
+            return this;
+          }
+        }
+        static Group1() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.ProtoBench.GoogleSizeProtoFile.Descriptor, null);
+        }
+      }
+      
+    }
+    #endregion
+    
+    public const int Field1FieldNumber = 1;
+    private bool hasField1;
+    private string field1_ = "";
+    public bool HasField1 {
+      get { return hasField1; }
+    }
+    public string Field1 {
+      get { return field1_; }
+    }
+    
+    public const int Field3FieldNumber = 3;
+    private bool hasField3;
+    private long field3_;
+    public bool HasField3 {
+      get { return hasField3; }
+    }
+    public long Field3 {
+      get { return field3_; }
+    }
+    
+    public const int Field4FieldNumber = 4;
+    private bool hasField4;
+    private long field4_;
+    public bool HasField4 {
+      get { return hasField4; }
+    }
+    public long Field4 {
+      get { return field4_; }
+    }
+    
+    public const int Field30FieldNumber = 30;
+    private bool hasField30;
+    private long field30_;
+    public bool HasField30 {
+      get { return hasField30; }
+    }
+    public long Field30 {
+      get { return field30_; }
+    }
+    
+    public const int Field75FieldNumber = 75;
+    private bool hasField75;
+    private bool field75_;
+    public bool HasField75 {
+      get { return hasField75; }
+    }
+    public bool Field75 {
+      get { return field75_; }
+    }
+    
+    public const int Field6FieldNumber = 6;
+    private bool hasField6;
+    private string field6_ = "";
+    public bool HasField6 {
+      get { return hasField6; }
+    }
+    public string Field6 {
+      get { return field6_; }
+    }
+    
+    public const int Field2FieldNumber = 2;
+    private bool hasField2;
+    private pb::ByteString field2_ = pb::ByteString.Empty;
+    public bool HasField2 {
+      get { return hasField2; }
+    }
+    public pb::ByteString Field2 {
+      get { return field2_; }
+    }
+    
+    public const int Field21FieldNumber = 21;
+    private bool hasField21;
+    private int field21_;
+    public bool HasField21 {
+      get { return hasField21; }
+    }
+    public int Field21 {
+      get { return field21_; }
+    }
+    
+    public const int Field71FieldNumber = 71;
+    private bool hasField71;
+    private int field71_;
+    public bool HasField71 {
+      get { return hasField71; }
+    }
+    public int Field71 {
+      get { return field71_; }
+    }
+    
+    public const int Field25FieldNumber = 25;
+    private bool hasField25;
+    private float field25_;
+    public bool HasField25 {
+      get { return hasField25; }
+    }
+    public float Field25 {
+      get { return field25_; }
+    }
+    
+    public const int Field109FieldNumber = 109;
+    private bool hasField109;
+    private int field109_;
+    public bool HasField109 {
+      get { return hasField109; }
+    }
+    public int Field109 {
+      get { return field109_; }
+    }
+    
+    public const int Field210FieldNumber = 210;
+    private bool hasField210;
+    private int field210_;
+    public bool HasField210 {
+      get { return hasField210; }
+    }
+    public int Field210 {
+      get { return field210_; }
+    }
+    
+    public const int Field211FieldNumber = 211;
+    private bool hasField211;
+    private int field211_;
+    public bool HasField211 {
+      get { return hasField211; }
+    }
+    public int Field211 {
+      get { return field211_; }
+    }
+    
+    public const int Field212FieldNumber = 212;
+    private bool hasField212;
+    private int field212_;
+    public bool HasField212 {
+      get { return hasField212; }
+    }
+    public int Field212 {
+      get { return field212_; }
+    }
+    
+    public const int Field213FieldNumber = 213;
+    private bool hasField213;
+    private int field213_;
+    public bool HasField213 {
+      get { return hasField213; }
+    }
+    public int Field213 {
+      get { return field213_; }
+    }
+    
+    public const int Field216FieldNumber = 216;
+    private bool hasField216;
+    private int field216_;
+    public bool HasField216 {
+      get { return hasField216; }
+    }
+    public int Field216 {
+      get { return field216_; }
+    }
+    
+    public const int Field217FieldNumber = 217;
+    private bool hasField217;
+    private int field217_;
+    public bool HasField217 {
+      get { return hasField217; }
+    }
+    public int Field217 {
+      get { return field217_; }
+    }
+    
+    public const int Field218FieldNumber = 218;
+    private bool hasField218;
+    private int field218_;
+    public bool HasField218 {
+      get { return hasField218; }
+    }
+    public int Field218 {
+      get { return field218_; }
+    }
+    
+    public const int Field220FieldNumber = 220;
+    private bool hasField220;
+    private int field220_;
+    public bool HasField220 {
+      get { return hasField220; }
+    }
+    public int Field220 {
+      get { return field220_; }
+    }
+    
+    public const int Field221FieldNumber = 221;
+    private bool hasField221;
+    private int field221_;
+    public bool HasField221 {
+      get { return hasField221; }
+    }
+    public int Field221 {
+      get { return field221_; }
+    }
+    
+    public const int Field222FieldNumber = 222;
+    private bool hasField222;
+    private float field222_;
+    public bool HasField222 {
+      get { return hasField222; }
+    }
+    public float Field222 {
+      get { return field222_; }
+    }
+    
+    public const int Field63FieldNumber = 63;
+    private bool hasField63;
+    private int field63_;
+    public bool HasField63 {
+      get { return hasField63; }
+    }
+    public int Field63 {
+      get { return field63_; }
+    }
+    
+    public const int Group1FieldNumber = 10;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.ProtoBench.SizeMessage2.Types.Group1> group1_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.ProtoBench.SizeMessage2.Types.Group1>();
+    public scg::IList<global::Google.ProtocolBuffers.ProtoBench.SizeMessage2.Types.Group1> Group1List {
+      get { return group1_; }
+    }
+    public int Group1Count {
+      get { return group1_.Count; }
+    }
+    public global::Google.ProtocolBuffers.ProtoBench.SizeMessage2.Types.Group1 GetGroup1(int index) {
+      return group1_[index];
+    }
+    
+    public const int Field128FieldNumber = 128;
+    private pbc::PopsicleList<string> field128_ = new pbc::PopsicleList<string>();
+    public scg::IList<string> Field128List {
+      get { return pbc::Lists.AsReadOnly(field128_); }
+    }
+    public int Field128Count {
+      get { return field128_.Count; }
+    }
+    public string GetField128(int index) {
+      return field128_[index];
+    }
+    
+    public const int Field131FieldNumber = 131;
+    private bool hasField131;
+    private long field131_;
+    public bool HasField131 {
+      get { return hasField131; }
+    }
+    public long Field131 {
+      get { return field131_; }
+    }
+    
+    public const int Field127FieldNumber = 127;
+    private pbc::PopsicleList<string> field127_ = new pbc::PopsicleList<string>();
+    public scg::IList<string> Field127List {
+      get { return pbc::Lists.AsReadOnly(field127_); }
+    }
+    public int Field127Count {
+      get { return field127_.Count; }
+    }
+    public string GetField127(int index) {
+      return field127_[index];
+    }
+    
+    public const int Field129FieldNumber = 129;
+    private bool hasField129;
+    private int field129_;
+    public bool HasField129 {
+      get { return hasField129; }
+    }
+    public int Field129 {
+      get { return field129_; }
+    }
+    
+    public const int Field130FieldNumber = 130;
+    private pbc::PopsicleList<long> field130_ = new pbc::PopsicleList<long>();
+    public scg::IList<long> Field130List {
+      get { return pbc::Lists.AsReadOnly(field130_); }
+    }
+    public int Field130Count {
+      get { return field130_.Count; }
+    }
+    public long GetField130(int index) {
+      return field130_[index];
+    }
+    
+    public const int Field205FieldNumber = 205;
+    private bool hasField205;
+    private bool field205_;
+    public bool HasField205 {
+      get { return hasField205; }
+    }
+    public bool Field205 {
+      get { return field205_; }
+    }
+    
+    public const int Field206FieldNumber = 206;
+    private bool hasField206;
+    private bool field206_;
+    public bool HasField206 {
+      get { return hasField206; }
+    }
+    public bool Field206 {
+      get { return field206_; }
+    }
+    
+    public static SizeMessage2 ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SizeMessage2 ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage2 ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SizeMessage2 ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage2 ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SizeMessage2 ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage2 ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static SizeMessage2 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static SizeMessage2 ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SizeMessage2 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private SizeMessage2 MakeReadOnly() {
+      group1_.MakeReadOnly();
+      field128_.MakeReadOnly();
+      field127_.MakeReadOnly();
+      field130_.MakeReadOnly();
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(SizeMessage2 prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<SizeMessage2, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(SizeMessage2 cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private SizeMessage2 result;
+      
+      private SizeMessage2 PrepareBuilder() {
+        if (resultIsReadOnly) {
+          SizeMessage2 original = result;
+          result = new SizeMessage2();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override SizeMessage2 MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.ProtoBench.SizeMessage2.Descriptor; }
+      }
+      
+      public override SizeMessage2 DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.ProtoBench.SizeMessage2.DefaultInstance; }
+      }
+      
+      public override SizeMessage2 BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      
+      public bool HasField1 {
+        get { return result.hasField1; }
+      }
+      public string Field1 {
+        get { return result.Field1; }
+        set { SetField1(value); }
+      }
+      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;
+      }
+      
+      public bool HasField3 {
+        get { return result.hasField3; }
+      }
+      public long Field3 {
+        get { return result.Field3; }
+        set { SetField3(value); }
+      }
+      public Builder SetField3(long value) {
+        PrepareBuilder();
+        result.hasField3 = true;
+        result.field3_ = value;
+        return this;
+      }
+      public Builder ClearField3() {
+        PrepareBuilder();
+        result.hasField3 = false;
+        result.field3_ = 0L;
+        return this;
+      }
+      
+      public bool HasField4 {
+        get { return result.hasField4; }
+      }
+      public long Field4 {
+        get { return result.Field4; }
+        set { SetField4(value); }
+      }
+      public Builder SetField4(long value) {
+        PrepareBuilder();
+        result.hasField4 = true;
+        result.field4_ = value;
+        return this;
+      }
+      public Builder ClearField4() {
+        PrepareBuilder();
+        result.hasField4 = false;
+        result.field4_ = 0L;
+        return this;
+      }
+      
+      public bool HasField30 {
+        get { return result.hasField30; }
+      }
+      public long Field30 {
+        get { return result.Field30; }
+        set { SetField30(value); }
+      }
+      public Builder SetField30(long value) {
+        PrepareBuilder();
+        result.hasField30 = true;
+        result.field30_ = value;
+        return this;
+      }
+      public Builder ClearField30() {
+        PrepareBuilder();
+        result.hasField30 = false;
+        result.field30_ = 0L;
+        return this;
+      }
+      
+      public bool HasField75 {
+        get { return result.hasField75; }
+      }
+      public bool Field75 {
+        get { return result.Field75; }
+        set { SetField75(value); }
+      }
+      public Builder SetField75(bool value) {
+        PrepareBuilder();
+        result.hasField75 = true;
+        result.field75_ = value;
+        return this;
+      }
+      public Builder ClearField75() {
+        PrepareBuilder();
+        result.hasField75 = false;
+        result.field75_ = false;
+        return this;
+      }
+      
+      public bool HasField6 {
+        get { return result.hasField6; }
+      }
+      public string Field6 {
+        get { return result.Field6; }
+        set { SetField6(value); }
+      }
+      public Builder SetField6(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField6 = true;
+        result.field6_ = value;
+        return this;
+      }
+      public Builder ClearField6() {
+        PrepareBuilder();
+        result.hasField6 = false;
+        result.field6_ = "";
+        return this;
+      }
+      
+      public bool HasField2 {
+        get { return result.hasField2; }
+      }
+      public pb::ByteString Field2 {
+        get { return result.Field2; }
+        set { SetField2(value); }
+      }
+      public Builder SetField2(pb::ByteString value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField2 = true;
+        result.field2_ = value;
+        return this;
+      }
+      public Builder ClearField2() {
+        PrepareBuilder();
+        result.hasField2 = false;
+        result.field2_ = pb::ByteString.Empty;
+        return this;
+      }
+      
+      public bool HasField21 {
+        get { return result.hasField21; }
+      }
+      public int Field21 {
+        get { return result.Field21; }
+        set { SetField21(value); }
+      }
+      public Builder SetField21(int value) {
+        PrepareBuilder();
+        result.hasField21 = true;
+        result.field21_ = value;
+        return this;
+      }
+      public Builder ClearField21() {
+        PrepareBuilder();
+        result.hasField21 = false;
+        result.field21_ = 0;
+        return this;
+      }
+      
+      public bool HasField71 {
+        get { return result.hasField71; }
+      }
+      public int Field71 {
+        get { return result.Field71; }
+        set { SetField71(value); }
+      }
+      public Builder SetField71(int value) {
+        PrepareBuilder();
+        result.hasField71 = true;
+        result.field71_ = value;
+        return this;
+      }
+      public Builder ClearField71() {
+        PrepareBuilder();
+        result.hasField71 = false;
+        result.field71_ = 0;
+        return this;
+      }
+      
+      public bool HasField25 {
+        get { return result.hasField25; }
+      }
+      public float Field25 {
+        get { return result.Field25; }
+        set { SetField25(value); }
+      }
+      public Builder SetField25(float value) {
+        PrepareBuilder();
+        result.hasField25 = true;
+        result.field25_ = value;
+        return this;
+      }
+      public Builder ClearField25() {
+        PrepareBuilder();
+        result.hasField25 = false;
+        result.field25_ = 0F;
+        return this;
+      }
+      
+      public bool HasField109 {
+        get { return result.hasField109; }
+      }
+      public int Field109 {
+        get { return result.Field109; }
+        set { SetField109(value); }
+      }
+      public Builder SetField109(int value) {
+        PrepareBuilder();
+        result.hasField109 = true;
+        result.field109_ = value;
+        return this;
+      }
+      public Builder ClearField109() {
+        PrepareBuilder();
+        result.hasField109 = false;
+        result.field109_ = 0;
+        return this;
+      }
+      
+      public bool HasField210 {
+        get { return result.hasField210; }
+      }
+      public int Field210 {
+        get { return result.Field210; }
+        set { SetField210(value); }
+      }
+      public Builder SetField210(int value) {
+        PrepareBuilder();
+        result.hasField210 = true;
+        result.field210_ = value;
+        return this;
+      }
+      public Builder ClearField210() {
+        PrepareBuilder();
+        result.hasField210 = false;
+        result.field210_ = 0;
+        return this;
+      }
+      
+      public bool HasField211 {
+        get { return result.hasField211; }
+      }
+      public int Field211 {
+        get { return result.Field211; }
+        set { SetField211(value); }
+      }
+      public Builder SetField211(int value) {
+        PrepareBuilder();
+        result.hasField211 = true;
+        result.field211_ = value;
+        return this;
+      }
+      public Builder ClearField211() {
+        PrepareBuilder();
+        result.hasField211 = false;
+        result.field211_ = 0;
+        return this;
+      }
+      
+      public bool HasField212 {
+        get { return result.hasField212; }
+      }
+      public int Field212 {
+        get { return result.Field212; }
+        set { SetField212(value); }
+      }
+      public Builder SetField212(int value) {
+        PrepareBuilder();
+        result.hasField212 = true;
+        result.field212_ = value;
+        return this;
+      }
+      public Builder ClearField212() {
+        PrepareBuilder();
+        result.hasField212 = false;
+        result.field212_ = 0;
+        return this;
+      }
+      
+      public bool HasField213 {
+        get { return result.hasField213; }
+      }
+      public int Field213 {
+        get { return result.Field213; }
+        set { SetField213(value); }
+      }
+      public Builder SetField213(int value) {
+        PrepareBuilder();
+        result.hasField213 = true;
+        result.field213_ = value;
+        return this;
+      }
+      public Builder ClearField213() {
+        PrepareBuilder();
+        result.hasField213 = false;
+        result.field213_ = 0;
+        return this;
+      }
+      
+      public bool HasField216 {
+        get { return result.hasField216; }
+      }
+      public int Field216 {
+        get { return result.Field216; }
+        set { SetField216(value); }
+      }
+      public Builder SetField216(int value) {
+        PrepareBuilder();
+        result.hasField216 = true;
+        result.field216_ = value;
+        return this;
+      }
+      public Builder ClearField216() {
+        PrepareBuilder();
+        result.hasField216 = false;
+        result.field216_ = 0;
+        return this;
+      }
+      
+      public bool HasField217 {
+        get { return result.hasField217; }
+      }
+      public int Field217 {
+        get { return result.Field217; }
+        set { SetField217(value); }
+      }
+      public Builder SetField217(int value) {
+        PrepareBuilder();
+        result.hasField217 = true;
+        result.field217_ = value;
+        return this;
+      }
+      public Builder ClearField217() {
+        PrepareBuilder();
+        result.hasField217 = false;
+        result.field217_ = 0;
+        return this;
+      }
+      
+      public bool HasField218 {
+        get { return result.hasField218; }
+      }
+      public int Field218 {
+        get { return result.Field218; }
+        set { SetField218(value); }
+      }
+      public Builder SetField218(int value) {
+        PrepareBuilder();
+        result.hasField218 = true;
+        result.field218_ = value;
+        return this;
+      }
+      public Builder ClearField218() {
+        PrepareBuilder();
+        result.hasField218 = false;
+        result.field218_ = 0;
+        return this;
+      }
+      
+      public bool HasField220 {
+        get { return result.hasField220; }
+      }
+      public int Field220 {
+        get { return result.Field220; }
+        set { SetField220(value); }
+      }
+      public Builder SetField220(int value) {
+        PrepareBuilder();
+        result.hasField220 = true;
+        result.field220_ = value;
+        return this;
+      }
+      public Builder ClearField220() {
+        PrepareBuilder();
+        result.hasField220 = false;
+        result.field220_ = 0;
+        return this;
+      }
+      
+      public bool HasField221 {
+        get { return result.hasField221; }
+      }
+      public int Field221 {
+        get { return result.Field221; }
+        set { SetField221(value); }
+      }
+      public Builder SetField221(int value) {
+        PrepareBuilder();
+        result.hasField221 = true;
+        result.field221_ = value;
+        return this;
+      }
+      public Builder ClearField221() {
+        PrepareBuilder();
+        result.hasField221 = false;
+        result.field221_ = 0;
+        return this;
+      }
+      
+      public bool HasField222 {
+        get { return result.hasField222; }
+      }
+      public float Field222 {
+        get { return result.Field222; }
+        set { SetField222(value); }
+      }
+      public Builder SetField222(float value) {
+        PrepareBuilder();
+        result.hasField222 = true;
+        result.field222_ = value;
+        return this;
+      }
+      public Builder ClearField222() {
+        PrepareBuilder();
+        result.hasField222 = false;
+        result.field222_ = 0F;
+        return this;
+      }
+      
+      public bool HasField63 {
+        get { return result.hasField63; }
+      }
+      public int Field63 {
+        get { return result.Field63; }
+        set { SetField63(value); }
+      }
+      public Builder SetField63(int value) {
+        PrepareBuilder();
+        result.hasField63 = true;
+        result.field63_ = value;
+        return this;
+      }
+      public Builder ClearField63() {
+        PrepareBuilder();
+        result.hasField63 = false;
+        result.field63_ = 0;
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.ProtoBench.SizeMessage2.Types.Group1> Group1List {
+        get { return PrepareBuilder().group1_; }
+      }
+      public int Group1Count {
+        get { return result.Group1Count; }
+      }
+      public global::Google.ProtocolBuffers.ProtoBench.SizeMessage2.Types.Group1 GetGroup1(int index) {
+        return result.GetGroup1(index);
+      }
+      public Builder SetGroup1(int index, global::Google.ProtocolBuffers.ProtoBench.SizeMessage2.Types.Group1 value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.group1_[index] = value;
+        return this;
+      }
+      public Builder SetGroup1(int index, global::Google.ProtocolBuffers.ProtoBench.SizeMessage2.Types.Group1.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.group1_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddGroup1(global::Google.ProtocolBuffers.ProtoBench.SizeMessage2.Types.Group1 value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.group1_.Add(value);
+        return this;
+      }
+      public Builder AddGroup1(global::Google.ProtocolBuffers.ProtoBench.SizeMessage2.Types.Group1.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.group1_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeGroup1(scg::IEnumerable<global::Google.ProtocolBuffers.ProtoBench.SizeMessage2.Types.Group1> values) {
+        PrepareBuilder();
+        result.group1_.Add(values);
+        return this;
+      }
+      public Builder ClearGroup1() {
+        PrepareBuilder();
+        result.group1_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<string> Field128List {
+        get { return PrepareBuilder().field128_; }
+      }
+      public int Field128Count {
+        get { return result.Field128Count; }
+      }
+      public string GetField128(int index) {
+        return result.GetField128(index);
+      }
+      public Builder SetField128(int index, string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.field128_[index] = value;
+        return this;
+      }
+      public Builder AddField128(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.field128_.Add(value);
+        return this;
+      }
+      public Builder AddRangeField128(scg::IEnumerable<string> values) {
+        PrepareBuilder();
+        result.field128_.Add(values);
+        return this;
+      }
+      public Builder ClearField128() {
+        PrepareBuilder();
+        result.field128_.Clear();
+        return this;
+      }
+      
+      public bool HasField131 {
+        get { return result.hasField131; }
+      }
+      public long Field131 {
+        get { return result.Field131; }
+        set { SetField131(value); }
+      }
+      public Builder SetField131(long value) {
+        PrepareBuilder();
+        result.hasField131 = true;
+        result.field131_ = value;
+        return this;
+      }
+      public Builder ClearField131() {
+        PrepareBuilder();
+        result.hasField131 = false;
+        result.field131_ = 0L;
+        return this;
+      }
+      
+      public pbc::IPopsicleList<string> Field127List {
+        get { return PrepareBuilder().field127_; }
+      }
+      public int Field127Count {
+        get { return result.Field127Count; }
+      }
+      public string GetField127(int index) {
+        return result.GetField127(index);
+      }
+      public Builder SetField127(int index, string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.field127_[index] = value;
+        return this;
+      }
+      public Builder AddField127(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.field127_.Add(value);
+        return this;
+      }
+      public Builder AddRangeField127(scg::IEnumerable<string> values) {
+        PrepareBuilder();
+        result.field127_.Add(values);
+        return this;
+      }
+      public Builder ClearField127() {
+        PrepareBuilder();
+        result.field127_.Clear();
+        return this;
+      }
+      
+      public bool HasField129 {
+        get { return result.hasField129; }
+      }
+      public int Field129 {
+        get { return result.Field129; }
+        set { SetField129(value); }
+      }
+      public Builder SetField129(int value) {
+        PrepareBuilder();
+        result.hasField129 = true;
+        result.field129_ = value;
+        return this;
+      }
+      public Builder ClearField129() {
+        PrepareBuilder();
+        result.hasField129 = false;
+        result.field129_ = 0;
+        return this;
+      }
+      
+      public pbc::IPopsicleList<long> Field130List {
+        get { return PrepareBuilder().field130_; }
+      }
+      public int Field130Count {
+        get { return result.Field130Count; }
+      }
+      public long GetField130(int index) {
+        return result.GetField130(index);
+      }
+      public Builder SetField130(int index, long value) {
+        PrepareBuilder();
+        result.field130_[index] = value;
+        return this;
+      }
+      public Builder AddField130(long value) {
+        PrepareBuilder();
+        result.field130_.Add(value);
+        return this;
+      }
+      public Builder AddRangeField130(scg::IEnumerable<long> values) {
+        PrepareBuilder();
+        result.field130_.Add(values);
+        return this;
+      }
+      public Builder ClearField130() {
+        PrepareBuilder();
+        result.field130_.Clear();
+        return this;
+      }
+      
+      public bool HasField205 {
+        get { return result.hasField205; }
+      }
+      public bool Field205 {
+        get { return result.Field205; }
+        set { SetField205(value); }
+      }
+      public Builder SetField205(bool value) {
+        PrepareBuilder();
+        result.hasField205 = true;
+        result.field205_ = value;
+        return this;
+      }
+      public Builder ClearField205() {
+        PrepareBuilder();
+        result.hasField205 = false;
+        result.field205_ = false;
+        return this;
+      }
+      
+      public bool HasField206 {
+        get { return result.hasField206; }
+      }
+      public bool Field206 {
+        get { return result.Field206; }
+        set { SetField206(value); }
+      }
+      public Builder SetField206(bool value) {
+        PrepareBuilder();
+        result.hasField206 = true;
+        result.field206_ = value;
+        return this;
+      }
+      public Builder ClearField206() {
+        PrepareBuilder();
+        result.hasField206 = false;
+        result.field206_ = false;
+        return this;
+      }
+    }
+    static SizeMessage2() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.ProtoBench.GoogleSizeProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class SizeMessage2GroupedMessage : pb::GeneratedMessage<SizeMessage2GroupedMessage, SizeMessage2GroupedMessage.Builder> {
+    private SizeMessage2GroupedMessage() { }
+    private static readonly SizeMessage2GroupedMessage defaultInstance = new SizeMessage2GroupedMessage().MakeReadOnly();
+    public static SizeMessage2GroupedMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override SizeMessage2GroupedMessage DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override SizeMessage2GroupedMessage ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.ProtoBench.GoogleSizeProtoFile.internal__static_benchmarks_SizeMessage2GroupedMessage__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<SizeMessage2GroupedMessage, SizeMessage2GroupedMessage.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.ProtoBench.GoogleSizeProtoFile.internal__static_benchmarks_SizeMessage2GroupedMessage__FieldAccessorTable; }
+    }
+    
+    public const int Field1FieldNumber = 1;
+    private bool hasField1;
+    private float field1_;
+    public bool HasField1 {
+      get { return hasField1; }
+    }
+    public float Field1 {
+      get { return field1_; }
+    }
+    
+    public const int Field2FieldNumber = 2;
+    private bool hasField2;
+    private float field2_;
+    public bool HasField2 {
+      get { return hasField2; }
+    }
+    public float Field2 {
+      get { return field2_; }
+    }
+    
+    public const int Field3FieldNumber = 3;
+    private bool hasField3;
+    private float field3_;
+    public bool HasField3 {
+      get { return hasField3; }
+    }
+    public float Field3 {
+      get { return field3_; }
+    }
+    
+    public const int Field4FieldNumber = 4;
+    private bool hasField4;
+    private bool field4_;
+    public bool HasField4 {
+      get { return hasField4; }
+    }
+    public bool Field4 {
+      get { return field4_; }
+    }
+    
+    public const int Field5FieldNumber = 5;
+    private bool hasField5;
+    private bool field5_;
+    public bool HasField5 {
+      get { return hasField5; }
+    }
+    public bool Field5 {
+      get { return field5_; }
+    }
+    
+    public const int Field6FieldNumber = 6;
+    private bool hasField6;
+    private bool field6_ = true;
+    public bool HasField6 {
+      get { return hasField6; }
+    }
+    public bool Field6 {
+      get { return field6_; }
+    }
+    
+    public const int Field7FieldNumber = 7;
+    private bool hasField7;
+    private bool field7_;
+    public bool HasField7 {
+      get { return hasField7; }
+    }
+    public bool Field7 {
+      get { return field7_; }
+    }
+    
+    public const int Field8FieldNumber = 8;
+    private bool hasField8;
+    private float field8_;
+    public bool HasField8 {
+      get { return hasField8; }
+    }
+    public float Field8 {
+      get { return field8_; }
+    }
+    
+    public const int Field9FieldNumber = 9;
+    private bool hasField9;
+    private bool field9_;
+    public bool HasField9 {
+      get { return hasField9; }
+    }
+    public bool Field9 {
+      get { return field9_; }
+    }
+    
+    public const int Field10FieldNumber = 10;
+    private bool hasField10;
+    private float field10_;
+    public bool HasField10 {
+      get { return hasField10; }
+    }
+    public float Field10 {
+      get { return field10_; }
+    }
+    
+    public const int Field11FieldNumber = 11;
+    private bool hasField11;
+    private long field11_;
+    public bool HasField11 {
+      get { return hasField11; }
+    }
+    public long Field11 {
+      get { return field11_; }
+    }
+    
+    public static SizeMessage2GroupedMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SizeMessage2GroupedMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage2GroupedMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SizeMessage2GroupedMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage2GroupedMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SizeMessage2GroupedMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage2GroupedMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static SizeMessage2GroupedMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static SizeMessage2GroupedMessage ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SizeMessage2GroupedMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private SizeMessage2GroupedMessage MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(SizeMessage2GroupedMessage prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<SizeMessage2GroupedMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(SizeMessage2GroupedMessage cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private SizeMessage2GroupedMessage result;
+      
+      private SizeMessage2GroupedMessage PrepareBuilder() {
+        if (resultIsReadOnly) {
+          SizeMessage2GroupedMessage original = result;
+          result = new SizeMessage2GroupedMessage();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override SizeMessage2GroupedMessage MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.ProtoBench.SizeMessage2GroupedMessage.Descriptor; }
+      }
+      
+      public override SizeMessage2GroupedMessage DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.ProtoBench.SizeMessage2GroupedMessage.DefaultInstance; }
+      }
+      
+      public override SizeMessage2GroupedMessage BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      
+      public bool HasField1 {
+        get { return result.hasField1; }
+      }
+      public float Field1 {
+        get { return result.Field1; }
+        set { SetField1(value); }
+      }
+      public Builder SetField1(float value) {
+        PrepareBuilder();
+        result.hasField1 = true;
+        result.field1_ = value;
+        return this;
+      }
+      public Builder ClearField1() {
+        PrepareBuilder();
+        result.hasField1 = false;
+        result.field1_ = 0F;
+        return this;
+      }
+      
+      public bool HasField2 {
+        get { return result.hasField2; }
+      }
+      public float Field2 {
+        get { return result.Field2; }
+        set { SetField2(value); }
+      }
+      public Builder SetField2(float value) {
+        PrepareBuilder();
+        result.hasField2 = true;
+        result.field2_ = value;
+        return this;
+      }
+      public Builder ClearField2() {
+        PrepareBuilder();
+        result.hasField2 = false;
+        result.field2_ = 0F;
+        return this;
+      }
+      
+      public bool HasField3 {
+        get { return result.hasField3; }
+      }
+      public float Field3 {
+        get { return result.Field3; }
+        set { SetField3(value); }
+      }
+      public Builder SetField3(float value) {
+        PrepareBuilder();
+        result.hasField3 = true;
+        result.field3_ = value;
+        return this;
+      }
+      public Builder ClearField3() {
+        PrepareBuilder();
+        result.hasField3 = false;
+        result.field3_ = 0F;
+        return this;
+      }
+      
+      public bool HasField4 {
+        get { return result.hasField4; }
+      }
+      public bool Field4 {
+        get { return result.Field4; }
+        set { SetField4(value); }
+      }
+      public Builder SetField4(bool value) {
+        PrepareBuilder();
+        result.hasField4 = true;
+        result.field4_ = value;
+        return this;
+      }
+      public Builder ClearField4() {
+        PrepareBuilder();
+        result.hasField4 = false;
+        result.field4_ = false;
+        return this;
+      }
+      
+      public bool HasField5 {
+        get { return result.hasField5; }
+      }
+      public bool Field5 {
+        get { return result.Field5; }
+        set { SetField5(value); }
+      }
+      public Builder SetField5(bool value) {
+        PrepareBuilder();
+        result.hasField5 = true;
+        result.field5_ = value;
+        return this;
+      }
+      public Builder ClearField5() {
+        PrepareBuilder();
+        result.hasField5 = false;
+        result.field5_ = false;
+        return this;
+      }
+      
+      public bool HasField6 {
+        get { return result.hasField6; }
+      }
+      public bool Field6 {
+        get { return result.Field6; }
+        set { SetField6(value); }
+      }
+      public Builder SetField6(bool value) {
+        PrepareBuilder();
+        result.hasField6 = true;
+        result.field6_ = value;
+        return this;
+      }
+      public Builder ClearField6() {
+        PrepareBuilder();
+        result.hasField6 = false;
+        result.field6_ = true;
+        return this;
+      }
+      
+      public bool HasField7 {
+        get { return result.hasField7; }
+      }
+      public bool Field7 {
+        get { return result.Field7; }
+        set { SetField7(value); }
+      }
+      public Builder SetField7(bool value) {
+        PrepareBuilder();
+        result.hasField7 = true;
+        result.field7_ = value;
+        return this;
+      }
+      public Builder ClearField7() {
+        PrepareBuilder();
+        result.hasField7 = false;
+        result.field7_ = false;
+        return this;
+      }
+      
+      public bool HasField8 {
+        get { return result.hasField8; }
+      }
+      public float Field8 {
+        get { return result.Field8; }
+        set { SetField8(value); }
+      }
+      public Builder SetField8(float value) {
+        PrepareBuilder();
+        result.hasField8 = true;
+        result.field8_ = value;
+        return this;
+      }
+      public Builder ClearField8() {
+        PrepareBuilder();
+        result.hasField8 = false;
+        result.field8_ = 0F;
+        return this;
+      }
+      
+      public bool HasField9 {
+        get { return result.hasField9; }
+      }
+      public bool Field9 {
+        get { return result.Field9; }
+        set { SetField9(value); }
+      }
+      public Builder SetField9(bool value) {
+        PrepareBuilder();
+        result.hasField9 = true;
+        result.field9_ = value;
+        return this;
+      }
+      public Builder ClearField9() {
+        PrepareBuilder();
+        result.hasField9 = false;
+        result.field9_ = false;
+        return this;
+      }
+      
+      public bool HasField10 {
+        get { return result.hasField10; }
+      }
+      public float Field10 {
+        get { return result.Field10; }
+        set { SetField10(value); }
+      }
+      public Builder SetField10(float value) {
+        PrepareBuilder();
+        result.hasField10 = true;
+        result.field10_ = value;
+        return this;
+      }
+      public Builder ClearField10() {
+        PrepareBuilder();
+        result.hasField10 = false;
+        result.field10_ = 0F;
+        return this;
+      }
+      
+      public bool HasField11 {
+        get { return result.hasField11; }
+      }
+      public long Field11 {
+        get { return result.Field11; }
+        set { SetField11(value); }
+      }
+      public Builder SetField11(long value) {
+        PrepareBuilder();
+        result.hasField11 = true;
+        result.field11_ = value;
+        return this;
+      }
+      public Builder ClearField11() {
+        PrepareBuilder();
+        result.hasField11 = false;
+        result.field11_ = 0L;
+        return this;
+      }
+    }
+    static SizeMessage2GroupedMessage() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.ProtoBench.GoogleSizeProtoFile.Descriptor, null);
+    }
+  }
+  
+  #endregion
+  
+}
+
+#endregion Designer generated code

+ 6637 - 0
csharp/src/ProtoBench/TestProtos/GoogleSpeedProtoFile.cs

@@ -0,0 +1,6637 @@
+// Generated by ProtoGen, Version=2.4.1.555, Culture=neutral, PublicKeyToken=55f7125234beb589.  DO NOT EDIT!
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.ProtocolBuffers;
+using pbc = global::Google.ProtocolBuffers.Collections;
+using pbd = global::Google.ProtocolBuffers.Descriptors;
+using scg = global::System.Collections.Generic;
+namespace Google.ProtocolBuffers.ProtoBench {
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public static partial class GoogleSpeedProtoFile {
+  
+    #region Extension registration
+    public static void RegisterAllExtensions(pb::ExtensionRegistry registry) {
+    }
+    #endregion
+    #region Static variables
+    internal static pbd::MessageDescriptor internal__static_benchmarks_SpeedMessage1__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.ProtoBench.SpeedMessage1, global::Google.ProtocolBuffers.ProtoBench.SpeedMessage1.Builder> internal__static_benchmarks_SpeedMessage1__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_benchmarks_SpeedMessage1SubMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.ProtoBench.SpeedMessage1SubMessage, global::Google.ProtocolBuffers.ProtoBench.SpeedMessage1SubMessage.Builder> internal__static_benchmarks_SpeedMessage1SubMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_benchmarks_SpeedMessage2__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2, global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2.Builder> internal__static_benchmarks_SpeedMessage2__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_benchmarks_SpeedMessage2_Group1__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2.Types.Group1, global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2.Types.Group1.Builder> internal__static_benchmarks_SpeedMessage2_Group1__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_benchmarks_SpeedMessage2GroupedMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2GroupedMessage, global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2GroupedMessage.Builder> internal__static_benchmarks_SpeedMessage2GroupedMessage__FieldAccessorTable;
+    #endregion
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbd::FileDescriptor descriptor;
+    
+    static GoogleSpeedProtoFile() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Ch1iZW5jaG1hcmtzL2dvb2dsZV9zcGVlZC5wcm90bxIKYmVuY2htYXJrcxok", 
+            "Z29vZ2xlL3Byb3RvYnVmL2NzaGFycF9vcHRpb25zLnByb3RvIvgGCg1TcGVl", 
+            "ZE1lc3NhZ2UxEg4KBmZpZWxkMRgBIAIoCRIOCgZmaWVsZDkYCSABKAkSDwoH", 
+            "ZmllbGQxOBgSIAEoCRIWCgdmaWVsZDgwGFAgASgIOgVmYWxzZRIVCgdmaWVs", 
+            "ZDgxGFEgASgIOgR0cnVlEg4KBmZpZWxkMhgCIAIoBRIOCgZmaWVsZDMYAyAC", 
+            "KAUSEQoIZmllbGQyODAYmAIgASgFEhEKBmZpZWxkNhgGIAEoBToBMBIPCgdm", 
+            "aWVsZDIyGBYgASgDEg4KBmZpZWxkNBgEIAEoCRIOCgZmaWVsZDUYBSADKAYS", 
+            "FgoHZmllbGQ1ORg7IAEoCDoFZmFsc2USDgoGZmllbGQ3GAcgASgJEg8KB2Zp", 
+            "ZWxkMTYYECABKAUSFAoIZmllbGQxMzAYggEgASgFOgEwEhUKB2ZpZWxkMTIY", 
+            "DCABKAg6BHRydWUSFQoHZmllbGQxNxgRIAEoCDoEdHJ1ZRIVCgdmaWVsZDEz", 
+            "GA0gASgIOgR0cnVlEhUKB2ZpZWxkMTQYDiABKAg6BHRydWUSEwoIZmllbGQx", 
+            "MDQYaCABKAU6ATASEwoIZmllbGQxMDAYZCABKAU6ATASEwoIZmllbGQxMDEY", 
+            "ZSABKAU6ATASEAoIZmllbGQxMDIYZiABKAkSEAoIZmllbGQxMDMYZyABKAkS", 
+            "EgoHZmllbGQyORgdIAEoBToBMBIWCgdmaWVsZDMwGB4gASgIOgVmYWxzZRIT", 
+            "CgdmaWVsZDYwGDwgASgFOgItMRIVCghmaWVsZDI3MRiPAiABKAU6Ai0xEhUK", 
+            "CGZpZWxkMjcyGJACIAEoBToCLTESEQoIZmllbGQxNTAYlgEgASgFEhIKB2Zp", 
+            "ZWxkMjMYFyABKAU6ATASFgoHZmllbGQyNBgYIAEoCDoFZmFsc2USEgoHZmll", 
+            "bGQyNRgZIAEoBToBMBI0CgdmaWVsZDE1GA8gASgLMiMuYmVuY2htYXJrcy5T", 
+            "cGVlZE1lc3NhZ2UxU3ViTWVzc2FnZRIPCgdmaWVsZDc4GE4gASgIEhIKB2Zp", 
+            "ZWxkNjcYQyABKAU6ATASDwoHZmllbGQ2OBhEIAEoBRIUCghmaWVsZDEyOBiA", 
+            "ASABKAU6ATASKAoIZmllbGQxMjkYgQEgASgJOhV4eHh4eHh4eHh4eHh4eHh4", 
+            "eHh4eHgSFAoIZmllbGQxMzEYgwEgASgFOgEwIqIDChdTcGVlZE1lc3NhZ2Ux", 
+            "U3ViTWVzc2FnZRIRCgZmaWVsZDEYASABKAU6ATASEQoGZmllbGQyGAIgASgF", 
+            "OgEwEhEKBmZpZWxkMxgDIAEoBToBMBIPCgdmaWVsZDE1GA8gASgJEhUKB2Zp", 
+            "ZWxkMTIYDCABKAg6BHRydWUSDwoHZmllbGQxMxgNIAEoAxIPCgdmaWVsZDE0", 
+            "GA4gASgDEg8KB2ZpZWxkMTYYECABKAUSEgoHZmllbGQxORgTIAEoBToBMhIV", 
+            "CgdmaWVsZDIwGBQgASgIOgR0cnVlEhUKB2ZpZWxkMjgYHCABKAg6BHRydWUS", 
+            "DwoHZmllbGQyMRgVIAEoBhIPCgdmaWVsZDIyGBYgASgFEhYKB2ZpZWxkMjMY", 
+            "FyABKAg6BWZhbHNlEhgKCGZpZWxkMjA2GM4BIAEoCDoFZmFsc2USEQoIZmll", 
+            "bGQyMDMYywEgASgHEhEKCGZpZWxkMjA0GMwBIAEoBRIRCghmaWVsZDIwNRjN", 
+            "ASABKAkSEQoIZmllbGQyMDcYzwEgASgEEhEKCGZpZWxkMzAwGKwCIAEoBCLK", 
+            "BwoNU3BlZWRNZXNzYWdlMhIOCgZmaWVsZDEYASABKAkSDgoGZmllbGQzGAMg", 
+            "ASgDEg4KBmZpZWxkNBgEIAEoAxIPCgdmaWVsZDMwGB4gASgDEhYKB2ZpZWxk", 
+            "NzUYSyABKAg6BWZhbHNlEg4KBmZpZWxkNhgGIAEoCRIOCgZmaWVsZDIYAiAB", 
+            "KAwSEgoHZmllbGQyMRgVIAEoBToBMBIPCgdmaWVsZDcxGEcgASgFEg8KB2Zp", 
+            "ZWxkMjUYGSABKAISEwoIZmllbGQxMDkYbSABKAU6ATASFAoIZmllbGQyMTAY", 
+            "0gEgASgFOgEwEhQKCGZpZWxkMjExGNMBIAEoBToBMBIUCghmaWVsZDIxMhjU", 
+            "ASABKAU6ATASFAoIZmllbGQyMTMY1QEgASgFOgEwEhQKCGZpZWxkMjE2GNgB", 
+            "IAEoBToBMBIUCghmaWVsZDIxNxjZASABKAU6ATASFAoIZmllbGQyMTgY2gEg", 
+            "ASgFOgEwEhQKCGZpZWxkMjIwGNwBIAEoBToBMBIUCghmaWVsZDIyMRjdASAB", 
+            "KAU6ATASFAoIZmllbGQyMjIY3gEgASgCOgEwEg8KB2ZpZWxkNjMYPyABKAUS", 
+            "MAoGZ3JvdXAxGAogAygKMiAuYmVuY2htYXJrcy5TcGVlZE1lc3NhZ2UyLkdy", 
+            "b3VwMRIRCghmaWVsZDEyOBiAASADKAkSEQoIZmllbGQxMzEYgwEgASgDEhAK", 
+            "CGZpZWxkMTI3GH8gAygJEhEKCGZpZWxkMTI5GIEBIAEoBRIRCghmaWVsZDEz", 
+            "MBiCASADKAMSGAoIZmllbGQyMDUYzQEgASgIOgVmYWxzZRIYCghmaWVsZDIw", 
+            "NhjOASABKAg6BWZhbHNlGsMCCgZHcm91cDESDwoHZmllbGQxMRgLIAIoAhIP", 
+            "CgdmaWVsZDI2GBogASgCEg8KB2ZpZWxkMTIYDCABKAkSDwoHZmllbGQxMxgN", 
+            "IAEoCRIPCgdmaWVsZDE0GA4gAygJEg8KB2ZpZWxkMTUYDyACKAQSDgoGZmll", 
+            "bGQ1GAUgASgFEg8KB2ZpZWxkMjcYGyABKAkSDwoHZmllbGQyOBgcIAEoBRIP", 
+            "CgdmaWVsZDI5GB0gASgJEg8KB2ZpZWxkMTYYECABKAkSDwoHZmllbGQyMhgW", 
+            "IAMoCRIPCgdmaWVsZDczGEkgAygFEhIKB2ZpZWxkMjAYFCABKAU6ATASDwoH", 
+            "ZmllbGQyNBgYIAEoCRI4CgdmaWVsZDMxGB8gASgLMicuYmVuY2htYXJrcy5T", 
+            "cGVlZE1lc3NhZ2UyR3JvdXBlZE1lc3NhZ2Ui3wEKG1NwZWVkTWVzc2FnZTJH", 
+            "cm91cGVkTWVzc2FnZRIOCgZmaWVsZDEYASABKAISDgoGZmllbGQyGAIgASgC", 
+            "EhEKBmZpZWxkMxgDIAEoAjoBMBIOCgZmaWVsZDQYBCABKAgSDgoGZmllbGQ1", 
+            "GAUgASgIEhQKBmZpZWxkNhgGIAEoCDoEdHJ1ZRIVCgZmaWVsZDcYByABKAg6", 
+            "BWZhbHNlEg4KBmZpZWxkOBgIIAEoAhIOCgZmaWVsZDkYCSABKAgSDwoHZmll", 
+            "bGQxMBgKIAEoAhIPCgdmaWVsZDExGAsgASgDQktCC0dvb2dsZVNwZWVkSAHC", 
+            "PjkKIUdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuUHJvdG9CZW5jaBIUR29vZ2xl", 
+          "U3BlZWRQcm90b0ZpbGU="));
+      pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) {
+        descriptor = root;
+        internal__static_benchmarks_SpeedMessage1__Descriptor = Descriptor.MessageTypes[0];
+        internal__static_benchmarks_SpeedMessage1__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.ProtoBench.SpeedMessage1, global::Google.ProtocolBuffers.ProtoBench.SpeedMessage1.Builder>(internal__static_benchmarks_SpeedMessage1__Descriptor,
+                new string[] { "Field1", "Field9", "Field18", "Field80", "Field81", "Field2", "Field3", "Field280", "Field6", "Field22", "Field4", "Field5", "Field59", "Field7", "Field16", "Field130", "Field12", "Field17", "Field13", "Field14", "Field104", "Field100", "Field101", "Field102", "Field103", "Field29", "Field30", "Field60", "Field271", "Field272", "Field150", "Field23", "Field24", "Field25", "Field15", "Field78", "Field67", "Field68", "Field128", "Field129", "Field131", });
+        internal__static_benchmarks_SpeedMessage1SubMessage__Descriptor = Descriptor.MessageTypes[1];
+        internal__static_benchmarks_SpeedMessage1SubMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.ProtoBench.SpeedMessage1SubMessage, global::Google.ProtocolBuffers.ProtoBench.SpeedMessage1SubMessage.Builder>(internal__static_benchmarks_SpeedMessage1SubMessage__Descriptor,
+                new string[] { "Field1", "Field2", "Field3", "Field15", "Field12", "Field13", "Field14", "Field16", "Field19", "Field20", "Field28", "Field21", "Field22", "Field23", "Field206", "Field203", "Field204", "Field205", "Field207", "Field300", });
+        internal__static_benchmarks_SpeedMessage2__Descriptor = Descriptor.MessageTypes[2];
+        internal__static_benchmarks_SpeedMessage2__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2, global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2.Builder>(internal__static_benchmarks_SpeedMessage2__Descriptor,
+                new string[] { "Field1", "Field3", "Field4", "Field30", "Field75", "Field6", "Field2", "Field21", "Field71", "Field25", "Field109", "Field210", "Field211", "Field212", "Field213", "Field216", "Field217", "Field218", "Field220", "Field221", "Field222", "Field63", "Group1", "Field128", "Field131", "Field127", "Field129", "Field130", "Field205", "Field206", });
+        internal__static_benchmarks_SpeedMessage2_Group1__Descriptor = internal__static_benchmarks_SpeedMessage2__Descriptor.NestedTypes[0];
+        internal__static_benchmarks_SpeedMessage2_Group1__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2.Types.Group1, global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2.Types.Group1.Builder>(internal__static_benchmarks_SpeedMessage2_Group1__Descriptor,
+                new string[] { "Field11", "Field26", "Field12", "Field13", "Field14", "Field15", "Field5", "Field27", "Field28", "Field29", "Field16", "Field22", "Field73", "Field20", "Field24", "Field31", });
+        internal__static_benchmarks_SpeedMessage2GroupedMessage__Descriptor = Descriptor.MessageTypes[3];
+        internal__static_benchmarks_SpeedMessage2GroupedMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2GroupedMessage, global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2GroupedMessage.Builder>(internal__static_benchmarks_SpeedMessage2GroupedMessage__Descriptor,
+                new string[] { "Field1", "Field2", "Field3", "Field4", "Field5", "Field6", "Field7", "Field8", "Field9", "Field10", "Field11", });
+        pb::ExtensionRegistry registry = pb::ExtensionRegistry.CreateInstance();
+        RegisterAllExtensions(registry);
+        global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.RegisterAllExtensions(registry);
+        return registry;
+      };
+      pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,
+          new pbd::FileDescriptor[] {
+          global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.Descriptor, 
+          }, assigner);
+    }
+    #endregion
+    
+  }
+  #region Messages
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class SpeedMessage1 : pb::GeneratedMessage<SpeedMessage1, SpeedMessage1.Builder> {
+    private SpeedMessage1() { }
+    private static readonly SpeedMessage1 defaultInstance = new SpeedMessage1().MakeReadOnly();
+    private static readonly string[] _speedMessage1FieldNames = new string[] { "field1", "field100", "field101", "field102", "field103", "field104", "field12", "field128", "field129", "field13", "field130", "field131", "field14", "field15", "field150", "field16", "field17", "field18", "field2", "field22", "field23", "field24", "field25", "field271", "field272", "field280", "field29", "field3", "field30", "field4", "field5", "field59", "field6", "field60", "field67", "field68", "field7", "field78", "field80", "field81", "field9" };
+    private static readonly uint[] _speedMessage1FieldTags = new uint[] { 10, 800, 808, 818, 826, 832, 96, 1024, 1034, 104, 1040, 1048, 112, 122, 1200, 128, 136, 146, 16, 176, 184, 192, 200, 2168, 2176, 2240, 232, 24, 240, 34, 41, 472, 48, 480, 536, 544, 58, 624, 640, 648, 74 };
+    public static SpeedMessage1 DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override SpeedMessage1 DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override SpeedMessage1 ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.ProtoBench.GoogleSpeedProtoFile.internal__static_benchmarks_SpeedMessage1__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<SpeedMessage1, SpeedMessage1.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.ProtoBench.GoogleSpeedProtoFile.internal__static_benchmarks_SpeedMessage1__FieldAccessorTable; }
+    }
+    
+    public const int Field1FieldNumber = 1;
+    private bool hasField1;
+    private string field1_ = "";
+    public bool HasField1 {
+      get { return hasField1; }
+    }
+    public string Field1 {
+      get { return field1_; }
+    }
+    
+    public const int Field9FieldNumber = 9;
+    private bool hasField9;
+    private string field9_ = "";
+    public bool HasField9 {
+      get { return hasField9; }
+    }
+    public string Field9 {
+      get { return field9_; }
+    }
+    
+    public const int Field18FieldNumber = 18;
+    private bool hasField18;
+    private string field18_ = "";
+    public bool HasField18 {
+      get { return hasField18; }
+    }
+    public string Field18 {
+      get { return field18_; }
+    }
+    
+    public const int Field80FieldNumber = 80;
+    private bool hasField80;
+    private bool field80_;
+    public bool HasField80 {
+      get { return hasField80; }
+    }
+    public bool Field80 {
+      get { return field80_; }
+    }
+    
+    public const int Field81FieldNumber = 81;
+    private bool hasField81;
+    private bool field81_ = true;
+    public bool HasField81 {
+      get { return hasField81; }
+    }
+    public bool Field81 {
+      get { return field81_; }
+    }
+    
+    public const int Field2FieldNumber = 2;
+    private bool hasField2;
+    private int field2_;
+    public bool HasField2 {
+      get { return hasField2; }
+    }
+    public int Field2 {
+      get { return field2_; }
+    }
+    
+    public const int Field3FieldNumber = 3;
+    private bool hasField3;
+    private int field3_;
+    public bool HasField3 {
+      get { return hasField3; }
+    }
+    public int Field3 {
+      get { return field3_; }
+    }
+    
+    public const int Field280FieldNumber = 280;
+    private bool hasField280;
+    private int field280_;
+    public bool HasField280 {
+      get { return hasField280; }
+    }
+    public int Field280 {
+      get { return field280_; }
+    }
+    
+    public const int Field6FieldNumber = 6;
+    private bool hasField6;
+    private int field6_;
+    public bool HasField6 {
+      get { return hasField6; }
+    }
+    public int Field6 {
+      get { return field6_; }
+    }
+    
+    public const int Field22FieldNumber = 22;
+    private bool hasField22;
+    private long field22_;
+    public bool HasField22 {
+      get { return hasField22; }
+    }
+    public long Field22 {
+      get { return field22_; }
+    }
+    
+    public const int Field4FieldNumber = 4;
+    private bool hasField4;
+    private string field4_ = "";
+    public bool HasField4 {
+      get { return hasField4; }
+    }
+    public string Field4 {
+      get { return field4_; }
+    }
+    
+    public const int Field5FieldNumber = 5;
+    private pbc::PopsicleList<ulong> field5_ = new pbc::PopsicleList<ulong>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<ulong> Field5List {
+      get { return pbc::Lists.AsReadOnly(field5_); }
+    }
+    public int Field5Count {
+      get { return field5_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong GetField5(int index) {
+      return field5_[index];
+    }
+    
+    public const int Field59FieldNumber = 59;
+    private bool hasField59;
+    private bool field59_;
+    public bool HasField59 {
+      get { return hasField59; }
+    }
+    public bool Field59 {
+      get { return field59_; }
+    }
+    
+    public const int Field7FieldNumber = 7;
+    private bool hasField7;
+    private string field7_ = "";
+    public bool HasField7 {
+      get { return hasField7; }
+    }
+    public string Field7 {
+      get { return field7_; }
+    }
+    
+    public const int Field16FieldNumber = 16;
+    private bool hasField16;
+    private int field16_;
+    public bool HasField16 {
+      get { return hasField16; }
+    }
+    public int Field16 {
+      get { return field16_; }
+    }
+    
+    public const int Field130FieldNumber = 130;
+    private bool hasField130;
+    private int field130_;
+    public bool HasField130 {
+      get { return hasField130; }
+    }
+    public int Field130 {
+      get { return field130_; }
+    }
+    
+    public const int Field12FieldNumber = 12;
+    private bool hasField12;
+    private bool field12_ = true;
+    public bool HasField12 {
+      get { return hasField12; }
+    }
+    public bool Field12 {
+      get { return field12_; }
+    }
+    
+    public const int Field17FieldNumber = 17;
+    private bool hasField17;
+    private bool field17_ = true;
+    public bool HasField17 {
+      get { return hasField17; }
+    }
+    public bool Field17 {
+      get { return field17_; }
+    }
+    
+    public const int Field13FieldNumber = 13;
+    private bool hasField13;
+    private bool field13_ = true;
+    public bool HasField13 {
+      get { return hasField13; }
+    }
+    public bool Field13 {
+      get { return field13_; }
+    }
+    
+    public const int Field14FieldNumber = 14;
+    private bool hasField14;
+    private bool field14_ = true;
+    public bool HasField14 {
+      get { return hasField14; }
+    }
+    public bool Field14 {
+      get { return field14_; }
+    }
+    
+    public const int Field104FieldNumber = 104;
+    private bool hasField104;
+    private int field104_;
+    public bool HasField104 {
+      get { return hasField104; }
+    }
+    public int Field104 {
+      get { return field104_; }
+    }
+    
+    public const int Field100FieldNumber = 100;
+    private bool hasField100;
+    private int field100_;
+    public bool HasField100 {
+      get { return hasField100; }
+    }
+    public int Field100 {
+      get { return field100_; }
+    }
+    
+    public const int Field101FieldNumber = 101;
+    private bool hasField101;
+    private int field101_;
+    public bool HasField101 {
+      get { return hasField101; }
+    }
+    public int Field101 {
+      get { return field101_; }
+    }
+    
+    public const int Field102FieldNumber = 102;
+    private bool hasField102;
+    private string field102_ = "";
+    public bool HasField102 {
+      get { return hasField102; }
+    }
+    public string Field102 {
+      get { return field102_; }
+    }
+    
+    public const int Field103FieldNumber = 103;
+    private bool hasField103;
+    private string field103_ = "";
+    public bool HasField103 {
+      get { return hasField103; }
+    }
+    public string Field103 {
+      get { return field103_; }
+    }
+    
+    public const int Field29FieldNumber = 29;
+    private bool hasField29;
+    private int field29_;
+    public bool HasField29 {
+      get { return hasField29; }
+    }
+    public int Field29 {
+      get { return field29_; }
+    }
+    
+    public const int Field30FieldNumber = 30;
+    private bool hasField30;
+    private bool field30_;
+    public bool HasField30 {
+      get { return hasField30; }
+    }
+    public bool Field30 {
+      get { return field30_; }
+    }
+    
+    public const int Field60FieldNumber = 60;
+    private bool hasField60;
+    private int field60_ = -1;
+    public bool HasField60 {
+      get { return hasField60; }
+    }
+    public int Field60 {
+      get { return field60_; }
+    }
+    
+    public const int Field271FieldNumber = 271;
+    private bool hasField271;
+    private int field271_ = -1;
+    public bool HasField271 {
+      get { return hasField271; }
+    }
+    public int Field271 {
+      get { return field271_; }
+    }
+    
+    public const int Field272FieldNumber = 272;
+    private bool hasField272;
+    private int field272_ = -1;
+    public bool HasField272 {
+      get { return hasField272; }
+    }
+    public int Field272 {
+      get { return field272_; }
+    }
+    
+    public const int Field150FieldNumber = 150;
+    private bool hasField150;
+    private int field150_;
+    public bool HasField150 {
+      get { return hasField150; }
+    }
+    public int Field150 {
+      get { return field150_; }
+    }
+    
+    public const int Field23FieldNumber = 23;
+    private bool hasField23;
+    private int field23_;
+    public bool HasField23 {
+      get { return hasField23; }
+    }
+    public int Field23 {
+      get { return field23_; }
+    }
+    
+    public const int Field24FieldNumber = 24;
+    private bool hasField24;
+    private bool field24_;
+    public bool HasField24 {
+      get { return hasField24; }
+    }
+    public bool Field24 {
+      get { return field24_; }
+    }
+    
+    public const int Field25FieldNumber = 25;
+    private bool hasField25;
+    private int field25_;
+    public bool HasField25 {
+      get { return hasField25; }
+    }
+    public int Field25 {
+      get { return field25_; }
+    }
+    
+    public const int Field15FieldNumber = 15;
+    private bool hasField15;
+    private global::Google.ProtocolBuffers.ProtoBench.SpeedMessage1SubMessage field15_;
+    public bool HasField15 {
+      get { return hasField15; }
+    }
+    public global::Google.ProtocolBuffers.ProtoBench.SpeedMessage1SubMessage Field15 {
+      get { return field15_ ?? global::Google.ProtocolBuffers.ProtoBench.SpeedMessage1SubMessage.DefaultInstance; }
+    }
+    
+    public const int Field78FieldNumber = 78;
+    private bool hasField78;
+    private bool field78_;
+    public bool HasField78 {
+      get { return hasField78; }
+    }
+    public bool Field78 {
+      get { return field78_; }
+    }
+    
+    public const int Field67FieldNumber = 67;
+    private bool hasField67;
+    private int field67_;
+    public bool HasField67 {
+      get { return hasField67; }
+    }
+    public int Field67 {
+      get { return field67_; }
+    }
+    
+    public const int Field68FieldNumber = 68;
+    private bool hasField68;
+    private int field68_;
+    public bool HasField68 {
+      get { return hasField68; }
+    }
+    public int Field68 {
+      get { return field68_; }
+    }
+    
+    public const int Field128FieldNumber = 128;
+    private bool hasField128;
+    private int field128_;
+    public bool HasField128 {
+      get { return hasField128; }
+    }
+    public int Field128 {
+      get { return field128_; }
+    }
+    
+    public const int Field129FieldNumber = 129;
+    private bool hasField129;
+    private string field129_ = "xxxxxxxxxxxxxxxxxxxxx";
+    public bool HasField129 {
+      get { return hasField129; }
+    }
+    public string Field129 {
+      get { return field129_; }
+    }
+    
+    public const int Field131FieldNumber = 131;
+    private bool hasField131;
+    private int field131_;
+    public bool HasField131 {
+      get { return hasField131; }
+    }
+    public int Field131 {
+      get { return field131_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (!hasField1) return false;
+        if (!hasField2) return false;
+        if (!hasField3) return false;
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _speedMessage1FieldNames;
+      if (hasField1) {
+        output.WriteString(1, field_names[0], Field1);
+      }
+      if (hasField2) {
+        output.WriteInt32(2, field_names[18], Field2);
+      }
+      if (hasField3) {
+        output.WriteInt32(3, field_names[27], Field3);
+      }
+      if (hasField4) {
+        output.WriteString(4, field_names[29], Field4);
+      }
+      if (field5_.Count > 0) {
+        output.WriteFixed64Array(5, field_names[30], field5_);
+      }
+      if (hasField6) {
+        output.WriteInt32(6, field_names[32], Field6);
+      }
+      if (hasField7) {
+        output.WriteString(7, field_names[36], Field7);
+      }
+      if (hasField9) {
+        output.WriteString(9, field_names[40], Field9);
+      }
+      if (hasField12) {
+        output.WriteBool(12, field_names[6], Field12);
+      }
+      if (hasField13) {
+        output.WriteBool(13, field_names[9], Field13);
+      }
+      if (hasField14) {
+        output.WriteBool(14, field_names[12], Field14);
+      }
+      if (hasField15) {
+        output.WriteMessage(15, field_names[13], Field15);
+      }
+      if (hasField16) {
+        output.WriteInt32(16, field_names[15], Field16);
+      }
+      if (hasField17) {
+        output.WriteBool(17, field_names[16], Field17);
+      }
+      if (hasField18) {
+        output.WriteString(18, field_names[17], Field18);
+      }
+      if (hasField22) {
+        output.WriteInt64(22, field_names[19], Field22);
+      }
+      if (hasField23) {
+        output.WriteInt32(23, field_names[20], Field23);
+      }
+      if (hasField24) {
+        output.WriteBool(24, field_names[21], Field24);
+      }
+      if (hasField25) {
+        output.WriteInt32(25, field_names[22], Field25);
+      }
+      if (hasField29) {
+        output.WriteInt32(29, field_names[26], Field29);
+      }
+      if (hasField30) {
+        output.WriteBool(30, field_names[28], Field30);
+      }
+      if (hasField59) {
+        output.WriteBool(59, field_names[31], Field59);
+      }
+      if (hasField60) {
+        output.WriteInt32(60, field_names[33], Field60);
+      }
+      if (hasField67) {
+        output.WriteInt32(67, field_names[34], Field67);
+      }
+      if (hasField68) {
+        output.WriteInt32(68, field_names[35], Field68);
+      }
+      if (hasField78) {
+        output.WriteBool(78, field_names[37], Field78);
+      }
+      if (hasField80) {
+        output.WriteBool(80, field_names[38], Field80);
+      }
+      if (hasField81) {
+        output.WriteBool(81, field_names[39], Field81);
+      }
+      if (hasField100) {
+        output.WriteInt32(100, field_names[1], Field100);
+      }
+      if (hasField101) {
+        output.WriteInt32(101, field_names[2], Field101);
+      }
+      if (hasField102) {
+        output.WriteString(102, field_names[3], Field102);
+      }
+      if (hasField103) {
+        output.WriteString(103, field_names[4], Field103);
+      }
+      if (hasField104) {
+        output.WriteInt32(104, field_names[5], Field104);
+      }
+      if (hasField128) {
+        output.WriteInt32(128, field_names[7], Field128);
+      }
+      if (hasField129) {
+        output.WriteString(129, field_names[8], Field129);
+      }
+      if (hasField130) {
+        output.WriteInt32(130, field_names[10], Field130);
+      }
+      if (hasField131) {
+        output.WriteInt32(131, field_names[11], Field131);
+      }
+      if (hasField150) {
+        output.WriteInt32(150, field_names[14], Field150);
+      }
+      if (hasField271) {
+        output.WriteInt32(271, field_names[23], Field271);
+      }
+      if (hasField272) {
+        output.WriteInt32(272, field_names[24], Field272);
+      }
+      if (hasField280) {
+        output.WriteInt32(280, field_names[25], Field280);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+      
+      size = 0;
+      if (hasField1) {
+        size += pb::CodedOutputStream.ComputeStringSize(1, Field1);
+      }
+      if (hasField9) {
+        size += pb::CodedOutputStream.ComputeStringSize(9, Field9);
+      }
+      if (hasField18) {
+        size += pb::CodedOutputStream.ComputeStringSize(18, Field18);
+      }
+      if (hasField80) {
+        size += pb::CodedOutputStream.ComputeBoolSize(80, Field80);
+      }
+      if (hasField81) {
+        size += pb::CodedOutputStream.ComputeBoolSize(81, Field81);
+      }
+      if (hasField2) {
+        size += pb::CodedOutputStream.ComputeInt32Size(2, Field2);
+      }
+      if (hasField3) {
+        size += pb::CodedOutputStream.ComputeInt32Size(3, Field3);
+      }
+      if (hasField280) {
+        size += pb::CodedOutputStream.ComputeInt32Size(280, Field280);
+      }
+      if (hasField6) {
+        size += pb::CodedOutputStream.ComputeInt32Size(6, Field6);
+      }
+      if (hasField22) {
+        size += pb::CodedOutputStream.ComputeInt64Size(22, Field22);
+      }
+      if (hasField4) {
+        size += pb::CodedOutputStream.ComputeStringSize(4, Field4);
+      }
+      {
+        int dataSize = 0;
+        dataSize = 8 * field5_.Count;
+        size += dataSize;
+        size += 1 * field5_.Count;
+      }
+      if (hasField59) {
+        size += pb::CodedOutputStream.ComputeBoolSize(59, Field59);
+      }
+      if (hasField7) {
+        size += pb::CodedOutputStream.ComputeStringSize(7, Field7);
+      }
+      if (hasField16) {
+        size += pb::CodedOutputStream.ComputeInt32Size(16, Field16);
+      }
+      if (hasField130) {
+        size += pb::CodedOutputStream.ComputeInt32Size(130, Field130);
+      }
+      if (hasField12) {
+        size += pb::CodedOutputStream.ComputeBoolSize(12, Field12);
+      }
+      if (hasField17) {
+        size += pb::CodedOutputStream.ComputeBoolSize(17, Field17);
+      }
+      if (hasField13) {
+        size += pb::CodedOutputStream.ComputeBoolSize(13, Field13);
+      }
+      if (hasField14) {
+        size += pb::CodedOutputStream.ComputeBoolSize(14, Field14);
+      }
+      if (hasField104) {
+        size += pb::CodedOutputStream.ComputeInt32Size(104, Field104);
+      }
+      if (hasField100) {
+        size += pb::CodedOutputStream.ComputeInt32Size(100, Field100);
+      }
+      if (hasField101) {
+        size += pb::CodedOutputStream.ComputeInt32Size(101, Field101);
+      }
+      if (hasField102) {
+        size += pb::CodedOutputStream.ComputeStringSize(102, Field102);
+      }
+      if (hasField103) {
+        size += pb::CodedOutputStream.ComputeStringSize(103, Field103);
+      }
+      if (hasField29) {
+        size += pb::CodedOutputStream.ComputeInt32Size(29, Field29);
+      }
+      if (hasField30) {
+        size += pb::CodedOutputStream.ComputeBoolSize(30, Field30);
+      }
+      if (hasField60) {
+        size += pb::CodedOutputStream.ComputeInt32Size(60, Field60);
+      }
+      if (hasField271) {
+        size += pb::CodedOutputStream.ComputeInt32Size(271, Field271);
+      }
+      if (hasField272) {
+        size += pb::CodedOutputStream.ComputeInt32Size(272, Field272);
+      }
+      if (hasField150) {
+        size += pb::CodedOutputStream.ComputeInt32Size(150, Field150);
+      }
+      if (hasField23) {
+        size += pb::CodedOutputStream.ComputeInt32Size(23, Field23);
+      }
+      if (hasField24) {
+        size += pb::CodedOutputStream.ComputeBoolSize(24, Field24);
+      }
+      if (hasField25) {
+        size += pb::CodedOutputStream.ComputeInt32Size(25, Field25);
+      }
+      if (hasField15) {
+        size += pb::CodedOutputStream.ComputeMessageSize(15, Field15);
+      }
+      if (hasField78) {
+        size += pb::CodedOutputStream.ComputeBoolSize(78, Field78);
+      }
+      if (hasField67) {
+        size += pb::CodedOutputStream.ComputeInt32Size(67, Field67);
+      }
+      if (hasField68) {
+        size += pb::CodedOutputStream.ComputeInt32Size(68, Field68);
+      }
+      if (hasField128) {
+        size += pb::CodedOutputStream.ComputeInt32Size(128, Field128);
+      }
+      if (hasField129) {
+        size += pb::CodedOutputStream.ComputeStringSize(129, Field129);
+      }
+      if (hasField131) {
+        size += pb::CodedOutputStream.ComputeInt32Size(131, Field131);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static SpeedMessage1 ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SpeedMessage1 ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage1 ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SpeedMessage1 ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage1 ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SpeedMessage1 ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage1 ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static SpeedMessage1 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static SpeedMessage1 ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SpeedMessage1 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private SpeedMessage1 MakeReadOnly() {
+      field5_.MakeReadOnly();
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(SpeedMessage1 prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<SpeedMessage1, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(SpeedMessage1 cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private SpeedMessage1 result;
+      
+      private SpeedMessage1 PrepareBuilder() {
+        if (resultIsReadOnly) {
+          SpeedMessage1 original = result;
+          result = new SpeedMessage1();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override SpeedMessage1 MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.ProtoBench.SpeedMessage1.Descriptor; }
+      }
+      
+      public override SpeedMessage1 DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.ProtoBench.SpeedMessage1.DefaultInstance; }
+      }
+      
+      public override SpeedMessage1 BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is SpeedMessage1) {
+          return MergeFrom((SpeedMessage1) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(SpeedMessage1 other) {
+        if (other == global::Google.ProtocolBuffers.ProtoBench.SpeedMessage1.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasField1) {
+          Field1 = other.Field1;
+        }
+        if (other.HasField9) {
+          Field9 = other.Field9;
+        }
+        if (other.HasField18) {
+          Field18 = other.Field18;
+        }
+        if (other.HasField80) {
+          Field80 = other.Field80;
+        }
+        if (other.HasField81) {
+          Field81 = other.Field81;
+        }
+        if (other.HasField2) {
+          Field2 = other.Field2;
+        }
+        if (other.HasField3) {
+          Field3 = other.Field3;
+        }
+        if (other.HasField280) {
+          Field280 = other.Field280;
+        }
+        if (other.HasField6) {
+          Field6 = other.Field6;
+        }
+        if (other.HasField22) {
+          Field22 = other.Field22;
+        }
+        if (other.HasField4) {
+          Field4 = other.Field4;
+        }
+        if (other.field5_.Count != 0) {
+          result.field5_.Add(other.field5_);
+        }
+        if (other.HasField59) {
+          Field59 = other.Field59;
+        }
+        if (other.HasField7) {
+          Field7 = other.Field7;
+        }
+        if (other.HasField16) {
+          Field16 = other.Field16;
+        }
+        if (other.HasField130) {
+          Field130 = other.Field130;
+        }
+        if (other.HasField12) {
+          Field12 = other.Field12;
+        }
+        if (other.HasField17) {
+          Field17 = other.Field17;
+        }
+        if (other.HasField13) {
+          Field13 = other.Field13;
+        }
+        if (other.HasField14) {
+          Field14 = other.Field14;
+        }
+        if (other.HasField104) {
+          Field104 = other.Field104;
+        }
+        if (other.HasField100) {
+          Field100 = other.Field100;
+        }
+        if (other.HasField101) {
+          Field101 = other.Field101;
+        }
+        if (other.HasField102) {
+          Field102 = other.Field102;
+        }
+        if (other.HasField103) {
+          Field103 = other.Field103;
+        }
+        if (other.HasField29) {
+          Field29 = other.Field29;
+        }
+        if (other.HasField30) {
+          Field30 = other.Field30;
+        }
+        if (other.HasField60) {
+          Field60 = other.Field60;
+        }
+        if (other.HasField271) {
+          Field271 = other.Field271;
+        }
+        if (other.HasField272) {
+          Field272 = other.Field272;
+        }
+        if (other.HasField150) {
+          Field150 = other.Field150;
+        }
+        if (other.HasField23) {
+          Field23 = other.Field23;
+        }
+        if (other.HasField24) {
+          Field24 = other.Field24;
+        }
+        if (other.HasField25) {
+          Field25 = other.Field25;
+        }
+        if (other.HasField15) {
+          MergeField15(other.Field15);
+        }
+        if (other.HasField78) {
+          Field78 = other.Field78;
+        }
+        if (other.HasField67) {
+          Field67 = other.Field67;
+        }
+        if (other.HasField68) {
+          Field68 = other.Field68;
+        }
+        if (other.HasField128) {
+          Field128 = other.Field128;
+        }
+        if (other.HasField129) {
+          Field129 = other.Field129;
+        }
+        if (other.HasField131) {
+          Field131 = other.Field131;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_speedMessage1FieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _speedMessage1FieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              result.hasField1 = input.ReadString(ref result.field1_);
+              break;
+            }
+            case 16: {
+              result.hasField2 = input.ReadInt32(ref result.field2_);
+              break;
+            }
+            case 24: {
+              result.hasField3 = input.ReadInt32(ref result.field3_);
+              break;
+            }
+            case 34: {
+              result.hasField4 = input.ReadString(ref result.field4_);
+              break;
+            }
+            case 42:
+            case 41: {
+              input.ReadFixed64Array(tag, field_name, result.field5_);
+              break;
+            }
+            case 48: {
+              result.hasField6 = input.ReadInt32(ref result.field6_);
+              break;
+            }
+            case 58: {
+              result.hasField7 = input.ReadString(ref result.field7_);
+              break;
+            }
+            case 74: {
+              result.hasField9 = input.ReadString(ref result.field9_);
+              break;
+            }
+            case 96: {
+              result.hasField12 = input.ReadBool(ref result.field12_);
+              break;
+            }
+            case 104: {
+              result.hasField13 = input.ReadBool(ref result.field13_);
+              break;
+            }
+            case 112: {
+              result.hasField14 = input.ReadBool(ref result.field14_);
+              break;
+            }
+            case 122: {
+              global::Google.ProtocolBuffers.ProtoBench.SpeedMessage1SubMessage.Builder subBuilder = global::Google.ProtocolBuffers.ProtoBench.SpeedMessage1SubMessage.CreateBuilder();
+              if (result.hasField15) {
+                subBuilder.MergeFrom(Field15);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              Field15 = subBuilder.BuildPartial();
+              break;
+            }
+            case 128: {
+              result.hasField16 = input.ReadInt32(ref result.field16_);
+              break;
+            }
+            case 136: {
+              result.hasField17 = input.ReadBool(ref result.field17_);
+              break;
+            }
+            case 146: {
+              result.hasField18 = input.ReadString(ref result.field18_);
+              break;
+            }
+            case 176: {
+              result.hasField22 = input.ReadInt64(ref result.field22_);
+              break;
+            }
+            case 184: {
+              result.hasField23 = input.ReadInt32(ref result.field23_);
+              break;
+            }
+            case 192: {
+              result.hasField24 = input.ReadBool(ref result.field24_);
+              break;
+            }
+            case 200: {
+              result.hasField25 = input.ReadInt32(ref result.field25_);
+              break;
+            }
+            case 232: {
+              result.hasField29 = input.ReadInt32(ref result.field29_);
+              break;
+            }
+            case 240: {
+              result.hasField30 = input.ReadBool(ref result.field30_);
+              break;
+            }
+            case 472: {
+              result.hasField59 = input.ReadBool(ref result.field59_);
+              break;
+            }
+            case 480: {
+              result.hasField60 = input.ReadInt32(ref result.field60_);
+              break;
+            }
+            case 536: {
+              result.hasField67 = input.ReadInt32(ref result.field67_);
+              break;
+            }
+            case 544: {
+              result.hasField68 = input.ReadInt32(ref result.field68_);
+              break;
+            }
+            case 624: {
+              result.hasField78 = input.ReadBool(ref result.field78_);
+              break;
+            }
+            case 640: {
+              result.hasField80 = input.ReadBool(ref result.field80_);
+              break;
+            }
+            case 648: {
+              result.hasField81 = input.ReadBool(ref result.field81_);
+              break;
+            }
+            case 800: {
+              result.hasField100 = input.ReadInt32(ref result.field100_);
+              break;
+            }
+            case 808: {
+              result.hasField101 = input.ReadInt32(ref result.field101_);
+              break;
+            }
+            case 818: {
+              result.hasField102 = input.ReadString(ref result.field102_);
+              break;
+            }
+            case 826: {
+              result.hasField103 = input.ReadString(ref result.field103_);
+              break;
+            }
+            case 832: {
+              result.hasField104 = input.ReadInt32(ref result.field104_);
+              break;
+            }
+            case 1024: {
+              result.hasField128 = input.ReadInt32(ref result.field128_);
+              break;
+            }
+            case 1034: {
+              result.hasField129 = input.ReadString(ref result.field129_);
+              break;
+            }
+            case 1040: {
+              result.hasField130 = input.ReadInt32(ref result.field130_);
+              break;
+            }
+            case 1048: {
+              result.hasField131 = input.ReadInt32(ref result.field131_);
+              break;
+            }
+            case 1200: {
+              result.hasField150 = input.ReadInt32(ref result.field150_);
+              break;
+            }
+            case 2168: {
+              result.hasField271 = input.ReadInt32(ref result.field271_);
+              break;
+            }
+            case 2176: {
+              result.hasField272 = input.ReadInt32(ref result.field272_);
+              break;
+            }
+            case 2240: {
+              result.hasField280 = input.ReadInt32(ref result.field280_);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public bool HasField1 {
+        get { return result.hasField1; }
+      }
+      public string Field1 {
+        get { return result.Field1; }
+        set { SetField1(value); }
+      }
+      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;
+      }
+      
+      public bool HasField9 {
+        get { return result.hasField9; }
+      }
+      public string Field9 {
+        get { return result.Field9; }
+        set { SetField9(value); }
+      }
+      public Builder SetField9(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField9 = true;
+        result.field9_ = value;
+        return this;
+      }
+      public Builder ClearField9() {
+        PrepareBuilder();
+        result.hasField9 = false;
+        result.field9_ = "";
+        return this;
+      }
+      
+      public bool HasField18 {
+        get { return result.hasField18; }
+      }
+      public string Field18 {
+        get { return result.Field18; }
+        set { SetField18(value); }
+      }
+      public Builder SetField18(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField18 = true;
+        result.field18_ = value;
+        return this;
+      }
+      public Builder ClearField18() {
+        PrepareBuilder();
+        result.hasField18 = false;
+        result.field18_ = "";
+        return this;
+      }
+      
+      public bool HasField80 {
+        get { return result.hasField80; }
+      }
+      public bool Field80 {
+        get { return result.Field80; }
+        set { SetField80(value); }
+      }
+      public Builder SetField80(bool value) {
+        PrepareBuilder();
+        result.hasField80 = true;
+        result.field80_ = value;
+        return this;
+      }
+      public Builder ClearField80() {
+        PrepareBuilder();
+        result.hasField80 = false;
+        result.field80_ = false;
+        return this;
+      }
+      
+      public bool HasField81 {
+        get { return result.hasField81; }
+      }
+      public bool Field81 {
+        get { return result.Field81; }
+        set { SetField81(value); }
+      }
+      public Builder SetField81(bool value) {
+        PrepareBuilder();
+        result.hasField81 = true;
+        result.field81_ = value;
+        return this;
+      }
+      public Builder ClearField81() {
+        PrepareBuilder();
+        result.hasField81 = false;
+        result.field81_ = true;
+        return this;
+      }
+      
+      public bool HasField2 {
+        get { return result.hasField2; }
+      }
+      public int Field2 {
+        get { return result.Field2; }
+        set { SetField2(value); }
+      }
+      public Builder SetField2(int value) {
+        PrepareBuilder();
+        result.hasField2 = true;
+        result.field2_ = value;
+        return this;
+      }
+      public Builder ClearField2() {
+        PrepareBuilder();
+        result.hasField2 = false;
+        result.field2_ = 0;
+        return this;
+      }
+      
+      public bool HasField3 {
+        get { return result.hasField3; }
+      }
+      public int Field3 {
+        get { return result.Field3; }
+        set { SetField3(value); }
+      }
+      public Builder SetField3(int value) {
+        PrepareBuilder();
+        result.hasField3 = true;
+        result.field3_ = value;
+        return this;
+      }
+      public Builder ClearField3() {
+        PrepareBuilder();
+        result.hasField3 = false;
+        result.field3_ = 0;
+        return this;
+      }
+      
+      public bool HasField280 {
+        get { return result.hasField280; }
+      }
+      public int Field280 {
+        get { return result.Field280; }
+        set { SetField280(value); }
+      }
+      public Builder SetField280(int value) {
+        PrepareBuilder();
+        result.hasField280 = true;
+        result.field280_ = value;
+        return this;
+      }
+      public Builder ClearField280() {
+        PrepareBuilder();
+        result.hasField280 = false;
+        result.field280_ = 0;
+        return this;
+      }
+      
+      public bool HasField6 {
+        get { return result.hasField6; }
+      }
+      public int Field6 {
+        get { return result.Field6; }
+        set { SetField6(value); }
+      }
+      public Builder SetField6(int value) {
+        PrepareBuilder();
+        result.hasField6 = true;
+        result.field6_ = value;
+        return this;
+      }
+      public Builder ClearField6() {
+        PrepareBuilder();
+        result.hasField6 = false;
+        result.field6_ = 0;
+        return this;
+      }
+      
+      public bool HasField22 {
+        get { return result.hasField22; }
+      }
+      public long Field22 {
+        get { return result.Field22; }
+        set { SetField22(value); }
+      }
+      public Builder SetField22(long value) {
+        PrepareBuilder();
+        result.hasField22 = true;
+        result.field22_ = value;
+        return this;
+      }
+      public Builder ClearField22() {
+        PrepareBuilder();
+        result.hasField22 = false;
+        result.field22_ = 0L;
+        return this;
+      }
+      
+      public bool HasField4 {
+        get { return result.hasField4; }
+      }
+      public string Field4 {
+        get { return result.Field4; }
+        set { SetField4(value); }
+      }
+      public Builder SetField4(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField4 = true;
+        result.field4_ = value;
+        return this;
+      }
+      public Builder ClearField4() {
+        PrepareBuilder();
+        result.hasField4 = false;
+        result.field4_ = "";
+        return this;
+      }
+      
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<ulong> Field5List {
+        get { return PrepareBuilder().field5_; }
+      }
+      public int Field5Count {
+        get { return result.Field5Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong GetField5(int index) {
+        return result.GetField5(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetField5(int index, ulong value) {
+        PrepareBuilder();
+        result.field5_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddField5(ulong value) {
+        PrepareBuilder();
+        result.field5_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangeField5(scg::IEnumerable<ulong> values) {
+        PrepareBuilder();
+        result.field5_.Add(values);
+        return this;
+      }
+      public Builder ClearField5() {
+        PrepareBuilder();
+        result.field5_.Clear();
+        return this;
+      }
+      
+      public bool HasField59 {
+        get { return result.hasField59; }
+      }
+      public bool Field59 {
+        get { return result.Field59; }
+        set { SetField59(value); }
+      }
+      public Builder SetField59(bool value) {
+        PrepareBuilder();
+        result.hasField59 = true;
+        result.field59_ = value;
+        return this;
+      }
+      public Builder ClearField59() {
+        PrepareBuilder();
+        result.hasField59 = false;
+        result.field59_ = false;
+        return this;
+      }
+      
+      public bool HasField7 {
+        get { return result.hasField7; }
+      }
+      public string Field7 {
+        get { return result.Field7; }
+        set { SetField7(value); }
+      }
+      public Builder SetField7(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField7 = true;
+        result.field7_ = value;
+        return this;
+      }
+      public Builder ClearField7() {
+        PrepareBuilder();
+        result.hasField7 = false;
+        result.field7_ = "";
+        return this;
+      }
+      
+      public bool HasField16 {
+        get { return result.hasField16; }
+      }
+      public int Field16 {
+        get { return result.Field16; }
+        set { SetField16(value); }
+      }
+      public Builder SetField16(int value) {
+        PrepareBuilder();
+        result.hasField16 = true;
+        result.field16_ = value;
+        return this;
+      }
+      public Builder ClearField16() {
+        PrepareBuilder();
+        result.hasField16 = false;
+        result.field16_ = 0;
+        return this;
+      }
+      
+      public bool HasField130 {
+        get { return result.hasField130; }
+      }
+      public int Field130 {
+        get { return result.Field130; }
+        set { SetField130(value); }
+      }
+      public Builder SetField130(int value) {
+        PrepareBuilder();
+        result.hasField130 = true;
+        result.field130_ = value;
+        return this;
+      }
+      public Builder ClearField130() {
+        PrepareBuilder();
+        result.hasField130 = false;
+        result.field130_ = 0;
+        return this;
+      }
+      
+      public bool HasField12 {
+        get { return result.hasField12; }
+      }
+      public bool Field12 {
+        get { return result.Field12; }
+        set { SetField12(value); }
+      }
+      public Builder SetField12(bool value) {
+        PrepareBuilder();
+        result.hasField12 = true;
+        result.field12_ = value;
+        return this;
+      }
+      public Builder ClearField12() {
+        PrepareBuilder();
+        result.hasField12 = false;
+        result.field12_ = true;
+        return this;
+      }
+      
+      public bool HasField17 {
+        get { return result.hasField17; }
+      }
+      public bool Field17 {
+        get { return result.Field17; }
+        set { SetField17(value); }
+      }
+      public Builder SetField17(bool value) {
+        PrepareBuilder();
+        result.hasField17 = true;
+        result.field17_ = value;
+        return this;
+      }
+      public Builder ClearField17() {
+        PrepareBuilder();
+        result.hasField17 = false;
+        result.field17_ = true;
+        return this;
+      }
+      
+      public bool HasField13 {
+        get { return result.hasField13; }
+      }
+      public bool Field13 {
+        get { return result.Field13; }
+        set { SetField13(value); }
+      }
+      public Builder SetField13(bool value) {
+        PrepareBuilder();
+        result.hasField13 = true;
+        result.field13_ = value;
+        return this;
+      }
+      public Builder ClearField13() {
+        PrepareBuilder();
+        result.hasField13 = false;
+        result.field13_ = true;
+        return this;
+      }
+      
+      public bool HasField14 {
+        get { return result.hasField14; }
+      }
+      public bool Field14 {
+        get { return result.Field14; }
+        set { SetField14(value); }
+      }
+      public Builder SetField14(bool value) {
+        PrepareBuilder();
+        result.hasField14 = true;
+        result.field14_ = value;
+        return this;
+      }
+      public Builder ClearField14() {
+        PrepareBuilder();
+        result.hasField14 = false;
+        result.field14_ = true;
+        return this;
+      }
+      
+      public bool HasField104 {
+        get { return result.hasField104; }
+      }
+      public int Field104 {
+        get { return result.Field104; }
+        set { SetField104(value); }
+      }
+      public Builder SetField104(int value) {
+        PrepareBuilder();
+        result.hasField104 = true;
+        result.field104_ = value;
+        return this;
+      }
+      public Builder ClearField104() {
+        PrepareBuilder();
+        result.hasField104 = false;
+        result.field104_ = 0;
+        return this;
+      }
+      
+      public bool HasField100 {
+        get { return result.hasField100; }
+      }
+      public int Field100 {
+        get { return result.Field100; }
+        set { SetField100(value); }
+      }
+      public Builder SetField100(int value) {
+        PrepareBuilder();
+        result.hasField100 = true;
+        result.field100_ = value;
+        return this;
+      }
+      public Builder ClearField100() {
+        PrepareBuilder();
+        result.hasField100 = false;
+        result.field100_ = 0;
+        return this;
+      }
+      
+      public bool HasField101 {
+        get { return result.hasField101; }
+      }
+      public int Field101 {
+        get { return result.Field101; }
+        set { SetField101(value); }
+      }
+      public Builder SetField101(int value) {
+        PrepareBuilder();
+        result.hasField101 = true;
+        result.field101_ = value;
+        return this;
+      }
+      public Builder ClearField101() {
+        PrepareBuilder();
+        result.hasField101 = false;
+        result.field101_ = 0;
+        return this;
+      }
+      
+      public bool HasField102 {
+        get { return result.hasField102; }
+      }
+      public string Field102 {
+        get { return result.Field102; }
+        set { SetField102(value); }
+      }
+      public Builder SetField102(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField102 = true;
+        result.field102_ = value;
+        return this;
+      }
+      public Builder ClearField102() {
+        PrepareBuilder();
+        result.hasField102 = false;
+        result.field102_ = "";
+        return this;
+      }
+      
+      public bool HasField103 {
+        get { return result.hasField103; }
+      }
+      public string Field103 {
+        get { return result.Field103; }
+        set { SetField103(value); }
+      }
+      public Builder SetField103(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField103 = true;
+        result.field103_ = value;
+        return this;
+      }
+      public Builder ClearField103() {
+        PrepareBuilder();
+        result.hasField103 = false;
+        result.field103_ = "";
+        return this;
+      }
+      
+      public bool HasField29 {
+        get { return result.hasField29; }
+      }
+      public int Field29 {
+        get { return result.Field29; }
+        set { SetField29(value); }
+      }
+      public Builder SetField29(int value) {
+        PrepareBuilder();
+        result.hasField29 = true;
+        result.field29_ = value;
+        return this;
+      }
+      public Builder ClearField29() {
+        PrepareBuilder();
+        result.hasField29 = false;
+        result.field29_ = 0;
+        return this;
+      }
+      
+      public bool HasField30 {
+        get { return result.hasField30; }
+      }
+      public bool Field30 {
+        get { return result.Field30; }
+        set { SetField30(value); }
+      }
+      public Builder SetField30(bool value) {
+        PrepareBuilder();
+        result.hasField30 = true;
+        result.field30_ = value;
+        return this;
+      }
+      public Builder ClearField30() {
+        PrepareBuilder();
+        result.hasField30 = false;
+        result.field30_ = false;
+        return this;
+      }
+      
+      public bool HasField60 {
+        get { return result.hasField60; }
+      }
+      public int Field60 {
+        get { return result.Field60; }
+        set { SetField60(value); }
+      }
+      public Builder SetField60(int value) {
+        PrepareBuilder();
+        result.hasField60 = true;
+        result.field60_ = value;
+        return this;
+      }
+      public Builder ClearField60() {
+        PrepareBuilder();
+        result.hasField60 = false;
+        result.field60_ = -1;
+        return this;
+      }
+      
+      public bool HasField271 {
+        get { return result.hasField271; }
+      }
+      public int Field271 {
+        get { return result.Field271; }
+        set { SetField271(value); }
+      }
+      public Builder SetField271(int value) {
+        PrepareBuilder();
+        result.hasField271 = true;
+        result.field271_ = value;
+        return this;
+      }
+      public Builder ClearField271() {
+        PrepareBuilder();
+        result.hasField271 = false;
+        result.field271_ = -1;
+        return this;
+      }
+      
+      public bool HasField272 {
+        get { return result.hasField272; }
+      }
+      public int Field272 {
+        get { return result.Field272; }
+        set { SetField272(value); }
+      }
+      public Builder SetField272(int value) {
+        PrepareBuilder();
+        result.hasField272 = true;
+        result.field272_ = value;
+        return this;
+      }
+      public Builder ClearField272() {
+        PrepareBuilder();
+        result.hasField272 = false;
+        result.field272_ = -1;
+        return this;
+      }
+      
+      public bool HasField150 {
+        get { return result.hasField150; }
+      }
+      public int Field150 {
+        get { return result.Field150; }
+        set { SetField150(value); }
+      }
+      public Builder SetField150(int value) {
+        PrepareBuilder();
+        result.hasField150 = true;
+        result.field150_ = value;
+        return this;
+      }
+      public Builder ClearField150() {
+        PrepareBuilder();
+        result.hasField150 = false;
+        result.field150_ = 0;
+        return this;
+      }
+      
+      public bool HasField23 {
+        get { return result.hasField23; }
+      }
+      public int Field23 {
+        get { return result.Field23; }
+        set { SetField23(value); }
+      }
+      public Builder SetField23(int value) {
+        PrepareBuilder();
+        result.hasField23 = true;
+        result.field23_ = value;
+        return this;
+      }
+      public Builder ClearField23() {
+        PrepareBuilder();
+        result.hasField23 = false;
+        result.field23_ = 0;
+        return this;
+      }
+      
+      public bool HasField24 {
+        get { return result.hasField24; }
+      }
+      public bool Field24 {
+        get { return result.Field24; }
+        set { SetField24(value); }
+      }
+      public Builder SetField24(bool value) {
+        PrepareBuilder();
+        result.hasField24 = true;
+        result.field24_ = value;
+        return this;
+      }
+      public Builder ClearField24() {
+        PrepareBuilder();
+        result.hasField24 = false;
+        result.field24_ = false;
+        return this;
+      }
+      
+      public bool HasField25 {
+        get { return result.hasField25; }
+      }
+      public int Field25 {
+        get { return result.Field25; }
+        set { SetField25(value); }
+      }
+      public Builder SetField25(int value) {
+        PrepareBuilder();
+        result.hasField25 = true;
+        result.field25_ = value;
+        return this;
+      }
+      public Builder ClearField25() {
+        PrepareBuilder();
+        result.hasField25 = false;
+        result.field25_ = 0;
+        return this;
+      }
+      
+      public bool HasField15 {
+       get { return result.hasField15; }
+      }
+      public global::Google.ProtocolBuffers.ProtoBench.SpeedMessage1SubMessage Field15 {
+        get { return result.Field15; }
+        set { SetField15(value); }
+      }
+      public Builder SetField15(global::Google.ProtocolBuffers.ProtoBench.SpeedMessage1SubMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField15 = true;
+        result.field15_ = value;
+        return this;
+      }
+      public Builder SetField15(global::Google.ProtocolBuffers.ProtoBench.SpeedMessage1SubMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasField15 = true;
+        result.field15_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeField15(global::Google.ProtocolBuffers.ProtoBench.SpeedMessage1SubMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasField15 &&
+            result.field15_ != global::Google.ProtocolBuffers.ProtoBench.SpeedMessage1SubMessage.DefaultInstance) {
+            result.field15_ = global::Google.ProtocolBuffers.ProtoBench.SpeedMessage1SubMessage.CreateBuilder(result.field15_).MergeFrom(value).BuildPartial();
+        } else {
+          result.field15_ = value;
+        }
+        result.hasField15 = true;
+        return this;
+      }
+      public Builder ClearField15() {
+        PrepareBuilder();
+        result.hasField15 = false;
+        result.field15_ = null;
+        return this;
+      }
+      
+      public bool HasField78 {
+        get { return result.hasField78; }
+      }
+      public bool Field78 {
+        get { return result.Field78; }
+        set { SetField78(value); }
+      }
+      public Builder SetField78(bool value) {
+        PrepareBuilder();
+        result.hasField78 = true;
+        result.field78_ = value;
+        return this;
+      }
+      public Builder ClearField78() {
+        PrepareBuilder();
+        result.hasField78 = false;
+        result.field78_ = false;
+        return this;
+      }
+      
+      public bool HasField67 {
+        get { return result.hasField67; }
+      }
+      public int Field67 {
+        get { return result.Field67; }
+        set { SetField67(value); }
+      }
+      public Builder SetField67(int value) {
+        PrepareBuilder();
+        result.hasField67 = true;
+        result.field67_ = value;
+        return this;
+      }
+      public Builder ClearField67() {
+        PrepareBuilder();
+        result.hasField67 = false;
+        result.field67_ = 0;
+        return this;
+      }
+      
+      public bool HasField68 {
+        get { return result.hasField68; }
+      }
+      public int Field68 {
+        get { return result.Field68; }
+        set { SetField68(value); }
+      }
+      public Builder SetField68(int value) {
+        PrepareBuilder();
+        result.hasField68 = true;
+        result.field68_ = value;
+        return this;
+      }
+      public Builder ClearField68() {
+        PrepareBuilder();
+        result.hasField68 = false;
+        result.field68_ = 0;
+        return this;
+      }
+      
+      public bool HasField128 {
+        get { return result.hasField128; }
+      }
+      public int Field128 {
+        get { return result.Field128; }
+        set { SetField128(value); }
+      }
+      public Builder SetField128(int value) {
+        PrepareBuilder();
+        result.hasField128 = true;
+        result.field128_ = value;
+        return this;
+      }
+      public Builder ClearField128() {
+        PrepareBuilder();
+        result.hasField128 = false;
+        result.field128_ = 0;
+        return this;
+      }
+      
+      public bool HasField129 {
+        get { return result.hasField129; }
+      }
+      public string Field129 {
+        get { return result.Field129; }
+        set { SetField129(value); }
+      }
+      public Builder SetField129(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField129 = true;
+        result.field129_ = value;
+        return this;
+      }
+      public Builder ClearField129() {
+        PrepareBuilder();
+        result.hasField129 = false;
+        result.field129_ = "xxxxxxxxxxxxxxxxxxxxx";
+        return this;
+      }
+      
+      public bool HasField131 {
+        get { return result.hasField131; }
+      }
+      public int Field131 {
+        get { return result.Field131; }
+        set { SetField131(value); }
+      }
+      public Builder SetField131(int value) {
+        PrepareBuilder();
+        result.hasField131 = true;
+        result.field131_ = value;
+        return this;
+      }
+      public Builder ClearField131() {
+        PrepareBuilder();
+        result.hasField131 = false;
+        result.field131_ = 0;
+        return this;
+      }
+    }
+    static SpeedMessage1() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.ProtoBench.GoogleSpeedProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class SpeedMessage1SubMessage : pb::GeneratedMessage<SpeedMessage1SubMessage, SpeedMessage1SubMessage.Builder> {
+    private SpeedMessage1SubMessage() { }
+    private static readonly SpeedMessage1SubMessage defaultInstance = new SpeedMessage1SubMessage().MakeReadOnly();
+    private static readonly string[] _speedMessage1SubMessageFieldNames = new string[] { "field1", "field12", "field13", "field14", "field15", "field16", "field19", "field2", "field20", "field203", "field204", "field205", "field206", "field207", "field21", "field22", "field23", "field28", "field3", "field300" };
+    private static readonly uint[] _speedMessage1SubMessageFieldTags = new uint[] { 8, 96, 104, 112, 122, 128, 152, 16, 160, 1629, 1632, 1642, 1648, 1656, 169, 176, 184, 224, 24, 2400 };
+    public static SpeedMessage1SubMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override SpeedMessage1SubMessage DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override SpeedMessage1SubMessage ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.ProtoBench.GoogleSpeedProtoFile.internal__static_benchmarks_SpeedMessage1SubMessage__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<SpeedMessage1SubMessage, SpeedMessage1SubMessage.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.ProtoBench.GoogleSpeedProtoFile.internal__static_benchmarks_SpeedMessage1SubMessage__FieldAccessorTable; }
+    }
+    
+    public const int Field1FieldNumber = 1;
+    private bool hasField1;
+    private int field1_;
+    public bool HasField1 {
+      get { return hasField1; }
+    }
+    public int Field1 {
+      get { return field1_; }
+    }
+    
+    public const int Field2FieldNumber = 2;
+    private bool hasField2;
+    private int field2_;
+    public bool HasField2 {
+      get { return hasField2; }
+    }
+    public int Field2 {
+      get { return field2_; }
+    }
+    
+    public const int Field3FieldNumber = 3;
+    private bool hasField3;
+    private int field3_;
+    public bool HasField3 {
+      get { return hasField3; }
+    }
+    public int Field3 {
+      get { return field3_; }
+    }
+    
+    public const int Field15FieldNumber = 15;
+    private bool hasField15;
+    private string field15_ = "";
+    public bool HasField15 {
+      get { return hasField15; }
+    }
+    public string Field15 {
+      get { return field15_; }
+    }
+    
+    public const int Field12FieldNumber = 12;
+    private bool hasField12;
+    private bool field12_ = true;
+    public bool HasField12 {
+      get { return hasField12; }
+    }
+    public bool Field12 {
+      get { return field12_; }
+    }
+    
+    public const int Field13FieldNumber = 13;
+    private bool hasField13;
+    private long field13_;
+    public bool HasField13 {
+      get { return hasField13; }
+    }
+    public long Field13 {
+      get { return field13_; }
+    }
+    
+    public const int Field14FieldNumber = 14;
+    private bool hasField14;
+    private long field14_;
+    public bool HasField14 {
+      get { return hasField14; }
+    }
+    public long Field14 {
+      get { return field14_; }
+    }
+    
+    public const int Field16FieldNumber = 16;
+    private bool hasField16;
+    private int field16_;
+    public bool HasField16 {
+      get { return hasField16; }
+    }
+    public int Field16 {
+      get { return field16_; }
+    }
+    
+    public const int Field19FieldNumber = 19;
+    private bool hasField19;
+    private int field19_ = 2;
+    public bool HasField19 {
+      get { return hasField19; }
+    }
+    public int Field19 {
+      get { return field19_; }
+    }
+    
+    public const int Field20FieldNumber = 20;
+    private bool hasField20;
+    private bool field20_ = true;
+    public bool HasField20 {
+      get { return hasField20; }
+    }
+    public bool Field20 {
+      get { return field20_; }
+    }
+    
+    public const int Field28FieldNumber = 28;
+    private bool hasField28;
+    private bool field28_ = true;
+    public bool HasField28 {
+      get { return hasField28; }
+    }
+    public bool Field28 {
+      get { return field28_; }
+    }
+    
+    public const int Field21FieldNumber = 21;
+    private bool hasField21;
+    private ulong field21_;
+    public bool HasField21 {
+      get { return hasField21; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong Field21 {
+      get { return field21_; }
+    }
+    
+    public const int Field22FieldNumber = 22;
+    private bool hasField22;
+    private int field22_;
+    public bool HasField22 {
+      get { return hasField22; }
+    }
+    public int Field22 {
+      get { return field22_; }
+    }
+    
+    public const int Field23FieldNumber = 23;
+    private bool hasField23;
+    private bool field23_;
+    public bool HasField23 {
+      get { return hasField23; }
+    }
+    public bool Field23 {
+      get { return field23_; }
+    }
+    
+    public const int Field206FieldNumber = 206;
+    private bool hasField206;
+    private bool field206_;
+    public bool HasField206 {
+      get { return hasField206; }
+    }
+    public bool Field206 {
+      get { return field206_; }
+    }
+    
+    public const int Field203FieldNumber = 203;
+    private bool hasField203;
+    private uint field203_;
+    public bool HasField203 {
+      get { return hasField203; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint Field203 {
+      get { return field203_; }
+    }
+    
+    public const int Field204FieldNumber = 204;
+    private bool hasField204;
+    private int field204_;
+    public bool HasField204 {
+      get { return hasField204; }
+    }
+    public int Field204 {
+      get { return field204_; }
+    }
+    
+    public const int Field205FieldNumber = 205;
+    private bool hasField205;
+    private string field205_ = "";
+    public bool HasField205 {
+      get { return hasField205; }
+    }
+    public string Field205 {
+      get { return field205_; }
+    }
+    
+    public const int Field207FieldNumber = 207;
+    private bool hasField207;
+    private ulong field207_;
+    public bool HasField207 {
+      get { return hasField207; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong Field207 {
+      get { return field207_; }
+    }
+    
+    public const int Field300FieldNumber = 300;
+    private bool hasField300;
+    private ulong field300_;
+    public bool HasField300 {
+      get { return hasField300; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong Field300 {
+      get { return field300_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _speedMessage1SubMessageFieldNames;
+      if (hasField1) {
+        output.WriteInt32(1, field_names[0], Field1);
+      }
+      if (hasField2) {
+        output.WriteInt32(2, field_names[7], Field2);
+      }
+      if (hasField3) {
+        output.WriteInt32(3, field_names[18], Field3);
+      }
+      if (hasField12) {
+        output.WriteBool(12, field_names[1], Field12);
+      }
+      if (hasField13) {
+        output.WriteInt64(13, field_names[2], Field13);
+      }
+      if (hasField14) {
+        output.WriteInt64(14, field_names[3], Field14);
+      }
+      if (hasField15) {
+        output.WriteString(15, field_names[4], Field15);
+      }
+      if (hasField16) {
+        output.WriteInt32(16, field_names[5], Field16);
+      }
+      if (hasField19) {
+        output.WriteInt32(19, field_names[6], Field19);
+      }
+      if (hasField20) {
+        output.WriteBool(20, field_names[8], Field20);
+      }
+      if (hasField21) {
+        output.WriteFixed64(21, field_names[14], Field21);
+      }
+      if (hasField22) {
+        output.WriteInt32(22, field_names[15], Field22);
+      }
+      if (hasField23) {
+        output.WriteBool(23, field_names[16], Field23);
+      }
+      if (hasField28) {
+        output.WriteBool(28, field_names[17], Field28);
+      }
+      if (hasField203) {
+        output.WriteFixed32(203, field_names[9], Field203);
+      }
+      if (hasField204) {
+        output.WriteInt32(204, field_names[10], Field204);
+      }
+      if (hasField205) {
+        output.WriteString(205, field_names[11], Field205);
+      }
+      if (hasField206) {
+        output.WriteBool(206, field_names[12], Field206);
+      }
+      if (hasField207) {
+        output.WriteUInt64(207, field_names[13], Field207);
+      }
+      if (hasField300) {
+        output.WriteUInt64(300, field_names[19], Field300);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+      
+      size = 0;
+      if (hasField1) {
+        size += pb::CodedOutputStream.ComputeInt32Size(1, Field1);
+      }
+      if (hasField2) {
+        size += pb::CodedOutputStream.ComputeInt32Size(2, Field2);
+      }
+      if (hasField3) {
+        size += pb::CodedOutputStream.ComputeInt32Size(3, Field3);
+      }
+      if (hasField15) {
+        size += pb::CodedOutputStream.ComputeStringSize(15, Field15);
+      }
+      if (hasField12) {
+        size += pb::CodedOutputStream.ComputeBoolSize(12, Field12);
+      }
+      if (hasField13) {
+        size += pb::CodedOutputStream.ComputeInt64Size(13, Field13);
+      }
+      if (hasField14) {
+        size += pb::CodedOutputStream.ComputeInt64Size(14, Field14);
+      }
+      if (hasField16) {
+        size += pb::CodedOutputStream.ComputeInt32Size(16, Field16);
+      }
+      if (hasField19) {
+        size += pb::CodedOutputStream.ComputeInt32Size(19, Field19);
+      }
+      if (hasField20) {
+        size += pb::CodedOutputStream.ComputeBoolSize(20, Field20);
+      }
+      if (hasField28) {
+        size += pb::CodedOutputStream.ComputeBoolSize(28, Field28);
+      }
+      if (hasField21) {
+        size += pb::CodedOutputStream.ComputeFixed64Size(21, Field21);
+      }
+      if (hasField22) {
+        size += pb::CodedOutputStream.ComputeInt32Size(22, Field22);
+      }
+      if (hasField23) {
+        size += pb::CodedOutputStream.ComputeBoolSize(23, Field23);
+      }
+      if (hasField206) {
+        size += pb::CodedOutputStream.ComputeBoolSize(206, Field206);
+      }
+      if (hasField203) {
+        size += pb::CodedOutputStream.ComputeFixed32Size(203, Field203);
+      }
+      if (hasField204) {
+        size += pb::CodedOutputStream.ComputeInt32Size(204, Field204);
+      }
+      if (hasField205) {
+        size += pb::CodedOutputStream.ComputeStringSize(205, Field205);
+      }
+      if (hasField207) {
+        size += pb::CodedOutputStream.ComputeUInt64Size(207, Field207);
+      }
+      if (hasField300) {
+        size += pb::CodedOutputStream.ComputeUInt64Size(300, Field300);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static SpeedMessage1SubMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SpeedMessage1SubMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage1SubMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SpeedMessage1SubMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage1SubMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SpeedMessage1SubMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage1SubMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static SpeedMessage1SubMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static SpeedMessage1SubMessage ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SpeedMessage1SubMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private SpeedMessage1SubMessage MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(SpeedMessage1SubMessage prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<SpeedMessage1SubMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(SpeedMessage1SubMessage cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private SpeedMessage1SubMessage result;
+      
+      private SpeedMessage1SubMessage PrepareBuilder() {
+        if (resultIsReadOnly) {
+          SpeedMessage1SubMessage original = result;
+          result = new SpeedMessage1SubMessage();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override SpeedMessage1SubMessage MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.ProtoBench.SpeedMessage1SubMessage.Descriptor; }
+      }
+      
+      public override SpeedMessage1SubMessage DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.ProtoBench.SpeedMessage1SubMessage.DefaultInstance; }
+      }
+      
+      public override SpeedMessage1SubMessage BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is SpeedMessage1SubMessage) {
+          return MergeFrom((SpeedMessage1SubMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(SpeedMessage1SubMessage other) {
+        if (other == global::Google.ProtocolBuffers.ProtoBench.SpeedMessage1SubMessage.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasField1) {
+          Field1 = other.Field1;
+        }
+        if (other.HasField2) {
+          Field2 = other.Field2;
+        }
+        if (other.HasField3) {
+          Field3 = other.Field3;
+        }
+        if (other.HasField15) {
+          Field15 = other.Field15;
+        }
+        if (other.HasField12) {
+          Field12 = other.Field12;
+        }
+        if (other.HasField13) {
+          Field13 = other.Field13;
+        }
+        if (other.HasField14) {
+          Field14 = other.Field14;
+        }
+        if (other.HasField16) {
+          Field16 = other.Field16;
+        }
+        if (other.HasField19) {
+          Field19 = other.Field19;
+        }
+        if (other.HasField20) {
+          Field20 = other.Field20;
+        }
+        if (other.HasField28) {
+          Field28 = other.Field28;
+        }
+        if (other.HasField21) {
+          Field21 = other.Field21;
+        }
+        if (other.HasField22) {
+          Field22 = other.Field22;
+        }
+        if (other.HasField23) {
+          Field23 = other.Field23;
+        }
+        if (other.HasField206) {
+          Field206 = other.Field206;
+        }
+        if (other.HasField203) {
+          Field203 = other.Field203;
+        }
+        if (other.HasField204) {
+          Field204 = other.Field204;
+        }
+        if (other.HasField205) {
+          Field205 = other.Field205;
+        }
+        if (other.HasField207) {
+          Field207 = other.Field207;
+        }
+        if (other.HasField300) {
+          Field300 = other.Field300;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_speedMessage1SubMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _speedMessage1SubMessageFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasField1 = input.ReadInt32(ref result.field1_);
+              break;
+            }
+            case 16: {
+              result.hasField2 = input.ReadInt32(ref result.field2_);
+              break;
+            }
+            case 24: {
+              result.hasField3 = input.ReadInt32(ref result.field3_);
+              break;
+            }
+            case 96: {
+              result.hasField12 = input.ReadBool(ref result.field12_);
+              break;
+            }
+            case 104: {
+              result.hasField13 = input.ReadInt64(ref result.field13_);
+              break;
+            }
+            case 112: {
+              result.hasField14 = input.ReadInt64(ref result.field14_);
+              break;
+            }
+            case 122: {
+              result.hasField15 = input.ReadString(ref result.field15_);
+              break;
+            }
+            case 128: {
+              result.hasField16 = input.ReadInt32(ref result.field16_);
+              break;
+            }
+            case 152: {
+              result.hasField19 = input.ReadInt32(ref result.field19_);
+              break;
+            }
+            case 160: {
+              result.hasField20 = input.ReadBool(ref result.field20_);
+              break;
+            }
+            case 169: {
+              result.hasField21 = input.ReadFixed64(ref result.field21_);
+              break;
+            }
+            case 176: {
+              result.hasField22 = input.ReadInt32(ref result.field22_);
+              break;
+            }
+            case 184: {
+              result.hasField23 = input.ReadBool(ref result.field23_);
+              break;
+            }
+            case 224: {
+              result.hasField28 = input.ReadBool(ref result.field28_);
+              break;
+            }
+            case 1629: {
+              result.hasField203 = input.ReadFixed32(ref result.field203_);
+              break;
+            }
+            case 1632: {
+              result.hasField204 = input.ReadInt32(ref result.field204_);
+              break;
+            }
+            case 1642: {
+              result.hasField205 = input.ReadString(ref result.field205_);
+              break;
+            }
+            case 1648: {
+              result.hasField206 = input.ReadBool(ref result.field206_);
+              break;
+            }
+            case 1656: {
+              result.hasField207 = input.ReadUInt64(ref result.field207_);
+              break;
+            }
+            case 2400: {
+              result.hasField300 = input.ReadUInt64(ref result.field300_);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public bool HasField1 {
+        get { return result.hasField1; }
+      }
+      public int Field1 {
+        get { return result.Field1; }
+        set { SetField1(value); }
+      }
+      public Builder SetField1(int value) {
+        PrepareBuilder();
+        result.hasField1 = true;
+        result.field1_ = value;
+        return this;
+      }
+      public Builder ClearField1() {
+        PrepareBuilder();
+        result.hasField1 = false;
+        result.field1_ = 0;
+        return this;
+      }
+      
+      public bool HasField2 {
+        get { return result.hasField2; }
+      }
+      public int Field2 {
+        get { return result.Field2; }
+        set { SetField2(value); }
+      }
+      public Builder SetField2(int value) {
+        PrepareBuilder();
+        result.hasField2 = true;
+        result.field2_ = value;
+        return this;
+      }
+      public Builder ClearField2() {
+        PrepareBuilder();
+        result.hasField2 = false;
+        result.field2_ = 0;
+        return this;
+      }
+      
+      public bool HasField3 {
+        get { return result.hasField3; }
+      }
+      public int Field3 {
+        get { return result.Field3; }
+        set { SetField3(value); }
+      }
+      public Builder SetField3(int value) {
+        PrepareBuilder();
+        result.hasField3 = true;
+        result.field3_ = value;
+        return this;
+      }
+      public Builder ClearField3() {
+        PrepareBuilder();
+        result.hasField3 = false;
+        result.field3_ = 0;
+        return this;
+      }
+      
+      public bool HasField15 {
+        get { return result.hasField15; }
+      }
+      public string Field15 {
+        get { return result.Field15; }
+        set { SetField15(value); }
+      }
+      public Builder SetField15(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField15 = true;
+        result.field15_ = value;
+        return this;
+      }
+      public Builder ClearField15() {
+        PrepareBuilder();
+        result.hasField15 = false;
+        result.field15_ = "";
+        return this;
+      }
+      
+      public bool HasField12 {
+        get { return result.hasField12; }
+      }
+      public bool Field12 {
+        get { return result.Field12; }
+        set { SetField12(value); }
+      }
+      public Builder SetField12(bool value) {
+        PrepareBuilder();
+        result.hasField12 = true;
+        result.field12_ = value;
+        return this;
+      }
+      public Builder ClearField12() {
+        PrepareBuilder();
+        result.hasField12 = false;
+        result.field12_ = true;
+        return this;
+      }
+      
+      public bool HasField13 {
+        get { return result.hasField13; }
+      }
+      public long Field13 {
+        get { return result.Field13; }
+        set { SetField13(value); }
+      }
+      public Builder SetField13(long value) {
+        PrepareBuilder();
+        result.hasField13 = true;
+        result.field13_ = value;
+        return this;
+      }
+      public Builder ClearField13() {
+        PrepareBuilder();
+        result.hasField13 = false;
+        result.field13_ = 0L;
+        return this;
+      }
+      
+      public bool HasField14 {
+        get { return result.hasField14; }
+      }
+      public long Field14 {
+        get { return result.Field14; }
+        set { SetField14(value); }
+      }
+      public Builder SetField14(long value) {
+        PrepareBuilder();
+        result.hasField14 = true;
+        result.field14_ = value;
+        return this;
+      }
+      public Builder ClearField14() {
+        PrepareBuilder();
+        result.hasField14 = false;
+        result.field14_ = 0L;
+        return this;
+      }
+      
+      public bool HasField16 {
+        get { return result.hasField16; }
+      }
+      public int Field16 {
+        get { return result.Field16; }
+        set { SetField16(value); }
+      }
+      public Builder SetField16(int value) {
+        PrepareBuilder();
+        result.hasField16 = true;
+        result.field16_ = value;
+        return this;
+      }
+      public Builder ClearField16() {
+        PrepareBuilder();
+        result.hasField16 = false;
+        result.field16_ = 0;
+        return this;
+      }
+      
+      public bool HasField19 {
+        get { return result.hasField19; }
+      }
+      public int Field19 {
+        get { return result.Field19; }
+        set { SetField19(value); }
+      }
+      public Builder SetField19(int value) {
+        PrepareBuilder();
+        result.hasField19 = true;
+        result.field19_ = value;
+        return this;
+      }
+      public Builder ClearField19() {
+        PrepareBuilder();
+        result.hasField19 = false;
+        result.field19_ = 2;
+        return this;
+      }
+      
+      public bool HasField20 {
+        get { return result.hasField20; }
+      }
+      public bool Field20 {
+        get { return result.Field20; }
+        set { SetField20(value); }
+      }
+      public Builder SetField20(bool value) {
+        PrepareBuilder();
+        result.hasField20 = true;
+        result.field20_ = value;
+        return this;
+      }
+      public Builder ClearField20() {
+        PrepareBuilder();
+        result.hasField20 = false;
+        result.field20_ = true;
+        return this;
+      }
+      
+      public bool HasField28 {
+        get { return result.hasField28; }
+      }
+      public bool Field28 {
+        get { return result.Field28; }
+        set { SetField28(value); }
+      }
+      public Builder SetField28(bool value) {
+        PrepareBuilder();
+        result.hasField28 = true;
+        result.field28_ = value;
+        return this;
+      }
+      public Builder ClearField28() {
+        PrepareBuilder();
+        result.hasField28 = false;
+        result.field28_ = true;
+        return this;
+      }
+      
+      public bool HasField21 {
+        get { return result.hasField21; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong Field21 {
+        get { return result.Field21; }
+        set { SetField21(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetField21(ulong value) {
+        PrepareBuilder();
+        result.hasField21 = true;
+        result.field21_ = value;
+        return this;
+      }
+      public Builder ClearField21() {
+        PrepareBuilder();
+        result.hasField21 = false;
+        result.field21_ = 0;
+        return this;
+      }
+      
+      public bool HasField22 {
+        get { return result.hasField22; }
+      }
+      public int Field22 {
+        get { return result.Field22; }
+        set { SetField22(value); }
+      }
+      public Builder SetField22(int value) {
+        PrepareBuilder();
+        result.hasField22 = true;
+        result.field22_ = value;
+        return this;
+      }
+      public Builder ClearField22() {
+        PrepareBuilder();
+        result.hasField22 = false;
+        result.field22_ = 0;
+        return this;
+      }
+      
+      public bool HasField23 {
+        get { return result.hasField23; }
+      }
+      public bool Field23 {
+        get { return result.Field23; }
+        set { SetField23(value); }
+      }
+      public Builder SetField23(bool value) {
+        PrepareBuilder();
+        result.hasField23 = true;
+        result.field23_ = value;
+        return this;
+      }
+      public Builder ClearField23() {
+        PrepareBuilder();
+        result.hasField23 = false;
+        result.field23_ = false;
+        return this;
+      }
+      
+      public bool HasField206 {
+        get { return result.hasField206; }
+      }
+      public bool Field206 {
+        get { return result.Field206; }
+        set { SetField206(value); }
+      }
+      public Builder SetField206(bool value) {
+        PrepareBuilder();
+        result.hasField206 = true;
+        result.field206_ = value;
+        return this;
+      }
+      public Builder ClearField206() {
+        PrepareBuilder();
+        result.hasField206 = false;
+        result.field206_ = false;
+        return this;
+      }
+      
+      public bool HasField203 {
+        get { return result.hasField203; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint Field203 {
+        get { return result.Field203; }
+        set { SetField203(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetField203(uint value) {
+        PrepareBuilder();
+        result.hasField203 = true;
+        result.field203_ = value;
+        return this;
+      }
+      public Builder ClearField203() {
+        PrepareBuilder();
+        result.hasField203 = false;
+        result.field203_ = 0;
+        return this;
+      }
+      
+      public bool HasField204 {
+        get { return result.hasField204; }
+      }
+      public int Field204 {
+        get { return result.Field204; }
+        set { SetField204(value); }
+      }
+      public Builder SetField204(int value) {
+        PrepareBuilder();
+        result.hasField204 = true;
+        result.field204_ = value;
+        return this;
+      }
+      public Builder ClearField204() {
+        PrepareBuilder();
+        result.hasField204 = false;
+        result.field204_ = 0;
+        return this;
+      }
+      
+      public bool HasField205 {
+        get { return result.hasField205; }
+      }
+      public string Field205 {
+        get { return result.Field205; }
+        set { SetField205(value); }
+      }
+      public Builder SetField205(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField205 = true;
+        result.field205_ = value;
+        return this;
+      }
+      public Builder ClearField205() {
+        PrepareBuilder();
+        result.hasField205 = false;
+        result.field205_ = "";
+        return this;
+      }
+      
+      public bool HasField207 {
+        get { return result.hasField207; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong Field207 {
+        get { return result.Field207; }
+        set { SetField207(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetField207(ulong value) {
+        PrepareBuilder();
+        result.hasField207 = true;
+        result.field207_ = value;
+        return this;
+      }
+      public Builder ClearField207() {
+        PrepareBuilder();
+        result.hasField207 = false;
+        result.field207_ = 0UL;
+        return this;
+      }
+      
+      public bool HasField300 {
+        get { return result.hasField300; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong Field300 {
+        get { return result.Field300; }
+        set { SetField300(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetField300(ulong value) {
+        PrepareBuilder();
+        result.hasField300 = true;
+        result.field300_ = value;
+        return this;
+      }
+      public Builder ClearField300() {
+        PrepareBuilder();
+        result.hasField300 = false;
+        result.field300_ = 0UL;
+        return this;
+      }
+    }
+    static SpeedMessage1SubMessage() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.ProtoBench.GoogleSpeedProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class SpeedMessage2 : pb::GeneratedMessage<SpeedMessage2, SpeedMessage2.Builder> {
+    private SpeedMessage2() { }
+    private static readonly SpeedMessage2 defaultInstance = new SpeedMessage2().MakeReadOnly();
+    private static readonly string[] _speedMessage2FieldNames = new string[] { "field1", "field109", "field127", "field128", "field129", "field130", "field131", "field2", "field205", "field206", "field21", "field210", "field211", "field212", "field213", "field216", "field217", "field218", "field220", "field221", "field222", "field25", "field3", "field30", "field4", "field6", "field63", "field71", "field75", "group1" };
+    private static readonly uint[] _speedMessage2FieldTags = new uint[] { 10, 872, 1018, 1026, 1032, 1040, 1048, 18, 1640, 1648, 168, 1680, 1688, 1696, 1704, 1728, 1736, 1744, 1760, 1768, 1781, 205, 24, 240, 32, 50, 504, 568, 600, 83 };
+    public static SpeedMessage2 DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override SpeedMessage2 DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override SpeedMessage2 ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.ProtoBench.GoogleSpeedProtoFile.internal__static_benchmarks_SpeedMessage2__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<SpeedMessage2, SpeedMessage2.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.ProtoBench.GoogleSpeedProtoFile.internal__static_benchmarks_SpeedMessage2__FieldAccessorTable; }
+    }
+    
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public static partial class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class Group1 : pb::GeneratedMessage<Group1, Group1.Builder> {
+        private Group1() { }
+        private static readonly Group1 defaultInstance = new Group1().MakeReadOnly();
+        private static readonly string[] _group1FieldNames = new string[] { "field11", "field12", "field13", "field14", "field15", "field16", "field20", "field22", "field24", "field26", "field27", "field28", "field29", "field31", "field5", "field73" };
+        private static readonly uint[] _group1FieldTags = new uint[] { 93, 98, 106, 114, 120, 130, 160, 178, 194, 213, 218, 224, 234, 250, 40, 584 };
+        public static Group1 DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override Group1 DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+        
+        protected override Group1 ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.ProtoBench.GoogleSpeedProtoFile.internal__static_benchmarks_SpeedMessage2_Group1__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<Group1, Group1.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.ProtoBench.GoogleSpeedProtoFile.internal__static_benchmarks_SpeedMessage2_Group1__FieldAccessorTable; }
+        }
+        
+        public const int Field11FieldNumber = 11;
+        private bool hasField11;
+        private float field11_;
+        public bool HasField11 {
+          get { return hasField11; }
+        }
+        public float Field11 {
+          get { return field11_; }
+        }
+        
+        public const int Field26FieldNumber = 26;
+        private bool hasField26;
+        private float field26_;
+        public bool HasField26 {
+          get { return hasField26; }
+        }
+        public float Field26 {
+          get { return field26_; }
+        }
+        
+        public const int Field12FieldNumber = 12;
+        private bool hasField12;
+        private string field12_ = "";
+        public bool HasField12 {
+          get { return hasField12; }
+        }
+        public string Field12 {
+          get { return field12_; }
+        }
+        
+        public const int Field13FieldNumber = 13;
+        private bool hasField13;
+        private string field13_ = "";
+        public bool HasField13 {
+          get { return hasField13; }
+        }
+        public string Field13 {
+          get { return field13_; }
+        }
+        
+        public const int Field14FieldNumber = 14;
+        private pbc::PopsicleList<string> field14_ = new pbc::PopsicleList<string>();
+        public scg::IList<string> Field14List {
+          get { return pbc::Lists.AsReadOnly(field14_); }
+        }
+        public int Field14Count {
+          get { return field14_.Count; }
+        }
+        public string GetField14(int index) {
+          return field14_[index];
+        }
+        
+        public const int Field15FieldNumber = 15;
+        private bool hasField15;
+        private ulong field15_;
+        public bool HasField15 {
+          get { return hasField15; }
+        }
+        [global::System.CLSCompliant(false)]
+        public ulong Field15 {
+          get { return field15_; }
+        }
+        
+        public const int Field5FieldNumber = 5;
+        private bool hasField5;
+        private int field5_;
+        public bool HasField5 {
+          get { return hasField5; }
+        }
+        public int Field5 {
+          get { return field5_; }
+        }
+        
+        public const int Field27FieldNumber = 27;
+        private bool hasField27;
+        private string field27_ = "";
+        public bool HasField27 {
+          get { return hasField27; }
+        }
+        public string Field27 {
+          get { return field27_; }
+        }
+        
+        public const int Field28FieldNumber = 28;
+        private bool hasField28;
+        private int field28_;
+        public bool HasField28 {
+          get { return hasField28; }
+        }
+        public int Field28 {
+          get { return field28_; }
+        }
+        
+        public const int Field29FieldNumber = 29;
+        private bool hasField29;
+        private string field29_ = "";
+        public bool HasField29 {
+          get { return hasField29; }
+        }
+        public string Field29 {
+          get { return field29_; }
+        }
+        
+        public const int Field16FieldNumber = 16;
+        private bool hasField16;
+        private string field16_ = "";
+        public bool HasField16 {
+          get { return hasField16; }
+        }
+        public string Field16 {
+          get { return field16_; }
+        }
+        
+        public const int Field22FieldNumber = 22;
+        private pbc::PopsicleList<string> field22_ = new pbc::PopsicleList<string>();
+        public scg::IList<string> Field22List {
+          get { return pbc::Lists.AsReadOnly(field22_); }
+        }
+        public int Field22Count {
+          get { return field22_.Count; }
+        }
+        public string GetField22(int index) {
+          return field22_[index];
+        }
+        
+        public const int Field73FieldNumber = 73;
+        private pbc::PopsicleList<int> field73_ = new pbc::PopsicleList<int>();
+        public scg::IList<int> Field73List {
+          get { return pbc::Lists.AsReadOnly(field73_); }
+        }
+        public int Field73Count {
+          get { return field73_.Count; }
+        }
+        public int GetField73(int index) {
+          return field73_[index];
+        }
+        
+        public const int Field20FieldNumber = 20;
+        private bool hasField20;
+        private int field20_;
+        public bool HasField20 {
+          get { return hasField20; }
+        }
+        public int Field20 {
+          get { return field20_; }
+        }
+        
+        public const int Field24FieldNumber = 24;
+        private bool hasField24;
+        private string field24_ = "";
+        public bool HasField24 {
+          get { return hasField24; }
+        }
+        public string Field24 {
+          get { return field24_; }
+        }
+        
+        public const int Field31FieldNumber = 31;
+        private bool hasField31;
+        private global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2GroupedMessage field31_;
+        public bool HasField31 {
+          get { return hasField31; }
+        }
+        public global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2GroupedMessage Field31 {
+          get { return field31_ ?? global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2GroupedMessage.DefaultInstance; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasField11) return false;
+            if (!hasField15) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          CalcSerializedSize();
+          string[] field_names = _group1FieldNames;
+          if (hasField5) {
+            output.WriteInt32(5, field_names[14], Field5);
+          }
+          if (hasField11) {
+            output.WriteFloat(11, field_names[0], Field11);
+          }
+          if (hasField12) {
+            output.WriteString(12, field_names[1], Field12);
+          }
+          if (hasField13) {
+            output.WriteString(13, field_names[2], Field13);
+          }
+          if (field14_.Count > 0) {
+            output.WriteStringArray(14, field_names[3], field14_);
+          }
+          if (hasField15) {
+            output.WriteUInt64(15, field_names[4], Field15);
+          }
+          if (hasField16) {
+            output.WriteString(16, field_names[5], Field16);
+          }
+          if (hasField20) {
+            output.WriteInt32(20, field_names[6], Field20);
+          }
+          if (field22_.Count > 0) {
+            output.WriteStringArray(22, field_names[7], field22_);
+          }
+          if (hasField24) {
+            output.WriteString(24, field_names[8], Field24);
+          }
+          if (hasField26) {
+            output.WriteFloat(26, field_names[9], Field26);
+          }
+          if (hasField27) {
+            output.WriteString(27, field_names[10], Field27);
+          }
+          if (hasField28) {
+            output.WriteInt32(28, field_names[11], Field28);
+          }
+          if (hasField29) {
+            output.WriteString(29, field_names[12], Field29);
+          }
+          if (hasField31) {
+            output.WriteMessage(31, field_names[13], Field31);
+          }
+          if (field73_.Count > 0) {
+            output.WriteInt32Array(73, field_names[15], field73_);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            return CalcSerializedSize();
+          }
+        }
+        
+        private int CalcSerializedSize() {
+          int size = memoizedSerializedSize;
+          if (size != -1) return size;
+          
+          size = 0;
+          if (hasField11) {
+            size += pb::CodedOutputStream.ComputeFloatSize(11, Field11);
+          }
+          if (hasField26) {
+            size += pb::CodedOutputStream.ComputeFloatSize(26, Field26);
+          }
+          if (hasField12) {
+            size += pb::CodedOutputStream.ComputeStringSize(12, Field12);
+          }
+          if (hasField13) {
+            size += pb::CodedOutputStream.ComputeStringSize(13, Field13);
+          }
+          {
+            int dataSize = 0;
+            foreach (string element in Field14List) {
+              dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+            }
+            size += dataSize;
+            size += 1 * field14_.Count;
+          }
+          if (hasField15) {
+            size += pb::CodedOutputStream.ComputeUInt64Size(15, Field15);
+          }
+          if (hasField5) {
+            size += pb::CodedOutputStream.ComputeInt32Size(5, Field5);
+          }
+          if (hasField27) {
+            size += pb::CodedOutputStream.ComputeStringSize(27, Field27);
+          }
+          if (hasField28) {
+            size += pb::CodedOutputStream.ComputeInt32Size(28, Field28);
+          }
+          if (hasField29) {
+            size += pb::CodedOutputStream.ComputeStringSize(29, Field29);
+          }
+          if (hasField16) {
+            size += pb::CodedOutputStream.ComputeStringSize(16, Field16);
+          }
+          {
+            int dataSize = 0;
+            foreach (string element in Field22List) {
+              dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+            }
+            size += dataSize;
+            size += 2 * field22_.Count;
+          }
+          {
+            int dataSize = 0;
+            foreach (int element in Field73List) {
+              dataSize += pb::CodedOutputStream.ComputeInt32SizeNoTag(element);
+            }
+            size += dataSize;
+            size += 2 * field73_.Count;
+          }
+          if (hasField20) {
+            size += pb::CodedOutputStream.ComputeInt32Size(20, Field20);
+          }
+          if (hasField24) {
+            size += pb::CodedOutputStream.ComputeStringSize(24, Field24);
+          }
+          if (hasField31) {
+            size += pb::CodedOutputStream.ComputeMessageSize(31, Field31);
+          }
+          size += UnknownFields.SerializedSize;
+          memoizedSerializedSize = size;
+          return size;
+        }
+        public static Group1 ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static Group1 ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static Group1 ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static Group1 ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static Group1 ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static Group1 ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static Group1 ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static Group1 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static Group1 ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static Group1 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private Group1 MakeReadOnly() {
+          field14_.MakeReadOnly();
+          field22_.MakeReadOnly();
+          field73_.MakeReadOnly();
+          return this;
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(Group1 prototype) {
+          return new Builder(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public sealed partial class Builder : pb::GeneratedBuilder<Group1, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(Group1 cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+          
+          private bool resultIsReadOnly;
+          private Group1 result;
+          
+          private Group1 PrepareBuilder() {
+            if (resultIsReadOnly) {
+              Group1 original = result;
+              result = new Group1();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+          
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+          
+          protected override Group1 MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+          
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+          
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2.Types.Group1.Descriptor; }
+          }
+          
+          public override Group1 DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2.Types.Group1.DefaultInstance; }
+          }
+          
+          public override Group1 BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is Group1) {
+              return MergeFrom((Group1) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(Group1 other) {
+            if (other == global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2.Types.Group1.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasField11) {
+              Field11 = other.Field11;
+            }
+            if (other.HasField26) {
+              Field26 = other.Field26;
+            }
+            if (other.HasField12) {
+              Field12 = other.Field12;
+            }
+            if (other.HasField13) {
+              Field13 = other.Field13;
+            }
+            if (other.field14_.Count != 0) {
+              result.field14_.Add(other.field14_);
+            }
+            if (other.HasField15) {
+              Field15 = other.Field15;
+            }
+            if (other.HasField5) {
+              Field5 = other.Field5;
+            }
+            if (other.HasField27) {
+              Field27 = other.Field27;
+            }
+            if (other.HasField28) {
+              Field28 = other.Field28;
+            }
+            if (other.HasField29) {
+              Field29 = other.Field29;
+            }
+            if (other.HasField16) {
+              Field16 = other.Field16;
+            }
+            if (other.field22_.Count != 0) {
+              result.field22_.Add(other.field22_);
+            }
+            if (other.field73_.Count != 0) {
+              result.field73_.Add(other.field73_);
+            }
+            if (other.HasField20) {
+              Field20 = other.Field20;
+            }
+            if (other.HasField24) {
+              Field24 = other.Field24;
+            }
+            if (other.HasField31) {
+              MergeField31(other.Field31);
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_group1FieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _group1FieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 40: {
+                  result.hasField5 = input.ReadInt32(ref result.field5_);
+                  break;
+                }
+                case 93: {
+                  result.hasField11 = input.ReadFloat(ref result.field11_);
+                  break;
+                }
+                case 98: {
+                  result.hasField12 = input.ReadString(ref result.field12_);
+                  break;
+                }
+                case 106: {
+                  result.hasField13 = input.ReadString(ref result.field13_);
+                  break;
+                }
+                case 114: {
+                  input.ReadStringArray(tag, field_name, result.field14_);
+                  break;
+                }
+                case 120: {
+                  result.hasField15 = input.ReadUInt64(ref result.field15_);
+                  break;
+                }
+                case 130: {
+                  result.hasField16 = input.ReadString(ref result.field16_);
+                  break;
+                }
+                case 160: {
+                  result.hasField20 = input.ReadInt32(ref result.field20_);
+                  break;
+                }
+                case 178: {
+                  input.ReadStringArray(tag, field_name, result.field22_);
+                  break;
+                }
+                case 194: {
+                  result.hasField24 = input.ReadString(ref result.field24_);
+                  break;
+                }
+                case 213: {
+                  result.hasField26 = input.ReadFloat(ref result.field26_);
+                  break;
+                }
+                case 218: {
+                  result.hasField27 = input.ReadString(ref result.field27_);
+                  break;
+                }
+                case 224: {
+                  result.hasField28 = input.ReadInt32(ref result.field28_);
+                  break;
+                }
+                case 234: {
+                  result.hasField29 = input.ReadString(ref result.field29_);
+                  break;
+                }
+                case 250: {
+                  global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2GroupedMessage.Builder subBuilder = global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2GroupedMessage.CreateBuilder();
+                  if (result.hasField31) {
+                    subBuilder.MergeFrom(Field31);
+                  }
+                  input.ReadMessage(subBuilder, extensionRegistry);
+                  Field31 = subBuilder.BuildPartial();
+                  break;
+                }
+                case 586:
+                case 584: {
+                  input.ReadInt32Array(tag, field_name, result.field73_);
+                  break;
+                }
+              }
+            }
+            
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+          
+          
+          public bool HasField11 {
+            get { return result.hasField11; }
+          }
+          public float Field11 {
+            get { return result.Field11; }
+            set { SetField11(value); }
+          }
+          public Builder SetField11(float value) {
+            PrepareBuilder();
+            result.hasField11 = true;
+            result.field11_ = value;
+            return this;
+          }
+          public Builder ClearField11() {
+            PrepareBuilder();
+            result.hasField11 = false;
+            result.field11_ = 0F;
+            return this;
+          }
+          
+          public bool HasField26 {
+            get { return result.hasField26; }
+          }
+          public float Field26 {
+            get { return result.Field26; }
+            set { SetField26(value); }
+          }
+          public Builder SetField26(float value) {
+            PrepareBuilder();
+            result.hasField26 = true;
+            result.field26_ = value;
+            return this;
+          }
+          public Builder ClearField26() {
+            PrepareBuilder();
+            result.hasField26 = false;
+            result.field26_ = 0F;
+            return this;
+          }
+          
+          public bool HasField12 {
+            get { return result.hasField12; }
+          }
+          public string Field12 {
+            get { return result.Field12; }
+            set { SetField12(value); }
+          }
+          public Builder SetField12(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasField12 = true;
+            result.field12_ = value;
+            return this;
+          }
+          public Builder ClearField12() {
+            PrepareBuilder();
+            result.hasField12 = false;
+            result.field12_ = "";
+            return this;
+          }
+          
+          public bool HasField13 {
+            get { return result.hasField13; }
+          }
+          public string Field13 {
+            get { return result.Field13; }
+            set { SetField13(value); }
+          }
+          public Builder SetField13(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasField13 = true;
+            result.field13_ = value;
+            return this;
+          }
+          public Builder ClearField13() {
+            PrepareBuilder();
+            result.hasField13 = false;
+            result.field13_ = "";
+            return this;
+          }
+          
+          public pbc::IPopsicleList<string> Field14List {
+            get { return PrepareBuilder().field14_; }
+          }
+          public int Field14Count {
+            get { return result.Field14Count; }
+          }
+          public string GetField14(int index) {
+            return result.GetField14(index);
+          }
+          public Builder SetField14(int index, string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.field14_[index] = value;
+            return this;
+          }
+          public Builder AddField14(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.field14_.Add(value);
+            return this;
+          }
+          public Builder AddRangeField14(scg::IEnumerable<string> values) {
+            PrepareBuilder();
+            result.field14_.Add(values);
+            return this;
+          }
+          public Builder ClearField14() {
+            PrepareBuilder();
+            result.field14_.Clear();
+            return this;
+          }
+          
+          public bool HasField15 {
+            get { return result.hasField15; }
+          }
+          [global::System.CLSCompliant(false)]
+          public ulong Field15 {
+            get { return result.Field15; }
+            set { SetField15(value); }
+          }
+          [global::System.CLSCompliant(false)]
+          public Builder SetField15(ulong value) {
+            PrepareBuilder();
+            result.hasField15 = true;
+            result.field15_ = value;
+            return this;
+          }
+          public Builder ClearField15() {
+            PrepareBuilder();
+            result.hasField15 = false;
+            result.field15_ = 0UL;
+            return this;
+          }
+          
+          public bool HasField5 {
+            get { return result.hasField5; }
+          }
+          public int Field5 {
+            get { return result.Field5; }
+            set { SetField5(value); }
+          }
+          public Builder SetField5(int value) {
+            PrepareBuilder();
+            result.hasField5 = true;
+            result.field5_ = value;
+            return this;
+          }
+          public Builder ClearField5() {
+            PrepareBuilder();
+            result.hasField5 = false;
+            result.field5_ = 0;
+            return this;
+          }
+          
+          public bool HasField27 {
+            get { return result.hasField27; }
+          }
+          public string Field27 {
+            get { return result.Field27; }
+            set { SetField27(value); }
+          }
+          public Builder SetField27(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasField27 = true;
+            result.field27_ = value;
+            return this;
+          }
+          public Builder ClearField27() {
+            PrepareBuilder();
+            result.hasField27 = false;
+            result.field27_ = "";
+            return this;
+          }
+          
+          public bool HasField28 {
+            get { return result.hasField28; }
+          }
+          public int Field28 {
+            get { return result.Field28; }
+            set { SetField28(value); }
+          }
+          public Builder SetField28(int value) {
+            PrepareBuilder();
+            result.hasField28 = true;
+            result.field28_ = value;
+            return this;
+          }
+          public Builder ClearField28() {
+            PrepareBuilder();
+            result.hasField28 = false;
+            result.field28_ = 0;
+            return this;
+          }
+          
+          public bool HasField29 {
+            get { return result.hasField29; }
+          }
+          public string Field29 {
+            get { return result.Field29; }
+            set { SetField29(value); }
+          }
+          public Builder SetField29(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasField29 = true;
+            result.field29_ = value;
+            return this;
+          }
+          public Builder ClearField29() {
+            PrepareBuilder();
+            result.hasField29 = false;
+            result.field29_ = "";
+            return this;
+          }
+          
+          public bool HasField16 {
+            get { return result.hasField16; }
+          }
+          public string Field16 {
+            get { return result.Field16; }
+            set { SetField16(value); }
+          }
+          public Builder SetField16(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasField16 = true;
+            result.field16_ = value;
+            return this;
+          }
+          public Builder ClearField16() {
+            PrepareBuilder();
+            result.hasField16 = false;
+            result.field16_ = "";
+            return this;
+          }
+          
+          public pbc::IPopsicleList<string> Field22List {
+            get { return PrepareBuilder().field22_; }
+          }
+          public int Field22Count {
+            get { return result.Field22Count; }
+          }
+          public string GetField22(int index) {
+            return result.GetField22(index);
+          }
+          public Builder SetField22(int index, string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.field22_[index] = value;
+            return this;
+          }
+          public Builder AddField22(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.field22_.Add(value);
+            return this;
+          }
+          public Builder AddRangeField22(scg::IEnumerable<string> values) {
+            PrepareBuilder();
+            result.field22_.Add(values);
+            return this;
+          }
+          public Builder ClearField22() {
+            PrepareBuilder();
+            result.field22_.Clear();
+            return this;
+          }
+          
+          public pbc::IPopsicleList<int> Field73List {
+            get { return PrepareBuilder().field73_; }
+          }
+          public int Field73Count {
+            get { return result.Field73Count; }
+          }
+          public int GetField73(int index) {
+            return result.GetField73(index);
+          }
+          public Builder SetField73(int index, int value) {
+            PrepareBuilder();
+            result.field73_[index] = value;
+            return this;
+          }
+          public Builder AddField73(int value) {
+            PrepareBuilder();
+            result.field73_.Add(value);
+            return this;
+          }
+          public Builder AddRangeField73(scg::IEnumerable<int> values) {
+            PrepareBuilder();
+            result.field73_.Add(values);
+            return this;
+          }
+          public Builder ClearField73() {
+            PrepareBuilder();
+            result.field73_.Clear();
+            return this;
+          }
+          
+          public bool HasField20 {
+            get { return result.hasField20; }
+          }
+          public int Field20 {
+            get { return result.Field20; }
+            set { SetField20(value); }
+          }
+          public Builder SetField20(int value) {
+            PrepareBuilder();
+            result.hasField20 = true;
+            result.field20_ = value;
+            return this;
+          }
+          public Builder ClearField20() {
+            PrepareBuilder();
+            result.hasField20 = false;
+            result.field20_ = 0;
+            return this;
+          }
+          
+          public bool HasField24 {
+            get { return result.hasField24; }
+          }
+          public string Field24 {
+            get { return result.Field24; }
+            set { SetField24(value); }
+          }
+          public Builder SetField24(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasField24 = true;
+            result.field24_ = value;
+            return this;
+          }
+          public Builder ClearField24() {
+            PrepareBuilder();
+            result.hasField24 = false;
+            result.field24_ = "";
+            return this;
+          }
+          
+          public bool HasField31 {
+           get { return result.hasField31; }
+          }
+          public global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2GroupedMessage Field31 {
+            get { return result.Field31; }
+            set { SetField31(value); }
+          }
+          public Builder SetField31(global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2GroupedMessage value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasField31 = true;
+            result.field31_ = value;
+            return this;
+          }
+          public Builder SetField31(global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2GroupedMessage.Builder builderForValue) {
+            pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+            PrepareBuilder();
+            result.hasField31 = true;
+            result.field31_ = builderForValue.Build();
+            return this;
+          }
+          public Builder MergeField31(global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2GroupedMessage value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            if (result.hasField31 &&
+                result.field31_ != global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2GroupedMessage.DefaultInstance) {
+                result.field31_ = global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2GroupedMessage.CreateBuilder(result.field31_).MergeFrom(value).BuildPartial();
+            } else {
+              result.field31_ = value;
+            }
+            result.hasField31 = true;
+            return this;
+          }
+          public Builder ClearField31() {
+            PrepareBuilder();
+            result.hasField31 = false;
+            result.field31_ = null;
+            return this;
+          }
+        }
+        static Group1() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.ProtoBench.GoogleSpeedProtoFile.Descriptor, null);
+        }
+      }
+      
+    }
+    #endregion
+    
+    public const int Field1FieldNumber = 1;
+    private bool hasField1;
+    private string field1_ = "";
+    public bool HasField1 {
+      get { return hasField1; }
+    }
+    public string Field1 {
+      get { return field1_; }
+    }
+    
+    public const int Field3FieldNumber = 3;
+    private bool hasField3;
+    private long field3_;
+    public bool HasField3 {
+      get { return hasField3; }
+    }
+    public long Field3 {
+      get { return field3_; }
+    }
+    
+    public const int Field4FieldNumber = 4;
+    private bool hasField4;
+    private long field4_;
+    public bool HasField4 {
+      get { return hasField4; }
+    }
+    public long Field4 {
+      get { return field4_; }
+    }
+    
+    public const int Field30FieldNumber = 30;
+    private bool hasField30;
+    private long field30_;
+    public bool HasField30 {
+      get { return hasField30; }
+    }
+    public long Field30 {
+      get { return field30_; }
+    }
+    
+    public const int Field75FieldNumber = 75;
+    private bool hasField75;
+    private bool field75_;
+    public bool HasField75 {
+      get { return hasField75; }
+    }
+    public bool Field75 {
+      get { return field75_; }
+    }
+    
+    public const int Field6FieldNumber = 6;
+    private bool hasField6;
+    private string field6_ = "";
+    public bool HasField6 {
+      get { return hasField6; }
+    }
+    public string Field6 {
+      get { return field6_; }
+    }
+    
+    public const int Field2FieldNumber = 2;
+    private bool hasField2;
+    private pb::ByteString field2_ = pb::ByteString.Empty;
+    public bool HasField2 {
+      get { return hasField2; }
+    }
+    public pb::ByteString Field2 {
+      get { return field2_; }
+    }
+    
+    public const int Field21FieldNumber = 21;
+    private bool hasField21;
+    private int field21_;
+    public bool HasField21 {
+      get { return hasField21; }
+    }
+    public int Field21 {
+      get { return field21_; }
+    }
+    
+    public const int Field71FieldNumber = 71;
+    private bool hasField71;
+    private int field71_;
+    public bool HasField71 {
+      get { return hasField71; }
+    }
+    public int Field71 {
+      get { return field71_; }
+    }
+    
+    public const int Field25FieldNumber = 25;
+    private bool hasField25;
+    private float field25_;
+    public bool HasField25 {
+      get { return hasField25; }
+    }
+    public float Field25 {
+      get { return field25_; }
+    }
+    
+    public const int Field109FieldNumber = 109;
+    private bool hasField109;
+    private int field109_;
+    public bool HasField109 {
+      get { return hasField109; }
+    }
+    public int Field109 {
+      get { return field109_; }
+    }
+    
+    public const int Field210FieldNumber = 210;
+    private bool hasField210;
+    private int field210_;
+    public bool HasField210 {
+      get { return hasField210; }
+    }
+    public int Field210 {
+      get { return field210_; }
+    }
+    
+    public const int Field211FieldNumber = 211;
+    private bool hasField211;
+    private int field211_;
+    public bool HasField211 {
+      get { return hasField211; }
+    }
+    public int Field211 {
+      get { return field211_; }
+    }
+    
+    public const int Field212FieldNumber = 212;
+    private bool hasField212;
+    private int field212_;
+    public bool HasField212 {
+      get { return hasField212; }
+    }
+    public int Field212 {
+      get { return field212_; }
+    }
+    
+    public const int Field213FieldNumber = 213;
+    private bool hasField213;
+    private int field213_;
+    public bool HasField213 {
+      get { return hasField213; }
+    }
+    public int Field213 {
+      get { return field213_; }
+    }
+    
+    public const int Field216FieldNumber = 216;
+    private bool hasField216;
+    private int field216_;
+    public bool HasField216 {
+      get { return hasField216; }
+    }
+    public int Field216 {
+      get { return field216_; }
+    }
+    
+    public const int Field217FieldNumber = 217;
+    private bool hasField217;
+    private int field217_;
+    public bool HasField217 {
+      get { return hasField217; }
+    }
+    public int Field217 {
+      get { return field217_; }
+    }
+    
+    public const int Field218FieldNumber = 218;
+    private bool hasField218;
+    private int field218_;
+    public bool HasField218 {
+      get { return hasField218; }
+    }
+    public int Field218 {
+      get { return field218_; }
+    }
+    
+    public const int Field220FieldNumber = 220;
+    private bool hasField220;
+    private int field220_;
+    public bool HasField220 {
+      get { return hasField220; }
+    }
+    public int Field220 {
+      get { return field220_; }
+    }
+    
+    public const int Field221FieldNumber = 221;
+    private bool hasField221;
+    private int field221_;
+    public bool HasField221 {
+      get { return hasField221; }
+    }
+    public int Field221 {
+      get { return field221_; }
+    }
+    
+    public const int Field222FieldNumber = 222;
+    private bool hasField222;
+    private float field222_;
+    public bool HasField222 {
+      get { return hasField222; }
+    }
+    public float Field222 {
+      get { return field222_; }
+    }
+    
+    public const int Field63FieldNumber = 63;
+    private bool hasField63;
+    private int field63_;
+    public bool HasField63 {
+      get { return hasField63; }
+    }
+    public int Field63 {
+      get { return field63_; }
+    }
+    
+    public const int Group1FieldNumber = 10;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2.Types.Group1> group1_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2.Types.Group1>();
+    public scg::IList<global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2.Types.Group1> Group1List {
+      get { return group1_; }
+    }
+    public int Group1Count {
+      get { return group1_.Count; }
+    }
+    public global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2.Types.Group1 GetGroup1(int index) {
+      return group1_[index];
+    }
+    
+    public const int Field128FieldNumber = 128;
+    private pbc::PopsicleList<string> field128_ = new pbc::PopsicleList<string>();
+    public scg::IList<string> Field128List {
+      get { return pbc::Lists.AsReadOnly(field128_); }
+    }
+    public int Field128Count {
+      get { return field128_.Count; }
+    }
+    public string GetField128(int index) {
+      return field128_[index];
+    }
+    
+    public const int Field131FieldNumber = 131;
+    private bool hasField131;
+    private long field131_;
+    public bool HasField131 {
+      get { return hasField131; }
+    }
+    public long Field131 {
+      get { return field131_; }
+    }
+    
+    public const int Field127FieldNumber = 127;
+    private pbc::PopsicleList<string> field127_ = new pbc::PopsicleList<string>();
+    public scg::IList<string> Field127List {
+      get { return pbc::Lists.AsReadOnly(field127_); }
+    }
+    public int Field127Count {
+      get { return field127_.Count; }
+    }
+    public string GetField127(int index) {
+      return field127_[index];
+    }
+    
+    public const int Field129FieldNumber = 129;
+    private bool hasField129;
+    private int field129_;
+    public bool HasField129 {
+      get { return hasField129; }
+    }
+    public int Field129 {
+      get { return field129_; }
+    }
+    
+    public const int Field130FieldNumber = 130;
+    private pbc::PopsicleList<long> field130_ = new pbc::PopsicleList<long>();
+    public scg::IList<long> Field130List {
+      get { return pbc::Lists.AsReadOnly(field130_); }
+    }
+    public int Field130Count {
+      get { return field130_.Count; }
+    }
+    public long GetField130(int index) {
+      return field130_[index];
+    }
+    
+    public const int Field205FieldNumber = 205;
+    private bool hasField205;
+    private bool field205_;
+    public bool HasField205 {
+      get { return hasField205; }
+    }
+    public bool Field205 {
+      get { return field205_; }
+    }
+    
+    public const int Field206FieldNumber = 206;
+    private bool hasField206;
+    private bool field206_;
+    public bool HasField206 {
+      get { return hasField206; }
+    }
+    public bool Field206 {
+      get { return field206_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _speedMessage2FieldNames;
+      if (hasField1) {
+        output.WriteString(1, field_names[0], Field1);
+      }
+      if (hasField2) {
+        output.WriteBytes(2, field_names[7], Field2);
+      }
+      if (hasField3) {
+        output.WriteInt64(3, field_names[22], Field3);
+      }
+      if (hasField4) {
+        output.WriteInt64(4, field_names[24], Field4);
+      }
+      if (hasField6) {
+        output.WriteString(6, field_names[25], Field6);
+      }
+      if (group1_.Count > 0) {
+        output.WriteGroupArray(10, field_names[29], group1_);
+      }
+      if (hasField21) {
+        output.WriteInt32(21, field_names[10], Field21);
+      }
+      if (hasField25) {
+        output.WriteFloat(25, field_names[21], Field25);
+      }
+      if (hasField30) {
+        output.WriteInt64(30, field_names[23], Field30);
+      }
+      if (hasField63) {
+        output.WriteInt32(63, field_names[26], Field63);
+      }
+      if (hasField71) {
+        output.WriteInt32(71, field_names[27], Field71);
+      }
+      if (hasField75) {
+        output.WriteBool(75, field_names[28], Field75);
+      }
+      if (hasField109) {
+        output.WriteInt32(109, field_names[1], Field109);
+      }
+      if (field127_.Count > 0) {
+        output.WriteStringArray(127, field_names[2], field127_);
+      }
+      if (field128_.Count > 0) {
+        output.WriteStringArray(128, field_names[3], field128_);
+      }
+      if (hasField129) {
+        output.WriteInt32(129, field_names[4], Field129);
+      }
+      if (field130_.Count > 0) {
+        output.WriteInt64Array(130, field_names[5], field130_);
+      }
+      if (hasField131) {
+        output.WriteInt64(131, field_names[6], Field131);
+      }
+      if (hasField205) {
+        output.WriteBool(205, field_names[8], Field205);
+      }
+      if (hasField206) {
+        output.WriteBool(206, field_names[9], Field206);
+      }
+      if (hasField210) {
+        output.WriteInt32(210, field_names[11], Field210);
+      }
+      if (hasField211) {
+        output.WriteInt32(211, field_names[12], Field211);
+      }
+      if (hasField212) {
+        output.WriteInt32(212, field_names[13], Field212);
+      }
+      if (hasField213) {
+        output.WriteInt32(213, field_names[14], Field213);
+      }
+      if (hasField216) {
+        output.WriteInt32(216, field_names[15], Field216);
+      }
+      if (hasField217) {
+        output.WriteInt32(217, field_names[16], Field217);
+      }
+      if (hasField218) {
+        output.WriteInt32(218, field_names[17], Field218);
+      }
+      if (hasField220) {
+        output.WriteInt32(220, field_names[18], Field220);
+      }
+      if (hasField221) {
+        output.WriteInt32(221, field_names[19], Field221);
+      }
+      if (hasField222) {
+        output.WriteFloat(222, field_names[20], Field222);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+      
+      size = 0;
+      if (hasField1) {
+        size += pb::CodedOutputStream.ComputeStringSize(1, Field1);
+      }
+      if (hasField3) {
+        size += pb::CodedOutputStream.ComputeInt64Size(3, Field3);
+      }
+      if (hasField4) {
+        size += pb::CodedOutputStream.ComputeInt64Size(4, Field4);
+      }
+      if (hasField30) {
+        size += pb::CodedOutputStream.ComputeInt64Size(30, Field30);
+      }
+      if (hasField75) {
+        size += pb::CodedOutputStream.ComputeBoolSize(75, Field75);
+      }
+      if (hasField6) {
+        size += pb::CodedOutputStream.ComputeStringSize(6, Field6);
+      }
+      if (hasField2) {
+        size += pb::CodedOutputStream.ComputeBytesSize(2, Field2);
+      }
+      if (hasField21) {
+        size += pb::CodedOutputStream.ComputeInt32Size(21, Field21);
+      }
+      if (hasField71) {
+        size += pb::CodedOutputStream.ComputeInt32Size(71, Field71);
+      }
+      if (hasField25) {
+        size += pb::CodedOutputStream.ComputeFloatSize(25, Field25);
+      }
+      if (hasField109) {
+        size += pb::CodedOutputStream.ComputeInt32Size(109, Field109);
+      }
+      if (hasField210) {
+        size += pb::CodedOutputStream.ComputeInt32Size(210, Field210);
+      }
+      if (hasField211) {
+        size += pb::CodedOutputStream.ComputeInt32Size(211, Field211);
+      }
+      if (hasField212) {
+        size += pb::CodedOutputStream.ComputeInt32Size(212, Field212);
+      }
+      if (hasField213) {
+        size += pb::CodedOutputStream.ComputeInt32Size(213, Field213);
+      }
+      if (hasField216) {
+        size += pb::CodedOutputStream.ComputeInt32Size(216, Field216);
+      }
+      if (hasField217) {
+        size += pb::CodedOutputStream.ComputeInt32Size(217, Field217);
+      }
+      if (hasField218) {
+        size += pb::CodedOutputStream.ComputeInt32Size(218, Field218);
+      }
+      if (hasField220) {
+        size += pb::CodedOutputStream.ComputeInt32Size(220, Field220);
+      }
+      if (hasField221) {
+        size += pb::CodedOutputStream.ComputeInt32Size(221, Field221);
+      }
+      if (hasField222) {
+        size += pb::CodedOutputStream.ComputeFloatSize(222, Field222);
+      }
+      if (hasField63) {
+        size += pb::CodedOutputStream.ComputeInt32Size(63, Field63);
+      }
+      foreach (global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2.Types.Group1 element in Group1List) {
+        size += pb::CodedOutputStream.ComputeGroupSize(10, element);
+      }
+      {
+        int dataSize = 0;
+        foreach (string element in Field128List) {
+          dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * field128_.Count;
+      }
+      if (hasField131) {
+        size += pb::CodedOutputStream.ComputeInt64Size(131, Field131);
+      }
+      {
+        int dataSize = 0;
+        foreach (string element in Field127List) {
+          dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * field127_.Count;
+      }
+      if (hasField129) {
+        size += pb::CodedOutputStream.ComputeInt32Size(129, Field129);
+      }
+      {
+        int dataSize = 0;
+        foreach (long element in Field130List) {
+          dataSize += pb::CodedOutputStream.ComputeInt64SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * field130_.Count;
+      }
+      if (hasField205) {
+        size += pb::CodedOutputStream.ComputeBoolSize(205, Field205);
+      }
+      if (hasField206) {
+        size += pb::CodedOutputStream.ComputeBoolSize(206, Field206);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static SpeedMessage2 ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SpeedMessage2 ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage2 ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SpeedMessage2 ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage2 ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SpeedMessage2 ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage2 ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static SpeedMessage2 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static SpeedMessage2 ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SpeedMessage2 ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private SpeedMessage2 MakeReadOnly() {
+      group1_.MakeReadOnly();
+      field128_.MakeReadOnly();
+      field127_.MakeReadOnly();
+      field130_.MakeReadOnly();
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(SpeedMessage2 prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<SpeedMessage2, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(SpeedMessage2 cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private SpeedMessage2 result;
+      
+      private SpeedMessage2 PrepareBuilder() {
+        if (resultIsReadOnly) {
+          SpeedMessage2 original = result;
+          result = new SpeedMessage2();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override SpeedMessage2 MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2.Descriptor; }
+      }
+      
+      public override SpeedMessage2 DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2.DefaultInstance; }
+      }
+      
+      public override SpeedMessage2 BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is SpeedMessage2) {
+          return MergeFrom((SpeedMessage2) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(SpeedMessage2 other) {
+        if (other == global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasField1) {
+          Field1 = other.Field1;
+        }
+        if (other.HasField3) {
+          Field3 = other.Field3;
+        }
+        if (other.HasField4) {
+          Field4 = other.Field4;
+        }
+        if (other.HasField30) {
+          Field30 = other.Field30;
+        }
+        if (other.HasField75) {
+          Field75 = other.Field75;
+        }
+        if (other.HasField6) {
+          Field6 = other.Field6;
+        }
+        if (other.HasField2) {
+          Field2 = other.Field2;
+        }
+        if (other.HasField21) {
+          Field21 = other.Field21;
+        }
+        if (other.HasField71) {
+          Field71 = other.Field71;
+        }
+        if (other.HasField25) {
+          Field25 = other.Field25;
+        }
+        if (other.HasField109) {
+          Field109 = other.Field109;
+        }
+        if (other.HasField210) {
+          Field210 = other.Field210;
+        }
+        if (other.HasField211) {
+          Field211 = other.Field211;
+        }
+        if (other.HasField212) {
+          Field212 = other.Field212;
+        }
+        if (other.HasField213) {
+          Field213 = other.Field213;
+        }
+        if (other.HasField216) {
+          Field216 = other.Field216;
+        }
+        if (other.HasField217) {
+          Field217 = other.Field217;
+        }
+        if (other.HasField218) {
+          Field218 = other.Field218;
+        }
+        if (other.HasField220) {
+          Field220 = other.Field220;
+        }
+        if (other.HasField221) {
+          Field221 = other.Field221;
+        }
+        if (other.HasField222) {
+          Field222 = other.Field222;
+        }
+        if (other.HasField63) {
+          Field63 = other.Field63;
+        }
+        if (other.group1_.Count != 0) {
+          result.group1_.Add(other.group1_);
+        }
+        if (other.field128_.Count != 0) {
+          result.field128_.Add(other.field128_);
+        }
+        if (other.HasField131) {
+          Field131 = other.Field131;
+        }
+        if (other.field127_.Count != 0) {
+          result.field127_.Add(other.field127_);
+        }
+        if (other.HasField129) {
+          Field129 = other.Field129;
+        }
+        if (other.field130_.Count != 0) {
+          result.field130_.Add(other.field130_);
+        }
+        if (other.HasField205) {
+          Field205 = other.Field205;
+        }
+        if (other.HasField206) {
+          Field206 = other.Field206;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_speedMessage2FieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _speedMessage2FieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              result.hasField1 = input.ReadString(ref result.field1_);
+              break;
+            }
+            case 18: {
+              result.hasField2 = input.ReadBytes(ref result.field2_);
+              break;
+            }
+            case 24: {
+              result.hasField3 = input.ReadInt64(ref result.field3_);
+              break;
+            }
+            case 32: {
+              result.hasField4 = input.ReadInt64(ref result.field4_);
+              break;
+            }
+            case 50: {
+              result.hasField6 = input.ReadString(ref result.field6_);
+              break;
+            }
+            case 83: {
+              input.ReadGroupArray(tag, field_name, result.group1_, global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2.Types.Group1.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 168: {
+              result.hasField21 = input.ReadInt32(ref result.field21_);
+              break;
+            }
+            case 205: {
+              result.hasField25 = input.ReadFloat(ref result.field25_);
+              break;
+            }
+            case 240: {
+              result.hasField30 = input.ReadInt64(ref result.field30_);
+              break;
+            }
+            case 504: {
+              result.hasField63 = input.ReadInt32(ref result.field63_);
+              break;
+            }
+            case 568: {
+              result.hasField71 = input.ReadInt32(ref result.field71_);
+              break;
+            }
+            case 600: {
+              result.hasField75 = input.ReadBool(ref result.field75_);
+              break;
+            }
+            case 872: {
+              result.hasField109 = input.ReadInt32(ref result.field109_);
+              break;
+            }
+            case 1018: {
+              input.ReadStringArray(tag, field_name, result.field127_);
+              break;
+            }
+            case 1026: {
+              input.ReadStringArray(tag, field_name, result.field128_);
+              break;
+            }
+            case 1032: {
+              result.hasField129 = input.ReadInt32(ref result.field129_);
+              break;
+            }
+            case 1042:
+            case 1040: {
+              input.ReadInt64Array(tag, field_name, result.field130_);
+              break;
+            }
+            case 1048: {
+              result.hasField131 = input.ReadInt64(ref result.field131_);
+              break;
+            }
+            case 1640: {
+              result.hasField205 = input.ReadBool(ref result.field205_);
+              break;
+            }
+            case 1648: {
+              result.hasField206 = input.ReadBool(ref result.field206_);
+              break;
+            }
+            case 1680: {
+              result.hasField210 = input.ReadInt32(ref result.field210_);
+              break;
+            }
+            case 1688: {
+              result.hasField211 = input.ReadInt32(ref result.field211_);
+              break;
+            }
+            case 1696: {
+              result.hasField212 = input.ReadInt32(ref result.field212_);
+              break;
+            }
+            case 1704: {
+              result.hasField213 = input.ReadInt32(ref result.field213_);
+              break;
+            }
+            case 1728: {
+              result.hasField216 = input.ReadInt32(ref result.field216_);
+              break;
+            }
+            case 1736: {
+              result.hasField217 = input.ReadInt32(ref result.field217_);
+              break;
+            }
+            case 1744: {
+              result.hasField218 = input.ReadInt32(ref result.field218_);
+              break;
+            }
+            case 1760: {
+              result.hasField220 = input.ReadInt32(ref result.field220_);
+              break;
+            }
+            case 1768: {
+              result.hasField221 = input.ReadInt32(ref result.field221_);
+              break;
+            }
+            case 1781: {
+              result.hasField222 = input.ReadFloat(ref result.field222_);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public bool HasField1 {
+        get { return result.hasField1; }
+      }
+      public string Field1 {
+        get { return result.Field1; }
+        set { SetField1(value); }
+      }
+      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;
+      }
+      
+      public bool HasField3 {
+        get { return result.hasField3; }
+      }
+      public long Field3 {
+        get { return result.Field3; }
+        set { SetField3(value); }
+      }
+      public Builder SetField3(long value) {
+        PrepareBuilder();
+        result.hasField3 = true;
+        result.field3_ = value;
+        return this;
+      }
+      public Builder ClearField3() {
+        PrepareBuilder();
+        result.hasField3 = false;
+        result.field3_ = 0L;
+        return this;
+      }
+      
+      public bool HasField4 {
+        get { return result.hasField4; }
+      }
+      public long Field4 {
+        get { return result.Field4; }
+        set { SetField4(value); }
+      }
+      public Builder SetField4(long value) {
+        PrepareBuilder();
+        result.hasField4 = true;
+        result.field4_ = value;
+        return this;
+      }
+      public Builder ClearField4() {
+        PrepareBuilder();
+        result.hasField4 = false;
+        result.field4_ = 0L;
+        return this;
+      }
+      
+      public bool HasField30 {
+        get { return result.hasField30; }
+      }
+      public long Field30 {
+        get { return result.Field30; }
+        set { SetField30(value); }
+      }
+      public Builder SetField30(long value) {
+        PrepareBuilder();
+        result.hasField30 = true;
+        result.field30_ = value;
+        return this;
+      }
+      public Builder ClearField30() {
+        PrepareBuilder();
+        result.hasField30 = false;
+        result.field30_ = 0L;
+        return this;
+      }
+      
+      public bool HasField75 {
+        get { return result.hasField75; }
+      }
+      public bool Field75 {
+        get { return result.Field75; }
+        set { SetField75(value); }
+      }
+      public Builder SetField75(bool value) {
+        PrepareBuilder();
+        result.hasField75 = true;
+        result.field75_ = value;
+        return this;
+      }
+      public Builder ClearField75() {
+        PrepareBuilder();
+        result.hasField75 = false;
+        result.field75_ = false;
+        return this;
+      }
+      
+      public bool HasField6 {
+        get { return result.hasField6; }
+      }
+      public string Field6 {
+        get { return result.Field6; }
+        set { SetField6(value); }
+      }
+      public Builder SetField6(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField6 = true;
+        result.field6_ = value;
+        return this;
+      }
+      public Builder ClearField6() {
+        PrepareBuilder();
+        result.hasField6 = false;
+        result.field6_ = "";
+        return this;
+      }
+      
+      public bool HasField2 {
+        get { return result.hasField2; }
+      }
+      public pb::ByteString Field2 {
+        get { return result.Field2; }
+        set { SetField2(value); }
+      }
+      public Builder SetField2(pb::ByteString value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasField2 = true;
+        result.field2_ = value;
+        return this;
+      }
+      public Builder ClearField2() {
+        PrepareBuilder();
+        result.hasField2 = false;
+        result.field2_ = pb::ByteString.Empty;
+        return this;
+      }
+      
+      public bool HasField21 {
+        get { return result.hasField21; }
+      }
+      public int Field21 {
+        get { return result.Field21; }
+        set { SetField21(value); }
+      }
+      public Builder SetField21(int value) {
+        PrepareBuilder();
+        result.hasField21 = true;
+        result.field21_ = value;
+        return this;
+      }
+      public Builder ClearField21() {
+        PrepareBuilder();
+        result.hasField21 = false;
+        result.field21_ = 0;
+        return this;
+      }
+      
+      public bool HasField71 {
+        get { return result.hasField71; }
+      }
+      public int Field71 {
+        get { return result.Field71; }
+        set { SetField71(value); }
+      }
+      public Builder SetField71(int value) {
+        PrepareBuilder();
+        result.hasField71 = true;
+        result.field71_ = value;
+        return this;
+      }
+      public Builder ClearField71() {
+        PrepareBuilder();
+        result.hasField71 = false;
+        result.field71_ = 0;
+        return this;
+      }
+      
+      public bool HasField25 {
+        get { return result.hasField25; }
+      }
+      public float Field25 {
+        get { return result.Field25; }
+        set { SetField25(value); }
+      }
+      public Builder SetField25(float value) {
+        PrepareBuilder();
+        result.hasField25 = true;
+        result.field25_ = value;
+        return this;
+      }
+      public Builder ClearField25() {
+        PrepareBuilder();
+        result.hasField25 = false;
+        result.field25_ = 0F;
+        return this;
+      }
+      
+      public bool HasField109 {
+        get { return result.hasField109; }
+      }
+      public int Field109 {
+        get { return result.Field109; }
+        set { SetField109(value); }
+      }
+      public Builder SetField109(int value) {
+        PrepareBuilder();
+        result.hasField109 = true;
+        result.field109_ = value;
+        return this;
+      }
+      public Builder ClearField109() {
+        PrepareBuilder();
+        result.hasField109 = false;
+        result.field109_ = 0;
+        return this;
+      }
+      
+      public bool HasField210 {
+        get { return result.hasField210; }
+      }
+      public int Field210 {
+        get { return result.Field210; }
+        set { SetField210(value); }
+      }
+      public Builder SetField210(int value) {
+        PrepareBuilder();
+        result.hasField210 = true;
+        result.field210_ = value;
+        return this;
+      }
+      public Builder ClearField210() {
+        PrepareBuilder();
+        result.hasField210 = false;
+        result.field210_ = 0;
+        return this;
+      }
+      
+      public bool HasField211 {
+        get { return result.hasField211; }
+      }
+      public int Field211 {
+        get { return result.Field211; }
+        set { SetField211(value); }
+      }
+      public Builder SetField211(int value) {
+        PrepareBuilder();
+        result.hasField211 = true;
+        result.field211_ = value;
+        return this;
+      }
+      public Builder ClearField211() {
+        PrepareBuilder();
+        result.hasField211 = false;
+        result.field211_ = 0;
+        return this;
+      }
+      
+      public bool HasField212 {
+        get { return result.hasField212; }
+      }
+      public int Field212 {
+        get { return result.Field212; }
+        set { SetField212(value); }
+      }
+      public Builder SetField212(int value) {
+        PrepareBuilder();
+        result.hasField212 = true;
+        result.field212_ = value;
+        return this;
+      }
+      public Builder ClearField212() {
+        PrepareBuilder();
+        result.hasField212 = false;
+        result.field212_ = 0;
+        return this;
+      }
+      
+      public bool HasField213 {
+        get { return result.hasField213; }
+      }
+      public int Field213 {
+        get { return result.Field213; }
+        set { SetField213(value); }
+      }
+      public Builder SetField213(int value) {
+        PrepareBuilder();
+        result.hasField213 = true;
+        result.field213_ = value;
+        return this;
+      }
+      public Builder ClearField213() {
+        PrepareBuilder();
+        result.hasField213 = false;
+        result.field213_ = 0;
+        return this;
+      }
+      
+      public bool HasField216 {
+        get { return result.hasField216; }
+      }
+      public int Field216 {
+        get { return result.Field216; }
+        set { SetField216(value); }
+      }
+      public Builder SetField216(int value) {
+        PrepareBuilder();
+        result.hasField216 = true;
+        result.field216_ = value;
+        return this;
+      }
+      public Builder ClearField216() {
+        PrepareBuilder();
+        result.hasField216 = false;
+        result.field216_ = 0;
+        return this;
+      }
+      
+      public bool HasField217 {
+        get { return result.hasField217; }
+      }
+      public int Field217 {
+        get { return result.Field217; }
+        set { SetField217(value); }
+      }
+      public Builder SetField217(int value) {
+        PrepareBuilder();
+        result.hasField217 = true;
+        result.field217_ = value;
+        return this;
+      }
+      public Builder ClearField217() {
+        PrepareBuilder();
+        result.hasField217 = false;
+        result.field217_ = 0;
+        return this;
+      }
+      
+      public bool HasField218 {
+        get { return result.hasField218; }
+      }
+      public int Field218 {
+        get { return result.Field218; }
+        set { SetField218(value); }
+      }
+      public Builder SetField218(int value) {
+        PrepareBuilder();
+        result.hasField218 = true;
+        result.field218_ = value;
+        return this;
+      }
+      public Builder ClearField218() {
+        PrepareBuilder();
+        result.hasField218 = false;
+        result.field218_ = 0;
+        return this;
+      }
+      
+      public bool HasField220 {
+        get { return result.hasField220; }
+      }
+      public int Field220 {
+        get { return result.Field220; }
+        set { SetField220(value); }
+      }
+      public Builder SetField220(int value) {
+        PrepareBuilder();
+        result.hasField220 = true;
+        result.field220_ = value;
+        return this;
+      }
+      public Builder ClearField220() {
+        PrepareBuilder();
+        result.hasField220 = false;
+        result.field220_ = 0;
+        return this;
+      }
+      
+      public bool HasField221 {
+        get { return result.hasField221; }
+      }
+      public int Field221 {
+        get { return result.Field221; }
+        set { SetField221(value); }
+      }
+      public Builder SetField221(int value) {
+        PrepareBuilder();
+        result.hasField221 = true;
+        result.field221_ = value;
+        return this;
+      }
+      public Builder ClearField221() {
+        PrepareBuilder();
+        result.hasField221 = false;
+        result.field221_ = 0;
+        return this;
+      }
+      
+      public bool HasField222 {
+        get { return result.hasField222; }
+      }
+      public float Field222 {
+        get { return result.Field222; }
+        set { SetField222(value); }
+      }
+      public Builder SetField222(float value) {
+        PrepareBuilder();
+        result.hasField222 = true;
+        result.field222_ = value;
+        return this;
+      }
+      public Builder ClearField222() {
+        PrepareBuilder();
+        result.hasField222 = false;
+        result.field222_ = 0F;
+        return this;
+      }
+      
+      public bool HasField63 {
+        get { return result.hasField63; }
+      }
+      public int Field63 {
+        get { return result.Field63; }
+        set { SetField63(value); }
+      }
+      public Builder SetField63(int value) {
+        PrepareBuilder();
+        result.hasField63 = true;
+        result.field63_ = value;
+        return this;
+      }
+      public Builder ClearField63() {
+        PrepareBuilder();
+        result.hasField63 = false;
+        result.field63_ = 0;
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2.Types.Group1> Group1List {
+        get { return PrepareBuilder().group1_; }
+      }
+      public int Group1Count {
+        get { return result.Group1Count; }
+      }
+      public global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2.Types.Group1 GetGroup1(int index) {
+        return result.GetGroup1(index);
+      }
+      public Builder SetGroup1(int index, global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2.Types.Group1 value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.group1_[index] = value;
+        return this;
+      }
+      public Builder SetGroup1(int index, global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2.Types.Group1.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.group1_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddGroup1(global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2.Types.Group1 value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.group1_.Add(value);
+        return this;
+      }
+      public Builder AddGroup1(global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2.Types.Group1.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.group1_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeGroup1(scg::IEnumerable<global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2.Types.Group1> values) {
+        PrepareBuilder();
+        result.group1_.Add(values);
+        return this;
+      }
+      public Builder ClearGroup1() {
+        PrepareBuilder();
+        result.group1_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<string> Field128List {
+        get { return PrepareBuilder().field128_; }
+      }
+      public int Field128Count {
+        get { return result.Field128Count; }
+      }
+      public string GetField128(int index) {
+        return result.GetField128(index);
+      }
+      public Builder SetField128(int index, string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.field128_[index] = value;
+        return this;
+      }
+      public Builder AddField128(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.field128_.Add(value);
+        return this;
+      }
+      public Builder AddRangeField128(scg::IEnumerable<string> values) {
+        PrepareBuilder();
+        result.field128_.Add(values);
+        return this;
+      }
+      public Builder ClearField128() {
+        PrepareBuilder();
+        result.field128_.Clear();
+        return this;
+      }
+      
+      public bool HasField131 {
+        get { return result.hasField131; }
+      }
+      public long Field131 {
+        get { return result.Field131; }
+        set { SetField131(value); }
+      }
+      public Builder SetField131(long value) {
+        PrepareBuilder();
+        result.hasField131 = true;
+        result.field131_ = value;
+        return this;
+      }
+      public Builder ClearField131() {
+        PrepareBuilder();
+        result.hasField131 = false;
+        result.field131_ = 0L;
+        return this;
+      }
+      
+      public pbc::IPopsicleList<string> Field127List {
+        get { return PrepareBuilder().field127_; }
+      }
+      public int Field127Count {
+        get { return result.Field127Count; }
+      }
+      public string GetField127(int index) {
+        return result.GetField127(index);
+      }
+      public Builder SetField127(int index, string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.field127_[index] = value;
+        return this;
+      }
+      public Builder AddField127(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.field127_.Add(value);
+        return this;
+      }
+      public Builder AddRangeField127(scg::IEnumerable<string> values) {
+        PrepareBuilder();
+        result.field127_.Add(values);
+        return this;
+      }
+      public Builder ClearField127() {
+        PrepareBuilder();
+        result.field127_.Clear();
+        return this;
+      }
+      
+      public bool HasField129 {
+        get { return result.hasField129; }
+      }
+      public int Field129 {
+        get { return result.Field129; }
+        set { SetField129(value); }
+      }
+      public Builder SetField129(int value) {
+        PrepareBuilder();
+        result.hasField129 = true;
+        result.field129_ = value;
+        return this;
+      }
+      public Builder ClearField129() {
+        PrepareBuilder();
+        result.hasField129 = false;
+        result.field129_ = 0;
+        return this;
+      }
+      
+      public pbc::IPopsicleList<long> Field130List {
+        get { return PrepareBuilder().field130_; }
+      }
+      public int Field130Count {
+        get { return result.Field130Count; }
+      }
+      public long GetField130(int index) {
+        return result.GetField130(index);
+      }
+      public Builder SetField130(int index, long value) {
+        PrepareBuilder();
+        result.field130_[index] = value;
+        return this;
+      }
+      public Builder AddField130(long value) {
+        PrepareBuilder();
+        result.field130_.Add(value);
+        return this;
+      }
+      public Builder AddRangeField130(scg::IEnumerable<long> values) {
+        PrepareBuilder();
+        result.field130_.Add(values);
+        return this;
+      }
+      public Builder ClearField130() {
+        PrepareBuilder();
+        result.field130_.Clear();
+        return this;
+      }
+      
+      public bool HasField205 {
+        get { return result.hasField205; }
+      }
+      public bool Field205 {
+        get { return result.Field205; }
+        set { SetField205(value); }
+      }
+      public Builder SetField205(bool value) {
+        PrepareBuilder();
+        result.hasField205 = true;
+        result.field205_ = value;
+        return this;
+      }
+      public Builder ClearField205() {
+        PrepareBuilder();
+        result.hasField205 = false;
+        result.field205_ = false;
+        return this;
+      }
+      
+      public bool HasField206 {
+        get { return result.hasField206; }
+      }
+      public bool Field206 {
+        get { return result.Field206; }
+        set { SetField206(value); }
+      }
+      public Builder SetField206(bool value) {
+        PrepareBuilder();
+        result.hasField206 = true;
+        result.field206_ = value;
+        return this;
+      }
+      public Builder ClearField206() {
+        PrepareBuilder();
+        result.hasField206 = false;
+        result.field206_ = false;
+        return this;
+      }
+    }
+    static SpeedMessage2() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.ProtoBench.GoogleSpeedProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class SpeedMessage2GroupedMessage : pb::GeneratedMessage<SpeedMessage2GroupedMessage, SpeedMessage2GroupedMessage.Builder> {
+    private SpeedMessage2GroupedMessage() { }
+    private static readonly SpeedMessage2GroupedMessage defaultInstance = new SpeedMessage2GroupedMessage().MakeReadOnly();
+    private static readonly string[] _speedMessage2GroupedMessageFieldNames = new string[] { "field1", "field10", "field11", "field2", "field3", "field4", "field5", "field6", "field7", "field8", "field9" };
+    private static readonly uint[] _speedMessage2GroupedMessageFieldTags = new uint[] { 13, 85, 88, 21, 29, 32, 40, 48, 56, 69, 72 };
+    public static SpeedMessage2GroupedMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override SpeedMessage2GroupedMessage DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override SpeedMessage2GroupedMessage ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.ProtoBench.GoogleSpeedProtoFile.internal__static_benchmarks_SpeedMessage2GroupedMessage__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<SpeedMessage2GroupedMessage, SpeedMessage2GroupedMessage.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.ProtoBench.GoogleSpeedProtoFile.internal__static_benchmarks_SpeedMessage2GroupedMessage__FieldAccessorTable; }
+    }
+    
+    public const int Field1FieldNumber = 1;
+    private bool hasField1;
+    private float field1_;
+    public bool HasField1 {
+      get { return hasField1; }
+    }
+    public float Field1 {
+      get { return field1_; }
+    }
+    
+    public const int Field2FieldNumber = 2;
+    private bool hasField2;
+    private float field2_;
+    public bool HasField2 {
+      get { return hasField2; }
+    }
+    public float Field2 {
+      get { return field2_; }
+    }
+    
+    public const int Field3FieldNumber = 3;
+    private bool hasField3;
+    private float field3_;
+    public bool HasField3 {
+      get { return hasField3; }
+    }
+    public float Field3 {
+      get { return field3_; }
+    }
+    
+    public const int Field4FieldNumber = 4;
+    private bool hasField4;
+    private bool field4_;
+    public bool HasField4 {
+      get { return hasField4; }
+    }
+    public bool Field4 {
+      get { return field4_; }
+    }
+    
+    public const int Field5FieldNumber = 5;
+    private bool hasField5;
+    private bool field5_;
+    public bool HasField5 {
+      get { return hasField5; }
+    }
+    public bool Field5 {
+      get { return field5_; }
+    }
+    
+    public const int Field6FieldNumber = 6;
+    private bool hasField6;
+    private bool field6_ = true;
+    public bool HasField6 {
+      get { return hasField6; }
+    }
+    public bool Field6 {
+      get { return field6_; }
+    }
+    
+    public const int Field7FieldNumber = 7;
+    private bool hasField7;
+    private bool field7_;
+    public bool HasField7 {
+      get { return hasField7; }
+    }
+    public bool Field7 {
+      get { return field7_; }
+    }
+    
+    public const int Field8FieldNumber = 8;
+    private bool hasField8;
+    private float field8_;
+    public bool HasField8 {
+      get { return hasField8; }
+    }
+    public float Field8 {
+      get { return field8_; }
+    }
+    
+    public const int Field9FieldNumber = 9;
+    private bool hasField9;
+    private bool field9_;
+    public bool HasField9 {
+      get { return hasField9; }
+    }
+    public bool Field9 {
+      get { return field9_; }
+    }
+    
+    public const int Field10FieldNumber = 10;
+    private bool hasField10;
+    private float field10_;
+    public bool HasField10 {
+      get { return hasField10; }
+    }
+    public float Field10 {
+      get { return field10_; }
+    }
+    
+    public const int Field11FieldNumber = 11;
+    private bool hasField11;
+    private long field11_;
+    public bool HasField11 {
+      get { return hasField11; }
+    }
+    public long Field11 {
+      get { return field11_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _speedMessage2GroupedMessageFieldNames;
+      if (hasField1) {
+        output.WriteFloat(1, field_names[0], Field1);
+      }
+      if (hasField2) {
+        output.WriteFloat(2, field_names[3], Field2);
+      }
+      if (hasField3) {
+        output.WriteFloat(3, field_names[4], Field3);
+      }
+      if (hasField4) {
+        output.WriteBool(4, field_names[5], Field4);
+      }
+      if (hasField5) {
+        output.WriteBool(5, field_names[6], Field5);
+      }
+      if (hasField6) {
+        output.WriteBool(6, field_names[7], Field6);
+      }
+      if (hasField7) {
+        output.WriteBool(7, field_names[8], Field7);
+      }
+      if (hasField8) {
+        output.WriteFloat(8, field_names[9], Field8);
+      }
+      if (hasField9) {
+        output.WriteBool(9, field_names[10], Field9);
+      }
+      if (hasField10) {
+        output.WriteFloat(10, field_names[1], Field10);
+      }
+      if (hasField11) {
+        output.WriteInt64(11, field_names[2], Field11);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+      
+      size = 0;
+      if (hasField1) {
+        size += pb::CodedOutputStream.ComputeFloatSize(1, Field1);
+      }
+      if (hasField2) {
+        size += pb::CodedOutputStream.ComputeFloatSize(2, Field2);
+      }
+      if (hasField3) {
+        size += pb::CodedOutputStream.ComputeFloatSize(3, Field3);
+      }
+      if (hasField4) {
+        size += pb::CodedOutputStream.ComputeBoolSize(4, Field4);
+      }
+      if (hasField5) {
+        size += pb::CodedOutputStream.ComputeBoolSize(5, Field5);
+      }
+      if (hasField6) {
+        size += pb::CodedOutputStream.ComputeBoolSize(6, Field6);
+      }
+      if (hasField7) {
+        size += pb::CodedOutputStream.ComputeBoolSize(7, Field7);
+      }
+      if (hasField8) {
+        size += pb::CodedOutputStream.ComputeFloatSize(8, Field8);
+      }
+      if (hasField9) {
+        size += pb::CodedOutputStream.ComputeBoolSize(9, Field9);
+      }
+      if (hasField10) {
+        size += pb::CodedOutputStream.ComputeFloatSize(10, Field10);
+      }
+      if (hasField11) {
+        size += pb::CodedOutputStream.ComputeInt64Size(11, Field11);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static SpeedMessage2GroupedMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SpeedMessage2GroupedMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage2GroupedMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SpeedMessage2GroupedMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage2GroupedMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SpeedMessage2GroupedMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage2GroupedMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static SpeedMessage2GroupedMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static SpeedMessage2GroupedMessage ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SpeedMessage2GroupedMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private SpeedMessage2GroupedMessage MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(SpeedMessage2GroupedMessage prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<SpeedMessage2GroupedMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(SpeedMessage2GroupedMessage cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private SpeedMessage2GroupedMessage result;
+      
+      private SpeedMessage2GroupedMessage PrepareBuilder() {
+        if (resultIsReadOnly) {
+          SpeedMessage2GroupedMessage original = result;
+          result = new SpeedMessage2GroupedMessage();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override SpeedMessage2GroupedMessage MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2GroupedMessage.Descriptor; }
+      }
+      
+      public override SpeedMessage2GroupedMessage DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2GroupedMessage.DefaultInstance; }
+      }
+      
+      public override SpeedMessage2GroupedMessage BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is SpeedMessage2GroupedMessage) {
+          return MergeFrom((SpeedMessage2GroupedMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(SpeedMessage2GroupedMessage other) {
+        if (other == global::Google.ProtocolBuffers.ProtoBench.SpeedMessage2GroupedMessage.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasField1) {
+          Field1 = other.Field1;
+        }
+        if (other.HasField2) {
+          Field2 = other.Field2;
+        }
+        if (other.HasField3) {
+          Field3 = other.Field3;
+        }
+        if (other.HasField4) {
+          Field4 = other.Field4;
+        }
+        if (other.HasField5) {
+          Field5 = other.Field5;
+        }
+        if (other.HasField6) {
+          Field6 = other.Field6;
+        }
+        if (other.HasField7) {
+          Field7 = other.Field7;
+        }
+        if (other.HasField8) {
+          Field8 = other.Field8;
+        }
+        if (other.HasField9) {
+          Field9 = other.Field9;
+        }
+        if (other.HasField10) {
+          Field10 = other.Field10;
+        }
+        if (other.HasField11) {
+          Field11 = other.Field11;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_speedMessage2GroupedMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _speedMessage2GroupedMessageFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 13: {
+              result.hasField1 = input.ReadFloat(ref result.field1_);
+              break;
+            }
+            case 21: {
+              result.hasField2 = input.ReadFloat(ref result.field2_);
+              break;
+            }
+            case 29: {
+              result.hasField3 = input.ReadFloat(ref result.field3_);
+              break;
+            }
+            case 32: {
+              result.hasField4 = input.ReadBool(ref result.field4_);
+              break;
+            }
+            case 40: {
+              result.hasField5 = input.ReadBool(ref result.field5_);
+              break;
+            }
+            case 48: {
+              result.hasField6 = input.ReadBool(ref result.field6_);
+              break;
+            }
+            case 56: {
+              result.hasField7 = input.ReadBool(ref result.field7_);
+              break;
+            }
+            case 69: {
+              result.hasField8 = input.ReadFloat(ref result.field8_);
+              break;
+            }
+            case 72: {
+              result.hasField9 = input.ReadBool(ref result.field9_);
+              break;
+            }
+            case 85: {
+              result.hasField10 = input.ReadFloat(ref result.field10_);
+              break;
+            }
+            case 88: {
+              result.hasField11 = input.ReadInt64(ref result.field11_);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public bool HasField1 {
+        get { return result.hasField1; }
+      }
+      public float Field1 {
+        get { return result.Field1; }
+        set { SetField1(value); }
+      }
+      public Builder SetField1(float value) {
+        PrepareBuilder();
+        result.hasField1 = true;
+        result.field1_ = value;
+        return this;
+      }
+      public Builder ClearField1() {
+        PrepareBuilder();
+        result.hasField1 = false;
+        result.field1_ = 0F;
+        return this;
+      }
+      
+      public bool HasField2 {
+        get { return result.hasField2; }
+      }
+      public float Field2 {
+        get { return result.Field2; }
+        set { SetField2(value); }
+      }
+      public Builder SetField2(float value) {
+        PrepareBuilder();
+        result.hasField2 = true;
+        result.field2_ = value;
+        return this;
+      }
+      public Builder ClearField2() {
+        PrepareBuilder();
+        result.hasField2 = false;
+        result.field2_ = 0F;
+        return this;
+      }
+      
+      public bool HasField3 {
+        get { return result.hasField3; }
+      }
+      public float Field3 {
+        get { return result.Field3; }
+        set { SetField3(value); }
+      }
+      public Builder SetField3(float value) {
+        PrepareBuilder();
+        result.hasField3 = true;
+        result.field3_ = value;
+        return this;
+      }
+      public Builder ClearField3() {
+        PrepareBuilder();
+        result.hasField3 = false;
+        result.field3_ = 0F;
+        return this;
+      }
+      
+      public bool HasField4 {
+        get { return result.hasField4; }
+      }
+      public bool Field4 {
+        get { return result.Field4; }
+        set { SetField4(value); }
+      }
+      public Builder SetField4(bool value) {
+        PrepareBuilder();
+        result.hasField4 = true;
+        result.field4_ = value;
+        return this;
+      }
+      public Builder ClearField4() {
+        PrepareBuilder();
+        result.hasField4 = false;
+        result.field4_ = false;
+        return this;
+      }
+      
+      public bool HasField5 {
+        get { return result.hasField5; }
+      }
+      public bool Field5 {
+        get { return result.Field5; }
+        set { SetField5(value); }
+      }
+      public Builder SetField5(bool value) {
+        PrepareBuilder();
+        result.hasField5 = true;
+        result.field5_ = value;
+        return this;
+      }
+      public Builder ClearField5() {
+        PrepareBuilder();
+        result.hasField5 = false;
+        result.field5_ = false;
+        return this;
+      }
+      
+      public bool HasField6 {
+        get { return result.hasField6; }
+      }
+      public bool Field6 {
+        get { return result.Field6; }
+        set { SetField6(value); }
+      }
+      public Builder SetField6(bool value) {
+        PrepareBuilder();
+        result.hasField6 = true;
+        result.field6_ = value;
+        return this;
+      }
+      public Builder ClearField6() {
+        PrepareBuilder();
+        result.hasField6 = false;
+        result.field6_ = true;
+        return this;
+      }
+      
+      public bool HasField7 {
+        get { return result.hasField7; }
+      }
+      public bool Field7 {
+        get { return result.Field7; }
+        set { SetField7(value); }
+      }
+      public Builder SetField7(bool value) {
+        PrepareBuilder();
+        result.hasField7 = true;
+        result.field7_ = value;
+        return this;
+      }
+      public Builder ClearField7() {
+        PrepareBuilder();
+        result.hasField7 = false;
+        result.field7_ = false;
+        return this;
+      }
+      
+      public bool HasField8 {
+        get { return result.hasField8; }
+      }
+      public float Field8 {
+        get { return result.Field8; }
+        set { SetField8(value); }
+      }
+      public Builder SetField8(float value) {
+        PrepareBuilder();
+        result.hasField8 = true;
+        result.field8_ = value;
+        return this;
+      }
+      public Builder ClearField8() {
+        PrepareBuilder();
+        result.hasField8 = false;
+        result.field8_ = 0F;
+        return this;
+      }
+      
+      public bool HasField9 {
+        get { return result.hasField9; }
+      }
+      public bool Field9 {
+        get { return result.Field9; }
+        set { SetField9(value); }
+      }
+      public Builder SetField9(bool value) {
+        PrepareBuilder();
+        result.hasField9 = true;
+        result.field9_ = value;
+        return this;
+      }
+      public Builder ClearField9() {
+        PrepareBuilder();
+        result.hasField9 = false;
+        result.field9_ = false;
+        return this;
+      }
+      
+      public bool HasField10 {
+        get { return result.hasField10; }
+      }
+      public float Field10 {
+        get { return result.Field10; }
+        set { SetField10(value); }
+      }
+      public Builder SetField10(float value) {
+        PrepareBuilder();
+        result.hasField10 = true;
+        result.field10_ = value;
+        return this;
+      }
+      public Builder ClearField10() {
+        PrepareBuilder();
+        result.hasField10 = false;
+        result.field10_ = 0F;
+        return this;
+      }
+      
+      public bool HasField11 {
+        get { return result.hasField11; }
+      }
+      public long Field11 {
+        get { return result.Field11; }
+        set { SetField11(value); }
+      }
+      public Builder SetField11(long value) {
+        PrepareBuilder();
+        result.hasField11 = true;
+        result.field11_ = value;
+        return this;
+      }
+      public Builder ClearField11() {
+        PrepareBuilder();
+        result.hasField11 = false;
+        result.field11_ = 0L;
+        return this;
+      }
+    }
+    static SpeedMessage2GroupedMessage() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.ProtoBench.GoogleSpeedProtoFile.Descriptor, null);
+    }
+  }
+  
+  #endregion
+  
+}
+
+#endregion Designer generated code

+ 346 - 0
csharp/src/ProtoBench/TestProtos/UnitTestImportProtoFile.cs

@@ -0,0 +1,346 @@
+// Generated by ProtoGen, Version=2.4.1.555, Culture=neutral, PublicKeyToken=55f7125234beb589.  DO NOT EDIT!
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.ProtocolBuffers;
+using pbc = global::Google.ProtocolBuffers.Collections;
+using pbd = global::Google.ProtocolBuffers.Descriptors;
+using scg = global::System.Collections.Generic;
+namespace Google.ProtocolBuffers.TestProtos {
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public static partial class UnitTestImportProtoFile {
+  
+    #region Extension registration
+    public static void RegisterAllExtensions(pb::ExtensionRegistry registry) {
+    }
+    #endregion
+    #region Static variables
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_import_ImportMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.ImportMessage, global::Google.ProtocolBuffers.TestProtos.ImportMessage.Builder> internal__static_protobuf_unittest_import_ImportMessage__FieldAccessorTable;
+    #endregion
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbd::FileDescriptor descriptor;
+    
+    static UnitTestImportProtoFile() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "CiVnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnByb3RvEhhwcm90", 
+            "b2J1Zl91bml0dGVzdF9pbXBvcnQaJGdvb2dsZS9wcm90b2J1Zi9jc2hhcnBf", 
+            "b3B0aW9ucy5wcm90byIaCg1JbXBvcnRNZXNzYWdlEgkKAWQYASABKAUqPAoK", 
+            "SW1wb3J0RW51bRIOCgpJTVBPUlRfRk9PEAcSDgoKSU1QT1JUX0JBUhAIEg4K", 
+            "CklNUE9SVF9CQVoQCUJbChhjb20uZ29vZ2xlLnByb3RvYnVmLnRlc3RIAcI+", 
+            "PAohR29vZ2xlLlByb3RvY29sQnVmZmVycy5UZXN0UHJvdG9zEhdVbml0VGVz", 
+          "dEltcG9ydFByb3RvRmlsZQ=="));
+      pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) {
+        descriptor = root;
+        internal__static_protobuf_unittest_import_ImportMessage__Descriptor = Descriptor.MessageTypes[0];
+        internal__static_protobuf_unittest_import_ImportMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.ImportMessage, global::Google.ProtocolBuffers.TestProtos.ImportMessage.Builder>(internal__static_protobuf_unittest_import_ImportMessage__Descriptor,
+                new string[] { "D", });
+        pb::ExtensionRegistry registry = pb::ExtensionRegistry.CreateInstance();
+        RegisterAllExtensions(registry);
+        global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.RegisterAllExtensions(registry);
+        return registry;
+      };
+      pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,
+          new pbd::FileDescriptor[] {
+          global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.Descriptor, 
+          }, assigner);
+    }
+    #endregion
+    
+  }
+  #region Enums
+  public enum ImportEnum {
+    IMPORT_FOO = 7,
+    IMPORT_BAR = 8,
+    IMPORT_BAZ = 9,
+  }
+  
+  #endregion
+  
+  #region Messages
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class ImportMessage : pb::GeneratedMessage<ImportMessage, ImportMessage.Builder> {
+    private ImportMessage() { }
+    private static readonly ImportMessage defaultInstance = new ImportMessage().MakeReadOnly();
+    private static readonly string[] _importMessageFieldNames = new string[] { "d" };
+    private static readonly uint[] _importMessageFieldTags = new uint[] { 8 };
+    public static ImportMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override ImportMessage DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override ImportMessage ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestImportProtoFile.internal__static_protobuf_unittest_import_ImportMessage__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<ImportMessage, ImportMessage.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestImportProtoFile.internal__static_protobuf_unittest_import_ImportMessage__FieldAccessorTable; }
+    }
+    
+    public const int DFieldNumber = 1;
+    private bool hasD;
+    private int d_;
+    public bool HasD {
+      get { return hasD; }
+    }
+    public int D {
+      get { return d_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _importMessageFieldNames;
+      if (hasD) {
+        output.WriteInt32(1, field_names[0], D);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      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 ImportMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static ImportMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static ImportMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static ImportMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static ImportMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static ImportMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static ImportMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static ImportMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static ImportMessage ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static ImportMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private ImportMessage MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(ImportMessage prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<ImportMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(ImportMessage cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private ImportMessage result;
+      
+      private ImportMessage PrepareBuilder() {
+        if (resultIsReadOnly) {
+          ImportMessage original = result;
+          result = new ImportMessage();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override ImportMessage MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.ImportMessage.Descriptor; }
+      }
+      
+      public override ImportMessage DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.ImportMessage.DefaultInstance; }
+      }
+      
+      public override ImportMessage BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is ImportMessage) {
+          return MergeFrom((ImportMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(ImportMessage other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.ImportMessage.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasD) {
+          D = other.D;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_importMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _importMessageFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasD = input.ReadInt32(ref result.d_);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public bool HasD {
+        get { return result.hasD; }
+      }
+      public int D {
+        get { return result.D; }
+        set { SetD(value); }
+      }
+      public Builder SetD(int value) {
+        PrepareBuilder();
+        result.hasD = true;
+        result.d_ = value;
+        return this;
+      }
+      public Builder ClearD() {
+        PrepareBuilder();
+        result.hasD = false;
+        result.d_ = 0;
+        return this;
+      }
+    }
+    static ImportMessage() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestImportProtoFile.Descriptor, null);
+    }
+  }
+  
+  #endregion
+  
+}
+
+#endregion Designer generated code

+ 21602 - 0
csharp/src/ProtoBench/TestProtos/UnitTestProtoFile.cs

@@ -0,0 +1,21602 @@
+// Generated by ProtoGen, Version=2.4.1.555, Culture=neutral, PublicKeyToken=55f7125234beb589.  DO NOT EDIT!
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.ProtocolBuffers;
+using pbc = global::Google.ProtocolBuffers.Collections;
+using pbd = global::Google.ProtocolBuffers.Descriptors;
+using scg = global::System.Collections.Generic;
+namespace Google.ProtocolBuffers.TestProtos {
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public static partial class UnitTestProtoFile {
+  
+    #region Extension registration
+    public static void RegisterAllExtensions(pb::ExtensionRegistry registry) {
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalInt32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalInt64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalUint32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalUint64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalSint32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalSint64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalFixed32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalFixed64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalSfixed32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalSfixed64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalFloatExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalDoubleExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalBoolExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalStringExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalBytesExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalGroupExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalNestedMessageExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalForeignMessageExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalImportMessageExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalNestedEnumExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalForeignEnumExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalImportEnumExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalStringPieceExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalCordExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedInt32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedInt64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedUint32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedUint64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedSint32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedSint64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedFixed32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedFixed64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedSfixed32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedSfixed64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedFloatExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedDoubleExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedBoolExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedStringExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedBytesExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedGroupExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedNestedMessageExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedForeignMessageExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedImportMessageExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedNestedEnumExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedForeignEnumExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedImportEnumExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedStringPieceExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedCordExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultInt32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultInt64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultUint32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultUint64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultSint32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultSint64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultFixed32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultFixed64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultSfixed32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultSfixed64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultFloatExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultDoubleExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultBoolExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultStringExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultBytesExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultNestedEnumExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultForeignEnumExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultImportEnumExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultStringPieceExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultCordExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.MyExtensionString);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.MyExtensionInt);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.PackedInt32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.PackedInt64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.PackedUint32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.PackedUint64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.PackedSint32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.PackedSint64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.PackedFixed32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.PackedFixed64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.PackedSfixed32Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.PackedSfixed64Extension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.PackedFloatExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.PackedDoubleExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.PackedBoolExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.PackedEnumExtension);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.TestNestedExtension.Test);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.TestRequired.Single);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.TestRequired.Multi);
+    }
+    #endregion
+    #region Extensions
+    public const int OptionalInt32ExtensionFieldNumber = 1;
+    public static pb::GeneratedExtensionBase<int> OptionalInt32Extension;
+    public const int OptionalInt64ExtensionFieldNumber = 2;
+    public static pb::GeneratedExtensionBase<long> OptionalInt64Extension;
+    public const int OptionalUint32ExtensionFieldNumber = 3;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<uint> OptionalUint32Extension;
+    public const int OptionalUint64ExtensionFieldNumber = 4;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<ulong> OptionalUint64Extension;
+    public const int OptionalSint32ExtensionFieldNumber = 5;
+    public static pb::GeneratedExtensionBase<int> OptionalSint32Extension;
+    public const int OptionalSint64ExtensionFieldNumber = 6;
+    public static pb::GeneratedExtensionBase<long> OptionalSint64Extension;
+    public const int OptionalFixed32ExtensionFieldNumber = 7;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<uint> OptionalFixed32Extension;
+    public const int OptionalFixed64ExtensionFieldNumber = 8;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<ulong> OptionalFixed64Extension;
+    public const int OptionalSfixed32ExtensionFieldNumber = 9;
+    public static pb::GeneratedExtensionBase<int> OptionalSfixed32Extension;
+    public const int OptionalSfixed64ExtensionFieldNumber = 10;
+    public static pb::GeneratedExtensionBase<long> OptionalSfixed64Extension;
+    public const int OptionalFloatExtensionFieldNumber = 11;
+    public static pb::GeneratedExtensionBase<float> OptionalFloatExtension;
+    public const int OptionalDoubleExtensionFieldNumber = 12;
+    public static pb::GeneratedExtensionBase<double> OptionalDoubleExtension;
+    public const int OptionalBoolExtensionFieldNumber = 13;
+    public static pb::GeneratedExtensionBase<bool> OptionalBoolExtension;
+    public const int OptionalStringExtensionFieldNumber = 14;
+    public static pb::GeneratedExtensionBase<string> OptionalStringExtension;
+    public const int OptionalBytesExtensionFieldNumber = 15;
+    public static pb::GeneratedExtensionBase<pb::ByteString> OptionalBytesExtension;
+    public const int OptionalGroupExtensionFieldNumber = 16;
+    public static pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.TestProtos.OptionalGroup_extension> OptionalGroupExtension;
+    public const int OptionalNestedMessageExtensionFieldNumber = 18;
+    public static pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage> OptionalNestedMessageExtension;
+    public const int OptionalForeignMessageExtensionFieldNumber = 19;
+    public static pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> OptionalForeignMessageExtension;
+    public const int OptionalImportMessageExtensionFieldNumber = 20;
+    public static pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.TestProtos.ImportMessage> OptionalImportMessageExtension;
+    public const int OptionalNestedEnumExtensionFieldNumber = 21;
+    public static pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum> OptionalNestedEnumExtension;
+    public const int OptionalForeignEnumExtensionFieldNumber = 22;
+    public static pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> OptionalForeignEnumExtension;
+    public const int OptionalImportEnumExtensionFieldNumber = 23;
+    public static pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.TestProtos.ImportEnum> OptionalImportEnumExtension;
+    public const int OptionalStringPieceExtensionFieldNumber = 24;
+    public static pb::GeneratedExtensionBase<string> OptionalStringPieceExtension;
+    public const int OptionalCordExtensionFieldNumber = 25;
+    public static pb::GeneratedExtensionBase<string> OptionalCordExtension;
+    public const int RepeatedInt32ExtensionFieldNumber = 31;
+    public static pb::GeneratedExtensionBase<scg::IList<int>> RepeatedInt32Extension;
+    public const int RepeatedInt64ExtensionFieldNumber = 32;
+    public static pb::GeneratedExtensionBase<scg::IList<long>> RepeatedInt64Extension;
+    public const int RepeatedUint32ExtensionFieldNumber = 33;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<scg::IList<uint>> RepeatedUint32Extension;
+    public const int RepeatedUint64ExtensionFieldNumber = 34;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<scg::IList<ulong>> RepeatedUint64Extension;
+    public const int RepeatedSint32ExtensionFieldNumber = 35;
+    public static pb::GeneratedExtensionBase<scg::IList<int>> RepeatedSint32Extension;
+    public const int RepeatedSint64ExtensionFieldNumber = 36;
+    public static pb::GeneratedExtensionBase<scg::IList<long>> RepeatedSint64Extension;
+    public const int RepeatedFixed32ExtensionFieldNumber = 37;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<scg::IList<uint>> RepeatedFixed32Extension;
+    public const int RepeatedFixed64ExtensionFieldNumber = 38;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<scg::IList<ulong>> RepeatedFixed64Extension;
+    public const int RepeatedSfixed32ExtensionFieldNumber = 39;
+    public static pb::GeneratedExtensionBase<scg::IList<int>> RepeatedSfixed32Extension;
+    public const int RepeatedSfixed64ExtensionFieldNumber = 40;
+    public static pb::GeneratedExtensionBase<scg::IList<long>> RepeatedSfixed64Extension;
+    public const int RepeatedFloatExtensionFieldNumber = 41;
+    public static pb::GeneratedExtensionBase<scg::IList<float>> RepeatedFloatExtension;
+    public const int RepeatedDoubleExtensionFieldNumber = 42;
+    public static pb::GeneratedExtensionBase<scg::IList<double>> RepeatedDoubleExtension;
+    public const int RepeatedBoolExtensionFieldNumber = 43;
+    public static pb::GeneratedExtensionBase<scg::IList<bool>> RepeatedBoolExtension;
+    public const int RepeatedStringExtensionFieldNumber = 44;
+    public static pb::GeneratedExtensionBase<scg::IList<string>> RepeatedStringExtension;
+    public const int RepeatedBytesExtensionFieldNumber = 45;
+    public static pb::GeneratedExtensionBase<scg::IList<pb::ByteString>> RepeatedBytesExtension;
+    public const int RepeatedGroupExtensionFieldNumber = 46;
+    public static pb::GeneratedExtensionBase<scg::IList<global::Google.ProtocolBuffers.TestProtos.RepeatedGroup_extension>> RepeatedGroupExtension;
+    public const int RepeatedNestedMessageExtensionFieldNumber = 48;
+    public static pb::GeneratedExtensionBase<scg::IList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage>> RepeatedNestedMessageExtension;
+    public const int RepeatedForeignMessageExtensionFieldNumber = 49;
+    public static pb::GeneratedExtensionBase<scg::IList<global::Google.ProtocolBuffers.TestProtos.ForeignMessage>> RepeatedForeignMessageExtension;
+    public const int RepeatedImportMessageExtensionFieldNumber = 50;
+    public static pb::GeneratedExtensionBase<scg::IList<global::Google.ProtocolBuffers.TestProtos.ImportMessage>> RepeatedImportMessageExtension;
+    public const int RepeatedNestedEnumExtensionFieldNumber = 51;
+    public static pb::GeneratedExtensionBase<scg::IList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum>> RepeatedNestedEnumExtension;
+    public const int RepeatedForeignEnumExtensionFieldNumber = 52;
+    public static pb::GeneratedExtensionBase<scg::IList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum>> RepeatedForeignEnumExtension;
+    public const int RepeatedImportEnumExtensionFieldNumber = 53;
+    public static pb::GeneratedExtensionBase<scg::IList<global::Google.ProtocolBuffers.TestProtos.ImportEnum>> RepeatedImportEnumExtension;
+    public const int RepeatedStringPieceExtensionFieldNumber = 54;
+    public static pb::GeneratedExtensionBase<scg::IList<string>> RepeatedStringPieceExtension;
+    public const int RepeatedCordExtensionFieldNumber = 55;
+    public static pb::GeneratedExtensionBase<scg::IList<string>> RepeatedCordExtension;
+    public const int DefaultInt32ExtensionFieldNumber = 61;
+    public static pb::GeneratedExtensionBase<int> DefaultInt32Extension;
+    public const int DefaultInt64ExtensionFieldNumber = 62;
+    public static pb::GeneratedExtensionBase<long> DefaultInt64Extension;
+    public const int DefaultUint32ExtensionFieldNumber = 63;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<uint> DefaultUint32Extension;
+    public const int DefaultUint64ExtensionFieldNumber = 64;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<ulong> DefaultUint64Extension;
+    public const int DefaultSint32ExtensionFieldNumber = 65;
+    public static pb::GeneratedExtensionBase<int> DefaultSint32Extension;
+    public const int DefaultSint64ExtensionFieldNumber = 66;
+    public static pb::GeneratedExtensionBase<long> DefaultSint64Extension;
+    public const int DefaultFixed32ExtensionFieldNumber = 67;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<uint> DefaultFixed32Extension;
+    public const int DefaultFixed64ExtensionFieldNumber = 68;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<ulong> DefaultFixed64Extension;
+    public const int DefaultSfixed32ExtensionFieldNumber = 69;
+    public static pb::GeneratedExtensionBase<int> DefaultSfixed32Extension;
+    public const int DefaultSfixed64ExtensionFieldNumber = 70;
+    public static pb::GeneratedExtensionBase<long> DefaultSfixed64Extension;
+    public const int DefaultFloatExtensionFieldNumber = 71;
+    public static pb::GeneratedExtensionBase<float> DefaultFloatExtension;
+    public const int DefaultDoubleExtensionFieldNumber = 72;
+    public static pb::GeneratedExtensionBase<double> DefaultDoubleExtension;
+    public const int DefaultBoolExtensionFieldNumber = 73;
+    public static pb::GeneratedExtensionBase<bool> DefaultBoolExtension;
+    public const int DefaultStringExtensionFieldNumber = 74;
+    public static pb::GeneratedExtensionBase<string> DefaultStringExtension;
+    public const int DefaultBytesExtensionFieldNumber = 75;
+    public static pb::GeneratedExtensionBase<pb::ByteString> DefaultBytesExtension;
+    public const int DefaultNestedEnumExtensionFieldNumber = 81;
+    public static pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum> DefaultNestedEnumExtension;
+    public const int DefaultForeignEnumExtensionFieldNumber = 82;
+    public static pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> DefaultForeignEnumExtension;
+    public const int DefaultImportEnumExtensionFieldNumber = 83;
+    public static pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.TestProtos.ImportEnum> DefaultImportEnumExtension;
+    public const int DefaultStringPieceExtensionFieldNumber = 84;
+    public static pb::GeneratedExtensionBase<string> DefaultStringPieceExtension;
+    public const int DefaultCordExtensionFieldNumber = 85;
+    public static pb::GeneratedExtensionBase<string> DefaultCordExtension;
+    public const int MyExtensionStringFieldNumber = 50;
+    public static pb::GeneratedExtensionBase<string> MyExtensionString;
+    public const int MyExtensionIntFieldNumber = 5;
+    public static pb::GeneratedExtensionBase<int> MyExtensionInt;
+    public const int PackedInt32ExtensionFieldNumber = 90;
+    public static pb::GeneratedExtensionBase<scg::IList<int>> PackedInt32Extension;
+    public const int PackedInt64ExtensionFieldNumber = 91;
+    public static pb::GeneratedExtensionBase<scg::IList<long>> PackedInt64Extension;
+    public const int PackedUint32ExtensionFieldNumber = 92;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<scg::IList<uint>> PackedUint32Extension;
+    public const int PackedUint64ExtensionFieldNumber = 93;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<scg::IList<ulong>> PackedUint64Extension;
+    public const int PackedSint32ExtensionFieldNumber = 94;
+    public static pb::GeneratedExtensionBase<scg::IList<int>> PackedSint32Extension;
+    public const int PackedSint64ExtensionFieldNumber = 95;
+    public static pb::GeneratedExtensionBase<scg::IList<long>> PackedSint64Extension;
+    public const int PackedFixed32ExtensionFieldNumber = 96;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<scg::IList<uint>> PackedFixed32Extension;
+    public const int PackedFixed64ExtensionFieldNumber = 97;
+    [global::System.CLSCompliant(false)]
+    public static pb::GeneratedExtensionBase<scg::IList<ulong>> PackedFixed64Extension;
+    public const int PackedSfixed32ExtensionFieldNumber = 98;
+    public static pb::GeneratedExtensionBase<scg::IList<int>> PackedSfixed32Extension;
+    public const int PackedSfixed64ExtensionFieldNumber = 99;
+    public static pb::GeneratedExtensionBase<scg::IList<long>> PackedSfixed64Extension;
+    public const int PackedFloatExtensionFieldNumber = 100;
+    public static pb::GeneratedExtensionBase<scg::IList<float>> PackedFloatExtension;
+    public const int PackedDoubleExtensionFieldNumber = 101;
+    public static pb::GeneratedExtensionBase<scg::IList<double>> PackedDoubleExtension;
+    public const int PackedBoolExtensionFieldNumber = 102;
+    public static pb::GeneratedExtensionBase<scg::IList<bool>> PackedBoolExtension;
+    public const int PackedEnumExtensionFieldNumber = 103;
+    public static pb::GeneratedExtensionBase<scg::IList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum>> PackedEnumExtension;
+    #endregion
+    
+    #region Static variables
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestAllTypes__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder> internal__static_protobuf_unittest_TestAllTypes__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestAllTypes_NestedMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Builder> internal__static_protobuf_unittest_TestAllTypes_NestedMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.Builder> internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup.Builder> internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestDeprecatedFields__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestDeprecatedFields, global::Google.ProtocolBuffers.TestProtos.TestDeprecatedFields.Builder> internal__static_protobuf_unittest_TestDeprecatedFields__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_ForeignMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.ForeignMessage, global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder> internal__static_protobuf_unittest_ForeignMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestAllExtensions__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestAllExtensions, global::Google.ProtocolBuffers.TestProtos.TestAllExtensions.Builder> internal__static_protobuf_unittest_TestAllExtensions__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_OptionalGroup_extension__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.OptionalGroup_extension, global::Google.ProtocolBuffers.TestProtos.OptionalGroup_extension.Builder> internal__static_protobuf_unittest_OptionalGroup_extension__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_RepeatedGroup_extension__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.RepeatedGroup_extension, global::Google.ProtocolBuffers.TestProtos.RepeatedGroup_extension.Builder> internal__static_protobuf_unittest_RepeatedGroup_extension__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestNestedExtension__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestNestedExtension, global::Google.ProtocolBuffers.TestProtos.TestNestedExtension.Builder> internal__static_protobuf_unittest_TestNestedExtension__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestRequired__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestRequired, global::Google.ProtocolBuffers.TestProtos.TestRequired.Builder> internal__static_protobuf_unittest_TestRequired__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestRequiredForeign__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestRequiredForeign, global::Google.ProtocolBuffers.TestProtos.TestRequiredForeign.Builder> internal__static_protobuf_unittest_TestRequiredForeign__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestForeignNested__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestForeignNested, global::Google.ProtocolBuffers.TestProtos.TestForeignNested.Builder> internal__static_protobuf_unittest_TestForeignNested__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestEmptyMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestEmptyMessage, global::Google.ProtocolBuffers.TestProtos.TestEmptyMessage.Builder> internal__static_protobuf_unittest_TestEmptyMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestEmptyMessageWithExtensions, global::Google.ProtocolBuffers.TestProtos.TestEmptyMessageWithExtensions.Builder> internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestMultipleExtensionRanges__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestMultipleExtensionRanges, global::Google.ProtocolBuffers.TestProtos.TestMultipleExtensionRanges.Builder> internal__static_protobuf_unittest_TestMultipleExtensionRanges__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestReallyLargeTagNumber__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestReallyLargeTagNumber, global::Google.ProtocolBuffers.TestProtos.TestReallyLargeTagNumber.Builder> internal__static_protobuf_unittest_TestReallyLargeTagNumber__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestRecursiveMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage, global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.Builder> internal__static_protobuf_unittest_TestRecursiveMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestMutualRecursionA__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA, global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.Builder> internal__static_protobuf_unittest_TestMutualRecursionA__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestMutualRecursionB__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB, global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.Builder> internal__static_protobuf_unittest_TestMutualRecursionB__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber, global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Builder> internal__static_protobuf_unittest_TestDupFieldNumber__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestDupFieldNumber_Foo__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo, global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.Builder> internal__static_protobuf_unittest_TestDupFieldNumber_Foo__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestDupFieldNumber_Bar__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar, global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.Builder> internal__static_protobuf_unittest_TestDupFieldNumber_Bar__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestNestedMessageHasBits__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits, global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Builder> internal__static_protobuf_unittest_TestNestedMessageHasBits__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage, global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.Builder> internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestCamelCaseFieldNames__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestCamelCaseFieldNames, global::Google.ProtocolBuffers.TestProtos.TestCamelCaseFieldNames.Builder> internal__static_protobuf_unittest_TestCamelCaseFieldNames__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestFieldOrderings__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings, global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.Builder> internal__static_protobuf_unittest_TestFieldOrderings__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestExtremeDefaultValues__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues, global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.Builder> internal__static_protobuf_unittest_TestExtremeDefaultValues__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_SparseEnumMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SparseEnumMessage, global::Google.ProtocolBuffers.TestProtos.SparseEnumMessage.Builder> internal__static_protobuf_unittest_SparseEnumMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_OneString__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.OneString, global::Google.ProtocolBuffers.TestProtos.OneString.Builder> internal__static_protobuf_unittest_OneString__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_OneBytes__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.OneBytes, global::Google.ProtocolBuffers.TestProtos.OneBytes.Builder> internal__static_protobuf_unittest_OneBytes__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestPackedTypes__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestPackedTypes, global::Google.ProtocolBuffers.TestProtos.TestPackedTypes.Builder> internal__static_protobuf_unittest_TestPackedTypes__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestUnpackedTypes__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestUnpackedTypes, global::Google.ProtocolBuffers.TestProtos.TestUnpackedTypes.Builder> internal__static_protobuf_unittest_TestUnpackedTypes__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestPackedExtensions__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestPackedExtensions, global::Google.ProtocolBuffers.TestProtos.TestPackedExtensions.Builder> internal__static_protobuf_unittest_TestPackedExtensions__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestDynamicExtensions__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions, global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Builder> internal__static_protobuf_unittest_TestDynamicExtensions__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestDynamicExtensions_DynamicMessageType__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType, global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType.Builder> internal__static_protobuf_unittest_TestDynamicExtensions_DynamicMessageType__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestRepeatedScalarDifferentTagSizes__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestRepeatedScalarDifferentTagSizes, global::Google.ProtocolBuffers.TestProtos.TestRepeatedScalarDifferentTagSizes.Builder> internal__static_protobuf_unittest_TestRepeatedScalarDifferentTagSizes__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_FooRequest__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.FooRequest, global::Google.ProtocolBuffers.TestProtos.FooRequest.Builder> internal__static_protobuf_unittest_FooRequest__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_FooResponse__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.FooResponse, global::Google.ProtocolBuffers.TestProtos.FooResponse.Builder> internal__static_protobuf_unittest_FooResponse__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_BarRequest__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.BarRequest, global::Google.ProtocolBuffers.TestProtos.BarRequest.Builder> internal__static_protobuf_unittest_BarRequest__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_BarResponse__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.BarResponse, global::Google.ProtocolBuffers.TestProtos.BarResponse.Builder> internal__static_protobuf_unittest_BarResponse__FieldAccessorTable;
+    #endregion
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbd::FileDescriptor descriptor;
+    
+    static UnitTestProtoFile() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Ch5nb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8SEXByb3RvYnVmX3Vu", 
+            "aXR0ZXN0GiRnb29nbGUvcHJvdG9idWYvY3NoYXJwX29wdGlvbnMucHJvdG8a", 
+            "JWdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucHJvdG8iuxUKDFRl", 
+            "c3RBbGxUeXBlcxIWCg5vcHRpb25hbF9pbnQzMhgBIAEoBRIWCg5vcHRpb25h", 
+            "bF9pbnQ2NBgCIAEoAxIXCg9vcHRpb25hbF91aW50MzIYAyABKA0SFwoPb3B0", 
+            "aW9uYWxfdWludDY0GAQgASgEEhcKD29wdGlvbmFsX3NpbnQzMhgFIAEoERIX", 
+            "Cg9vcHRpb25hbF9zaW50NjQYBiABKBISGAoQb3B0aW9uYWxfZml4ZWQzMhgH", 
+            "IAEoBxIYChBvcHRpb25hbF9maXhlZDY0GAggASgGEhkKEW9wdGlvbmFsX3Nm", 
+            "aXhlZDMyGAkgASgPEhkKEW9wdGlvbmFsX3NmaXhlZDY0GAogASgQEhYKDm9w", 
+            "dGlvbmFsX2Zsb2F0GAsgASgCEhcKD29wdGlvbmFsX2RvdWJsZRgMIAEoARIV", 
+            "Cg1vcHRpb25hbF9ib29sGA0gASgIEhcKD29wdGlvbmFsX3N0cmluZxgOIAEo", 
+            "CRIWCg5vcHRpb25hbF9ieXRlcxgPIAEoDBJECg1vcHRpb25hbGdyb3VwGBAg", 
+            "ASgKMi0ucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk9wdGlvbmFs", 
+            "R3JvdXASTgoXb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UYEiABKAsyLS5wcm90", 
+            "b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZRJDChhv", 
+            "cHRpb25hbF9mb3JlaWduX21lc3NhZ2UYEyABKAsyIS5wcm90b2J1Zl91bml0", 
+            "dGVzdC5Gb3JlaWduTWVzc2FnZRJIChdvcHRpb25hbF9pbXBvcnRfbWVzc2Fn", 
+            "ZRgUIAEoCzInLnByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRNZXNz", 
+            "YWdlEkgKFG9wdGlvbmFsX25lc3RlZF9lbnVtGBUgASgOMioucHJvdG9idWZf", 
+            "dW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0SPQoVb3B0aW9uYWxf", 
+            "Zm9yZWlnbl9lbnVtGBYgASgOMh4ucHJvdG9idWZfdW5pdHRlc3QuRm9yZWln", 
+            "bkVudW0SQgoUb3B0aW9uYWxfaW1wb3J0X2VudW0YFyABKA4yJC5wcm90b2J1", 
+            "Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0RW51bRIhChVvcHRpb25hbF9zdHJp", 
+            "bmdfcGllY2UYGCABKAlCAggCEhkKDW9wdGlvbmFsX2NvcmQYGSABKAlCAggB", 
+            "EhYKDnJlcGVhdGVkX2ludDMyGB8gAygFEhYKDnJlcGVhdGVkX2ludDY0GCAg", 
+            "AygDEhcKD3JlcGVhdGVkX3VpbnQzMhghIAMoDRIXCg9yZXBlYXRlZF91aW50", 
+            "NjQYIiADKAQSFwoPcmVwZWF0ZWRfc2ludDMyGCMgAygREhcKD3JlcGVhdGVk", 
+            "X3NpbnQ2NBgkIAMoEhIYChByZXBlYXRlZF9maXhlZDMyGCUgAygHEhgKEHJl", 
+            "cGVhdGVkX2ZpeGVkNjQYJiADKAYSGQoRcmVwZWF0ZWRfc2ZpeGVkMzIYJyAD", 
+            "KA8SGQoRcmVwZWF0ZWRfc2ZpeGVkNjQYKCADKBASFgoOcmVwZWF0ZWRfZmxv", 
+            "YXQYKSADKAISFwoPcmVwZWF0ZWRfZG91YmxlGCogAygBEhUKDXJlcGVhdGVk", 
+            "X2Jvb2wYKyADKAgSFwoPcmVwZWF0ZWRfc3RyaW5nGCwgAygJEhYKDnJlcGVh", 
+            "dGVkX2J5dGVzGC0gAygMEkQKDXJlcGVhdGVkZ3JvdXAYLiADKAoyLS5wcm90", 
+            "b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cBJOChdy", 
+            "ZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZRgwIAMoCzItLnByb3RvYnVmX3VuaXR0", 
+            "ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlEkMKGHJlcGVhdGVkX2Zv", 
+            "cmVpZ25fbWVzc2FnZRgxIAMoCzIhLnByb3RvYnVmX3VuaXR0ZXN0LkZvcmVp", 
+            "Z25NZXNzYWdlEkgKF3JlcGVhdGVkX2ltcG9ydF9tZXNzYWdlGDIgAygLMicu", 
+            "cHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydE1lc3NhZ2USSAoUcmVw", 
+            "ZWF0ZWRfbmVzdGVkX2VudW0YMyADKA4yKi5wcm90b2J1Zl91bml0dGVzdC5U", 
+            "ZXN0QWxsVHlwZXMuTmVzdGVkRW51bRI9ChVyZXBlYXRlZF9mb3JlaWduX2Vu", 
+            "dW0YNCADKA4yHi5wcm90b2J1Zl91bml0dGVzdC5Gb3JlaWduRW51bRJCChRy", 
+            "ZXBlYXRlZF9pbXBvcnRfZW51bRg1IAMoDjIkLnByb3RvYnVmX3VuaXR0ZXN0", 
+            "X2ltcG9ydC5JbXBvcnRFbnVtEiEKFXJlcGVhdGVkX3N0cmluZ19waWVjZRg2", 
+            "IAMoCUICCAISGQoNcmVwZWF0ZWRfY29yZBg3IAMoCUICCAESGQoNZGVmYXVs", 
+            "dF9pbnQzMhg9IAEoBToCNDESGQoNZGVmYXVsdF9pbnQ2NBg+IAEoAzoCNDIS", 
+            "GgoOZGVmYXVsdF91aW50MzIYPyABKA06AjQzEhoKDmRlZmF1bHRfdWludDY0", 
+            "GEAgASgEOgI0NBIbCg5kZWZhdWx0X3NpbnQzMhhBIAEoEToDLTQ1EhoKDmRl", 
+            "ZmF1bHRfc2ludDY0GEIgASgSOgI0NhIbCg9kZWZhdWx0X2ZpeGVkMzIYQyAB", 
+            "KAc6AjQ3EhsKD2RlZmF1bHRfZml4ZWQ2NBhEIAEoBjoCNDgSHAoQZGVmYXVs", 
+            "dF9zZml4ZWQzMhhFIAEoDzoCNDkSHQoQZGVmYXVsdF9zZml4ZWQ2NBhGIAEo", 
+            "EDoDLTUwEhsKDWRlZmF1bHRfZmxvYXQYRyABKAI6BDUxLjUSHQoOZGVmYXVs", 
+            "dF9kb3VibGUYSCABKAE6BTUyMDAwEhoKDGRlZmF1bHRfYm9vbBhJIAEoCDoE", 
+            "dHJ1ZRIdCg5kZWZhdWx0X3N0cmluZxhKIAEoCToFaGVsbG8SHAoNZGVmYXVs", 
+            "dF9ieXRlcxhLIAEoDDoFd29ybGQSTAoTZGVmYXVsdF9uZXN0ZWRfZW51bRhR", 
+            "IAEoDjIqLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRF", 
+            "bnVtOgNCQVISSQoUZGVmYXVsdF9mb3JlaWduX2VudW0YUiABKA4yHi5wcm90", 
+            "b2J1Zl91bml0dGVzdC5Gb3JlaWduRW51bToLRk9SRUlHTl9CQVISTQoTZGVm", 
+            "YXVsdF9pbXBvcnRfZW51bRhTIAEoDjIkLnByb3RvYnVmX3VuaXR0ZXN0X2lt", 
+            "cG9ydC5JbXBvcnRFbnVtOgpJTVBPUlRfQkFSEiUKFGRlZmF1bHRfc3RyaW5n", 
+            "X3BpZWNlGFQgASgJOgNhYmNCAggCEh0KDGRlZmF1bHRfY29yZBhVIAEoCToD", 
+            "MTIzQgIIARobCg1OZXN0ZWRNZXNzYWdlEgoKAmJiGAEgASgFGhoKDU9wdGlv", 
+            "bmFsR3JvdXASCQoBYRgRIAEoBRoaCg1SZXBlYXRlZEdyb3VwEgkKAWEYLyAB", 
+            "KAUiJwoKTmVzdGVkRW51bRIHCgNGT08QARIHCgNCQVIQAhIHCgNCQVoQAyI0", 
+            "ChRUZXN0RGVwcmVjYXRlZEZpZWxkcxIcChBkZXByZWNhdGVkX2ludDMyGAEg", 
+            "ASgFQgIYASIbCg5Gb3JlaWduTWVzc2FnZRIJCgFjGAEgASgFIh0KEVRlc3RB", 
+            "bGxFeHRlbnNpb25zKggIARCAgICAAiIkChdPcHRpb25hbEdyb3VwX2V4dGVu", 
+            "c2lvbhIJCgFhGBEgASgFIiQKF1JlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uEgkK", 
+            "AWEYLyABKAUiUAoTVGVzdE5lc3RlZEV4dGVuc2lvbjI5CgR0ZXN0EiQucHJv", 
+            "dG9idWZfdW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMY6gcgASgJOgR0ZXN0", 
+            "ItUFCgxUZXN0UmVxdWlyZWQSCQoBYRgBIAIoBRIOCgZkdW1teTIYAiABKAUS", 
+            "CQoBYhgDIAIoBRIOCgZkdW1teTQYBCABKAUSDgoGZHVtbXk1GAUgASgFEg4K", 
+            "BmR1bW15NhgGIAEoBRIOCgZkdW1teTcYByABKAUSDgoGZHVtbXk4GAggASgF", 
+            "Eg4KBmR1bW15ORgJIAEoBRIPCgdkdW1teTEwGAogASgFEg8KB2R1bW15MTEY", 
+            "CyABKAUSDwoHZHVtbXkxMhgMIAEoBRIPCgdkdW1teTEzGA0gASgFEg8KB2R1", 
+            "bW15MTQYDiABKAUSDwoHZHVtbXkxNRgPIAEoBRIPCgdkdW1teTE2GBAgASgF", 
+            "Eg8KB2R1bW15MTcYESABKAUSDwoHZHVtbXkxOBgSIAEoBRIPCgdkdW1teTE5", 
+            "GBMgASgFEg8KB2R1bW15MjAYFCABKAUSDwoHZHVtbXkyMRgVIAEoBRIPCgdk", 
+            "dW1teTIyGBYgASgFEg8KB2R1bW15MjMYFyABKAUSDwoHZHVtbXkyNBgYIAEo", 
+            "BRIPCgdkdW1teTI1GBkgASgFEg8KB2R1bW15MjYYGiABKAUSDwoHZHVtbXky", 
+            "NxgbIAEoBRIPCgdkdW1teTI4GBwgASgFEg8KB2R1bW15MjkYHSABKAUSDwoH", 
+            "ZHVtbXkzMBgeIAEoBRIPCgdkdW1teTMxGB8gASgFEg8KB2R1bW15MzIYICAB", 
+            "KAUSCQoBYxghIAIoBTJWCgZzaW5nbGUSJC5wcm90b2J1Zl91bml0dGVzdC5U", 
+            "ZXN0QWxsRXh0ZW5zaW9ucxjoByABKAsyHy5wcm90b2J1Zl91bml0dGVzdC5U", 
+            "ZXN0UmVxdWlyZWQyVQoFbXVsdGkSJC5wcm90b2J1Zl91bml0dGVzdC5UZXN0", 
+            "QWxsRXh0ZW5zaW9ucxjpByADKAsyHy5wcm90b2J1Zl91bml0dGVzdC5UZXN0", 
+            "UmVxdWlyZWQimgEKE1Rlc3RSZXF1aXJlZEZvcmVpZ24SOQoQb3B0aW9uYWxf", 
+            "bWVzc2FnZRgBIAEoCzIfLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RSZXF1aXJl", 
+            "ZBI5ChByZXBlYXRlZF9tZXNzYWdlGAIgAygLMh8ucHJvdG9idWZfdW5pdHRl", 
+            "c3QuVGVzdFJlcXVpcmVkEg0KBWR1bW15GAMgASgFIloKEVRlc3RGb3JlaWdu", 
+            "TmVzdGVkEkUKDmZvcmVpZ25fbmVzdGVkGAEgASgLMi0ucHJvdG9idWZfdW5p", 
+            "dHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UiEgoQVGVzdEVtcHR5", 
+            "TWVzc2FnZSIqCh5UZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMqCAgB", 
+            "EICAgIACIjcKG1Rlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcyoECCoQKyoG", 
+            "CK8gEJQhKgoIgIAEEICAgIACIjQKGFRlc3RSZWFsbHlMYXJnZVRhZ051bWJl", 
+            "chIJCgFhGAEgASgFEg0KAmJiGP///38gASgFIlUKFFRlc3RSZWN1cnNpdmVN", 
+            "ZXNzYWdlEjIKAWEYASABKAsyJy5wcm90b2J1Zl91bml0dGVzdC5UZXN0UmVj", 
+            "dXJzaXZlTWVzc2FnZRIJCgFpGAIgASgFIksKFFRlc3RNdXR1YWxSZWN1cnNp", 
+            "b25BEjMKAmJiGAEgASgLMicucHJvdG9idWZfdW5pdHRlc3QuVGVzdE11dHVh", 
+            "bFJlY3Vyc2lvbkIiYgoUVGVzdE11dHVhbFJlY3Vyc2lvbkISMgoBYRgBIAEo", 
+            "CzInLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RNdXR1YWxSZWN1cnNpb25BEhYK", 
+            "Dm9wdGlvbmFsX2ludDMyGAIgASgFIrMBChJUZXN0RHVwRmllbGROdW1iZXIS", 
+            "CQoBYRgBIAEoBRI2CgNmb28YAiABKAoyKS5wcm90b2J1Zl91bml0dGVzdC5U", 
+            "ZXN0RHVwRmllbGROdW1iZXIuRm9vEjYKA2JhchgDIAEoCjIpLnByb3RvYnVm", 
+            "X3VuaXR0ZXN0LlRlc3REdXBGaWVsZE51bWJlci5CYXIaEAoDRm9vEgkKAWEY", 
+            "ASABKAUaEAoDQmFyEgkKAWEYASABKAUigAIKGFRlc3ROZXN0ZWRNZXNzYWdl", 
+            "SGFzQml0cxJaChdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZRgBIAEoCzI5LnBy", 
+            "b3RvYnVmX3VuaXR0ZXN0LlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cy5OZXN0", 
+            "ZWRNZXNzYWdlGocBCg1OZXN0ZWRNZXNzYWdlEiQKHG5lc3RlZG1lc3NhZ2Vf", 
+            "cmVwZWF0ZWRfaW50MzIYASADKAUSUAolbmVzdGVkbWVzc2FnZV9yZXBlYXRl", 
+            "ZF9mb3JlaWdubWVzc2FnZRgCIAMoCzIhLnByb3RvYnVmX3VuaXR0ZXN0LkZv", 
+            "cmVpZ25NZXNzYWdlIuUDChdUZXN0Q2FtZWxDYXNlRmllbGROYW1lcxIWCg5Q", 
+            "cmltaXRpdmVGaWVsZBgBIAEoBRITCgtTdHJpbmdGaWVsZBgCIAEoCRIxCglF", 
+            "bnVtRmllbGQYAyABKA4yHi5wcm90b2J1Zl91bml0dGVzdC5Gb3JlaWduRW51", 
+            "bRI3CgxNZXNzYWdlRmllbGQYBCABKAsyIS5wcm90b2J1Zl91bml0dGVzdC5G", 
+            "b3JlaWduTWVzc2FnZRIcChBTdHJpbmdQaWVjZUZpZWxkGAUgASgJQgIIAhIV", 
+            "CglDb3JkRmllbGQYBiABKAlCAggBEh4KFlJlcGVhdGVkUHJpbWl0aXZlRmll", 
+            "bGQYByADKAUSGwoTUmVwZWF0ZWRTdHJpbmdGaWVsZBgIIAMoCRI5ChFSZXBl", 
+            "YXRlZEVudW1GaWVsZBgJIAMoDjIeLnByb3RvYnVmX3VuaXR0ZXN0LkZvcmVp", 
+            "Z25FbnVtEj8KFFJlcGVhdGVkTWVzc2FnZUZpZWxkGAogAygLMiEucHJvdG9i", 
+            "dWZfdW5pdHRlc3QuRm9yZWlnbk1lc3NhZ2USJAoYUmVwZWF0ZWRTdHJpbmdQ", 
+            "aWVjZUZpZWxkGAsgAygJQgIIAhIdChFSZXBlYXRlZENvcmRGaWVsZBgMIAMo", 
+            "CUICCAEiVQoSVGVzdEZpZWxkT3JkZXJpbmdzEhEKCW15X3N0cmluZxgLIAEo", 
+            "CRIOCgZteV9pbnQYASABKAMSEAoIbXlfZmxvYXQYZSABKAIqBAgCEAsqBAgM", 
+            "EGUiowUKGFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcxI/Cg1lc2NhcGVkX2J5", 
+            "dGVzGAEgASgMOihcMDAwXDAwMVwwMDdcMDEwXDAxNFxuXHJcdFwwMTNcXFwn", 
+            "XCJcMzc2EiAKDGxhcmdlX3VpbnQzMhgCIAEoDToKNDI5NDk2NzI5NRIqCgxs", 
+            "YXJnZV91aW50NjQYAyABKAQ6FDE4NDQ2NzQ0MDczNzA5NTUxNjE1EiAKC3Nt", 
+            "YWxsX2ludDMyGAQgASgFOgstMjE0NzQ4MzY0NxIpCgtzbWFsbF9pbnQ2NBgF", 
+            "IAEoAzoULTkyMjMzNzIwMzY4NTQ3NzU4MDcSGAoLdXRmOF9zdHJpbmcYBiAB", 
+            "KAk6A+GItBIVCgp6ZXJvX2Zsb2F0GAcgASgCOgEwEhQKCW9uZV9mbG9hdBgI", 
+            "IAEoAjoBMRIYCgtzbWFsbF9mbG9hdBgJIAEoAjoDMS41Eh4KEm5lZ2F0aXZl", 
+            "X29uZV9mbG9hdBgKIAEoAjoCLTESHAoObmVnYXRpdmVfZmxvYXQYCyABKAI6", 
+            "BC0xLjUSGwoLbGFyZ2VfZmxvYXQYDCABKAI6BjJlKzAwOBIlChRzbWFsbF9u", 
+            "ZWdhdGl2ZV9mbG9hdBgNIAEoAjoHLThlLTAyOBIXCgppbmZfZG91YmxlGA4g", 
+            "ASgBOgNpbmYSHAoObmVnX2luZl9kb3VibGUYDyABKAE6BC1pbmYSFwoKbmFu", 
+            "X2RvdWJsZRgQIAEoAToDbmFuEhYKCWluZl9mbG9hdBgRIAEoAjoDaW5mEhsK", 
+            "DW5lZ19pbmZfZmxvYXQYEiABKAI6BC1pbmYSFgoJbmFuX2Zsb2F0GBMgASgC", 
+            "OgNuYW4SKwoMY3BwX3RyaWdyYXBoGBQgASgJOhU/ID8gPz8gPz8gPz8/ID8/", 
+            "LyA/Py0iSwoRU3BhcnNlRW51bU1lc3NhZ2USNgoLc3BhcnNlX2VudW0YASAB", 
+            "KA4yIS5wcm90b2J1Zl91bml0dGVzdC5UZXN0U3BhcnNlRW51bSIZCglPbmVT", 
+            "dHJpbmcSDAoEZGF0YRgBIAEoCSIYCghPbmVCeXRlcxIMCgRkYXRhGAEgASgM", 
+            "IqoDCg9UZXN0UGFja2VkVHlwZXMSGAoMcGFja2VkX2ludDMyGFogAygFQgIQ", 
+            "ARIYCgxwYWNrZWRfaW50NjQYWyADKANCAhABEhkKDXBhY2tlZF91aW50MzIY", 
+            "XCADKA1CAhABEhkKDXBhY2tlZF91aW50NjQYXSADKARCAhABEhkKDXBhY2tl", 
+            "ZF9zaW50MzIYXiADKBFCAhABEhkKDXBhY2tlZF9zaW50NjQYXyADKBJCAhAB", 
+            "EhoKDnBhY2tlZF9maXhlZDMyGGAgAygHQgIQARIaCg5wYWNrZWRfZml4ZWQ2", 
+            "NBhhIAMoBkICEAESGwoPcGFja2VkX3NmaXhlZDMyGGIgAygPQgIQARIbCg9w", 
+            "YWNrZWRfc2ZpeGVkNjQYYyADKBBCAhABEhgKDHBhY2tlZF9mbG9hdBhkIAMo", 
+            "AkICEAESGQoNcGFja2VkX2RvdWJsZRhlIAMoAUICEAESFwoLcGFja2VkX2Jv", 
+            "b2wYZiADKAhCAhABEjcKC3BhY2tlZF9lbnVtGGcgAygOMh4ucHJvdG9idWZf", 
+            "dW5pdHRlc3QuRm9yZWlnbkVudW1CAhABIsgDChFUZXN0VW5wYWNrZWRUeXBl", 
+            "cxIaCg51bnBhY2tlZF9pbnQzMhhaIAMoBUICEAASGgoOdW5wYWNrZWRfaW50", 
+            "NjQYWyADKANCAhAAEhsKD3VucGFja2VkX3VpbnQzMhhcIAMoDUICEAASGwoP", 
+            "dW5wYWNrZWRfdWludDY0GF0gAygEQgIQABIbCg91bnBhY2tlZF9zaW50MzIY", 
+            "XiADKBFCAhAAEhsKD3VucGFja2VkX3NpbnQ2NBhfIAMoEkICEAASHAoQdW5w", 
+            "YWNrZWRfZml4ZWQzMhhgIAMoB0ICEAASHAoQdW5wYWNrZWRfZml4ZWQ2NBhh", 
+            "IAMoBkICEAASHQoRdW5wYWNrZWRfc2ZpeGVkMzIYYiADKA9CAhAAEh0KEXVu", 
+            "cGFja2VkX3NmaXhlZDY0GGMgAygQQgIQABIaCg51bnBhY2tlZF9mbG9hdBhk", 
+            "IAMoAkICEAASGwoPdW5wYWNrZWRfZG91YmxlGGUgAygBQgIQABIZCg11bnBh", 
+            "Y2tlZF9ib29sGGYgAygIQgIQABI5Cg11bnBhY2tlZF9lbnVtGGcgAygOMh4u", 
+            "cHJvdG9idWZfdW5pdHRlc3QuRm9yZWlnbkVudW1CAhAAIiAKFFRlc3RQYWNr", 
+            "ZWRFeHRlbnNpb25zKggIARCAgICAAiKZBAoVVGVzdER5bmFtaWNFeHRlbnNp", 
+            "b25zEhkKEHNjYWxhcl9leHRlbnNpb24Y0A8gASgHEjcKDmVudW1fZXh0ZW5z", 
+            "aW9uGNEPIAEoDjIeLnByb3RvYnVmX3VuaXR0ZXN0LkZvcmVpZ25FbnVtElkK", 
+            "FmR5bmFtaWNfZW51bV9leHRlbnNpb24Y0g8gASgOMjgucHJvdG9idWZfdW5p", 
+            "dHRlc3QuVGVzdER5bmFtaWNFeHRlbnNpb25zLkR5bmFtaWNFbnVtVHlwZRI9", 
+            "ChFtZXNzYWdlX2V4dGVuc2lvbhjTDyABKAsyIS5wcm90b2J1Zl91bml0dGVz", 
+            "dC5Gb3JlaWduTWVzc2FnZRJfChlkeW5hbWljX21lc3NhZ2VfZXh0ZW5zaW9u", 
+            "GNQPIAEoCzI7LnByb3RvYnVmX3VuaXR0ZXN0LlRlc3REeW5hbWljRXh0ZW5z", 
+            "aW9ucy5EeW5hbWljTWVzc2FnZVR5cGUSGwoScmVwZWF0ZWRfZXh0ZW5zaW9u", 
+            "GNUPIAMoCRIdChBwYWNrZWRfZXh0ZW5zaW9uGNYPIAMoEUICEAEaLAoSRHlu", 
+            "YW1pY01lc3NhZ2VUeXBlEhYKDWR5bmFtaWNfZmllbGQYtBAgASgFIkcKD0R5", 
+            "bmFtaWNFbnVtVHlwZRIQCgtEWU5BTUlDX0ZPTxCYERIQCgtEWU5BTUlDX0JB", 
+            "UhCZERIQCgtEWU5BTUlDX0JBWhCaESLAAQojVGVzdFJlcGVhdGVkU2NhbGFy", 
+            "RGlmZmVyZW50VGFnU2l6ZXMSGAoQcmVwZWF0ZWRfZml4ZWQzMhgMIAMoBxIW", 
+            "Cg5yZXBlYXRlZF9pbnQzMhgNIAMoBRIZChByZXBlYXRlZF9maXhlZDY0GP4P", 
+            "IAMoBhIXCg5yZXBlYXRlZF9pbnQ2NBj/DyADKAMSGAoOcmVwZWF0ZWRfZmxv", 
+            "YXQY/v8PIAMoAhIZCg9yZXBlYXRlZF91aW50NjQY//8PIAMoBCIMCgpGb29S", 
+            "ZXF1ZXN0Ig0KC0Zvb1Jlc3BvbnNlIgwKCkJhclJlcXVlc3QiDQoLQmFyUmVz", 
+            "cG9uc2UqQAoLRm9yZWlnbkVudW0SDwoLRk9SRUlHTl9GT08QBBIPCgtGT1JF", 
+            "SUdOX0JBUhAFEg8KC0ZPUkVJR05fQkFaEAYqRwoUVGVzdEVudW1XaXRoRHVw", 
+            "VmFsdWUSCAoERk9PMRABEggKBEJBUjEQAhIHCgNCQVoQAxIICgRGT08yEAES", 
+            "CAoEQkFSMhACKokBCg5UZXN0U3BhcnNlRW51bRIMCghTUEFSU0VfQRB7Eg4K", 
+            "CFNQQVJTRV9CEKbnAxIPCghTUEFSU0VfQxCysYAGEhUKCFNQQVJTRV9EEPH/", 
+            "/////////wESFQoIU1BBUlNFX0UQtN78////////ARIMCghTUEFSU0VfRhAA", 
+            "EgwKCFNQQVJTRV9HEAIymQEKC1Rlc3RTZXJ2aWNlEkQKA0ZvbxIdLnByb3Rv", 
+            "YnVmX3VuaXR0ZXN0LkZvb1JlcXVlc3QaHi5wcm90b2J1Zl91bml0dGVzdC5G", 
+            "b29SZXNwb25zZRJECgNCYXISHS5wcm90b2J1Zl91bml0dGVzdC5CYXJSZXF1", 
+            "ZXN0Gh4ucHJvdG9idWZfdW5pdHRlc3QuQmFyUmVzcG9uc2U6RgoYb3B0aW9u", 
+            "YWxfaW50MzJfZXh0ZW5zaW9uEiQucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFs", 
+            "bEV4dGVuc2lvbnMYASABKAU6RgoYb3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9u", 
+            "EiQucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMYAiABKAM6", 
+            "RwoZb3B0aW9uYWxfdWludDMyX2V4dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0", 
+            "ZXN0LlRlc3RBbGxFeHRlbnNpb25zGAMgASgNOkcKGW9wdGlvbmFsX3VpbnQ2", 
+            "NF9leHRlbnNpb24SJC5wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0ZW5z", 
+            "aW9ucxgEIAEoBDpHChlvcHRpb25hbF9zaW50MzJfZXh0ZW5zaW9uEiQucHJv", 
+            "dG9idWZfdW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMYBSABKBE6RwoZb3B0", 
+            "aW9uYWxfc2ludDY0X2V4dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRl", 
+            "c3RBbGxFeHRlbnNpb25zGAYgASgSOkgKGm9wdGlvbmFsX2ZpeGVkMzJfZXh0", 
+            "ZW5zaW9uEiQucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMY", 
+            "ByABKAc6SAoab3B0aW9uYWxfZml4ZWQ2NF9leHRlbnNpb24SJC5wcm90b2J1", 
+            "Zl91bml0dGVzdC5UZXN0QWxsRXh0ZW5zaW9ucxgIIAEoBjpJChtvcHRpb25h", 
+            "bF9zZml4ZWQzMl9leHRlbnNpb24SJC5wcm90b2J1Zl91bml0dGVzdC5UZXN0", 
+            "QWxsRXh0ZW5zaW9ucxgJIAEoDzpJChtvcHRpb25hbF9zZml4ZWQ2NF9leHRl", 
+            "bnNpb24SJC5wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0ZW5zaW9ucxgK", 
+            "IAEoEDpGChhvcHRpb25hbF9mbG9hdF9leHRlbnNpb24SJC5wcm90b2J1Zl91", 
+            "bml0dGVzdC5UZXN0QWxsRXh0ZW5zaW9ucxgLIAEoAjpHChlvcHRpb25hbF9k", 
+            "b3VibGVfZXh0ZW5zaW9uEiQucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbEV4", 
+            "dGVuc2lvbnMYDCABKAE6RQoXb3B0aW9uYWxfYm9vbF9leHRlbnNpb24SJC5w", 
+            "cm90b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0ZW5zaW9ucxgNIAEoCDpHChlv", 
+            "cHRpb25hbF9zdHJpbmdfZXh0ZW5zaW9uEiQucHJvdG9idWZfdW5pdHRlc3Qu", 
+            "VGVzdEFsbEV4dGVuc2lvbnMYDiABKAk6RgoYb3B0aW9uYWxfYnl0ZXNfZXh0", 
+            "ZW5zaW9uEiQucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMY", 
+            "DyABKAw6cQoXb3B0aW9uYWxncm91cF9leHRlbnNpb24SJC5wcm90b2J1Zl91", 
+            "bml0dGVzdC5UZXN0QWxsRXh0ZW5zaW9ucxgQIAEoCjIqLnByb3RvYnVmX3Vu", 
+            "aXR0ZXN0Lk9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uOn4KIW9wdGlvbmFsX25l", 
+            "c3RlZF9tZXNzYWdlX2V4dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRl", 
+            "c3RBbGxFeHRlbnNpb25zGBIgASgLMi0ucHJvdG9idWZfdW5pdHRlc3QuVGVz", 
+            "dEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2U6cwoib3B0aW9uYWxfZm9yZWlnbl9t", 
+            "ZXNzYWdlX2V4dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxF", 
+            "eHRlbnNpb25zGBMgASgLMiEucHJvdG9idWZfdW5pdHRlc3QuRm9yZWlnbk1l", 
+            "c3NhZ2U6eAohb3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uEiQu", 
+            "cHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMYFCABKAsyJy5w", 
+            "cm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0TWVzc2FnZTp4Ch5vcHRp", 
+            "b25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb24SJC5wcm90b2J1Zl91bml0dGVz", 
+            "dC5UZXN0QWxsRXh0ZW5zaW9ucxgVIAEoDjIqLnByb3RvYnVmX3VuaXR0ZXN0", 
+            "LlRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtOm0KH29wdGlvbmFsX2ZvcmVpZ25f", 
+            "ZW51bV9leHRlbnNpb24SJC5wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0", 
+            "ZW5zaW9ucxgWIAEoDjIeLnByb3RvYnVmX3VuaXR0ZXN0LkZvcmVpZ25FbnVt", 
+            "OnIKHm9wdGlvbmFsX2ltcG9ydF9lbnVtX2V4dGVuc2lvbhIkLnByb3RvYnVm", 
+            "X3VuaXR0ZXN0LlRlc3RBbGxFeHRlbnNpb25zGBcgASgOMiQucHJvdG9idWZf", 
+            "dW5pdHRlc3RfaW1wb3J0LkltcG9ydEVudW06UQofb3B0aW9uYWxfc3RyaW5n", 
+            "X3BpZWNlX2V4dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxF", 
+            "eHRlbnNpb25zGBggASgJQgIIAjpJChdvcHRpb25hbF9jb3JkX2V4dGVuc2lv", 
+            "bhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxFeHRlbnNpb25zGBkgASgJ", 
+            "QgIIATpGChhyZXBlYXRlZF9pbnQzMl9leHRlbnNpb24SJC5wcm90b2J1Zl91", 
+            "bml0dGVzdC5UZXN0QWxsRXh0ZW5zaW9ucxgfIAMoBTpGChhyZXBlYXRlZF9p", 
+            "bnQ2NF9leHRlbnNpb24SJC5wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0", 
+            "ZW5zaW9ucxggIAMoAzpHChlyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uEiQu", 
+            "cHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMYISADKA06RwoZ", 
+            "cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0ZXN0", 
+            "LlRlc3RBbGxFeHRlbnNpb25zGCIgAygEOkcKGXJlcGVhdGVkX3NpbnQzMl9l", 
+            "eHRlbnNpb24SJC5wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0ZW5zaW9u", 
+            "cxgjIAMoETpHChlyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uEiQucHJvdG9i", 
+            "dWZfdW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMYJCADKBI6SAoacmVwZWF0", 
+            "ZWRfZml4ZWQzMl9leHRlbnNpb24SJC5wcm90b2J1Zl91bml0dGVzdC5UZXN0", 
+            "QWxsRXh0ZW5zaW9ucxglIAMoBzpIChpyZXBlYXRlZF9maXhlZDY0X2V4dGVu", 
+            "c2lvbhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxFeHRlbnNpb25zGCYg", 
+            "AygGOkkKG3JlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbhIkLnByb3RvYnVm", 
+            "X3VuaXR0ZXN0LlRlc3RBbGxFeHRlbnNpb25zGCcgAygPOkkKG3JlcGVhdGVk", 
+            "X3NmaXhlZDY0X2V4dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RB", 
+            "bGxFeHRlbnNpb25zGCggAygQOkYKGHJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lv", 
+            "bhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxFeHRlbnNpb25zGCkgAygC", 
+            "OkcKGXJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb24SJC5wcm90b2J1Zl91bml0", 
+            "dGVzdC5UZXN0QWxsRXh0ZW5zaW9ucxgqIAMoATpFChdyZXBlYXRlZF9ib29s", 
+            "X2V4dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxFeHRlbnNp", 
+            "b25zGCsgAygIOkcKGXJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24SJC5wcm90", 
+            "b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0ZW5zaW9ucxgsIAMoCTpGChhyZXBl", 
+            "YXRlZF9ieXRlc19leHRlbnNpb24SJC5wcm90b2J1Zl91bml0dGVzdC5UZXN0", 
+            "QWxsRXh0ZW5zaW9ucxgtIAMoDDpxChdyZXBlYXRlZGdyb3VwX2V4dGVuc2lv", 
+            "bhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxFeHRlbnNpb25zGC4gAygK", 
+            "MioucHJvdG9idWZfdW5pdHRlc3QuUmVwZWF0ZWRHcm91cF9leHRlbnNpb246", 
+            "fgohcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uEiQucHJvdG9i", 
+            "dWZfdW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMYMCADKAsyLS5wcm90b2J1", 
+            "Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZTpzCiJyZXBl", 
+            "YXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uEiQucHJvdG9idWZfdW5p", 
+            "dHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMYMSADKAsyIS5wcm90b2J1Zl91bml0", 
+            "dGVzdC5Gb3JlaWduTWVzc2FnZTp4CiFyZXBlYXRlZF9pbXBvcnRfbWVzc2Fn", 
+            "ZV9leHRlbnNpb24SJC5wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0ZW5z", 
+            "aW9ucxgyIAMoCzInLnByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRN", 
+            "ZXNzYWdlOngKHnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbhIkLnBy", 
+            "b3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxFeHRlbnNpb25zGDMgAygOMioucHJv", 
+            "dG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW06bQofcmVw", 
+            "ZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0", 
+            "ZXN0LlRlc3RBbGxFeHRlbnNpb25zGDQgAygOMh4ucHJvdG9idWZfdW5pdHRl", 
+            "c3QuRm9yZWlnbkVudW06cgoecmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5z", 
+            "aW9uEiQucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMYNSAD", 
+            "KA4yJC5wcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0RW51bTpRCh9y", 
+            "ZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uEiQucHJvdG9idWZfdW5p", 
+            "dHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMYNiADKAlCAggCOkkKF3JlcGVhdGVk", 
+            "X2NvcmRfZXh0ZW5zaW9uEiQucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbEV4", 
+            "dGVuc2lvbnMYNyADKAlCAggBOkkKF2RlZmF1bHRfaW50MzJfZXh0ZW5zaW9u", 
+            "EiQucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMYPSABKAU6", 
+            "AjQxOkkKF2RlZmF1bHRfaW50NjRfZXh0ZW5zaW9uEiQucHJvdG9idWZfdW5p", 
+            "dHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMYPiABKAM6AjQyOkoKGGRlZmF1bHRf", 
+            "dWludDMyX2V4dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxF", 
+            "eHRlbnNpb25zGD8gASgNOgI0MzpKChhkZWZhdWx0X3VpbnQ2NF9leHRlbnNp", 
+            "b24SJC5wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0ZW5zaW9ucxhAIAEo", 
+            "BDoCNDQ6SwoYZGVmYXVsdF9zaW50MzJfZXh0ZW5zaW9uEiQucHJvdG9idWZf", 
+            "dW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMYQSABKBE6Ay00NTpKChhkZWZh", 
+            "dWx0X3NpbnQ2NF9leHRlbnNpb24SJC5wcm90b2J1Zl91bml0dGVzdC5UZXN0", 
+            "QWxsRXh0ZW5zaW9ucxhCIAEoEjoCNDY6SwoZZGVmYXVsdF9maXhlZDMyX2V4", 
+            "dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxFeHRlbnNpb25z", 
+            "GEMgASgHOgI0NzpLChlkZWZhdWx0X2ZpeGVkNjRfZXh0ZW5zaW9uEiQucHJv", 
+            "dG9idWZfdW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMYRCABKAY6AjQ4OkwK", 
+            "GmRlZmF1bHRfc2ZpeGVkMzJfZXh0ZW5zaW9uEiQucHJvdG9idWZfdW5pdHRl", 
+            "c3QuVGVzdEFsbEV4dGVuc2lvbnMYRSABKA86AjQ5Ok0KGmRlZmF1bHRfc2Zp", 
+            "eGVkNjRfZXh0ZW5zaW9uEiQucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbEV4", 
+            "dGVuc2lvbnMYRiABKBA6Ay01MDpLChdkZWZhdWx0X2Zsb2F0X2V4dGVuc2lv", 
+            "bhIkLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxFeHRlbnNpb25zGEcgASgC", 
+            "OgQ1MS41Ok0KGGRlZmF1bHRfZG91YmxlX2V4dGVuc2lvbhIkLnByb3RvYnVm", 
+            "X3VuaXR0ZXN0LlRlc3RBbGxFeHRlbnNpb25zGEggASgBOgU1MjAwMDpKChZk", 
+            "ZWZhdWx0X2Jvb2xfZXh0ZW5zaW9uEiQucHJvdG9idWZfdW5pdHRlc3QuVGVz", 
+            "dEFsbEV4dGVuc2lvbnMYSSABKAg6BHRydWU6TQoYZGVmYXVsdF9zdHJpbmdf", 
+            "ZXh0ZW5zaW9uEiQucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lv", 
+            "bnMYSiABKAk6BWhlbGxvOkwKF2RlZmF1bHRfYnl0ZXNfZXh0ZW5zaW9uEiQu", 
+            "cHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMYSyABKAw6BXdv", 
+            "cmxkOnwKHWRlZmF1bHRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uEiQucHJvdG9i", 
+            "dWZfdW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMYUSABKA4yKi5wcm90b2J1", 
+            "Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bToDQkFSOnkKHmRl", 
+            "ZmF1bHRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbhIkLnByb3RvYnVmX3VuaXR0", 
+            "ZXN0LlRlc3RBbGxFeHRlbnNpb25zGFIgASgOMh4ucHJvdG9idWZfdW5pdHRl", 
+            "c3QuRm9yZWlnbkVudW06C0ZPUkVJR05fQkFSOn0KHWRlZmF1bHRfaW1wb3J0", 
+            "X2VudW1fZXh0ZW5zaW9uEiQucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbEV4", 
+            "dGVuc2lvbnMYUyABKA4yJC5wcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1w", 
+            "b3J0RW51bToKSU1QT1JUX0JBUjpVCh5kZWZhdWx0X3N0cmluZ19waWVjZV9l", 
+            "eHRlbnNpb24SJC5wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0ZW5zaW9u", 
+            "cxhUIAEoCToDYWJjQgIIAjpNChZkZWZhdWx0X2NvcmRfZXh0ZW5zaW9uEiQu", 
+            "cHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMYVSABKAk6AzEy", 
+            "M0ICCAE6QgoTbXlfZXh0ZW5zaW9uX3N0cmluZxIlLnByb3RvYnVmX3VuaXR0", 
+            "ZXN0LlRlc3RGaWVsZE9yZGVyaW5ncxgyIAEoCTo/ChBteV9leHRlbnNpb25f", 
+            "aW50EiUucHJvdG9idWZfdW5pdHRlc3QuVGVzdEZpZWxkT3JkZXJpbmdzGAUg", 
+            "ASgFOksKFnBhY2tlZF9pbnQzMl9leHRlbnNpb24SJy5wcm90b2J1Zl91bml0", 
+            "dGVzdC5UZXN0UGFja2VkRXh0ZW5zaW9ucxhaIAMoBUICEAE6SwoWcGFja2Vk", 
+            "X2ludDY0X2V4dGVuc2lvbhInLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RQYWNr", 
+            "ZWRFeHRlbnNpb25zGFsgAygDQgIQATpMChdwYWNrZWRfdWludDMyX2V4dGVu", 
+            "c2lvbhInLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RQYWNrZWRFeHRlbnNpb25z", 
+            "GFwgAygNQgIQATpMChdwYWNrZWRfdWludDY0X2V4dGVuc2lvbhInLnByb3Rv", 
+            "YnVmX3VuaXR0ZXN0LlRlc3RQYWNrZWRFeHRlbnNpb25zGF0gAygEQgIQATpM", 
+            "ChdwYWNrZWRfc2ludDMyX2V4dGVuc2lvbhInLnByb3RvYnVmX3VuaXR0ZXN0", 
+            "LlRlc3RQYWNrZWRFeHRlbnNpb25zGF4gAygRQgIQATpMChdwYWNrZWRfc2lu", 
+            "dDY0X2V4dGVuc2lvbhInLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RQYWNrZWRF", 
+            "eHRlbnNpb25zGF8gAygSQgIQATpNChhwYWNrZWRfZml4ZWQzMl9leHRlbnNp", 
+            "b24SJy5wcm90b2J1Zl91bml0dGVzdC5UZXN0UGFja2VkRXh0ZW5zaW9ucxhg", 
+            "IAMoB0ICEAE6TQoYcGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uEicucHJvdG9i", 
+            "dWZfdW5pdHRlc3QuVGVzdFBhY2tlZEV4dGVuc2lvbnMYYSADKAZCAhABOk4K", 
+            "GXBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb24SJy5wcm90b2J1Zl91bml0dGVz", 
+            "dC5UZXN0UGFja2VkRXh0ZW5zaW9ucxhiIAMoD0ICEAE6TgoZcGFja2VkX3Nm", 
+            "aXhlZDY0X2V4dGVuc2lvbhInLnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RQYWNr", 
+            "ZWRFeHRlbnNpb25zGGMgAygQQgIQATpLChZwYWNrZWRfZmxvYXRfZXh0ZW5z", 
+            "aW9uEicucHJvdG9idWZfdW5pdHRlc3QuVGVzdFBhY2tlZEV4dGVuc2lvbnMY", 
+            "ZCADKAJCAhABOkwKF3BhY2tlZF9kb3VibGVfZXh0ZW5zaW9uEicucHJvdG9i", 
+            "dWZfdW5pdHRlc3QuVGVzdFBhY2tlZEV4dGVuc2lvbnMYZSADKAFCAhABOkoK", 
+            "FXBhY2tlZF9ib29sX2V4dGVuc2lvbhInLnByb3RvYnVmX3VuaXR0ZXN0LlRl", 
+            "c3RQYWNrZWRFeHRlbnNpb25zGGYgAygIQgIQATpqChVwYWNrZWRfZW51bV9l", 
+            "eHRlbnNpb24SJy5wcm90b2J1Zl91bml0dGVzdC5UZXN0UGFja2VkRXh0ZW5z", 
+            "aW9ucxhnIAMoDjIeLnByb3RvYnVmX3VuaXR0ZXN0LkZvcmVpZ25FbnVtQgIQ", 
+            "AUJTQg1Vbml0dGVzdFByb3RvSAGAAQGIAQGQAQHCPjYKIUdvb2dsZS5Qcm90", 
+          "b2NvbEJ1ZmZlcnMuVGVzdFByb3RvcxIRVW5pdFRlc3RQcm90b0ZpbGU="));
+      pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) {
+        descriptor = root;
+        internal__static_protobuf_unittest_TestAllTypes__Descriptor = Descriptor.MessageTypes[0];
+        internal__static_protobuf_unittest_TestAllTypes__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder>(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", });
+        internal__static_protobuf_unittest_TestAllTypes_NestedMessage__Descriptor = internal__static_protobuf_unittest_TestAllTypes__Descriptor.NestedTypes[0];
+        internal__static_protobuf_unittest_TestAllTypes_NestedMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Builder>(internal__static_protobuf_unittest_TestAllTypes_NestedMessage__Descriptor,
+                new string[] { "Bb", });
+        internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__Descriptor = internal__static_protobuf_unittest_TestAllTypes__Descriptor.NestedTypes[1];
+        internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.Builder>(internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__Descriptor,
+                new string[] { "A", });
+        internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__Descriptor = internal__static_protobuf_unittest_TestAllTypes__Descriptor.NestedTypes[2];
+        internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup.Builder>(internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__Descriptor,
+                new string[] { "A", });
+        internal__static_protobuf_unittest_TestDeprecatedFields__Descriptor = Descriptor.MessageTypes[1];
+        internal__static_protobuf_unittest_TestDeprecatedFields__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestDeprecatedFields, global::Google.ProtocolBuffers.TestProtos.TestDeprecatedFields.Builder>(internal__static_protobuf_unittest_TestDeprecatedFields__Descriptor,
+                new string[] { "DeprecatedInt32", });
+        internal__static_protobuf_unittest_ForeignMessage__Descriptor = Descriptor.MessageTypes[2];
+        internal__static_protobuf_unittest_ForeignMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.ForeignMessage, global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder>(internal__static_protobuf_unittest_ForeignMessage__Descriptor,
+                new string[] { "C", });
+        internal__static_protobuf_unittest_TestAllExtensions__Descriptor = Descriptor.MessageTypes[3];
+        internal__static_protobuf_unittest_TestAllExtensions__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestAllExtensions, global::Google.ProtocolBuffers.TestProtos.TestAllExtensions.Builder>(internal__static_protobuf_unittest_TestAllExtensions__Descriptor,
+                new string[] { });
+        internal__static_protobuf_unittest_OptionalGroup_extension__Descriptor = Descriptor.MessageTypes[4];
+        internal__static_protobuf_unittest_OptionalGroup_extension__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.OptionalGroup_extension, global::Google.ProtocolBuffers.TestProtos.OptionalGroup_extension.Builder>(internal__static_protobuf_unittest_OptionalGroup_extension__Descriptor,
+                new string[] { "A", });
+        internal__static_protobuf_unittest_RepeatedGroup_extension__Descriptor = Descriptor.MessageTypes[5];
+        internal__static_protobuf_unittest_RepeatedGroup_extension__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.RepeatedGroup_extension, global::Google.ProtocolBuffers.TestProtos.RepeatedGroup_extension.Builder>(internal__static_protobuf_unittest_RepeatedGroup_extension__Descriptor,
+                new string[] { "A", });
+        internal__static_protobuf_unittest_TestNestedExtension__Descriptor = Descriptor.MessageTypes[6];
+        internal__static_protobuf_unittest_TestNestedExtension__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestNestedExtension, global::Google.ProtocolBuffers.TestProtos.TestNestedExtension.Builder>(internal__static_protobuf_unittest_TestNestedExtension__Descriptor,
+                new string[] { });
+        global::Google.ProtocolBuffers.TestProtos.TestNestedExtension.Test = pb::GeneratedSingleExtension<string>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.TestNestedExtension.Descriptor.Extensions[0]);
+        internal__static_protobuf_unittest_TestRequired__Descriptor = Descriptor.MessageTypes[7];
+        internal__static_protobuf_unittest_TestRequired__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestRequired, global::Google.ProtocolBuffers.TestProtos.TestRequired.Builder>(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", });
+        global::Google.ProtocolBuffers.TestProtos.TestRequired.Single = pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.TestProtos.TestRequired>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.TestRequired.Descriptor.Extensions[0]);
+        global::Google.ProtocolBuffers.TestProtos.TestRequired.Multi = pb::GeneratedRepeatExtension<global::Google.ProtocolBuffers.TestProtos.TestRequired>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.TestRequired.Descriptor.Extensions[1]);
+        internal__static_protobuf_unittest_TestRequiredForeign__Descriptor = Descriptor.MessageTypes[8];
+        internal__static_protobuf_unittest_TestRequiredForeign__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestRequiredForeign, global::Google.ProtocolBuffers.TestProtos.TestRequiredForeign.Builder>(internal__static_protobuf_unittest_TestRequiredForeign__Descriptor,
+                new string[] { "OptionalMessage", "RepeatedMessage", "Dummy", });
+        internal__static_protobuf_unittest_TestForeignNested__Descriptor = Descriptor.MessageTypes[9];
+        internal__static_protobuf_unittest_TestForeignNested__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestForeignNested, global::Google.ProtocolBuffers.TestProtos.TestForeignNested.Builder>(internal__static_protobuf_unittest_TestForeignNested__Descriptor,
+                new string[] { "ForeignNested", });
+        internal__static_protobuf_unittest_TestEmptyMessage__Descriptor = Descriptor.MessageTypes[10];
+        internal__static_protobuf_unittest_TestEmptyMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestEmptyMessage, global::Google.ProtocolBuffers.TestProtos.TestEmptyMessage.Builder>(internal__static_protobuf_unittest_TestEmptyMessage__Descriptor,
+                new string[] { });
+        internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__Descriptor = Descriptor.MessageTypes[11];
+        internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestEmptyMessageWithExtensions, global::Google.ProtocolBuffers.TestProtos.TestEmptyMessageWithExtensions.Builder>(internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__Descriptor,
+                new string[] { });
+        internal__static_protobuf_unittest_TestMultipleExtensionRanges__Descriptor = Descriptor.MessageTypes[12];
+        internal__static_protobuf_unittest_TestMultipleExtensionRanges__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestMultipleExtensionRanges, global::Google.ProtocolBuffers.TestProtos.TestMultipleExtensionRanges.Builder>(internal__static_protobuf_unittest_TestMultipleExtensionRanges__Descriptor,
+                new string[] { });
+        internal__static_protobuf_unittest_TestReallyLargeTagNumber__Descriptor = Descriptor.MessageTypes[13];
+        internal__static_protobuf_unittest_TestReallyLargeTagNumber__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestReallyLargeTagNumber, global::Google.ProtocolBuffers.TestProtos.TestReallyLargeTagNumber.Builder>(internal__static_protobuf_unittest_TestReallyLargeTagNumber__Descriptor,
+                new string[] { "A", "Bb", });
+        internal__static_protobuf_unittest_TestRecursiveMessage__Descriptor = Descriptor.MessageTypes[14];
+        internal__static_protobuf_unittest_TestRecursiveMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage, global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.Builder>(internal__static_protobuf_unittest_TestRecursiveMessage__Descriptor,
+                new string[] { "A", "I", });
+        internal__static_protobuf_unittest_TestMutualRecursionA__Descriptor = Descriptor.MessageTypes[15];
+        internal__static_protobuf_unittest_TestMutualRecursionA__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA, global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.Builder>(internal__static_protobuf_unittest_TestMutualRecursionA__Descriptor,
+                new string[] { "Bb", });
+        internal__static_protobuf_unittest_TestMutualRecursionB__Descriptor = Descriptor.MessageTypes[16];
+        internal__static_protobuf_unittest_TestMutualRecursionB__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB, global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.Builder>(internal__static_protobuf_unittest_TestMutualRecursionB__Descriptor,
+                new string[] { "A", "OptionalInt32", });
+        internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor = Descriptor.MessageTypes[17];
+        internal__static_protobuf_unittest_TestDupFieldNumber__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber, global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Builder>(internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor,
+                new string[] { "A", "Foo", "Bar", });
+        internal__static_protobuf_unittest_TestDupFieldNumber_Foo__Descriptor = internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor.NestedTypes[0];
+        internal__static_protobuf_unittest_TestDupFieldNumber_Foo__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo, global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.Builder>(internal__static_protobuf_unittest_TestDupFieldNumber_Foo__Descriptor,
+                new string[] { "A", });
+        internal__static_protobuf_unittest_TestDupFieldNumber_Bar__Descriptor = internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor.NestedTypes[1];
+        internal__static_protobuf_unittest_TestDupFieldNumber_Bar__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar, global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.Builder>(internal__static_protobuf_unittest_TestDupFieldNumber_Bar__Descriptor,
+                new string[] { "A", });
+        internal__static_protobuf_unittest_TestNestedMessageHasBits__Descriptor = Descriptor.MessageTypes[18];
+        internal__static_protobuf_unittest_TestNestedMessageHasBits__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits, global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Builder>(internal__static_protobuf_unittest_TestNestedMessageHasBits__Descriptor,
+                new string[] { "OptionalNestedMessage", });
+        internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__Descriptor = internal__static_protobuf_unittest_TestNestedMessageHasBits__Descriptor.NestedTypes[0];
+        internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage, global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.Builder>(internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__Descriptor,
+                new string[] { "NestedmessageRepeatedInt32", "NestedmessageRepeatedForeignmessage", });
+        internal__static_protobuf_unittest_TestCamelCaseFieldNames__Descriptor = Descriptor.MessageTypes[19];
+        internal__static_protobuf_unittest_TestCamelCaseFieldNames__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestCamelCaseFieldNames, global::Google.ProtocolBuffers.TestProtos.TestCamelCaseFieldNames.Builder>(internal__static_protobuf_unittest_TestCamelCaseFieldNames__Descriptor,
+                new string[] { "PrimitiveField", "StringField", "EnumField", "MessageField", "StringPieceField", "CordField", "RepeatedPrimitiveField", "RepeatedStringField", "RepeatedEnumField", "RepeatedMessageField", "RepeatedStringPieceField", "RepeatedCordField", });
+        internal__static_protobuf_unittest_TestFieldOrderings__Descriptor = Descriptor.MessageTypes[20];
+        internal__static_protobuf_unittest_TestFieldOrderings__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings, global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.Builder>(internal__static_protobuf_unittest_TestFieldOrderings__Descriptor,
+                new string[] { "MyString", "MyInt", "MyFloat", });
+        internal__static_protobuf_unittest_TestExtremeDefaultValues__Descriptor = Descriptor.MessageTypes[21];
+        internal__static_protobuf_unittest_TestExtremeDefaultValues__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues, global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.Builder>(internal__static_protobuf_unittest_TestExtremeDefaultValues__Descriptor,
+                new string[] { "EscapedBytes", "LargeUint32", "LargeUint64", "SmallInt32", "SmallInt64", "Utf8String", "ZeroFloat", "OneFloat", "SmallFloat", "NegativeOneFloat", "NegativeFloat", "LargeFloat", "SmallNegativeFloat", "InfDouble", "NegInfDouble", "NanDouble", "InfFloat", "NegInfFloat", "NanFloat", "CppTrigraph", });
+        internal__static_protobuf_unittest_SparseEnumMessage__Descriptor = Descriptor.MessageTypes[22];
+        internal__static_protobuf_unittest_SparseEnumMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SparseEnumMessage, global::Google.ProtocolBuffers.TestProtos.SparseEnumMessage.Builder>(internal__static_protobuf_unittest_SparseEnumMessage__Descriptor,
+                new string[] { "SparseEnum", });
+        internal__static_protobuf_unittest_OneString__Descriptor = Descriptor.MessageTypes[23];
+        internal__static_protobuf_unittest_OneString__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.OneString, global::Google.ProtocolBuffers.TestProtos.OneString.Builder>(internal__static_protobuf_unittest_OneString__Descriptor,
+                new string[] { "Data", });
+        internal__static_protobuf_unittest_OneBytes__Descriptor = Descriptor.MessageTypes[24];
+        internal__static_protobuf_unittest_OneBytes__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.OneBytes, global::Google.ProtocolBuffers.TestProtos.OneBytes.Builder>(internal__static_protobuf_unittest_OneBytes__Descriptor,
+                new string[] { "Data", });
+        internal__static_protobuf_unittest_TestPackedTypes__Descriptor = Descriptor.MessageTypes[25];
+        internal__static_protobuf_unittest_TestPackedTypes__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestPackedTypes, global::Google.ProtocolBuffers.TestProtos.TestPackedTypes.Builder>(internal__static_protobuf_unittest_TestPackedTypes__Descriptor,
+                new string[] { "PackedInt32", "PackedInt64", "PackedUint32", "PackedUint64", "PackedSint32", "PackedSint64", "PackedFixed32", "PackedFixed64", "PackedSfixed32", "PackedSfixed64", "PackedFloat", "PackedDouble", "PackedBool", "PackedEnum", });
+        internal__static_protobuf_unittest_TestUnpackedTypes__Descriptor = Descriptor.MessageTypes[26];
+        internal__static_protobuf_unittest_TestUnpackedTypes__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestUnpackedTypes, global::Google.ProtocolBuffers.TestProtos.TestUnpackedTypes.Builder>(internal__static_protobuf_unittest_TestUnpackedTypes__Descriptor,
+                new string[] { "UnpackedInt32", "UnpackedInt64", "UnpackedUint32", "UnpackedUint64", "UnpackedSint32", "UnpackedSint64", "UnpackedFixed32", "UnpackedFixed64", "UnpackedSfixed32", "UnpackedSfixed64", "UnpackedFloat", "UnpackedDouble", "UnpackedBool", "UnpackedEnum", });
+        internal__static_protobuf_unittest_TestPackedExtensions__Descriptor = Descriptor.MessageTypes[27];
+        internal__static_protobuf_unittest_TestPackedExtensions__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestPackedExtensions, global::Google.ProtocolBuffers.TestProtos.TestPackedExtensions.Builder>(internal__static_protobuf_unittest_TestPackedExtensions__Descriptor,
+                new string[] { });
+        internal__static_protobuf_unittest_TestDynamicExtensions__Descriptor = Descriptor.MessageTypes[28];
+        internal__static_protobuf_unittest_TestDynamicExtensions__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions, global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Builder>(internal__static_protobuf_unittest_TestDynamicExtensions__Descriptor,
+                new string[] { "ScalarExtension", "EnumExtension", "DynamicEnumExtension", "MessageExtension", "DynamicMessageExtension", "RepeatedExtension", "PackedExtension", });
+        internal__static_protobuf_unittest_TestDynamicExtensions_DynamicMessageType__Descriptor = internal__static_protobuf_unittest_TestDynamicExtensions__Descriptor.NestedTypes[0];
+        internal__static_protobuf_unittest_TestDynamicExtensions_DynamicMessageType__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType, global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType.Builder>(internal__static_protobuf_unittest_TestDynamicExtensions_DynamicMessageType__Descriptor,
+                new string[] { "DynamicField", });
+        internal__static_protobuf_unittest_TestRepeatedScalarDifferentTagSizes__Descriptor = Descriptor.MessageTypes[29];
+        internal__static_protobuf_unittest_TestRepeatedScalarDifferentTagSizes__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestRepeatedScalarDifferentTagSizes, global::Google.ProtocolBuffers.TestProtos.TestRepeatedScalarDifferentTagSizes.Builder>(internal__static_protobuf_unittest_TestRepeatedScalarDifferentTagSizes__Descriptor,
+                new string[] { "RepeatedFixed32", "RepeatedInt32", "RepeatedFixed64", "RepeatedInt64", "RepeatedFloat", "RepeatedUint64", });
+        internal__static_protobuf_unittest_FooRequest__Descriptor = Descriptor.MessageTypes[30];
+        internal__static_protobuf_unittest_FooRequest__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.FooRequest, global::Google.ProtocolBuffers.TestProtos.FooRequest.Builder>(internal__static_protobuf_unittest_FooRequest__Descriptor,
+                new string[] { });
+        internal__static_protobuf_unittest_FooResponse__Descriptor = Descriptor.MessageTypes[31];
+        internal__static_protobuf_unittest_FooResponse__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.FooResponse, global::Google.ProtocolBuffers.TestProtos.FooResponse.Builder>(internal__static_protobuf_unittest_FooResponse__Descriptor,
+                new string[] { });
+        internal__static_protobuf_unittest_BarRequest__Descriptor = Descriptor.MessageTypes[32];
+        internal__static_protobuf_unittest_BarRequest__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.BarRequest, global::Google.ProtocolBuffers.TestProtos.BarRequest.Builder>(internal__static_protobuf_unittest_BarRequest__Descriptor,
+                new string[] { });
+        internal__static_protobuf_unittest_BarResponse__Descriptor = Descriptor.MessageTypes[33];
+        internal__static_protobuf_unittest_BarResponse__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.BarResponse, global::Google.ProtocolBuffers.TestProtos.BarResponse.Builder>(internal__static_protobuf_unittest_BarResponse__Descriptor,
+                new string[] { });
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalInt32Extension = pb::GeneratedSingleExtension<int>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[0]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalInt64Extension = pb::GeneratedSingleExtension<long>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[1]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalUint32Extension = pb::GeneratedSingleExtension<uint>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[2]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalUint64Extension = pb::GeneratedSingleExtension<ulong>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[3]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalSint32Extension = pb::GeneratedSingleExtension<int>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[4]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalSint64Extension = pb::GeneratedSingleExtension<long>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[5]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalFixed32Extension = pb::GeneratedSingleExtension<uint>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[6]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalFixed64Extension = pb::GeneratedSingleExtension<ulong>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[7]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalSfixed32Extension = pb::GeneratedSingleExtension<int>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[8]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalSfixed64Extension = pb::GeneratedSingleExtension<long>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[9]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalFloatExtension = pb::GeneratedSingleExtension<float>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[10]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalDoubleExtension = pb::GeneratedSingleExtension<double>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[11]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalBoolExtension = pb::GeneratedSingleExtension<bool>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[12]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalStringExtension = pb::GeneratedSingleExtension<string>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[13]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalBytesExtension = pb::GeneratedSingleExtension<pb::ByteString>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[14]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalGroupExtension = pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.TestProtos.OptionalGroup_extension>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[15]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalNestedMessageExtension = pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[16]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalForeignMessageExtension = pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.TestProtos.ForeignMessage>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[17]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalImportMessageExtension = pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.TestProtos.ImportMessage>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[18]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalNestedEnumExtension = pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[19]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalForeignEnumExtension = pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.TestProtos.ForeignEnum>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[20]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalImportEnumExtension = pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.TestProtos.ImportEnum>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[21]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalStringPieceExtension = pb::GeneratedSingleExtension<string>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[22]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.OptionalCordExtension = pb::GeneratedSingleExtension<string>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[23]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedInt32Extension = pb::GeneratedRepeatExtension<int>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[24]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedInt64Extension = pb::GeneratedRepeatExtension<long>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[25]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedUint32Extension = pb::GeneratedRepeatExtension<uint>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[26]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedUint64Extension = pb::GeneratedRepeatExtension<ulong>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[27]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedSint32Extension = pb::GeneratedRepeatExtension<int>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[28]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedSint64Extension = pb::GeneratedRepeatExtension<long>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[29]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedFixed32Extension = pb::GeneratedRepeatExtension<uint>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[30]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedFixed64Extension = pb::GeneratedRepeatExtension<ulong>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[31]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedSfixed32Extension = pb::GeneratedRepeatExtension<int>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[32]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedSfixed64Extension = pb::GeneratedRepeatExtension<long>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[33]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedFloatExtension = pb::GeneratedRepeatExtension<float>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[34]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedDoubleExtension = pb::GeneratedRepeatExtension<double>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[35]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedBoolExtension = pb::GeneratedRepeatExtension<bool>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[36]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedStringExtension = pb::GeneratedRepeatExtension<string>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[37]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedBytesExtension = pb::GeneratedRepeatExtension<pb::ByteString>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[38]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedGroupExtension = pb::GeneratedRepeatExtension<global::Google.ProtocolBuffers.TestProtos.RepeatedGroup_extension>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[39]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedNestedMessageExtension = pb::GeneratedRepeatExtension<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[40]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedForeignMessageExtension = pb::GeneratedRepeatExtension<global::Google.ProtocolBuffers.TestProtos.ForeignMessage>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[41]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedImportMessageExtension = pb::GeneratedRepeatExtension<global::Google.ProtocolBuffers.TestProtos.ImportMessage>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[42]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedNestedEnumExtension = pb::GeneratedRepeatExtension<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[43]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedForeignEnumExtension = pb::GeneratedRepeatExtension<global::Google.ProtocolBuffers.TestProtos.ForeignEnum>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[44]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedImportEnumExtension = pb::GeneratedRepeatExtension<global::Google.ProtocolBuffers.TestProtos.ImportEnum>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[45]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedStringPieceExtension = pb::GeneratedRepeatExtension<string>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[46]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.RepeatedCordExtension = pb::GeneratedRepeatExtension<string>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[47]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultInt32Extension = pb::GeneratedSingleExtension<int>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[48]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultInt64Extension = pb::GeneratedSingleExtension<long>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[49]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultUint32Extension = pb::GeneratedSingleExtension<uint>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[50]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultUint64Extension = pb::GeneratedSingleExtension<ulong>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[51]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultSint32Extension = pb::GeneratedSingleExtension<int>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[52]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultSint64Extension = pb::GeneratedSingleExtension<long>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[53]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultFixed32Extension = pb::GeneratedSingleExtension<uint>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[54]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultFixed64Extension = pb::GeneratedSingleExtension<ulong>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[55]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultSfixed32Extension = pb::GeneratedSingleExtension<int>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[56]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultSfixed64Extension = pb::GeneratedSingleExtension<long>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[57]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultFloatExtension = pb::GeneratedSingleExtension<float>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[58]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultDoubleExtension = pb::GeneratedSingleExtension<double>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[59]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultBoolExtension = pb::GeneratedSingleExtension<bool>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[60]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultStringExtension = pb::GeneratedSingleExtension<string>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[61]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultBytesExtension = pb::GeneratedSingleExtension<pb::ByteString>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[62]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultNestedEnumExtension = pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[63]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultForeignEnumExtension = pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.TestProtos.ForeignEnum>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[64]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultImportEnumExtension = pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.TestProtos.ImportEnum>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[65]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultStringPieceExtension = pb::GeneratedSingleExtension<string>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[66]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.DefaultCordExtension = pb::GeneratedSingleExtension<string>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[67]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.MyExtensionString = pb::GeneratedSingleExtension<string>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[68]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.MyExtensionInt = pb::GeneratedSingleExtension<int>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[69]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.PackedInt32Extension = pb::GeneratedRepeatExtension<int>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[70]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.PackedInt64Extension = pb::GeneratedRepeatExtension<long>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[71]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.PackedUint32Extension = pb::GeneratedRepeatExtension<uint>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[72]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.PackedUint64Extension = pb::GeneratedRepeatExtension<ulong>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[73]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.PackedSint32Extension = pb::GeneratedRepeatExtension<int>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[74]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.PackedSint64Extension = pb::GeneratedRepeatExtension<long>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[75]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.PackedFixed32Extension = pb::GeneratedRepeatExtension<uint>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[76]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.PackedFixed64Extension = pb::GeneratedRepeatExtension<ulong>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[77]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.PackedSfixed32Extension = pb::GeneratedRepeatExtension<int>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[78]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.PackedSfixed64Extension = pb::GeneratedRepeatExtension<long>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[79]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.PackedFloatExtension = pb::GeneratedRepeatExtension<float>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[80]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.PackedDoubleExtension = pb::GeneratedRepeatExtension<double>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[81]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.PackedBoolExtension = pb::GeneratedRepeatExtension<bool>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[82]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.PackedEnumExtension = pb::GeneratedRepeatExtension<global::Google.ProtocolBuffers.TestProtos.ForeignEnum>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor.Extensions[83]);
+        pb::ExtensionRegistry registry = pb::ExtensionRegistry.CreateInstance();
+        RegisterAllExtensions(registry);
+        global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.RegisterAllExtensions(registry);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestImportProtoFile.RegisterAllExtensions(registry);
+        return registry;
+      };
+      pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,
+          new pbd::FileDescriptor[] {
+          global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.Descriptor, 
+          global::Google.ProtocolBuffers.TestProtos.UnitTestImportProtoFile.Descriptor, 
+          }, assigner);
+    }
+    #endregion
+    
+  }
+  #region Enums
+  public enum ForeignEnum {
+    FOREIGN_FOO = 4,
+    FOREIGN_BAR = 5,
+    FOREIGN_BAZ = 6,
+  }
+  
+  public enum TestEnumWithDupValue {
+    FOO1 = 1,
+    BAR1 = 2,
+    BAZ = 3,
+    FOO2 = 1,
+    BAR2 = 2,
+  }
+  
+  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
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestAllTypes : pb::GeneratedMessage<TestAllTypes, TestAllTypes.Builder> {
+    private TestAllTypes() { }
+    private static readonly TestAllTypes defaultInstance = new TestAllTypes().MakeReadOnly();
+    private static readonly string[] _testAllTypesFieldNames = new string[] { "default_bool", "default_bytes", "default_cord", "default_double", "default_fixed32", "default_fixed64", "default_float", "default_foreign_enum", "default_import_enum", "default_int32", "default_int64", "default_nested_enum", "default_sfixed32", "default_sfixed64", "default_sint32", "default_sint64", "default_string", "default_string_piece", "default_uint32", "default_uint64", "optional_bool", "optional_bytes", "optional_cord", "optional_double", "optional_fixed32", "optional_fixed64", "optional_float", "optional_foreign_enum", "optional_foreign_message", "optional_import_enum", "optional_import_message", "optional_int32", "optional_int64", "optional_nested_enum", "optional_nested_message", "optional_sfixed32", "optional_sfixed64", "optional_sint32", "optional_sint64", "optional_string", "optional_string_piece", "optional_uint32", "optional_uint64", "optionalgroup", "repeated_bool", "repeated_bytes", "repeated_cord", "repeated_double", "repeated_fixed32", "repeated_fixed64", "repeated_float", "repeated_foreign_enum", "repeated_foreign_message", "repeated_import_enum", "repeated_import_message", "repeated_int32", "repeated_int64", "repeated_nested_enum", "repeated_nested_message", "repeated_sfixed32", "repeated_sfixed64", "repeated_sint32", "repeated_sint64", "repeated_string", "repeated_string_piece", "repeated_uint32", "repeated_uint64", "repeatedgroup" };
+    private static readonly uint[] _testAllTypesFieldTags = new uint[] { 584, 602, 682, 577, 541, 545, 573, 656, 664, 488, 496, 648, 557, 561, 520, 528, 594, 674, 504, 512, 104, 122, 202, 97, 61, 65, 93, 176, 154, 184, 162, 8, 16, 168, 146, 77, 81, 40, 48, 114, 194, 24, 32, 131, 344, 362, 442, 337, 301, 305, 333, 416, 394, 424, 402, 248, 256, 408, 386, 317, 321, 280, 288, 354, 434, 264, 272, 371 };
+    public static TestAllTypes DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestAllTypes DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override TestAllTypes ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<TestAllTypes, TestAllTypes.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes__FieldAccessorTable; }
+    }
+    
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public static partial class Types {
+      public enum NestedEnum {
+        FOO = 1,
+        BAR = 2,
+        BAZ = 3,
+      }
+      
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class NestedMessage : pb::GeneratedMessage<NestedMessage, NestedMessage.Builder> {
+        private NestedMessage() { }
+        private static readonly NestedMessage defaultInstance = new NestedMessage().MakeReadOnly();
+        private static readonly string[] _nestedMessageFieldNames = new string[] { "bb" };
+        private static readonly uint[] _nestedMessageFieldTags = new uint[] { 8 };
+        public static NestedMessage DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override NestedMessage DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+        
+        protected override NestedMessage ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes_NestedMessage__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<NestedMessage, NestedMessage.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes_NestedMessage__FieldAccessorTable; }
+        }
+        
+        public const int BbFieldNumber = 1;
+        private bool hasBb;
+        private int bb_;
+        public bool HasBb {
+          get { return hasBb; }
+        }
+        public int Bb {
+          get { return bb_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          CalcSerializedSize();
+          string[] field_names = _nestedMessageFieldNames;
+          if (hasBb) {
+            output.WriteInt32(1, field_names[0], Bb);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            return CalcSerializedSize();
+          }
+        }
+        
+        private int CalcSerializedSize() {
+          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 NestedMessage ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static NestedMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static NestedMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private NestedMessage MakeReadOnly() {
+          return this;
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(NestedMessage prototype) {
+          return new Builder(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public sealed partial class Builder : pb::GeneratedBuilder<NestedMessage, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(NestedMessage cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+          
+          private bool resultIsReadOnly;
+          private NestedMessage result;
+          
+          private NestedMessage PrepareBuilder() {
+            if (resultIsReadOnly) {
+              NestedMessage original = result;
+              result = new NestedMessage();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+          
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+          
+          protected override NestedMessage MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+          
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+          
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Descriptor; }
+          }
+          
+          public override NestedMessage DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance; }
+          }
+          
+          public override NestedMessage BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is NestedMessage) {
+              return MergeFrom((NestedMessage) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(NestedMessage other) {
+            if (other == global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasBb) {
+              Bb = other.Bb;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_nestedMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _nestedMessageFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 8: {
+                  result.hasBb = input.ReadInt32(ref result.bb_);
+                  break;
+                }
+              }
+            }
+            
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+          
+          
+          public bool HasBb {
+            get { return result.hasBb; }
+          }
+          public int Bb {
+            get { return result.Bb; }
+            set { SetBb(value); }
+          }
+          public Builder SetBb(int value) {
+            PrepareBuilder();
+            result.hasBb = true;
+            result.bb_ = value;
+            return this;
+          }
+          public Builder ClearBb() {
+            PrepareBuilder();
+            result.hasBb = false;
+            result.bb_ = 0;
+            return this;
+          }
+        }
+        static NestedMessage() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+        }
+      }
+      
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class OptionalGroup : pb::GeneratedMessage<OptionalGroup, OptionalGroup.Builder> {
+        private OptionalGroup() { }
+        private static readonly OptionalGroup defaultInstance = new OptionalGroup().MakeReadOnly();
+        private static readonly string[] _optionalGroupFieldNames = new string[] { "a" };
+        private static readonly uint[] _optionalGroupFieldTags = new uint[] { 136 };
+        public static OptionalGroup DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override OptionalGroup DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+        
+        protected override OptionalGroup ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<OptionalGroup, OptionalGroup.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__FieldAccessorTable; }
+        }
+        
+        public const int AFieldNumber = 17;
+        private bool hasA;
+        private int a_;
+        public bool HasA {
+          get { return hasA; }
+        }
+        public int A {
+          get { return a_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          CalcSerializedSize();
+          string[] field_names = _optionalGroupFieldNames;
+          if (hasA) {
+            output.WriteInt32(17, field_names[0], A);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            return CalcSerializedSize();
+          }
+        }
+        
+        private int CalcSerializedSize() {
+          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 OptionalGroup ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static OptionalGroup ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static OptionalGroup ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static OptionalGroup ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static OptionalGroup ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static OptionalGroup ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static OptionalGroup ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static OptionalGroup ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static OptionalGroup ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static OptionalGroup ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private OptionalGroup MakeReadOnly() {
+          return this;
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(OptionalGroup prototype) {
+          return new Builder(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public sealed partial class Builder : pb::GeneratedBuilder<OptionalGroup, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(OptionalGroup cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+          
+          private bool resultIsReadOnly;
+          private OptionalGroup result;
+          
+          private OptionalGroup PrepareBuilder() {
+            if (resultIsReadOnly) {
+              OptionalGroup original = result;
+              result = new OptionalGroup();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+          
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+          
+          protected override OptionalGroup MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+          
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+          
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.Descriptor; }
+          }
+          
+          public override OptionalGroup DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.DefaultInstance; }
+          }
+          
+          public override OptionalGroup BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is OptionalGroup) {
+              return MergeFrom((OptionalGroup) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(OptionalGroup other) {
+            if (other == global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasA) {
+              A = other.A;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_optionalGroupFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _optionalGroupFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 136: {
+                  result.hasA = input.ReadInt32(ref result.a_);
+                  break;
+                }
+              }
+            }
+            
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+          
+          
+          public bool HasA {
+            get { return result.hasA; }
+          }
+          public int A {
+            get { return result.A; }
+            set { SetA(value); }
+          }
+          public Builder SetA(int value) {
+            PrepareBuilder();
+            result.hasA = true;
+            result.a_ = value;
+            return this;
+          }
+          public Builder ClearA() {
+            PrepareBuilder();
+            result.hasA = false;
+            result.a_ = 0;
+            return this;
+          }
+        }
+        static OptionalGroup() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+        }
+      }
+      
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class RepeatedGroup : pb::GeneratedMessage<RepeatedGroup, RepeatedGroup.Builder> {
+        private RepeatedGroup() { }
+        private static readonly RepeatedGroup defaultInstance = new RepeatedGroup().MakeReadOnly();
+        private static readonly string[] _repeatedGroupFieldNames = new string[] { "a" };
+        private static readonly uint[] _repeatedGroupFieldTags = new uint[] { 376 };
+        public static RepeatedGroup DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override RepeatedGroup DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+        
+        protected override RepeatedGroup ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<RepeatedGroup, RepeatedGroup.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__FieldAccessorTable; }
+        }
+        
+        public const int AFieldNumber = 47;
+        private bool hasA;
+        private int a_;
+        public bool HasA {
+          get { return hasA; }
+        }
+        public int A {
+          get { return a_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          CalcSerializedSize();
+          string[] field_names = _repeatedGroupFieldNames;
+          if (hasA) {
+            output.WriteInt32(47, field_names[0], A);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            return CalcSerializedSize();
+          }
+        }
+        
+        private int CalcSerializedSize() {
+          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 RepeatedGroup ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static RepeatedGroup ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static RepeatedGroup ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static RepeatedGroup ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static RepeatedGroup ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static RepeatedGroup ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static RepeatedGroup ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static RepeatedGroup ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static RepeatedGroup ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static RepeatedGroup ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private RepeatedGroup MakeReadOnly() {
+          return this;
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(RepeatedGroup prototype) {
+          return new Builder(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public sealed partial class Builder : pb::GeneratedBuilder<RepeatedGroup, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(RepeatedGroup cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+          
+          private bool resultIsReadOnly;
+          private RepeatedGroup result;
+          
+          private RepeatedGroup PrepareBuilder() {
+            if (resultIsReadOnly) {
+              RepeatedGroup original = result;
+              result = new RepeatedGroup();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+          
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+          
+          protected override RepeatedGroup MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+          
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+          
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup.Descriptor; }
+          }
+          
+          public override RepeatedGroup DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup.DefaultInstance; }
+          }
+          
+          public override RepeatedGroup BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is RepeatedGroup) {
+              return MergeFrom((RepeatedGroup) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(RepeatedGroup other) {
+            if (other == global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasA) {
+              A = other.A;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_repeatedGroupFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _repeatedGroupFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 376: {
+                  result.hasA = input.ReadInt32(ref result.a_);
+                  break;
+                }
+              }
+            }
+            
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+          
+          
+          public bool HasA {
+            get { return result.hasA; }
+          }
+          public int A {
+            get { return result.A; }
+            set { SetA(value); }
+          }
+          public Builder SetA(int value) {
+            PrepareBuilder();
+            result.hasA = true;
+            result.a_ = value;
+            return this;
+          }
+          public Builder ClearA() {
+            PrepareBuilder();
+            result.hasA = false;
+            result.a_ = 0;
+            return this;
+          }
+        }
+        static RepeatedGroup() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+        }
+      }
+      
+    }
+    #endregion
+    
+    public const int OptionalInt32FieldNumber = 1;
+    private bool hasOptionalInt32;
+    private int optionalInt32_;
+    public bool HasOptionalInt32 {
+      get { return hasOptionalInt32; }
+    }
+    public int OptionalInt32 {
+      get { return optionalInt32_; }
+    }
+    
+    public const int OptionalInt64FieldNumber = 2;
+    private bool hasOptionalInt64;
+    private long optionalInt64_;
+    public bool HasOptionalInt64 {
+      get { return hasOptionalInt64; }
+    }
+    public long OptionalInt64 {
+      get { return optionalInt64_; }
+    }
+    
+    public const int OptionalUint32FieldNumber = 3;
+    private bool hasOptionalUint32;
+    private uint optionalUint32_;
+    public bool HasOptionalUint32 {
+      get { return hasOptionalUint32; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint OptionalUint32 {
+      get { return optionalUint32_; }
+    }
+    
+    public const int OptionalUint64FieldNumber = 4;
+    private bool hasOptionalUint64;
+    private ulong optionalUint64_;
+    public bool HasOptionalUint64 {
+      get { return hasOptionalUint64; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong OptionalUint64 {
+      get { return optionalUint64_; }
+    }
+    
+    public const int OptionalSint32FieldNumber = 5;
+    private bool hasOptionalSint32;
+    private int optionalSint32_;
+    public bool HasOptionalSint32 {
+      get { return hasOptionalSint32; }
+    }
+    public int OptionalSint32 {
+      get { return optionalSint32_; }
+    }
+    
+    public const int OptionalSint64FieldNumber = 6;
+    private bool hasOptionalSint64;
+    private long optionalSint64_;
+    public bool HasOptionalSint64 {
+      get { return hasOptionalSint64; }
+    }
+    public long OptionalSint64 {
+      get { return optionalSint64_; }
+    }
+    
+    public const int OptionalFixed32FieldNumber = 7;
+    private bool hasOptionalFixed32;
+    private uint optionalFixed32_;
+    public bool HasOptionalFixed32 {
+      get { return hasOptionalFixed32; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint OptionalFixed32 {
+      get { return optionalFixed32_; }
+    }
+    
+    public const int OptionalFixed64FieldNumber = 8;
+    private bool hasOptionalFixed64;
+    private ulong optionalFixed64_;
+    public bool HasOptionalFixed64 {
+      get { return hasOptionalFixed64; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong OptionalFixed64 {
+      get { return optionalFixed64_; }
+    }
+    
+    public const int OptionalSfixed32FieldNumber = 9;
+    private bool hasOptionalSfixed32;
+    private int optionalSfixed32_;
+    public bool HasOptionalSfixed32 {
+      get { return hasOptionalSfixed32; }
+    }
+    public int OptionalSfixed32 {
+      get { return optionalSfixed32_; }
+    }
+    
+    public const int OptionalSfixed64FieldNumber = 10;
+    private bool hasOptionalSfixed64;
+    private long optionalSfixed64_;
+    public bool HasOptionalSfixed64 {
+      get { return hasOptionalSfixed64; }
+    }
+    public long OptionalSfixed64 {
+      get { return optionalSfixed64_; }
+    }
+    
+    public const int OptionalFloatFieldNumber = 11;
+    private bool hasOptionalFloat;
+    private float optionalFloat_;
+    public bool HasOptionalFloat {
+      get { return hasOptionalFloat; }
+    }
+    public float OptionalFloat {
+      get { return optionalFloat_; }
+    }
+    
+    public const int OptionalDoubleFieldNumber = 12;
+    private bool hasOptionalDouble;
+    private double optionalDouble_;
+    public bool HasOptionalDouble {
+      get { return hasOptionalDouble; }
+    }
+    public double OptionalDouble {
+      get { return optionalDouble_; }
+    }
+    
+    public const int OptionalBoolFieldNumber = 13;
+    private bool hasOptionalBool;
+    private bool optionalBool_;
+    public bool HasOptionalBool {
+      get { return hasOptionalBool; }
+    }
+    public bool OptionalBool {
+      get { return optionalBool_; }
+    }
+    
+    public const int OptionalStringFieldNumber = 14;
+    private bool hasOptionalString;
+    private string optionalString_ = "";
+    public bool HasOptionalString {
+      get { return hasOptionalString; }
+    }
+    public string OptionalString {
+      get { return optionalString_; }
+    }
+    
+    public const int OptionalBytesFieldNumber = 15;
+    private bool hasOptionalBytes;
+    private pb::ByteString optionalBytes_ = pb::ByteString.Empty;
+    public bool HasOptionalBytes {
+      get { return hasOptionalBytes; }
+    }
+    public pb::ByteString OptionalBytes {
+      get { return optionalBytes_; }
+    }
+    
+    public const int OptionalGroupFieldNumber = 16;
+    private bool hasOptionalGroup;
+    private global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup optionalGroup_;
+    public bool HasOptionalGroup {
+      get { return hasOptionalGroup; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup OptionalGroup {
+      get { return optionalGroup_ ?? global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.DefaultInstance; }
+    }
+    
+    public const int OptionalNestedMessageFieldNumber = 18;
+    private bool hasOptionalNestedMessage;
+    private global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage optionalNestedMessage_;
+    public bool HasOptionalNestedMessage {
+      get { return hasOptionalNestedMessage; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage OptionalNestedMessage {
+      get { return optionalNestedMessage_ ?? global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance; }
+    }
+    
+    public const int OptionalForeignMessageFieldNumber = 19;
+    private bool hasOptionalForeignMessage;
+    private global::Google.ProtocolBuffers.TestProtos.ForeignMessage optionalForeignMessage_;
+    public bool HasOptionalForeignMessage {
+      get { return hasOptionalForeignMessage; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ForeignMessage OptionalForeignMessage {
+      get { return optionalForeignMessage_ ?? global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance; }
+    }
+    
+    public const int OptionalImportMessageFieldNumber = 20;
+    private bool hasOptionalImportMessage;
+    private global::Google.ProtocolBuffers.TestProtos.ImportMessage optionalImportMessage_;
+    public bool HasOptionalImportMessage {
+      get { return hasOptionalImportMessage; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ImportMessage OptionalImportMessage {
+      get { return optionalImportMessage_ ?? global::Google.ProtocolBuffers.TestProtos.ImportMessage.DefaultInstance; }
+    }
+    
+    public const int OptionalNestedEnumFieldNumber = 21;
+    private bool hasOptionalNestedEnum;
+    private global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum optionalNestedEnum_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum.FOO;
+    public bool HasOptionalNestedEnum {
+      get { return hasOptionalNestedEnum; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum OptionalNestedEnum {
+      get { return optionalNestedEnum_; }
+    }
+    
+    public const int OptionalForeignEnumFieldNumber = 22;
+    private bool hasOptionalForeignEnum;
+    private global::Google.ProtocolBuffers.TestProtos.ForeignEnum optionalForeignEnum_ = global::Google.ProtocolBuffers.TestProtos.ForeignEnum.FOREIGN_FOO;
+    public bool HasOptionalForeignEnum {
+      get { return hasOptionalForeignEnum; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ForeignEnum OptionalForeignEnum {
+      get { return optionalForeignEnum_; }
+    }
+    
+    public const int OptionalImportEnumFieldNumber = 23;
+    private bool hasOptionalImportEnum;
+    private global::Google.ProtocolBuffers.TestProtos.ImportEnum optionalImportEnum_ = global::Google.ProtocolBuffers.TestProtos.ImportEnum.IMPORT_FOO;
+    public bool HasOptionalImportEnum {
+      get { return hasOptionalImportEnum; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ImportEnum OptionalImportEnum {
+      get { return optionalImportEnum_; }
+    }
+    
+    public const int OptionalStringPieceFieldNumber = 24;
+    private bool hasOptionalStringPiece;
+    private string optionalStringPiece_ = "";
+    public bool HasOptionalStringPiece {
+      get { return hasOptionalStringPiece; }
+    }
+    public string OptionalStringPiece {
+      get { return optionalStringPiece_; }
+    }
+    
+    public const int OptionalCordFieldNumber = 25;
+    private bool hasOptionalCord;
+    private string optionalCord_ = "";
+    public bool HasOptionalCord {
+      get { return hasOptionalCord; }
+    }
+    public string OptionalCord {
+      get { return optionalCord_; }
+    }
+    
+    public const int RepeatedInt32FieldNumber = 31;
+    private pbc::PopsicleList<int> repeatedInt32_ = new pbc::PopsicleList<int>();
+    public scg::IList<int> RepeatedInt32List {
+      get { return pbc::Lists.AsReadOnly(repeatedInt32_); }
+    }
+    public int RepeatedInt32Count {
+      get { return repeatedInt32_.Count; }
+    }
+    public int GetRepeatedInt32(int index) {
+      return repeatedInt32_[index];
+    }
+    
+    public const int RepeatedInt64FieldNumber = 32;
+    private pbc::PopsicleList<long> repeatedInt64_ = new pbc::PopsicleList<long>();
+    public scg::IList<long> RepeatedInt64List {
+      get { return pbc::Lists.AsReadOnly(repeatedInt64_); }
+    }
+    public int RepeatedInt64Count {
+      get { return repeatedInt64_.Count; }
+    }
+    public long GetRepeatedInt64(int index) {
+      return repeatedInt64_[index];
+    }
+    
+    public const int RepeatedUint32FieldNumber = 33;
+    private pbc::PopsicleList<uint> repeatedUint32_ = new pbc::PopsicleList<uint>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<uint> RepeatedUint32List {
+      get { return pbc::Lists.AsReadOnly(repeatedUint32_); }
+    }
+    public int RepeatedUint32Count {
+      get { return repeatedUint32_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint GetRepeatedUint32(int index) {
+      return repeatedUint32_[index];
+    }
+    
+    public const int RepeatedUint64FieldNumber = 34;
+    private pbc::PopsicleList<ulong> repeatedUint64_ = new pbc::PopsicleList<ulong>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<ulong> RepeatedUint64List {
+      get { return pbc::Lists.AsReadOnly(repeatedUint64_); }
+    }
+    public int RepeatedUint64Count {
+      get { return repeatedUint64_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong GetRepeatedUint64(int index) {
+      return repeatedUint64_[index];
+    }
+    
+    public const int RepeatedSint32FieldNumber = 35;
+    private pbc::PopsicleList<int> repeatedSint32_ = new pbc::PopsicleList<int>();
+    public scg::IList<int> RepeatedSint32List {
+      get { return pbc::Lists.AsReadOnly(repeatedSint32_); }
+    }
+    public int RepeatedSint32Count {
+      get { return repeatedSint32_.Count; }
+    }
+    public int GetRepeatedSint32(int index) {
+      return repeatedSint32_[index];
+    }
+    
+    public const int RepeatedSint64FieldNumber = 36;
+    private pbc::PopsicleList<long> repeatedSint64_ = new pbc::PopsicleList<long>();
+    public scg::IList<long> RepeatedSint64List {
+      get { return pbc::Lists.AsReadOnly(repeatedSint64_); }
+    }
+    public int RepeatedSint64Count {
+      get { return repeatedSint64_.Count; }
+    }
+    public long GetRepeatedSint64(int index) {
+      return repeatedSint64_[index];
+    }
+    
+    public const int RepeatedFixed32FieldNumber = 37;
+    private pbc::PopsicleList<uint> repeatedFixed32_ = new pbc::PopsicleList<uint>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<uint> RepeatedFixed32List {
+      get { return pbc::Lists.AsReadOnly(repeatedFixed32_); }
+    }
+    public int RepeatedFixed32Count {
+      get { return repeatedFixed32_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint GetRepeatedFixed32(int index) {
+      return repeatedFixed32_[index];
+    }
+    
+    public const int RepeatedFixed64FieldNumber = 38;
+    private pbc::PopsicleList<ulong> repeatedFixed64_ = new pbc::PopsicleList<ulong>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<ulong> RepeatedFixed64List {
+      get { return pbc::Lists.AsReadOnly(repeatedFixed64_); }
+    }
+    public int RepeatedFixed64Count {
+      get { return repeatedFixed64_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong GetRepeatedFixed64(int index) {
+      return repeatedFixed64_[index];
+    }
+    
+    public const int RepeatedSfixed32FieldNumber = 39;
+    private pbc::PopsicleList<int> repeatedSfixed32_ = new pbc::PopsicleList<int>();
+    public scg::IList<int> RepeatedSfixed32List {
+      get { return pbc::Lists.AsReadOnly(repeatedSfixed32_); }
+    }
+    public int RepeatedSfixed32Count {
+      get { return repeatedSfixed32_.Count; }
+    }
+    public int GetRepeatedSfixed32(int index) {
+      return repeatedSfixed32_[index];
+    }
+    
+    public const int RepeatedSfixed64FieldNumber = 40;
+    private pbc::PopsicleList<long> repeatedSfixed64_ = new pbc::PopsicleList<long>();
+    public scg::IList<long> RepeatedSfixed64List {
+      get { return pbc::Lists.AsReadOnly(repeatedSfixed64_); }
+    }
+    public int RepeatedSfixed64Count {
+      get { return repeatedSfixed64_.Count; }
+    }
+    public long GetRepeatedSfixed64(int index) {
+      return repeatedSfixed64_[index];
+    }
+    
+    public const int RepeatedFloatFieldNumber = 41;
+    private pbc::PopsicleList<float> repeatedFloat_ = new pbc::PopsicleList<float>();
+    public scg::IList<float> RepeatedFloatList {
+      get { return pbc::Lists.AsReadOnly(repeatedFloat_); }
+    }
+    public int RepeatedFloatCount {
+      get { return repeatedFloat_.Count; }
+    }
+    public float GetRepeatedFloat(int index) {
+      return repeatedFloat_[index];
+    }
+    
+    public const int RepeatedDoubleFieldNumber = 42;
+    private pbc::PopsicleList<double> repeatedDouble_ = new pbc::PopsicleList<double>();
+    public scg::IList<double> RepeatedDoubleList {
+      get { return pbc::Lists.AsReadOnly(repeatedDouble_); }
+    }
+    public int RepeatedDoubleCount {
+      get { return repeatedDouble_.Count; }
+    }
+    public double GetRepeatedDouble(int index) {
+      return repeatedDouble_[index];
+    }
+    
+    public const int RepeatedBoolFieldNumber = 43;
+    private pbc::PopsicleList<bool> repeatedBool_ = new pbc::PopsicleList<bool>();
+    public scg::IList<bool> RepeatedBoolList {
+      get { return pbc::Lists.AsReadOnly(repeatedBool_); }
+    }
+    public int RepeatedBoolCount {
+      get { return repeatedBool_.Count; }
+    }
+    public bool GetRepeatedBool(int index) {
+      return repeatedBool_[index];
+    }
+    
+    public const int RepeatedStringFieldNumber = 44;
+    private pbc::PopsicleList<string> repeatedString_ = new pbc::PopsicleList<string>();
+    public scg::IList<string> RepeatedStringList {
+      get { return pbc::Lists.AsReadOnly(repeatedString_); }
+    }
+    public int RepeatedStringCount {
+      get { return repeatedString_.Count; }
+    }
+    public string GetRepeatedString(int index) {
+      return repeatedString_[index];
+    }
+    
+    public const int RepeatedBytesFieldNumber = 45;
+    private pbc::PopsicleList<pb::ByteString> repeatedBytes_ = new pbc::PopsicleList<pb::ByteString>();
+    public scg::IList<pb::ByteString> RepeatedBytesList {
+      get { return pbc::Lists.AsReadOnly(repeatedBytes_); }
+    }
+    public int RepeatedBytesCount {
+      get { return repeatedBytes_.Count; }
+    }
+    public pb::ByteString GetRepeatedBytes(int index) {
+      return repeatedBytes_[index];
+    }
+    
+    public const int RepeatedGroupFieldNumber = 46;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup> repeatedGroup_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup> RepeatedGroupList {
+      get { return repeatedGroup_; }
+    }
+    public int RepeatedGroupCount {
+      get { return repeatedGroup_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup GetRepeatedGroup(int index) {
+      return repeatedGroup_[index];
+    }
+    
+    public const int RepeatedNestedMessageFieldNumber = 48;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage> repeatedNestedMessage_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage> RepeatedNestedMessageList {
+      get { return repeatedNestedMessage_; }
+    }
+    public int RepeatedNestedMessageCount {
+      get { return repeatedNestedMessage_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage GetRepeatedNestedMessage(int index) {
+      return repeatedNestedMessage_[index];
+    }
+    
+    public const int RepeatedForeignMessageFieldNumber = 49;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> repeatedForeignMessage_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignMessage>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> RepeatedForeignMessageList {
+      get { return repeatedForeignMessage_; }
+    }
+    public int RepeatedForeignMessageCount {
+      get { return repeatedForeignMessage_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ForeignMessage GetRepeatedForeignMessage(int index) {
+      return repeatedForeignMessage_[index];
+    }
+    
+    public const int RepeatedImportMessageFieldNumber = 50;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ImportMessage> repeatedImportMessage_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ImportMessage>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.ImportMessage> RepeatedImportMessageList {
+      get { return repeatedImportMessage_; }
+    }
+    public int RepeatedImportMessageCount {
+      get { return repeatedImportMessage_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ImportMessage GetRepeatedImportMessage(int index) {
+      return repeatedImportMessage_[index];
+    }
+    
+    public const int RepeatedNestedEnumFieldNumber = 51;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum> repeatedNestedEnum_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum> RepeatedNestedEnumList {
+      get { return pbc::Lists.AsReadOnly(repeatedNestedEnum_); }
+    }
+    public int RepeatedNestedEnumCount {
+      get { return repeatedNestedEnum_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum GetRepeatedNestedEnum(int index) {
+      return repeatedNestedEnum_[index];
+    }
+    
+    public const int RepeatedForeignEnumFieldNumber = 52;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> repeatedForeignEnum_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> RepeatedForeignEnumList {
+      get { return pbc::Lists.AsReadOnly(repeatedForeignEnum_); }
+    }
+    public int RepeatedForeignEnumCount {
+      get { return repeatedForeignEnum_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ForeignEnum GetRepeatedForeignEnum(int index) {
+      return repeatedForeignEnum_[index];
+    }
+    
+    public const int RepeatedImportEnumFieldNumber = 53;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ImportEnum> repeatedImportEnum_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ImportEnum>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.ImportEnum> RepeatedImportEnumList {
+      get { return pbc::Lists.AsReadOnly(repeatedImportEnum_); }
+    }
+    public int RepeatedImportEnumCount {
+      get { return repeatedImportEnum_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ImportEnum GetRepeatedImportEnum(int index) {
+      return repeatedImportEnum_[index];
+    }
+    
+    public const int RepeatedStringPieceFieldNumber = 54;
+    private pbc::PopsicleList<string> repeatedStringPiece_ = new pbc::PopsicleList<string>();
+    public scg::IList<string> RepeatedStringPieceList {
+      get { return pbc::Lists.AsReadOnly(repeatedStringPiece_); }
+    }
+    public int RepeatedStringPieceCount {
+      get { return repeatedStringPiece_.Count; }
+    }
+    public string GetRepeatedStringPiece(int index) {
+      return repeatedStringPiece_[index];
+    }
+    
+    public const int RepeatedCordFieldNumber = 55;
+    private pbc::PopsicleList<string> repeatedCord_ = new pbc::PopsicleList<string>();
+    public scg::IList<string> RepeatedCordList {
+      get { return pbc::Lists.AsReadOnly(repeatedCord_); }
+    }
+    public int RepeatedCordCount {
+      get { return repeatedCord_.Count; }
+    }
+    public string GetRepeatedCord(int index) {
+      return repeatedCord_[index];
+    }
+    
+    public const int DefaultInt32FieldNumber = 61;
+    private bool hasDefaultInt32;
+    private int defaultInt32_ = 41;
+    public bool HasDefaultInt32 {
+      get { return hasDefaultInt32; }
+    }
+    public int DefaultInt32 {
+      get { return defaultInt32_; }
+    }
+    
+    public const int DefaultInt64FieldNumber = 62;
+    private bool hasDefaultInt64;
+    private long defaultInt64_ = 42L;
+    public bool HasDefaultInt64 {
+      get { return hasDefaultInt64; }
+    }
+    public long DefaultInt64 {
+      get { return defaultInt64_; }
+    }
+    
+    public const int DefaultUint32FieldNumber = 63;
+    private bool hasDefaultUint32;
+    private uint defaultUint32_ = 43;
+    public bool HasDefaultUint32 {
+      get { return hasDefaultUint32; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint DefaultUint32 {
+      get { return defaultUint32_; }
+    }
+    
+    public const int DefaultUint64FieldNumber = 64;
+    private bool hasDefaultUint64;
+    private ulong defaultUint64_ = 44UL;
+    public bool HasDefaultUint64 {
+      get { return hasDefaultUint64; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong DefaultUint64 {
+      get { return defaultUint64_; }
+    }
+    
+    public const int DefaultSint32FieldNumber = 65;
+    private bool hasDefaultSint32;
+    private int defaultSint32_ = -45;
+    public bool HasDefaultSint32 {
+      get { return hasDefaultSint32; }
+    }
+    public int DefaultSint32 {
+      get { return defaultSint32_; }
+    }
+    
+    public const int DefaultSint64FieldNumber = 66;
+    private bool hasDefaultSint64;
+    private long defaultSint64_ = 46;
+    public bool HasDefaultSint64 {
+      get { return hasDefaultSint64; }
+    }
+    public long DefaultSint64 {
+      get { return defaultSint64_; }
+    }
+    
+    public const int DefaultFixed32FieldNumber = 67;
+    private bool hasDefaultFixed32;
+    private uint defaultFixed32_ = 47;
+    public bool HasDefaultFixed32 {
+      get { return hasDefaultFixed32; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint DefaultFixed32 {
+      get { return defaultFixed32_; }
+    }
+    
+    public const int DefaultFixed64FieldNumber = 68;
+    private bool hasDefaultFixed64;
+    private ulong defaultFixed64_ = 48;
+    public bool HasDefaultFixed64 {
+      get { return hasDefaultFixed64; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong DefaultFixed64 {
+      get { return defaultFixed64_; }
+    }
+    
+    public const int DefaultSfixed32FieldNumber = 69;
+    private bool hasDefaultSfixed32;
+    private int defaultSfixed32_ = 49;
+    public bool HasDefaultSfixed32 {
+      get { return hasDefaultSfixed32; }
+    }
+    public int DefaultSfixed32 {
+      get { return defaultSfixed32_; }
+    }
+    
+    public const int DefaultSfixed64FieldNumber = 70;
+    private bool hasDefaultSfixed64;
+    private long defaultSfixed64_ = -50;
+    public bool HasDefaultSfixed64 {
+      get { return hasDefaultSfixed64; }
+    }
+    public long DefaultSfixed64 {
+      get { return defaultSfixed64_; }
+    }
+    
+    public const int DefaultFloatFieldNumber = 71;
+    private bool hasDefaultFloat;
+    private float defaultFloat_ = 51.5F;
+    public bool HasDefaultFloat {
+      get { return hasDefaultFloat; }
+    }
+    public float DefaultFloat {
+      get { return defaultFloat_; }
+    }
+    
+    public const int DefaultDoubleFieldNumber = 72;
+    private bool hasDefaultDouble;
+    private double defaultDouble_ = 52000D;
+    public bool HasDefaultDouble {
+      get { return hasDefaultDouble; }
+    }
+    public double DefaultDouble {
+      get { return defaultDouble_; }
+    }
+    
+    public const int DefaultBoolFieldNumber = 73;
+    private bool hasDefaultBool;
+    private bool defaultBool_ = true;
+    public bool HasDefaultBool {
+      get { return hasDefaultBool; }
+    }
+    public bool DefaultBool {
+      get { return defaultBool_; }
+    }
+    
+    public const int DefaultStringFieldNumber = 74;
+    private bool hasDefaultString;
+    private string defaultString_ = "hello";
+    public bool HasDefaultString {
+      get { return hasDefaultString; }
+    }
+    public string DefaultString {
+      get { return defaultString_; }
+    }
+    
+    public const int DefaultBytesFieldNumber = 75;
+    private bool hasDefaultBytes;
+    private pb::ByteString defaultBytes_ = (pb::ByteString) global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Descriptor.Fields[62].DefaultValue;
+    public bool HasDefaultBytes {
+      get { return hasDefaultBytes; }
+    }
+    public pb::ByteString DefaultBytes {
+      get { return defaultBytes_; }
+    }
+    
+    public const int DefaultNestedEnumFieldNumber = 81;
+    private bool hasDefaultNestedEnum;
+    private global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum defaultNestedEnum_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum.BAR;
+    public bool HasDefaultNestedEnum {
+      get { return hasDefaultNestedEnum; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum DefaultNestedEnum {
+      get { return defaultNestedEnum_; }
+    }
+    
+    public const int DefaultForeignEnumFieldNumber = 82;
+    private bool hasDefaultForeignEnum;
+    private global::Google.ProtocolBuffers.TestProtos.ForeignEnum defaultForeignEnum_ = global::Google.ProtocolBuffers.TestProtos.ForeignEnum.FOREIGN_BAR;
+    public bool HasDefaultForeignEnum {
+      get { return hasDefaultForeignEnum; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ForeignEnum DefaultForeignEnum {
+      get { return defaultForeignEnum_; }
+    }
+    
+    public const int DefaultImportEnumFieldNumber = 83;
+    private bool hasDefaultImportEnum;
+    private global::Google.ProtocolBuffers.TestProtos.ImportEnum defaultImportEnum_ = global::Google.ProtocolBuffers.TestProtos.ImportEnum.IMPORT_BAR;
+    public bool HasDefaultImportEnum {
+      get { return hasDefaultImportEnum; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ImportEnum DefaultImportEnum {
+      get { return defaultImportEnum_; }
+    }
+    
+    public const int DefaultStringPieceFieldNumber = 84;
+    private bool hasDefaultStringPiece;
+    private string defaultStringPiece_ = "abc";
+    public bool HasDefaultStringPiece {
+      get { return hasDefaultStringPiece; }
+    }
+    public string DefaultStringPiece {
+      get { return defaultStringPiece_; }
+    }
+    
+    public const int DefaultCordFieldNumber = 85;
+    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::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testAllTypesFieldNames;
+      if (hasOptionalInt32) {
+        output.WriteInt32(1, field_names[31], OptionalInt32);
+      }
+      if (hasOptionalInt64) {
+        output.WriteInt64(2, field_names[32], OptionalInt64);
+      }
+      if (hasOptionalUint32) {
+        output.WriteUInt32(3, field_names[41], OptionalUint32);
+      }
+      if (hasOptionalUint64) {
+        output.WriteUInt64(4, field_names[42], OptionalUint64);
+      }
+      if (hasOptionalSint32) {
+        output.WriteSInt32(5, field_names[37], OptionalSint32);
+      }
+      if (hasOptionalSint64) {
+        output.WriteSInt64(6, field_names[38], OptionalSint64);
+      }
+      if (hasOptionalFixed32) {
+        output.WriteFixed32(7, field_names[24], OptionalFixed32);
+      }
+      if (hasOptionalFixed64) {
+        output.WriteFixed64(8, field_names[25], OptionalFixed64);
+      }
+      if (hasOptionalSfixed32) {
+        output.WriteSFixed32(9, field_names[35], OptionalSfixed32);
+      }
+      if (hasOptionalSfixed64) {
+        output.WriteSFixed64(10, field_names[36], OptionalSfixed64);
+      }
+      if (hasOptionalFloat) {
+        output.WriteFloat(11, field_names[26], OptionalFloat);
+      }
+      if (hasOptionalDouble) {
+        output.WriteDouble(12, field_names[23], OptionalDouble);
+      }
+      if (hasOptionalBool) {
+        output.WriteBool(13, field_names[20], OptionalBool);
+      }
+      if (hasOptionalString) {
+        output.WriteString(14, field_names[39], OptionalString);
+      }
+      if (hasOptionalBytes) {
+        output.WriteBytes(15, field_names[21], OptionalBytes);
+      }
+      if (hasOptionalGroup) {
+        output.WriteGroup(16, field_names[43], OptionalGroup);
+      }
+      if (hasOptionalNestedMessage) {
+        output.WriteMessage(18, field_names[34], OptionalNestedMessage);
+      }
+      if (hasOptionalForeignMessage) {
+        output.WriteMessage(19, field_names[28], OptionalForeignMessage);
+      }
+      if (hasOptionalImportMessage) {
+        output.WriteMessage(20, field_names[30], OptionalImportMessage);
+      }
+      if (hasOptionalNestedEnum) {
+        output.WriteEnum(21, field_names[33], (int) OptionalNestedEnum, OptionalNestedEnum);
+      }
+      if (hasOptionalForeignEnum) {
+        output.WriteEnum(22, field_names[27], (int) OptionalForeignEnum, OptionalForeignEnum);
+      }
+      if (hasOptionalImportEnum) {
+        output.WriteEnum(23, field_names[29], (int) OptionalImportEnum, OptionalImportEnum);
+      }
+      if (hasOptionalStringPiece) {
+        output.WriteString(24, field_names[40], OptionalStringPiece);
+      }
+      if (hasOptionalCord) {
+        output.WriteString(25, field_names[22], OptionalCord);
+      }
+      if (repeatedInt32_.Count > 0) {
+        output.WriteInt32Array(31, field_names[55], repeatedInt32_);
+      }
+      if (repeatedInt64_.Count > 0) {
+        output.WriteInt64Array(32, field_names[56], repeatedInt64_);
+      }
+      if (repeatedUint32_.Count > 0) {
+        output.WriteUInt32Array(33, field_names[65], repeatedUint32_);
+      }
+      if (repeatedUint64_.Count > 0) {
+        output.WriteUInt64Array(34, field_names[66], repeatedUint64_);
+      }
+      if (repeatedSint32_.Count > 0) {
+        output.WriteSInt32Array(35, field_names[61], repeatedSint32_);
+      }
+      if (repeatedSint64_.Count > 0) {
+        output.WriteSInt64Array(36, field_names[62], repeatedSint64_);
+      }
+      if (repeatedFixed32_.Count > 0) {
+        output.WriteFixed32Array(37, field_names[48], repeatedFixed32_);
+      }
+      if (repeatedFixed64_.Count > 0) {
+        output.WriteFixed64Array(38, field_names[49], repeatedFixed64_);
+      }
+      if (repeatedSfixed32_.Count > 0) {
+        output.WriteSFixed32Array(39, field_names[59], repeatedSfixed32_);
+      }
+      if (repeatedSfixed64_.Count > 0) {
+        output.WriteSFixed64Array(40, field_names[60], repeatedSfixed64_);
+      }
+      if (repeatedFloat_.Count > 0) {
+        output.WriteFloatArray(41, field_names[50], repeatedFloat_);
+      }
+      if (repeatedDouble_.Count > 0) {
+        output.WriteDoubleArray(42, field_names[47], repeatedDouble_);
+      }
+      if (repeatedBool_.Count > 0) {
+        output.WriteBoolArray(43, field_names[44], repeatedBool_);
+      }
+      if (repeatedString_.Count > 0) {
+        output.WriteStringArray(44, field_names[63], repeatedString_);
+      }
+      if (repeatedBytes_.Count > 0) {
+        output.WriteBytesArray(45, field_names[45], repeatedBytes_);
+      }
+      if (repeatedGroup_.Count > 0) {
+        output.WriteGroupArray(46, field_names[67], repeatedGroup_);
+      }
+      if (repeatedNestedMessage_.Count > 0) {
+        output.WriteMessageArray(48, field_names[58], repeatedNestedMessage_);
+      }
+      if (repeatedForeignMessage_.Count > 0) {
+        output.WriteMessageArray(49, field_names[52], repeatedForeignMessage_);
+      }
+      if (repeatedImportMessage_.Count > 0) {
+        output.WriteMessageArray(50, field_names[54], repeatedImportMessage_);
+      }
+      if (repeatedNestedEnum_.Count > 0) {
+        output.WriteEnumArray(51, field_names[57], repeatedNestedEnum_);
+      }
+      if (repeatedForeignEnum_.Count > 0) {
+        output.WriteEnumArray(52, field_names[51], repeatedForeignEnum_);
+      }
+      if (repeatedImportEnum_.Count > 0) {
+        output.WriteEnumArray(53, field_names[53], repeatedImportEnum_);
+      }
+      if (repeatedStringPiece_.Count > 0) {
+        output.WriteStringArray(54, field_names[64], repeatedStringPiece_);
+      }
+      if (repeatedCord_.Count > 0) {
+        output.WriteStringArray(55, field_names[46], repeatedCord_);
+      }
+      if (hasDefaultInt32) {
+        output.WriteInt32(61, field_names[9], DefaultInt32);
+      }
+      if (hasDefaultInt64) {
+        output.WriteInt64(62, field_names[10], DefaultInt64);
+      }
+      if (hasDefaultUint32) {
+        output.WriteUInt32(63, field_names[18], DefaultUint32);
+      }
+      if (hasDefaultUint64) {
+        output.WriteUInt64(64, field_names[19], DefaultUint64);
+      }
+      if (hasDefaultSint32) {
+        output.WriteSInt32(65, field_names[14], DefaultSint32);
+      }
+      if (hasDefaultSint64) {
+        output.WriteSInt64(66, field_names[15], DefaultSint64);
+      }
+      if (hasDefaultFixed32) {
+        output.WriteFixed32(67, field_names[4], DefaultFixed32);
+      }
+      if (hasDefaultFixed64) {
+        output.WriteFixed64(68, field_names[5], DefaultFixed64);
+      }
+      if (hasDefaultSfixed32) {
+        output.WriteSFixed32(69, field_names[12], DefaultSfixed32);
+      }
+      if (hasDefaultSfixed64) {
+        output.WriteSFixed64(70, field_names[13], DefaultSfixed64);
+      }
+      if (hasDefaultFloat) {
+        output.WriteFloat(71, field_names[6], DefaultFloat);
+      }
+      if (hasDefaultDouble) {
+        output.WriteDouble(72, field_names[3], DefaultDouble);
+      }
+      if (hasDefaultBool) {
+        output.WriteBool(73, field_names[0], DefaultBool);
+      }
+      if (hasDefaultString) {
+        output.WriteString(74, field_names[16], DefaultString);
+      }
+      if (hasDefaultBytes) {
+        output.WriteBytes(75, field_names[1], DefaultBytes);
+      }
+      if (hasDefaultNestedEnum) {
+        output.WriteEnum(81, field_names[11], (int) DefaultNestedEnum, DefaultNestedEnum);
+      }
+      if (hasDefaultForeignEnum) {
+        output.WriteEnum(82, field_names[7], (int) DefaultForeignEnum, DefaultForeignEnum);
+      }
+      if (hasDefaultImportEnum) {
+        output.WriteEnum(83, field_names[8], (int) DefaultImportEnum, DefaultImportEnum);
+      }
+      if (hasDefaultStringPiece) {
+        output.WriteString(84, field_names[17], DefaultStringPiece);
+      }
+      if (hasDefaultCord) {
+        output.WriteString(85, field_names[2], DefaultCord);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      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);
+      }
+      {
+        int dataSize = 0;
+        foreach (int element in RepeatedInt32List) {
+          dataSize += pb::CodedOutputStream.ComputeInt32SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * repeatedInt32_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (long element in RepeatedInt64List) {
+          dataSize += pb::CodedOutputStream.ComputeInt64SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * repeatedInt64_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (uint element in RepeatedUint32List) {
+          dataSize += pb::CodedOutputStream.ComputeUInt32SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * repeatedUint32_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (ulong element in RepeatedUint64List) {
+          dataSize += pb::CodedOutputStream.ComputeUInt64SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * repeatedUint64_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (int element in RepeatedSint32List) {
+          dataSize += pb::CodedOutputStream.ComputeSInt32SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * repeatedSint32_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (long element in RepeatedSint64List) {
+          dataSize += pb::CodedOutputStream.ComputeSInt64SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * repeatedSint64_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 4 * repeatedFixed32_.Count;
+        size += dataSize;
+        size += 2 * repeatedFixed32_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 8 * repeatedFixed64_.Count;
+        size += dataSize;
+        size += 2 * repeatedFixed64_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 4 * repeatedSfixed32_.Count;
+        size += dataSize;
+        size += 2 * repeatedSfixed32_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 8 * repeatedSfixed64_.Count;
+        size += dataSize;
+        size += 2 * repeatedSfixed64_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 4 * repeatedFloat_.Count;
+        size += dataSize;
+        size += 2 * repeatedFloat_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 8 * repeatedDouble_.Count;
+        size += dataSize;
+        size += 2 * repeatedDouble_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 1 * repeatedBool_.Count;
+        size += dataSize;
+        size += 2 * repeatedBool_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (string element in RepeatedStringList) {
+          dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * repeatedString_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (pb::ByteString element in RepeatedBytesList) {
+          dataSize += pb::CodedOutputStream.ComputeBytesSizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * repeatedBytes_.Count;
+      }
+      foreach (global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup element in RepeatedGroupList) {
+        size += pb::CodedOutputStream.ComputeGroupSize(46, element);
+      }
+      foreach (global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage element in RepeatedNestedMessageList) {
+        size += pb::CodedOutputStream.ComputeMessageSize(48, element);
+      }
+      foreach (global::Google.ProtocolBuffers.TestProtos.ForeignMessage element in RepeatedForeignMessageList) {
+        size += pb::CodedOutputStream.ComputeMessageSize(49, element);
+      }
+      foreach (global::Google.ProtocolBuffers.TestProtos.ImportMessage element in RepeatedImportMessageList) {
+        size += pb::CodedOutputStream.ComputeMessageSize(50, element);
+      }
+      {
+        int dataSize = 0;
+        if (repeatedNestedEnum_.Count > 0) {
+          foreach (global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum element in repeatedNestedEnum_) {
+            dataSize += pb::CodedOutputStream.ComputeEnumSizeNoTag((int) element);
+          }
+          size += dataSize;
+          size += 2 * repeatedNestedEnum_.Count;
+        }
+      }
+      {
+        int dataSize = 0;
+        if (repeatedForeignEnum_.Count > 0) {
+          foreach (global::Google.ProtocolBuffers.TestProtos.ForeignEnum element in repeatedForeignEnum_) {
+            dataSize += pb::CodedOutputStream.ComputeEnumSizeNoTag((int) element);
+          }
+          size += dataSize;
+          size += 2 * repeatedForeignEnum_.Count;
+        }
+      }
+      {
+        int dataSize = 0;
+        if (repeatedImportEnum_.Count > 0) {
+          foreach (global::Google.ProtocolBuffers.TestProtos.ImportEnum element in repeatedImportEnum_) {
+            dataSize += pb::CodedOutputStream.ComputeEnumSizeNoTag((int) element);
+          }
+          size += dataSize;
+          size += 2 * repeatedImportEnum_.Count;
+        }
+      }
+      {
+        int dataSize = 0;
+        foreach (string element in RepeatedStringPieceList) {
+          dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * repeatedStringPiece_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (string element in RepeatedCordList) {
+          dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * repeatedCord_.Count;
+      }
+      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 TestAllTypes ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestAllTypes ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestAllTypes ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestAllTypes ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestAllTypes ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestAllTypes ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestAllTypes ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestAllTypes ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestAllTypes ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestAllTypes ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestAllTypes MakeReadOnly() {
+      repeatedInt32_.MakeReadOnly();
+      repeatedInt64_.MakeReadOnly();
+      repeatedUint32_.MakeReadOnly();
+      repeatedUint64_.MakeReadOnly();
+      repeatedSint32_.MakeReadOnly();
+      repeatedSint64_.MakeReadOnly();
+      repeatedFixed32_.MakeReadOnly();
+      repeatedFixed64_.MakeReadOnly();
+      repeatedSfixed32_.MakeReadOnly();
+      repeatedSfixed64_.MakeReadOnly();
+      repeatedFloat_.MakeReadOnly();
+      repeatedDouble_.MakeReadOnly();
+      repeatedBool_.MakeReadOnly();
+      repeatedString_.MakeReadOnly();
+      repeatedBytes_.MakeReadOnly();
+      repeatedGroup_.MakeReadOnly();
+      repeatedNestedMessage_.MakeReadOnly();
+      repeatedForeignMessage_.MakeReadOnly();
+      repeatedImportMessage_.MakeReadOnly();
+      repeatedNestedEnum_.MakeReadOnly();
+      repeatedForeignEnum_.MakeReadOnly();
+      repeatedImportEnum_.MakeReadOnly();
+      repeatedStringPiece_.MakeReadOnly();
+      repeatedCord_.MakeReadOnly();
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestAllTypes prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestAllTypes, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestAllTypes cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private TestAllTypes result;
+      
+      private TestAllTypes PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestAllTypes original = result;
+          result = new TestAllTypes();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override TestAllTypes MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Descriptor; }
+      }
+      
+      public override TestAllTypes DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance; }
+      }
+      
+      public override TestAllTypes BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestAllTypes) {
+          return MergeFrom((TestAllTypes) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(TestAllTypes other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestAllTypes.DefaultInstance) return this;
+        PrepareBuilder();
+        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) {
+          result.repeatedInt32_.Add(other.repeatedInt32_);
+        }
+        if (other.repeatedInt64_.Count != 0) {
+          result.repeatedInt64_.Add(other.repeatedInt64_);
+        }
+        if (other.repeatedUint32_.Count != 0) {
+          result.repeatedUint32_.Add(other.repeatedUint32_);
+        }
+        if (other.repeatedUint64_.Count != 0) {
+          result.repeatedUint64_.Add(other.repeatedUint64_);
+        }
+        if (other.repeatedSint32_.Count != 0) {
+          result.repeatedSint32_.Add(other.repeatedSint32_);
+        }
+        if (other.repeatedSint64_.Count != 0) {
+          result.repeatedSint64_.Add(other.repeatedSint64_);
+        }
+        if (other.repeatedFixed32_.Count != 0) {
+          result.repeatedFixed32_.Add(other.repeatedFixed32_);
+        }
+        if (other.repeatedFixed64_.Count != 0) {
+          result.repeatedFixed64_.Add(other.repeatedFixed64_);
+        }
+        if (other.repeatedSfixed32_.Count != 0) {
+          result.repeatedSfixed32_.Add(other.repeatedSfixed32_);
+        }
+        if (other.repeatedSfixed64_.Count != 0) {
+          result.repeatedSfixed64_.Add(other.repeatedSfixed64_);
+        }
+        if (other.repeatedFloat_.Count != 0) {
+          result.repeatedFloat_.Add(other.repeatedFloat_);
+        }
+        if (other.repeatedDouble_.Count != 0) {
+          result.repeatedDouble_.Add(other.repeatedDouble_);
+        }
+        if (other.repeatedBool_.Count != 0) {
+          result.repeatedBool_.Add(other.repeatedBool_);
+        }
+        if (other.repeatedString_.Count != 0) {
+          result.repeatedString_.Add(other.repeatedString_);
+        }
+        if (other.repeatedBytes_.Count != 0) {
+          result.repeatedBytes_.Add(other.repeatedBytes_);
+        }
+        if (other.repeatedGroup_.Count != 0) {
+          result.repeatedGroup_.Add(other.repeatedGroup_);
+        }
+        if (other.repeatedNestedMessage_.Count != 0) {
+          result.repeatedNestedMessage_.Add(other.repeatedNestedMessage_);
+        }
+        if (other.repeatedForeignMessage_.Count != 0) {
+          result.repeatedForeignMessage_.Add(other.repeatedForeignMessage_);
+        }
+        if (other.repeatedImportMessage_.Count != 0) {
+          result.repeatedImportMessage_.Add(other.repeatedImportMessage_);
+        }
+        if (other.repeatedNestedEnum_.Count != 0) {
+          result.repeatedNestedEnum_.Add(other.repeatedNestedEnum_);
+        }
+        if (other.repeatedForeignEnum_.Count != 0) {
+          result.repeatedForeignEnum_.Add(other.repeatedForeignEnum_);
+        }
+        if (other.repeatedImportEnum_.Count != 0) {
+          result.repeatedImportEnum_.Add(other.repeatedImportEnum_);
+        }
+        if (other.repeatedStringPiece_.Count != 0) {
+          result.repeatedStringPiece_.Add(other.repeatedStringPiece_);
+        }
+        if (other.repeatedCord_.Count != 0) {
+          result.repeatedCord_.Add(other.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 Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testAllTypesFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testAllTypesFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasOptionalInt32 = input.ReadInt32(ref result.optionalInt32_);
+              break;
+            }
+            case 16: {
+              result.hasOptionalInt64 = input.ReadInt64(ref result.optionalInt64_);
+              break;
+            }
+            case 24: {
+              result.hasOptionalUint32 = input.ReadUInt32(ref result.optionalUint32_);
+              break;
+            }
+            case 32: {
+              result.hasOptionalUint64 = input.ReadUInt64(ref result.optionalUint64_);
+              break;
+            }
+            case 40: {
+              result.hasOptionalSint32 = input.ReadSInt32(ref result.optionalSint32_);
+              break;
+            }
+            case 48: {
+              result.hasOptionalSint64 = input.ReadSInt64(ref result.optionalSint64_);
+              break;
+            }
+            case 61: {
+              result.hasOptionalFixed32 = input.ReadFixed32(ref result.optionalFixed32_);
+              break;
+            }
+            case 65: {
+              result.hasOptionalFixed64 = input.ReadFixed64(ref result.optionalFixed64_);
+              break;
+            }
+            case 77: {
+              result.hasOptionalSfixed32 = input.ReadSFixed32(ref result.optionalSfixed32_);
+              break;
+            }
+            case 81: {
+              result.hasOptionalSfixed64 = input.ReadSFixed64(ref result.optionalSfixed64_);
+              break;
+            }
+            case 93: {
+              result.hasOptionalFloat = input.ReadFloat(ref result.optionalFloat_);
+              break;
+            }
+            case 97: {
+              result.hasOptionalDouble = input.ReadDouble(ref result.optionalDouble_);
+              break;
+            }
+            case 104: {
+              result.hasOptionalBool = input.ReadBool(ref result.optionalBool_);
+              break;
+            }
+            case 114: {
+              result.hasOptionalString = input.ReadString(ref result.optionalString_);
+              break;
+            }
+            case 122: {
+              result.hasOptionalBytes = input.ReadBytes(ref result.optionalBytes_);
+              break;
+            }
+            case 131: {
+              global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.CreateBuilder();
+              if (result.hasOptionalGroup) {
+                subBuilder.MergeFrom(OptionalGroup);
+              }
+              input.ReadGroup(16, subBuilder, extensionRegistry);
+              OptionalGroup = subBuilder.BuildPartial();
+              break;
+            }
+            case 146: {
+              global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.CreateBuilder();
+              if (result.hasOptionalNestedMessage) {
+                subBuilder.MergeFrom(OptionalNestedMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              OptionalNestedMessage = subBuilder.BuildPartial();
+              break;
+            }
+            case 154: {
+              global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.ForeignMessage.CreateBuilder();
+              if (result.hasOptionalForeignMessage) {
+                subBuilder.MergeFrom(OptionalForeignMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              OptionalForeignMessage = subBuilder.BuildPartial();
+              break;
+            }
+            case 162: {
+              global::Google.ProtocolBuffers.TestProtos.ImportMessage.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.ImportMessage.CreateBuilder();
+              if (result.hasOptionalImportMessage) {
+                subBuilder.MergeFrom(OptionalImportMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              OptionalImportMessage = subBuilder.BuildPartial();
+              break;
+            }
+            case 168: {
+              object unknown;
+              if(input.ReadEnum(ref result.optionalNestedEnum_, out unknown)) {
+                result.hasOptionalNestedEnum = true;
+              } else if(unknown is int) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                unknownFields.MergeVarintField(21, (ulong)(int)unknown);
+              }
+              break;
+            }
+            case 176: {
+              object unknown;
+              if(input.ReadEnum(ref result.optionalForeignEnum_, out unknown)) {
+                result.hasOptionalForeignEnum = true;
+              } else if(unknown is int) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                unknownFields.MergeVarintField(22, (ulong)(int)unknown);
+              }
+              break;
+            }
+            case 184: {
+              object unknown;
+              if(input.ReadEnum(ref result.optionalImportEnum_, out unknown)) {
+                result.hasOptionalImportEnum = true;
+              } else if(unknown is int) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                unknownFields.MergeVarintField(23, (ulong)(int)unknown);
+              }
+              break;
+            }
+            case 194: {
+              result.hasOptionalStringPiece = input.ReadString(ref result.optionalStringPiece_);
+              break;
+            }
+            case 202: {
+              result.hasOptionalCord = input.ReadString(ref result.optionalCord_);
+              break;
+            }
+            case 250:
+            case 248: {
+              input.ReadInt32Array(tag, field_name, result.repeatedInt32_);
+              break;
+            }
+            case 258:
+            case 256: {
+              input.ReadInt64Array(tag, field_name, result.repeatedInt64_);
+              break;
+            }
+            case 266:
+            case 264: {
+              input.ReadUInt32Array(tag, field_name, result.repeatedUint32_);
+              break;
+            }
+            case 274:
+            case 272: {
+              input.ReadUInt64Array(tag, field_name, result.repeatedUint64_);
+              break;
+            }
+            case 282:
+            case 280: {
+              input.ReadSInt32Array(tag, field_name, result.repeatedSint32_);
+              break;
+            }
+            case 290:
+            case 288: {
+              input.ReadSInt64Array(tag, field_name, result.repeatedSint64_);
+              break;
+            }
+            case 298:
+            case 301: {
+              input.ReadFixed32Array(tag, field_name, result.repeatedFixed32_);
+              break;
+            }
+            case 306:
+            case 305: {
+              input.ReadFixed64Array(tag, field_name, result.repeatedFixed64_);
+              break;
+            }
+            case 314:
+            case 317: {
+              input.ReadSFixed32Array(tag, field_name, result.repeatedSfixed32_);
+              break;
+            }
+            case 322:
+            case 321: {
+              input.ReadSFixed64Array(tag, field_name, result.repeatedSfixed64_);
+              break;
+            }
+            case 330:
+            case 333: {
+              input.ReadFloatArray(tag, field_name, result.repeatedFloat_);
+              break;
+            }
+            case 338:
+            case 337: {
+              input.ReadDoubleArray(tag, field_name, result.repeatedDouble_);
+              break;
+            }
+            case 346:
+            case 344: {
+              input.ReadBoolArray(tag, field_name, result.repeatedBool_);
+              break;
+            }
+            case 354: {
+              input.ReadStringArray(tag, field_name, result.repeatedString_);
+              break;
+            }
+            case 362: {
+              input.ReadBytesArray(tag, field_name, result.repeatedBytes_);
+              break;
+            }
+            case 371: {
+              input.ReadGroupArray(tag, field_name, result.repeatedGroup_, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 386: {
+              input.ReadMessageArray(tag, field_name, result.repeatedNestedMessage_, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 394: {
+              input.ReadMessageArray(tag, field_name, result.repeatedForeignMessage_, global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 402: {
+              input.ReadMessageArray(tag, field_name, result.repeatedImportMessage_, global::Google.ProtocolBuffers.TestProtos.ImportMessage.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 410:
+            case 408: {
+              scg::ICollection<object> unknownItems;
+              input.ReadEnumArray<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum>(tag, field_name, result.repeatedNestedEnum_, out unknownItems);
+              if (unknownItems != null) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                foreach (object rawValue in unknownItems)
+                  if (rawValue is int)
+                    unknownFields.MergeVarintField(51, (ulong)(int)rawValue);
+              }
+              break;
+            }
+            case 418:
+            case 416: {
+              scg::ICollection<object> unknownItems;
+              input.ReadEnumArray<global::Google.ProtocolBuffers.TestProtos.ForeignEnum>(tag, field_name, result.repeatedForeignEnum_, out unknownItems);
+              if (unknownItems != null) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                foreach (object rawValue in unknownItems)
+                  if (rawValue is int)
+                    unknownFields.MergeVarintField(52, (ulong)(int)rawValue);
+              }
+              break;
+            }
+            case 426:
+            case 424: {
+              scg::ICollection<object> unknownItems;
+              input.ReadEnumArray<global::Google.ProtocolBuffers.TestProtos.ImportEnum>(tag, field_name, result.repeatedImportEnum_, out unknownItems);
+              if (unknownItems != null) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                foreach (object rawValue in unknownItems)
+                  if (rawValue is int)
+                    unknownFields.MergeVarintField(53, (ulong)(int)rawValue);
+              }
+              break;
+            }
+            case 434: {
+              input.ReadStringArray(tag, field_name, result.repeatedStringPiece_);
+              break;
+            }
+            case 442: {
+              input.ReadStringArray(tag, field_name, result.repeatedCord_);
+              break;
+            }
+            case 488: {
+              result.hasDefaultInt32 = input.ReadInt32(ref result.defaultInt32_);
+              break;
+            }
+            case 496: {
+              result.hasDefaultInt64 = input.ReadInt64(ref result.defaultInt64_);
+              break;
+            }
+            case 504: {
+              result.hasDefaultUint32 = input.ReadUInt32(ref result.defaultUint32_);
+              break;
+            }
+            case 512: {
+              result.hasDefaultUint64 = input.ReadUInt64(ref result.defaultUint64_);
+              break;
+            }
+            case 520: {
+              result.hasDefaultSint32 = input.ReadSInt32(ref result.defaultSint32_);
+              break;
+            }
+            case 528: {
+              result.hasDefaultSint64 = input.ReadSInt64(ref result.defaultSint64_);
+              break;
+            }
+            case 541: {
+              result.hasDefaultFixed32 = input.ReadFixed32(ref result.defaultFixed32_);
+              break;
+            }
+            case 545: {
+              result.hasDefaultFixed64 = input.ReadFixed64(ref result.defaultFixed64_);
+              break;
+            }
+            case 557: {
+              result.hasDefaultSfixed32 = input.ReadSFixed32(ref result.defaultSfixed32_);
+              break;
+            }
+            case 561: {
+              result.hasDefaultSfixed64 = input.ReadSFixed64(ref result.defaultSfixed64_);
+              break;
+            }
+            case 573: {
+              result.hasDefaultFloat = input.ReadFloat(ref result.defaultFloat_);
+              break;
+            }
+            case 577: {
+              result.hasDefaultDouble = input.ReadDouble(ref result.defaultDouble_);
+              break;
+            }
+            case 584: {
+              result.hasDefaultBool = input.ReadBool(ref result.defaultBool_);
+              break;
+            }
+            case 594: {
+              result.hasDefaultString = input.ReadString(ref result.defaultString_);
+              break;
+            }
+            case 602: {
+              result.hasDefaultBytes = input.ReadBytes(ref result.defaultBytes_);
+              break;
+            }
+            case 648: {
+              object unknown;
+              if(input.ReadEnum(ref result.defaultNestedEnum_, out unknown)) {
+                result.hasDefaultNestedEnum = true;
+              } else if(unknown is int) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                unknownFields.MergeVarintField(81, (ulong)(int)unknown);
+              }
+              break;
+            }
+            case 656: {
+              object unknown;
+              if(input.ReadEnum(ref result.defaultForeignEnum_, out unknown)) {
+                result.hasDefaultForeignEnum = true;
+              } else if(unknown is int) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                unknownFields.MergeVarintField(82, (ulong)(int)unknown);
+              }
+              break;
+            }
+            case 664: {
+              object unknown;
+              if(input.ReadEnum(ref result.defaultImportEnum_, out unknown)) {
+                result.hasDefaultImportEnum = true;
+              } else if(unknown is int) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                unknownFields.MergeVarintField(83, (ulong)(int)unknown);
+              }
+              break;
+            }
+            case 674: {
+              result.hasDefaultStringPiece = input.ReadString(ref result.defaultStringPiece_);
+              break;
+            }
+            case 682: {
+              result.hasDefaultCord = input.ReadString(ref result.defaultCord_);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public bool HasOptionalInt32 {
+        get { return result.hasOptionalInt32; }
+      }
+      public int OptionalInt32 {
+        get { return result.OptionalInt32; }
+        set { SetOptionalInt32(value); }
+      }
+      public Builder SetOptionalInt32(int value) {
+        PrepareBuilder();
+        result.hasOptionalInt32 = true;
+        result.optionalInt32_ = value;
+        return this;
+      }
+      public Builder ClearOptionalInt32() {
+        PrepareBuilder();
+        result.hasOptionalInt32 = false;
+        result.optionalInt32_ = 0;
+        return this;
+      }
+      
+      public bool HasOptionalInt64 {
+        get { return result.hasOptionalInt64; }
+      }
+      public long OptionalInt64 {
+        get { return result.OptionalInt64; }
+        set { SetOptionalInt64(value); }
+      }
+      public Builder SetOptionalInt64(long value) {
+        PrepareBuilder();
+        result.hasOptionalInt64 = true;
+        result.optionalInt64_ = value;
+        return this;
+      }
+      public Builder ClearOptionalInt64() {
+        PrepareBuilder();
+        result.hasOptionalInt64 = false;
+        result.optionalInt64_ = 0L;
+        return this;
+      }
+      
+      public bool HasOptionalUint32 {
+        get { return result.hasOptionalUint32; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint OptionalUint32 {
+        get { return result.OptionalUint32; }
+        set { SetOptionalUint32(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetOptionalUint32(uint value) {
+        PrepareBuilder();
+        result.hasOptionalUint32 = true;
+        result.optionalUint32_ = value;
+        return this;
+      }
+      public Builder ClearOptionalUint32() {
+        PrepareBuilder();
+        result.hasOptionalUint32 = false;
+        result.optionalUint32_ = 0;
+        return this;
+      }
+      
+      public bool HasOptionalUint64 {
+        get { return result.hasOptionalUint64; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong OptionalUint64 {
+        get { return result.OptionalUint64; }
+        set { SetOptionalUint64(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetOptionalUint64(ulong value) {
+        PrepareBuilder();
+        result.hasOptionalUint64 = true;
+        result.optionalUint64_ = value;
+        return this;
+      }
+      public Builder ClearOptionalUint64() {
+        PrepareBuilder();
+        result.hasOptionalUint64 = false;
+        result.optionalUint64_ = 0UL;
+        return this;
+      }
+      
+      public bool HasOptionalSint32 {
+        get { return result.hasOptionalSint32; }
+      }
+      public int OptionalSint32 {
+        get { return result.OptionalSint32; }
+        set { SetOptionalSint32(value); }
+      }
+      public Builder SetOptionalSint32(int value) {
+        PrepareBuilder();
+        result.hasOptionalSint32 = true;
+        result.optionalSint32_ = value;
+        return this;
+      }
+      public Builder ClearOptionalSint32() {
+        PrepareBuilder();
+        result.hasOptionalSint32 = false;
+        result.optionalSint32_ = 0;
+        return this;
+      }
+      
+      public bool HasOptionalSint64 {
+        get { return result.hasOptionalSint64; }
+      }
+      public long OptionalSint64 {
+        get { return result.OptionalSint64; }
+        set { SetOptionalSint64(value); }
+      }
+      public Builder SetOptionalSint64(long value) {
+        PrepareBuilder();
+        result.hasOptionalSint64 = true;
+        result.optionalSint64_ = value;
+        return this;
+      }
+      public Builder ClearOptionalSint64() {
+        PrepareBuilder();
+        result.hasOptionalSint64 = false;
+        result.optionalSint64_ = 0;
+        return this;
+      }
+      
+      public bool HasOptionalFixed32 {
+        get { return result.hasOptionalFixed32; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint OptionalFixed32 {
+        get { return result.OptionalFixed32; }
+        set { SetOptionalFixed32(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetOptionalFixed32(uint value) {
+        PrepareBuilder();
+        result.hasOptionalFixed32 = true;
+        result.optionalFixed32_ = value;
+        return this;
+      }
+      public Builder ClearOptionalFixed32() {
+        PrepareBuilder();
+        result.hasOptionalFixed32 = false;
+        result.optionalFixed32_ = 0;
+        return this;
+      }
+      
+      public bool HasOptionalFixed64 {
+        get { return result.hasOptionalFixed64; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong OptionalFixed64 {
+        get { return result.OptionalFixed64; }
+        set { SetOptionalFixed64(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetOptionalFixed64(ulong value) {
+        PrepareBuilder();
+        result.hasOptionalFixed64 = true;
+        result.optionalFixed64_ = value;
+        return this;
+      }
+      public Builder ClearOptionalFixed64() {
+        PrepareBuilder();
+        result.hasOptionalFixed64 = false;
+        result.optionalFixed64_ = 0;
+        return this;
+      }
+      
+      public bool HasOptionalSfixed32 {
+        get { return result.hasOptionalSfixed32; }
+      }
+      public int OptionalSfixed32 {
+        get { return result.OptionalSfixed32; }
+        set { SetOptionalSfixed32(value); }
+      }
+      public Builder SetOptionalSfixed32(int value) {
+        PrepareBuilder();
+        result.hasOptionalSfixed32 = true;
+        result.optionalSfixed32_ = value;
+        return this;
+      }
+      public Builder ClearOptionalSfixed32() {
+        PrepareBuilder();
+        result.hasOptionalSfixed32 = false;
+        result.optionalSfixed32_ = 0;
+        return this;
+      }
+      
+      public bool HasOptionalSfixed64 {
+        get { return result.hasOptionalSfixed64; }
+      }
+      public long OptionalSfixed64 {
+        get { return result.OptionalSfixed64; }
+        set { SetOptionalSfixed64(value); }
+      }
+      public Builder SetOptionalSfixed64(long value) {
+        PrepareBuilder();
+        result.hasOptionalSfixed64 = true;
+        result.optionalSfixed64_ = value;
+        return this;
+      }
+      public Builder ClearOptionalSfixed64() {
+        PrepareBuilder();
+        result.hasOptionalSfixed64 = false;
+        result.optionalSfixed64_ = 0;
+        return this;
+      }
+      
+      public bool HasOptionalFloat {
+        get { return result.hasOptionalFloat; }
+      }
+      public float OptionalFloat {
+        get { return result.OptionalFloat; }
+        set { SetOptionalFloat(value); }
+      }
+      public Builder SetOptionalFloat(float value) {
+        PrepareBuilder();
+        result.hasOptionalFloat = true;
+        result.optionalFloat_ = value;
+        return this;
+      }
+      public Builder ClearOptionalFloat() {
+        PrepareBuilder();
+        result.hasOptionalFloat = false;
+        result.optionalFloat_ = 0F;
+        return this;
+      }
+      
+      public bool HasOptionalDouble {
+        get { return result.hasOptionalDouble; }
+      }
+      public double OptionalDouble {
+        get { return result.OptionalDouble; }
+        set { SetOptionalDouble(value); }
+      }
+      public Builder SetOptionalDouble(double value) {
+        PrepareBuilder();
+        result.hasOptionalDouble = true;
+        result.optionalDouble_ = value;
+        return this;
+      }
+      public Builder ClearOptionalDouble() {
+        PrepareBuilder();
+        result.hasOptionalDouble = false;
+        result.optionalDouble_ = 0D;
+        return this;
+      }
+      
+      public bool HasOptionalBool {
+        get { return result.hasOptionalBool; }
+      }
+      public bool OptionalBool {
+        get { return result.OptionalBool; }
+        set { SetOptionalBool(value); }
+      }
+      public Builder SetOptionalBool(bool value) {
+        PrepareBuilder();
+        result.hasOptionalBool = true;
+        result.optionalBool_ = value;
+        return this;
+      }
+      public Builder ClearOptionalBool() {
+        PrepareBuilder();
+        result.hasOptionalBool = false;
+        result.optionalBool_ = false;
+        return this;
+      }
+      
+      public bool HasOptionalString {
+        get { return result.hasOptionalString; }
+      }
+      public string OptionalString {
+        get { return result.OptionalString; }
+        set { SetOptionalString(value); }
+      }
+      public Builder SetOptionalString(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasOptionalString = true;
+        result.optionalString_ = value;
+        return this;
+      }
+      public Builder ClearOptionalString() {
+        PrepareBuilder();
+        result.hasOptionalString = false;
+        result.optionalString_ = "";
+        return this;
+      }
+      
+      public bool HasOptionalBytes {
+        get { return result.hasOptionalBytes; }
+      }
+      public pb::ByteString OptionalBytes {
+        get { return result.OptionalBytes; }
+        set { SetOptionalBytes(value); }
+      }
+      public Builder SetOptionalBytes(pb::ByteString value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasOptionalBytes = true;
+        result.optionalBytes_ = value;
+        return this;
+      }
+      public Builder ClearOptionalBytes() {
+        PrepareBuilder();
+        result.hasOptionalBytes = false;
+        result.optionalBytes_ = pb::ByteString.Empty;
+        return this;
+      }
+      
+      public bool HasOptionalGroup {
+       get { return result.hasOptionalGroup; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup OptionalGroup {
+        get { return result.OptionalGroup; }
+        set { SetOptionalGroup(value); }
+      }
+      public Builder SetOptionalGroup(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasOptionalGroup = true;
+        result.optionalGroup_ = value;
+        return this;
+      }
+      public Builder SetOptionalGroup(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasOptionalGroup = true;
+        result.optionalGroup_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalGroup(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasOptionalGroup &&
+            result.optionalGroup_ != global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.DefaultInstance) {
+            result.optionalGroup_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.CreateBuilder(result.optionalGroup_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalGroup_ = value;
+        }
+        result.hasOptionalGroup = true;
+        return this;
+      }
+      public Builder ClearOptionalGroup() {
+        PrepareBuilder();
+        result.hasOptionalGroup = false;
+        result.optionalGroup_ = null;
+        return this;
+      }
+      
+      public bool HasOptionalNestedMessage {
+       get { return result.hasOptionalNestedMessage; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage OptionalNestedMessage {
+        get { return result.OptionalNestedMessage; }
+        set { SetOptionalNestedMessage(value); }
+      }
+      public Builder SetOptionalNestedMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasOptionalNestedMessage = true;
+        result.optionalNestedMessage_ = value;
+        return this;
+      }
+      public Builder SetOptionalNestedMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasOptionalNestedMessage = true;
+        result.optionalNestedMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalNestedMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasOptionalNestedMessage &&
+            result.optionalNestedMessage_ != global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance) {
+            result.optionalNestedMessage_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.CreateBuilder(result.optionalNestedMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalNestedMessage_ = value;
+        }
+        result.hasOptionalNestedMessage = true;
+        return this;
+      }
+      public Builder ClearOptionalNestedMessage() {
+        PrepareBuilder();
+        result.hasOptionalNestedMessage = false;
+        result.optionalNestedMessage_ = null;
+        return this;
+      }
+      
+      public bool HasOptionalForeignMessage {
+       get { return result.hasOptionalForeignMessage; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ForeignMessage OptionalForeignMessage {
+        get { return result.OptionalForeignMessage; }
+        set { SetOptionalForeignMessage(value); }
+      }
+      public Builder SetOptionalForeignMessage(global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasOptionalForeignMessage = true;
+        result.optionalForeignMessage_ = value;
+        return this;
+      }
+      public Builder SetOptionalForeignMessage(global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasOptionalForeignMessage = true;
+        result.optionalForeignMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalForeignMessage(global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasOptionalForeignMessage &&
+            result.optionalForeignMessage_ != global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance) {
+            result.optionalForeignMessage_ = global::Google.ProtocolBuffers.TestProtos.ForeignMessage.CreateBuilder(result.optionalForeignMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalForeignMessage_ = value;
+        }
+        result.hasOptionalForeignMessage = true;
+        return this;
+      }
+      public Builder ClearOptionalForeignMessage() {
+        PrepareBuilder();
+        result.hasOptionalForeignMessage = false;
+        result.optionalForeignMessage_ = null;
+        return this;
+      }
+      
+      public bool HasOptionalImportMessage {
+       get { return result.hasOptionalImportMessage; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ImportMessage OptionalImportMessage {
+        get { return result.OptionalImportMessage; }
+        set { SetOptionalImportMessage(value); }
+      }
+      public Builder SetOptionalImportMessage(global::Google.ProtocolBuffers.TestProtos.ImportMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasOptionalImportMessage = true;
+        result.optionalImportMessage_ = value;
+        return this;
+      }
+      public Builder SetOptionalImportMessage(global::Google.ProtocolBuffers.TestProtos.ImportMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasOptionalImportMessage = true;
+        result.optionalImportMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalImportMessage(global::Google.ProtocolBuffers.TestProtos.ImportMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasOptionalImportMessage &&
+            result.optionalImportMessage_ != global::Google.ProtocolBuffers.TestProtos.ImportMessage.DefaultInstance) {
+            result.optionalImportMessage_ = global::Google.ProtocolBuffers.TestProtos.ImportMessage.CreateBuilder(result.optionalImportMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalImportMessage_ = value;
+        }
+        result.hasOptionalImportMessage = true;
+        return this;
+      }
+      public Builder ClearOptionalImportMessage() {
+        PrepareBuilder();
+        result.hasOptionalImportMessage = false;
+        result.optionalImportMessage_ = null;
+        return this;
+      }
+      
+      public bool HasOptionalNestedEnum {
+       get { return result.hasOptionalNestedEnum; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum OptionalNestedEnum {
+        get { return result.OptionalNestedEnum; }
+        set { SetOptionalNestedEnum(value); }
+      }
+      public Builder SetOptionalNestedEnum(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum value) {
+        PrepareBuilder();
+        result.hasOptionalNestedEnum = true;
+        result.optionalNestedEnum_ = value;
+        return this;
+      }
+      public Builder ClearOptionalNestedEnum() {
+        PrepareBuilder();
+        result.hasOptionalNestedEnum = false;
+        result.optionalNestedEnum_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum.FOO;
+        return this;
+      }
+      
+      public bool HasOptionalForeignEnum {
+       get { return result.hasOptionalForeignEnum; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ForeignEnum OptionalForeignEnum {
+        get { return result.OptionalForeignEnum; }
+        set { SetOptionalForeignEnum(value); }
+      }
+      public Builder SetOptionalForeignEnum(global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {
+        PrepareBuilder();
+        result.hasOptionalForeignEnum = true;
+        result.optionalForeignEnum_ = value;
+        return this;
+      }
+      public Builder ClearOptionalForeignEnum() {
+        PrepareBuilder();
+        result.hasOptionalForeignEnum = false;
+        result.optionalForeignEnum_ = global::Google.ProtocolBuffers.TestProtos.ForeignEnum.FOREIGN_FOO;
+        return this;
+      }
+      
+      public bool HasOptionalImportEnum {
+       get { return result.hasOptionalImportEnum; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ImportEnum OptionalImportEnum {
+        get { return result.OptionalImportEnum; }
+        set { SetOptionalImportEnum(value); }
+      }
+      public Builder SetOptionalImportEnum(global::Google.ProtocolBuffers.TestProtos.ImportEnum value) {
+        PrepareBuilder();
+        result.hasOptionalImportEnum = true;
+        result.optionalImportEnum_ = value;
+        return this;
+      }
+      public Builder ClearOptionalImportEnum() {
+        PrepareBuilder();
+        result.hasOptionalImportEnum = false;
+        result.optionalImportEnum_ = global::Google.ProtocolBuffers.TestProtos.ImportEnum.IMPORT_FOO;
+        return this;
+      }
+      
+      public bool HasOptionalStringPiece {
+        get { return result.hasOptionalStringPiece; }
+      }
+      public string OptionalStringPiece {
+        get { return result.OptionalStringPiece; }
+        set { SetOptionalStringPiece(value); }
+      }
+      public Builder SetOptionalStringPiece(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasOptionalStringPiece = true;
+        result.optionalStringPiece_ = value;
+        return this;
+      }
+      public Builder ClearOptionalStringPiece() {
+        PrepareBuilder();
+        result.hasOptionalStringPiece = false;
+        result.optionalStringPiece_ = "";
+        return this;
+      }
+      
+      public bool HasOptionalCord {
+        get { return result.hasOptionalCord; }
+      }
+      public string OptionalCord {
+        get { return result.OptionalCord; }
+        set { SetOptionalCord(value); }
+      }
+      public Builder SetOptionalCord(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasOptionalCord = true;
+        result.optionalCord_ = value;
+        return this;
+      }
+      public Builder ClearOptionalCord() {
+        PrepareBuilder();
+        result.hasOptionalCord = false;
+        result.optionalCord_ = "";
+        return this;
+      }
+      
+      public pbc::IPopsicleList<int> RepeatedInt32List {
+        get { return PrepareBuilder().repeatedInt32_; }
+      }
+      public int RepeatedInt32Count {
+        get { return result.RepeatedInt32Count; }
+      }
+      public int GetRepeatedInt32(int index) {
+        return result.GetRepeatedInt32(index);
+      }
+      public Builder SetRepeatedInt32(int index, int value) {
+        PrepareBuilder();
+        result.repeatedInt32_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedInt32(int value) {
+        PrepareBuilder();
+        result.repeatedInt32_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedInt32(scg::IEnumerable<int> values) {
+        PrepareBuilder();
+        result.repeatedInt32_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedInt32() {
+        PrepareBuilder();
+        result.repeatedInt32_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<long> RepeatedInt64List {
+        get { return PrepareBuilder().repeatedInt64_; }
+      }
+      public int RepeatedInt64Count {
+        get { return result.RepeatedInt64Count; }
+      }
+      public long GetRepeatedInt64(int index) {
+        return result.GetRepeatedInt64(index);
+      }
+      public Builder SetRepeatedInt64(int index, long value) {
+        PrepareBuilder();
+        result.repeatedInt64_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedInt64(long value) {
+        PrepareBuilder();
+        result.repeatedInt64_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedInt64(scg::IEnumerable<long> values) {
+        PrepareBuilder();
+        result.repeatedInt64_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedInt64() {
+        PrepareBuilder();
+        result.repeatedInt64_.Clear();
+        return this;
+      }
+      
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<uint> RepeatedUint32List {
+        get { return PrepareBuilder().repeatedUint32_; }
+      }
+      public int RepeatedUint32Count {
+        get { return result.RepeatedUint32Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint GetRepeatedUint32(int index) {
+        return result.GetRepeatedUint32(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetRepeatedUint32(int index, uint value) {
+        PrepareBuilder();
+        result.repeatedUint32_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRepeatedUint32(uint value) {
+        PrepareBuilder();
+        result.repeatedUint32_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangeRepeatedUint32(scg::IEnumerable<uint> values) {
+        PrepareBuilder();
+        result.repeatedUint32_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedUint32() {
+        PrepareBuilder();
+        result.repeatedUint32_.Clear();
+        return this;
+      }
+      
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<ulong> RepeatedUint64List {
+        get { return PrepareBuilder().repeatedUint64_; }
+      }
+      public int RepeatedUint64Count {
+        get { return result.RepeatedUint64Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong GetRepeatedUint64(int index) {
+        return result.GetRepeatedUint64(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetRepeatedUint64(int index, ulong value) {
+        PrepareBuilder();
+        result.repeatedUint64_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRepeatedUint64(ulong value) {
+        PrepareBuilder();
+        result.repeatedUint64_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangeRepeatedUint64(scg::IEnumerable<ulong> values) {
+        PrepareBuilder();
+        result.repeatedUint64_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedUint64() {
+        PrepareBuilder();
+        result.repeatedUint64_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<int> RepeatedSint32List {
+        get { return PrepareBuilder().repeatedSint32_; }
+      }
+      public int RepeatedSint32Count {
+        get { return result.RepeatedSint32Count; }
+      }
+      public int GetRepeatedSint32(int index) {
+        return result.GetRepeatedSint32(index);
+      }
+      public Builder SetRepeatedSint32(int index, int value) {
+        PrepareBuilder();
+        result.repeatedSint32_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedSint32(int value) {
+        PrepareBuilder();
+        result.repeatedSint32_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedSint32(scg::IEnumerable<int> values) {
+        PrepareBuilder();
+        result.repeatedSint32_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedSint32() {
+        PrepareBuilder();
+        result.repeatedSint32_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<long> RepeatedSint64List {
+        get { return PrepareBuilder().repeatedSint64_; }
+      }
+      public int RepeatedSint64Count {
+        get { return result.RepeatedSint64Count; }
+      }
+      public long GetRepeatedSint64(int index) {
+        return result.GetRepeatedSint64(index);
+      }
+      public Builder SetRepeatedSint64(int index, long value) {
+        PrepareBuilder();
+        result.repeatedSint64_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedSint64(long value) {
+        PrepareBuilder();
+        result.repeatedSint64_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedSint64(scg::IEnumerable<long> values) {
+        PrepareBuilder();
+        result.repeatedSint64_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedSint64() {
+        PrepareBuilder();
+        result.repeatedSint64_.Clear();
+        return this;
+      }
+      
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<uint> RepeatedFixed32List {
+        get { return PrepareBuilder().repeatedFixed32_; }
+      }
+      public int RepeatedFixed32Count {
+        get { return result.RepeatedFixed32Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint GetRepeatedFixed32(int index) {
+        return result.GetRepeatedFixed32(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetRepeatedFixed32(int index, uint value) {
+        PrepareBuilder();
+        result.repeatedFixed32_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRepeatedFixed32(uint value) {
+        PrepareBuilder();
+        result.repeatedFixed32_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangeRepeatedFixed32(scg::IEnumerable<uint> values) {
+        PrepareBuilder();
+        result.repeatedFixed32_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedFixed32() {
+        PrepareBuilder();
+        result.repeatedFixed32_.Clear();
+        return this;
+      }
+      
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<ulong> RepeatedFixed64List {
+        get { return PrepareBuilder().repeatedFixed64_; }
+      }
+      public int RepeatedFixed64Count {
+        get { return result.RepeatedFixed64Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong GetRepeatedFixed64(int index) {
+        return result.GetRepeatedFixed64(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetRepeatedFixed64(int index, ulong value) {
+        PrepareBuilder();
+        result.repeatedFixed64_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRepeatedFixed64(ulong value) {
+        PrepareBuilder();
+        result.repeatedFixed64_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangeRepeatedFixed64(scg::IEnumerable<ulong> values) {
+        PrepareBuilder();
+        result.repeatedFixed64_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedFixed64() {
+        PrepareBuilder();
+        result.repeatedFixed64_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<int> RepeatedSfixed32List {
+        get { return PrepareBuilder().repeatedSfixed32_; }
+      }
+      public int RepeatedSfixed32Count {
+        get { return result.RepeatedSfixed32Count; }
+      }
+      public int GetRepeatedSfixed32(int index) {
+        return result.GetRepeatedSfixed32(index);
+      }
+      public Builder SetRepeatedSfixed32(int index, int value) {
+        PrepareBuilder();
+        result.repeatedSfixed32_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedSfixed32(int value) {
+        PrepareBuilder();
+        result.repeatedSfixed32_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedSfixed32(scg::IEnumerable<int> values) {
+        PrepareBuilder();
+        result.repeatedSfixed32_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedSfixed32() {
+        PrepareBuilder();
+        result.repeatedSfixed32_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<long> RepeatedSfixed64List {
+        get { return PrepareBuilder().repeatedSfixed64_; }
+      }
+      public int RepeatedSfixed64Count {
+        get { return result.RepeatedSfixed64Count; }
+      }
+      public long GetRepeatedSfixed64(int index) {
+        return result.GetRepeatedSfixed64(index);
+      }
+      public Builder SetRepeatedSfixed64(int index, long value) {
+        PrepareBuilder();
+        result.repeatedSfixed64_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedSfixed64(long value) {
+        PrepareBuilder();
+        result.repeatedSfixed64_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedSfixed64(scg::IEnumerable<long> values) {
+        PrepareBuilder();
+        result.repeatedSfixed64_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedSfixed64() {
+        PrepareBuilder();
+        result.repeatedSfixed64_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<float> RepeatedFloatList {
+        get { return PrepareBuilder().repeatedFloat_; }
+      }
+      public int RepeatedFloatCount {
+        get { return result.RepeatedFloatCount; }
+      }
+      public float GetRepeatedFloat(int index) {
+        return result.GetRepeatedFloat(index);
+      }
+      public Builder SetRepeatedFloat(int index, float value) {
+        PrepareBuilder();
+        result.repeatedFloat_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedFloat(float value) {
+        PrepareBuilder();
+        result.repeatedFloat_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedFloat(scg::IEnumerable<float> values) {
+        PrepareBuilder();
+        result.repeatedFloat_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedFloat() {
+        PrepareBuilder();
+        result.repeatedFloat_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<double> RepeatedDoubleList {
+        get { return PrepareBuilder().repeatedDouble_; }
+      }
+      public int RepeatedDoubleCount {
+        get { return result.RepeatedDoubleCount; }
+      }
+      public double GetRepeatedDouble(int index) {
+        return result.GetRepeatedDouble(index);
+      }
+      public Builder SetRepeatedDouble(int index, double value) {
+        PrepareBuilder();
+        result.repeatedDouble_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedDouble(double value) {
+        PrepareBuilder();
+        result.repeatedDouble_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedDouble(scg::IEnumerable<double> values) {
+        PrepareBuilder();
+        result.repeatedDouble_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedDouble() {
+        PrepareBuilder();
+        result.repeatedDouble_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<bool> RepeatedBoolList {
+        get { return PrepareBuilder().repeatedBool_; }
+      }
+      public int RepeatedBoolCount {
+        get { return result.RepeatedBoolCount; }
+      }
+      public bool GetRepeatedBool(int index) {
+        return result.GetRepeatedBool(index);
+      }
+      public Builder SetRepeatedBool(int index, bool value) {
+        PrepareBuilder();
+        result.repeatedBool_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedBool(bool value) {
+        PrepareBuilder();
+        result.repeatedBool_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedBool(scg::IEnumerable<bool> values) {
+        PrepareBuilder();
+        result.repeatedBool_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedBool() {
+        PrepareBuilder();
+        result.repeatedBool_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<string> RepeatedStringList {
+        get { return PrepareBuilder().repeatedString_; }
+      }
+      public int RepeatedStringCount {
+        get { return result.RepeatedStringCount; }
+      }
+      public string GetRepeatedString(int index) {
+        return result.GetRepeatedString(index);
+      }
+      public Builder SetRepeatedString(int index, string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedString_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedString(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedString_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedString(scg::IEnumerable<string> values) {
+        PrepareBuilder();
+        result.repeatedString_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedString() {
+        PrepareBuilder();
+        result.repeatedString_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<pb::ByteString> RepeatedBytesList {
+        get { return PrepareBuilder().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) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedBytes_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedBytes(pb::ByteString value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedBytes_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedBytes(scg::IEnumerable<pb::ByteString> values) {
+        PrepareBuilder();
+        result.repeatedBytes_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedBytes() {
+        PrepareBuilder();
+        result.repeatedBytes_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup> RepeatedGroupList {
+        get { return PrepareBuilder().repeatedGroup_; }
+      }
+      public int RepeatedGroupCount {
+        get { return result.RepeatedGroupCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup GetRepeatedGroup(int index) {
+        return result.GetRepeatedGroup(index);
+      }
+      public Builder SetRepeatedGroup(int index, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedGroup_[index] = value;
+        return this;
+      }
+      public Builder SetRepeatedGroup(int index, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.repeatedGroup_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRepeatedGroup(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedGroup_.Add(value);
+        return this;
+      }
+      public Builder AddRepeatedGroup(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.repeatedGroup_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRepeatedGroup(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup> values) {
+        PrepareBuilder();
+        result.repeatedGroup_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedGroup() {
+        PrepareBuilder();
+        result.repeatedGroup_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage> RepeatedNestedMessageList {
+        get { return PrepareBuilder().repeatedNestedMessage_; }
+      }
+      public int RepeatedNestedMessageCount {
+        get { return result.RepeatedNestedMessageCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage GetRepeatedNestedMessage(int index) {
+        return result.GetRepeatedNestedMessage(index);
+      }
+      public Builder SetRepeatedNestedMessage(int index, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedNestedMessage_[index] = value;
+        return this;
+      }
+      public Builder SetRepeatedNestedMessage(int index, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.repeatedNestedMessage_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRepeatedNestedMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedNestedMessage_.Add(value);
+        return this;
+      }
+      public Builder AddRepeatedNestedMessage(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.repeatedNestedMessage_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRepeatedNestedMessage(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage> values) {
+        PrepareBuilder();
+        result.repeatedNestedMessage_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedNestedMessage() {
+        PrepareBuilder();
+        result.repeatedNestedMessage_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> RepeatedForeignMessageList {
+        get { return PrepareBuilder().repeatedForeignMessage_; }
+      }
+      public int RepeatedForeignMessageCount {
+        get { return result.RepeatedForeignMessageCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ForeignMessage GetRepeatedForeignMessage(int index) {
+        return result.GetRepeatedForeignMessage(index);
+      }
+      public Builder SetRepeatedForeignMessage(int index, global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedForeignMessage_[index] = value;
+        return this;
+      }
+      public Builder SetRepeatedForeignMessage(int index, global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.repeatedForeignMessage_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRepeatedForeignMessage(global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedForeignMessage_.Add(value);
+        return this;
+      }
+      public Builder AddRepeatedForeignMessage(global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.repeatedForeignMessage_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRepeatedForeignMessage(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> values) {
+        PrepareBuilder();
+        result.repeatedForeignMessage_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedForeignMessage() {
+        PrepareBuilder();
+        result.repeatedForeignMessage_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.ImportMessage> RepeatedImportMessageList {
+        get { return PrepareBuilder().repeatedImportMessage_; }
+      }
+      public int RepeatedImportMessageCount {
+        get { return result.RepeatedImportMessageCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ImportMessage GetRepeatedImportMessage(int index) {
+        return result.GetRepeatedImportMessage(index);
+      }
+      public Builder SetRepeatedImportMessage(int index, global::Google.ProtocolBuffers.TestProtos.ImportMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedImportMessage_[index] = value;
+        return this;
+      }
+      public Builder SetRepeatedImportMessage(int index, global::Google.ProtocolBuffers.TestProtos.ImportMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.repeatedImportMessage_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRepeatedImportMessage(global::Google.ProtocolBuffers.TestProtos.ImportMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedImportMessage_.Add(value);
+        return this;
+      }
+      public Builder AddRepeatedImportMessage(global::Google.ProtocolBuffers.TestProtos.ImportMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.repeatedImportMessage_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRepeatedImportMessage(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.ImportMessage> values) {
+        PrepareBuilder();
+        result.repeatedImportMessage_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedImportMessage() {
+        PrepareBuilder();
+        result.repeatedImportMessage_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum> RepeatedNestedEnumList {
+        get { return PrepareBuilder().repeatedNestedEnum_; }
+      }
+      public int RepeatedNestedEnumCount {
+        get { return result.RepeatedNestedEnumCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum GetRepeatedNestedEnum(int index) {
+        return result.GetRepeatedNestedEnum(index);
+      }
+      public Builder SetRepeatedNestedEnum(int index, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum value) {
+        PrepareBuilder();
+        result.repeatedNestedEnum_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedNestedEnum(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum value) {
+        PrepareBuilder();
+        result.repeatedNestedEnum_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedNestedEnum(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum> values) {
+        PrepareBuilder();
+        result.repeatedNestedEnum_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedNestedEnum() {
+        PrepareBuilder();
+        result.repeatedNestedEnum_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> RepeatedForeignEnumList {
+        get { return PrepareBuilder().repeatedForeignEnum_; }
+      }
+      public int RepeatedForeignEnumCount {
+        get { return result.RepeatedForeignEnumCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ForeignEnum GetRepeatedForeignEnum(int index) {
+        return result.GetRepeatedForeignEnum(index);
+      }
+      public Builder SetRepeatedForeignEnum(int index, global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {
+        PrepareBuilder();
+        result.repeatedForeignEnum_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedForeignEnum(global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {
+        PrepareBuilder();
+        result.repeatedForeignEnum_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedForeignEnum(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> values) {
+        PrepareBuilder();
+        result.repeatedForeignEnum_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedForeignEnum() {
+        PrepareBuilder();
+        result.repeatedForeignEnum_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.ImportEnum> RepeatedImportEnumList {
+        get { return PrepareBuilder().repeatedImportEnum_; }
+      }
+      public int RepeatedImportEnumCount {
+        get { return result.RepeatedImportEnumCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ImportEnum GetRepeatedImportEnum(int index) {
+        return result.GetRepeatedImportEnum(index);
+      }
+      public Builder SetRepeatedImportEnum(int index, global::Google.ProtocolBuffers.TestProtos.ImportEnum value) {
+        PrepareBuilder();
+        result.repeatedImportEnum_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedImportEnum(global::Google.ProtocolBuffers.TestProtos.ImportEnum value) {
+        PrepareBuilder();
+        result.repeatedImportEnum_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedImportEnum(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.ImportEnum> values) {
+        PrepareBuilder();
+        result.repeatedImportEnum_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedImportEnum() {
+        PrepareBuilder();
+        result.repeatedImportEnum_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<string> RepeatedStringPieceList {
+        get { return PrepareBuilder().repeatedStringPiece_; }
+      }
+      public int RepeatedStringPieceCount {
+        get { return result.RepeatedStringPieceCount; }
+      }
+      public string GetRepeatedStringPiece(int index) {
+        return result.GetRepeatedStringPiece(index);
+      }
+      public Builder SetRepeatedStringPiece(int index, string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedStringPiece_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedStringPiece(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedStringPiece_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedStringPiece(scg::IEnumerable<string> values) {
+        PrepareBuilder();
+        result.repeatedStringPiece_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedStringPiece() {
+        PrepareBuilder();
+        result.repeatedStringPiece_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<string> RepeatedCordList {
+        get { return PrepareBuilder().repeatedCord_; }
+      }
+      public int RepeatedCordCount {
+        get { return result.RepeatedCordCount; }
+      }
+      public string GetRepeatedCord(int index) {
+        return result.GetRepeatedCord(index);
+      }
+      public Builder SetRepeatedCord(int index, string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedCord_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedCord(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedCord_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedCord(scg::IEnumerable<string> values) {
+        PrepareBuilder();
+        result.repeatedCord_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedCord() {
+        PrepareBuilder();
+        result.repeatedCord_.Clear();
+        return this;
+      }
+      
+      public bool HasDefaultInt32 {
+        get { return result.hasDefaultInt32; }
+      }
+      public int DefaultInt32 {
+        get { return result.DefaultInt32; }
+        set { SetDefaultInt32(value); }
+      }
+      public Builder SetDefaultInt32(int value) {
+        PrepareBuilder();
+        result.hasDefaultInt32 = true;
+        result.defaultInt32_ = value;
+        return this;
+      }
+      public Builder ClearDefaultInt32() {
+        PrepareBuilder();
+        result.hasDefaultInt32 = false;
+        result.defaultInt32_ = 41;
+        return this;
+      }
+      
+      public bool HasDefaultInt64 {
+        get { return result.hasDefaultInt64; }
+      }
+      public long DefaultInt64 {
+        get { return result.DefaultInt64; }
+        set { SetDefaultInt64(value); }
+      }
+      public Builder SetDefaultInt64(long value) {
+        PrepareBuilder();
+        result.hasDefaultInt64 = true;
+        result.defaultInt64_ = value;
+        return this;
+      }
+      public Builder ClearDefaultInt64() {
+        PrepareBuilder();
+        result.hasDefaultInt64 = false;
+        result.defaultInt64_ = 42L;
+        return this;
+      }
+      
+      public bool HasDefaultUint32 {
+        get { return result.hasDefaultUint32; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint DefaultUint32 {
+        get { return result.DefaultUint32; }
+        set { SetDefaultUint32(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetDefaultUint32(uint value) {
+        PrepareBuilder();
+        result.hasDefaultUint32 = true;
+        result.defaultUint32_ = value;
+        return this;
+      }
+      public Builder ClearDefaultUint32() {
+        PrepareBuilder();
+        result.hasDefaultUint32 = false;
+        result.defaultUint32_ = 43;
+        return this;
+      }
+      
+      public bool HasDefaultUint64 {
+        get { return result.hasDefaultUint64; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong DefaultUint64 {
+        get { return result.DefaultUint64; }
+        set { SetDefaultUint64(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetDefaultUint64(ulong value) {
+        PrepareBuilder();
+        result.hasDefaultUint64 = true;
+        result.defaultUint64_ = value;
+        return this;
+      }
+      public Builder ClearDefaultUint64() {
+        PrepareBuilder();
+        result.hasDefaultUint64 = false;
+        result.defaultUint64_ = 44UL;
+        return this;
+      }
+      
+      public bool HasDefaultSint32 {
+        get { return result.hasDefaultSint32; }
+      }
+      public int DefaultSint32 {
+        get { return result.DefaultSint32; }
+        set { SetDefaultSint32(value); }
+      }
+      public Builder SetDefaultSint32(int value) {
+        PrepareBuilder();
+        result.hasDefaultSint32 = true;
+        result.defaultSint32_ = value;
+        return this;
+      }
+      public Builder ClearDefaultSint32() {
+        PrepareBuilder();
+        result.hasDefaultSint32 = false;
+        result.defaultSint32_ = -45;
+        return this;
+      }
+      
+      public bool HasDefaultSint64 {
+        get { return result.hasDefaultSint64; }
+      }
+      public long DefaultSint64 {
+        get { return result.DefaultSint64; }
+        set { SetDefaultSint64(value); }
+      }
+      public Builder SetDefaultSint64(long value) {
+        PrepareBuilder();
+        result.hasDefaultSint64 = true;
+        result.defaultSint64_ = value;
+        return this;
+      }
+      public Builder ClearDefaultSint64() {
+        PrepareBuilder();
+        result.hasDefaultSint64 = false;
+        result.defaultSint64_ = 46;
+        return this;
+      }
+      
+      public bool HasDefaultFixed32 {
+        get { return result.hasDefaultFixed32; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint DefaultFixed32 {
+        get { return result.DefaultFixed32; }
+        set { SetDefaultFixed32(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetDefaultFixed32(uint value) {
+        PrepareBuilder();
+        result.hasDefaultFixed32 = true;
+        result.defaultFixed32_ = value;
+        return this;
+      }
+      public Builder ClearDefaultFixed32() {
+        PrepareBuilder();
+        result.hasDefaultFixed32 = false;
+        result.defaultFixed32_ = 47;
+        return this;
+      }
+      
+      public bool HasDefaultFixed64 {
+        get { return result.hasDefaultFixed64; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong DefaultFixed64 {
+        get { return result.DefaultFixed64; }
+        set { SetDefaultFixed64(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetDefaultFixed64(ulong value) {
+        PrepareBuilder();
+        result.hasDefaultFixed64 = true;
+        result.defaultFixed64_ = value;
+        return this;
+      }
+      public Builder ClearDefaultFixed64() {
+        PrepareBuilder();
+        result.hasDefaultFixed64 = false;
+        result.defaultFixed64_ = 48;
+        return this;
+      }
+      
+      public bool HasDefaultSfixed32 {
+        get { return result.hasDefaultSfixed32; }
+      }
+      public int DefaultSfixed32 {
+        get { return result.DefaultSfixed32; }
+        set { SetDefaultSfixed32(value); }
+      }
+      public Builder SetDefaultSfixed32(int value) {
+        PrepareBuilder();
+        result.hasDefaultSfixed32 = true;
+        result.defaultSfixed32_ = value;
+        return this;
+      }
+      public Builder ClearDefaultSfixed32() {
+        PrepareBuilder();
+        result.hasDefaultSfixed32 = false;
+        result.defaultSfixed32_ = 49;
+        return this;
+      }
+      
+      public bool HasDefaultSfixed64 {
+        get { return result.hasDefaultSfixed64; }
+      }
+      public long DefaultSfixed64 {
+        get { return result.DefaultSfixed64; }
+        set { SetDefaultSfixed64(value); }
+      }
+      public Builder SetDefaultSfixed64(long value) {
+        PrepareBuilder();
+        result.hasDefaultSfixed64 = true;
+        result.defaultSfixed64_ = value;
+        return this;
+      }
+      public Builder ClearDefaultSfixed64() {
+        PrepareBuilder();
+        result.hasDefaultSfixed64 = false;
+        result.defaultSfixed64_ = -50;
+        return this;
+      }
+      
+      public bool HasDefaultFloat {
+        get { return result.hasDefaultFloat; }
+      }
+      public float DefaultFloat {
+        get { return result.DefaultFloat; }
+        set { SetDefaultFloat(value); }
+      }
+      public Builder SetDefaultFloat(float value) {
+        PrepareBuilder();
+        result.hasDefaultFloat = true;
+        result.defaultFloat_ = value;
+        return this;
+      }
+      public Builder ClearDefaultFloat() {
+        PrepareBuilder();
+        result.hasDefaultFloat = false;
+        result.defaultFloat_ = 51.5F;
+        return this;
+      }
+      
+      public bool HasDefaultDouble {
+        get { return result.hasDefaultDouble; }
+      }
+      public double DefaultDouble {
+        get { return result.DefaultDouble; }
+        set { SetDefaultDouble(value); }
+      }
+      public Builder SetDefaultDouble(double value) {
+        PrepareBuilder();
+        result.hasDefaultDouble = true;
+        result.defaultDouble_ = value;
+        return this;
+      }
+      public Builder ClearDefaultDouble() {
+        PrepareBuilder();
+        result.hasDefaultDouble = false;
+        result.defaultDouble_ = 52000D;
+        return this;
+      }
+      
+      public bool HasDefaultBool {
+        get { return result.hasDefaultBool; }
+      }
+      public bool DefaultBool {
+        get { return result.DefaultBool; }
+        set { SetDefaultBool(value); }
+      }
+      public Builder SetDefaultBool(bool value) {
+        PrepareBuilder();
+        result.hasDefaultBool = true;
+        result.defaultBool_ = value;
+        return this;
+      }
+      public Builder ClearDefaultBool() {
+        PrepareBuilder();
+        result.hasDefaultBool = false;
+        result.defaultBool_ = true;
+        return this;
+      }
+      
+      public bool HasDefaultString {
+        get { return result.hasDefaultString; }
+      }
+      public string DefaultString {
+        get { return result.DefaultString; }
+        set { SetDefaultString(value); }
+      }
+      public Builder SetDefaultString(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasDefaultString = true;
+        result.defaultString_ = value;
+        return this;
+      }
+      public Builder ClearDefaultString() {
+        PrepareBuilder();
+        result.hasDefaultString = false;
+        result.defaultString_ = "hello";
+        return this;
+      }
+      
+      public bool HasDefaultBytes {
+        get { return result.hasDefaultBytes; }
+      }
+      public pb::ByteString DefaultBytes {
+        get { return result.DefaultBytes; }
+        set { SetDefaultBytes(value); }
+      }
+      public Builder SetDefaultBytes(pb::ByteString value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasDefaultBytes = true;
+        result.defaultBytes_ = value;
+        return this;
+      }
+      public Builder ClearDefaultBytes() {
+        PrepareBuilder();
+        result.hasDefaultBytes = false;
+        result.defaultBytes_ = (pb::ByteString) global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Descriptor.Fields[62].DefaultValue;
+        return this;
+      }
+      
+      public bool HasDefaultNestedEnum {
+       get { return result.hasDefaultNestedEnum; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum DefaultNestedEnum {
+        get { return result.DefaultNestedEnum; }
+        set { SetDefaultNestedEnum(value); }
+      }
+      public Builder SetDefaultNestedEnum(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum value) {
+        PrepareBuilder();
+        result.hasDefaultNestedEnum = true;
+        result.defaultNestedEnum_ = value;
+        return this;
+      }
+      public Builder ClearDefaultNestedEnum() {
+        PrepareBuilder();
+        result.hasDefaultNestedEnum = false;
+        result.defaultNestedEnum_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedEnum.BAR;
+        return this;
+      }
+      
+      public bool HasDefaultForeignEnum {
+       get { return result.hasDefaultForeignEnum; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ForeignEnum DefaultForeignEnum {
+        get { return result.DefaultForeignEnum; }
+        set { SetDefaultForeignEnum(value); }
+      }
+      public Builder SetDefaultForeignEnum(global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {
+        PrepareBuilder();
+        result.hasDefaultForeignEnum = true;
+        result.defaultForeignEnum_ = value;
+        return this;
+      }
+      public Builder ClearDefaultForeignEnum() {
+        PrepareBuilder();
+        result.hasDefaultForeignEnum = false;
+        result.defaultForeignEnum_ = global::Google.ProtocolBuffers.TestProtos.ForeignEnum.FOREIGN_BAR;
+        return this;
+      }
+      
+      public bool HasDefaultImportEnum {
+       get { return result.hasDefaultImportEnum; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ImportEnum DefaultImportEnum {
+        get { return result.DefaultImportEnum; }
+        set { SetDefaultImportEnum(value); }
+      }
+      public Builder SetDefaultImportEnum(global::Google.ProtocolBuffers.TestProtos.ImportEnum value) {
+        PrepareBuilder();
+        result.hasDefaultImportEnum = true;
+        result.defaultImportEnum_ = value;
+        return this;
+      }
+      public Builder ClearDefaultImportEnum() {
+        PrepareBuilder();
+        result.hasDefaultImportEnum = false;
+        result.defaultImportEnum_ = global::Google.ProtocolBuffers.TestProtos.ImportEnum.IMPORT_BAR;
+        return this;
+      }
+      
+      public bool HasDefaultStringPiece {
+        get { return result.hasDefaultStringPiece; }
+      }
+      public string DefaultStringPiece {
+        get { return result.DefaultStringPiece; }
+        set { SetDefaultStringPiece(value); }
+      }
+      public Builder SetDefaultStringPiece(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasDefaultStringPiece = true;
+        result.defaultStringPiece_ = value;
+        return this;
+      }
+      public Builder ClearDefaultStringPiece() {
+        PrepareBuilder();
+        result.hasDefaultStringPiece = false;
+        result.defaultStringPiece_ = "abc";
+        return this;
+      }
+      
+      public bool HasDefaultCord {
+        get { return result.hasDefaultCord; }
+      }
+      public string DefaultCord {
+        get { return result.DefaultCord; }
+        set { SetDefaultCord(value); }
+      }
+      public Builder SetDefaultCord(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasDefaultCord = true;
+        result.defaultCord_ = value;
+        return this;
+      }
+      public Builder ClearDefaultCord() {
+        PrepareBuilder();
+        result.hasDefaultCord = false;
+        result.defaultCord_ = "123";
+        return this;
+      }
+    }
+    static TestAllTypes() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestDeprecatedFields : pb::GeneratedMessage<TestDeprecatedFields, TestDeprecatedFields.Builder> {
+    private TestDeprecatedFields() { }
+    private static readonly TestDeprecatedFields defaultInstance = new TestDeprecatedFields().MakeReadOnly();
+    private static readonly string[] _testDeprecatedFieldsFieldNames = new string[] { "deprecated_int32" };
+    private static readonly uint[] _testDeprecatedFieldsFieldTags = new uint[] { 8 };
+    public static TestDeprecatedFields DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestDeprecatedFields DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override TestDeprecatedFields ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestDeprecatedFields__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<TestDeprecatedFields, TestDeprecatedFields.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestDeprecatedFields__FieldAccessorTable; }
+    }
+    
+    public const int DeprecatedInt32FieldNumber = 1;
+    private bool hasDeprecatedInt32;
+    private int deprecatedInt32_;
+    [global::System.ObsoleteAttribute()]
+    public bool HasDeprecatedInt32 {
+      get { return hasDeprecatedInt32; }
+    }
+    [global::System.ObsoleteAttribute()]
+    public int DeprecatedInt32 {
+      get { return deprecatedInt32_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testDeprecatedFieldsFieldNames;
+      if (hasDeprecatedInt32) {
+        output.WriteInt32(1, field_names[0], DeprecatedInt32);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+      
+      size = 0;
+      if (hasDeprecatedInt32) {
+        size += pb::CodedOutputStream.ComputeInt32Size(1, DeprecatedInt32);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestDeprecatedFields ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestDeprecatedFields ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestDeprecatedFields ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestDeprecatedFields ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestDeprecatedFields ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestDeprecatedFields ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestDeprecatedFields ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestDeprecatedFields ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestDeprecatedFields ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestDeprecatedFields ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestDeprecatedFields MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestDeprecatedFields prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestDeprecatedFields, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestDeprecatedFields cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private TestDeprecatedFields result;
+      
+      private TestDeprecatedFields PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestDeprecatedFields original = result;
+          result = new TestDeprecatedFields();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override TestDeprecatedFields MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestDeprecatedFields.Descriptor; }
+      }
+      
+      public override TestDeprecatedFields DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestDeprecatedFields.DefaultInstance; }
+      }
+      
+      public override TestDeprecatedFields BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestDeprecatedFields) {
+          return MergeFrom((TestDeprecatedFields) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(TestDeprecatedFields other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestDeprecatedFields.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasDeprecatedInt32) {
+          DeprecatedInt32 = other.DeprecatedInt32;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testDeprecatedFieldsFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testDeprecatedFieldsFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasDeprecatedInt32 = input.ReadInt32(ref result.deprecatedInt32_);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      [global::System.ObsoleteAttribute()]
+      public bool HasDeprecatedInt32 {
+        get { return result.hasDeprecatedInt32; }
+      }
+      [global::System.ObsoleteAttribute()]
+      public int DeprecatedInt32 {
+        get { return result.DeprecatedInt32; }
+        set { SetDeprecatedInt32(value); }
+      }
+      [global::System.ObsoleteAttribute()]
+      public Builder SetDeprecatedInt32(int value) {
+        PrepareBuilder();
+        result.hasDeprecatedInt32 = true;
+        result.deprecatedInt32_ = value;
+        return this;
+      }
+      [global::System.ObsoleteAttribute()]
+      public Builder ClearDeprecatedInt32() {
+        PrepareBuilder();
+        result.hasDeprecatedInt32 = false;
+        result.deprecatedInt32_ = 0;
+        return this;
+      }
+    }
+    static TestDeprecatedFields() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class ForeignMessage : pb::GeneratedMessage<ForeignMessage, ForeignMessage.Builder> {
+    private ForeignMessage() { }
+    private static readonly ForeignMessage defaultInstance = new ForeignMessage().MakeReadOnly();
+    private static readonly string[] _foreignMessageFieldNames = new string[] { "c" };
+    private static readonly uint[] _foreignMessageFieldTags = new uint[] { 8 };
+    public static ForeignMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override ForeignMessage DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override ForeignMessage ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_ForeignMessage__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<ForeignMessage, ForeignMessage.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_ForeignMessage__FieldAccessorTable; }
+    }
+    
+    public const int CFieldNumber = 1;
+    private bool hasC;
+    private int c_;
+    public bool HasC {
+      get { return hasC; }
+    }
+    public int C {
+      get { return c_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _foreignMessageFieldNames;
+      if (hasC) {
+        output.WriteInt32(1, field_names[0], C);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      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 ForeignMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static ForeignMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static ForeignMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static ForeignMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static ForeignMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static ForeignMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static ForeignMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static ForeignMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static ForeignMessage ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static ForeignMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private ForeignMessage MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(ForeignMessage prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<ForeignMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(ForeignMessage cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private ForeignMessage result;
+      
+      private ForeignMessage PrepareBuilder() {
+        if (resultIsReadOnly) {
+          ForeignMessage original = result;
+          result = new ForeignMessage();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override ForeignMessage MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Descriptor; }
+      }
+      
+      public override ForeignMessage DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance; }
+      }
+      
+      public override ForeignMessage BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is ForeignMessage) {
+          return MergeFrom((ForeignMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(ForeignMessage other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasC) {
+          C = other.C;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_foreignMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _foreignMessageFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasC = input.ReadInt32(ref result.c_);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public bool HasC {
+        get { return result.hasC; }
+      }
+      public int C {
+        get { return result.C; }
+        set { SetC(value); }
+      }
+      public Builder SetC(int value) {
+        PrepareBuilder();
+        result.hasC = true;
+        result.c_ = value;
+        return this;
+      }
+      public Builder ClearC() {
+        PrepareBuilder();
+        result.hasC = false;
+        result.c_ = 0;
+        return this;
+      }
+    }
+    static ForeignMessage() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestAllExtensions : pb::ExtendableMessage<TestAllExtensions, TestAllExtensions.Builder> {
+    private TestAllExtensions() { }
+    private static readonly TestAllExtensions defaultInstance = new TestAllExtensions().MakeReadOnly();
+    private static readonly string[] _testAllExtensionsFieldNames = new string[] {  };
+    private static readonly uint[] _testAllExtensionsFieldTags = new uint[] {  };
+    public static TestAllExtensions DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestAllExtensions DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override TestAllExtensions ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestAllExtensions__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<TestAllExtensions, TestAllExtensions.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestAllExtensions__FieldAccessorTable; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (!ExtensionsAreInitialized) return false;
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testAllExtensionsFieldNames;
+      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;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+      
+      size = 0;
+      size += ExtensionsSerializedSize;
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestAllExtensions ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestAllExtensions ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestAllExtensions ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestAllExtensions ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestAllExtensions ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestAllExtensions ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestAllExtensions ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestAllExtensions ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestAllExtensions ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestAllExtensions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestAllExtensions MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestAllExtensions prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::ExtendableBuilder<TestAllExtensions, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestAllExtensions cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private TestAllExtensions result;
+      
+      private TestAllExtensions PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestAllExtensions original = result;
+          result = new TestAllExtensions();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override TestAllExtensions MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestAllExtensions.Descriptor; }
+      }
+      
+      public override TestAllExtensions DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestAllExtensions.DefaultInstance; }
+      }
+      
+      public override TestAllExtensions BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestAllExtensions) {
+          return MergeFrom((TestAllExtensions) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(TestAllExtensions other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestAllExtensions.DefaultInstance) return this;
+        PrepareBuilder();
+          this.MergeExtensionFields(other);
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testAllExtensionsFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testAllExtensionsFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+    }
+    static TestAllExtensions() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class OptionalGroup_extension : pb::GeneratedMessage<OptionalGroup_extension, OptionalGroup_extension.Builder> {
+    private OptionalGroup_extension() { }
+    private static readonly OptionalGroup_extension defaultInstance = new OptionalGroup_extension().MakeReadOnly();
+    private static readonly string[] _optionalGroupExtensionFieldNames = new string[] { "a" };
+    private static readonly uint[] _optionalGroupExtensionFieldTags = new uint[] { 136 };
+    public static OptionalGroup_extension DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override OptionalGroup_extension DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override OptionalGroup_extension ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_OptionalGroup_extension__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<OptionalGroup_extension, OptionalGroup_extension.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_OptionalGroup_extension__FieldAccessorTable; }
+    }
+    
+    public const int AFieldNumber = 17;
+    private bool hasA;
+    private int a_;
+    public bool HasA {
+      get { return hasA; }
+    }
+    public int A {
+      get { return a_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _optionalGroupExtensionFieldNames;
+      if (hasA) {
+        output.WriteInt32(17, field_names[0], A);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      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 OptionalGroup_extension ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static OptionalGroup_extension ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static OptionalGroup_extension ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static OptionalGroup_extension ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static OptionalGroup_extension ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static OptionalGroup_extension ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static OptionalGroup_extension ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static OptionalGroup_extension ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static OptionalGroup_extension ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static OptionalGroup_extension ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private OptionalGroup_extension MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(OptionalGroup_extension prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<OptionalGroup_extension, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(OptionalGroup_extension cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private OptionalGroup_extension result;
+      
+      private OptionalGroup_extension PrepareBuilder() {
+        if (resultIsReadOnly) {
+          OptionalGroup_extension original = result;
+          result = new OptionalGroup_extension();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override OptionalGroup_extension MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.OptionalGroup_extension.Descriptor; }
+      }
+      
+      public override OptionalGroup_extension DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.OptionalGroup_extension.DefaultInstance; }
+      }
+      
+      public override OptionalGroup_extension BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is OptionalGroup_extension) {
+          return MergeFrom((OptionalGroup_extension) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(OptionalGroup_extension other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.OptionalGroup_extension.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasA) {
+          A = other.A;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_optionalGroupExtensionFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _optionalGroupExtensionFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 136: {
+              result.hasA = input.ReadInt32(ref result.a_);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public bool HasA {
+        get { return result.hasA; }
+      }
+      public int A {
+        get { return result.A; }
+        set { SetA(value); }
+      }
+      public Builder SetA(int value) {
+        PrepareBuilder();
+        result.hasA = true;
+        result.a_ = value;
+        return this;
+      }
+      public Builder ClearA() {
+        PrepareBuilder();
+        result.hasA = false;
+        result.a_ = 0;
+        return this;
+      }
+    }
+    static OptionalGroup_extension() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class RepeatedGroup_extension : pb::GeneratedMessage<RepeatedGroup_extension, RepeatedGroup_extension.Builder> {
+    private RepeatedGroup_extension() { }
+    private static readonly RepeatedGroup_extension defaultInstance = new RepeatedGroup_extension().MakeReadOnly();
+    private static readonly string[] _repeatedGroupExtensionFieldNames = new string[] { "a" };
+    private static readonly uint[] _repeatedGroupExtensionFieldTags = new uint[] { 376 };
+    public static RepeatedGroup_extension DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override RepeatedGroup_extension DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override RepeatedGroup_extension ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_RepeatedGroup_extension__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<RepeatedGroup_extension, RepeatedGroup_extension.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_RepeatedGroup_extension__FieldAccessorTable; }
+    }
+    
+    public const int AFieldNumber = 47;
+    private bool hasA;
+    private int a_;
+    public bool HasA {
+      get { return hasA; }
+    }
+    public int A {
+      get { return a_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _repeatedGroupExtensionFieldNames;
+      if (hasA) {
+        output.WriteInt32(47, field_names[0], A);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      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 RepeatedGroup_extension ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static RepeatedGroup_extension ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static RepeatedGroup_extension ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static RepeatedGroup_extension ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static RepeatedGroup_extension ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static RepeatedGroup_extension ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static RepeatedGroup_extension ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static RepeatedGroup_extension ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static RepeatedGroup_extension ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static RepeatedGroup_extension ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private RepeatedGroup_extension MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(RepeatedGroup_extension prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<RepeatedGroup_extension, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(RepeatedGroup_extension cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private RepeatedGroup_extension result;
+      
+      private RepeatedGroup_extension PrepareBuilder() {
+        if (resultIsReadOnly) {
+          RepeatedGroup_extension original = result;
+          result = new RepeatedGroup_extension();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override RepeatedGroup_extension MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.RepeatedGroup_extension.Descriptor; }
+      }
+      
+      public override RepeatedGroup_extension DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.RepeatedGroup_extension.DefaultInstance; }
+      }
+      
+      public override RepeatedGroup_extension BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is RepeatedGroup_extension) {
+          return MergeFrom((RepeatedGroup_extension) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(RepeatedGroup_extension other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.RepeatedGroup_extension.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasA) {
+          A = other.A;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_repeatedGroupExtensionFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _repeatedGroupExtensionFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 376: {
+              result.hasA = input.ReadInt32(ref result.a_);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public bool HasA {
+        get { return result.hasA; }
+      }
+      public int A {
+        get { return result.A; }
+        set { SetA(value); }
+      }
+      public Builder SetA(int value) {
+        PrepareBuilder();
+        result.hasA = true;
+        result.a_ = value;
+        return this;
+      }
+      public Builder ClearA() {
+        PrepareBuilder();
+        result.hasA = false;
+        result.a_ = 0;
+        return this;
+      }
+    }
+    static RepeatedGroup_extension() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestNestedExtension : pb::GeneratedMessage<TestNestedExtension, TestNestedExtension.Builder> {
+    private TestNestedExtension() { }
+    private static readonly TestNestedExtension defaultInstance = new TestNestedExtension().MakeReadOnly();
+    private static readonly string[] _testNestedExtensionFieldNames = new string[] {  };
+    private static readonly uint[] _testNestedExtensionFieldTags = new uint[] {  };
+    public static TestNestedExtension DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestNestedExtension DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override TestNestedExtension ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestNestedExtension__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<TestNestedExtension, TestNestedExtension.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestNestedExtension__FieldAccessorTable; }
+    }
+    
+    public const int TestFieldNumber = 1002;
+    public static pb::GeneratedExtensionBase<string> Test;
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testNestedExtensionFieldNames;
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+      
+      size = 0;
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestNestedExtension ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestNestedExtension ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestNestedExtension ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestNestedExtension ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestNestedExtension ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestNestedExtension ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestNestedExtension ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestNestedExtension ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestNestedExtension ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestNestedExtension ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestNestedExtension MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestNestedExtension prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestNestedExtension, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestNestedExtension cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private TestNestedExtension result;
+      
+      private TestNestedExtension PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestNestedExtension original = result;
+          result = new TestNestedExtension();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override TestNestedExtension MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestNestedExtension.Descriptor; }
+      }
+      
+      public override TestNestedExtension DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestNestedExtension.DefaultInstance; }
+      }
+      
+      public override TestNestedExtension BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestNestedExtension) {
+          return MergeFrom((TestNestedExtension) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(TestNestedExtension other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestNestedExtension.DefaultInstance) return this;
+        PrepareBuilder();
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testNestedExtensionFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testNestedExtensionFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+    }
+    static TestNestedExtension() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestRequired : pb::GeneratedMessage<TestRequired, TestRequired.Builder> {
+    private TestRequired() { }
+    private static readonly TestRequired defaultInstance = new TestRequired().MakeReadOnly();
+    private static readonly string[] _testRequiredFieldNames = new string[] { "a", "b", "c", "dummy10", "dummy11", "dummy12", "dummy13", "dummy14", "dummy15", "dummy16", "dummy17", "dummy18", "dummy19", "dummy2", "dummy20", "dummy21", "dummy22", "dummy23", "dummy24", "dummy25", "dummy26", "dummy27", "dummy28", "dummy29", "dummy30", "dummy31", "dummy32", "dummy4", "dummy5", "dummy6", "dummy7", "dummy8", "dummy9" };
+    private static readonly uint[] _testRequiredFieldTags = new uint[] { 8, 24, 264, 80, 88, 96, 104, 112, 120, 128, 136, 144, 152, 16, 160, 168, 176, 184, 192, 200, 208, 216, 224, 232, 240, 248, 256, 32, 40, 48, 56, 64, 72 };
+    public static TestRequired DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestRequired DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override TestRequired ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestRequired__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<TestRequired, TestRequired.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestRequired__FieldAccessorTable; }
+    }
+    
+    public const int SingleFieldNumber = 1000;
+    public static pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.TestProtos.TestRequired> Single;
+    public const int MultiFieldNumber = 1001;
+    public static pb::GeneratedExtensionBase<scg::IList<global::Google.ProtocolBuffers.TestProtos.TestRequired>> Multi;
+    public const int AFieldNumber = 1;
+    private bool hasA;
+    private int a_;
+    public bool HasA {
+      get { return hasA; }
+    }
+    public int A {
+      get { return a_; }
+    }
+    
+    public const int Dummy2FieldNumber = 2;
+    private bool hasDummy2;
+    private int dummy2_;
+    public bool HasDummy2 {
+      get { return hasDummy2; }
+    }
+    public int Dummy2 {
+      get { return dummy2_; }
+    }
+    
+    public const int BFieldNumber = 3;
+    private bool hasB;
+    private int b_;
+    public bool HasB {
+      get { return hasB; }
+    }
+    public int B {
+      get { return b_; }
+    }
+    
+    public const int Dummy4FieldNumber = 4;
+    private bool hasDummy4;
+    private int dummy4_;
+    public bool HasDummy4 {
+      get { return hasDummy4; }
+    }
+    public int Dummy4 {
+      get { return dummy4_; }
+    }
+    
+    public const int Dummy5FieldNumber = 5;
+    private bool hasDummy5;
+    private int dummy5_;
+    public bool HasDummy5 {
+      get { return hasDummy5; }
+    }
+    public int Dummy5 {
+      get { return dummy5_; }
+    }
+    
+    public const int Dummy6FieldNumber = 6;
+    private bool hasDummy6;
+    private int dummy6_;
+    public bool HasDummy6 {
+      get { return hasDummy6; }
+    }
+    public int Dummy6 {
+      get { return dummy6_; }
+    }
+    
+    public const int Dummy7FieldNumber = 7;
+    private bool hasDummy7;
+    private int dummy7_;
+    public bool HasDummy7 {
+      get { return hasDummy7; }
+    }
+    public int Dummy7 {
+      get { return dummy7_; }
+    }
+    
+    public const int Dummy8FieldNumber = 8;
+    private bool hasDummy8;
+    private int dummy8_;
+    public bool HasDummy8 {
+      get { return hasDummy8; }
+    }
+    public int Dummy8 {
+      get { return dummy8_; }
+    }
+    
+    public const int Dummy9FieldNumber = 9;
+    private bool hasDummy9;
+    private int dummy9_;
+    public bool HasDummy9 {
+      get { return hasDummy9; }
+    }
+    public int Dummy9 {
+      get { return dummy9_; }
+    }
+    
+    public const int Dummy10FieldNumber = 10;
+    private bool hasDummy10;
+    private int dummy10_;
+    public bool HasDummy10 {
+      get { return hasDummy10; }
+    }
+    public int Dummy10 {
+      get { return dummy10_; }
+    }
+    
+    public const int Dummy11FieldNumber = 11;
+    private bool hasDummy11;
+    private int dummy11_;
+    public bool HasDummy11 {
+      get { return hasDummy11; }
+    }
+    public int Dummy11 {
+      get { return dummy11_; }
+    }
+    
+    public const int Dummy12FieldNumber = 12;
+    private bool hasDummy12;
+    private int dummy12_;
+    public bool HasDummy12 {
+      get { return hasDummy12; }
+    }
+    public int Dummy12 {
+      get { return dummy12_; }
+    }
+    
+    public const int Dummy13FieldNumber = 13;
+    private bool hasDummy13;
+    private int dummy13_;
+    public bool HasDummy13 {
+      get { return hasDummy13; }
+    }
+    public int Dummy13 {
+      get { return dummy13_; }
+    }
+    
+    public const int Dummy14FieldNumber = 14;
+    private bool hasDummy14;
+    private int dummy14_;
+    public bool HasDummy14 {
+      get { return hasDummy14; }
+    }
+    public int Dummy14 {
+      get { return dummy14_; }
+    }
+    
+    public const int Dummy15FieldNumber = 15;
+    private bool hasDummy15;
+    private int dummy15_;
+    public bool HasDummy15 {
+      get { return hasDummy15; }
+    }
+    public int Dummy15 {
+      get { return dummy15_; }
+    }
+    
+    public const int Dummy16FieldNumber = 16;
+    private bool hasDummy16;
+    private int dummy16_;
+    public bool HasDummy16 {
+      get { return hasDummy16; }
+    }
+    public int Dummy16 {
+      get { return dummy16_; }
+    }
+    
+    public const int Dummy17FieldNumber = 17;
+    private bool hasDummy17;
+    private int dummy17_;
+    public bool HasDummy17 {
+      get { return hasDummy17; }
+    }
+    public int Dummy17 {
+      get { return dummy17_; }
+    }
+    
+    public const int Dummy18FieldNumber = 18;
+    private bool hasDummy18;
+    private int dummy18_;
+    public bool HasDummy18 {
+      get { return hasDummy18; }
+    }
+    public int Dummy18 {
+      get { return dummy18_; }
+    }
+    
+    public const int Dummy19FieldNumber = 19;
+    private bool hasDummy19;
+    private int dummy19_;
+    public bool HasDummy19 {
+      get { return hasDummy19; }
+    }
+    public int Dummy19 {
+      get { return dummy19_; }
+    }
+    
+    public const int Dummy20FieldNumber = 20;
+    private bool hasDummy20;
+    private int dummy20_;
+    public bool HasDummy20 {
+      get { return hasDummy20; }
+    }
+    public int Dummy20 {
+      get { return dummy20_; }
+    }
+    
+    public const int Dummy21FieldNumber = 21;
+    private bool hasDummy21;
+    private int dummy21_;
+    public bool HasDummy21 {
+      get { return hasDummy21; }
+    }
+    public int Dummy21 {
+      get { return dummy21_; }
+    }
+    
+    public const int Dummy22FieldNumber = 22;
+    private bool hasDummy22;
+    private int dummy22_;
+    public bool HasDummy22 {
+      get { return hasDummy22; }
+    }
+    public int Dummy22 {
+      get { return dummy22_; }
+    }
+    
+    public const int Dummy23FieldNumber = 23;
+    private bool hasDummy23;
+    private int dummy23_;
+    public bool HasDummy23 {
+      get { return hasDummy23; }
+    }
+    public int Dummy23 {
+      get { return dummy23_; }
+    }
+    
+    public const int Dummy24FieldNumber = 24;
+    private bool hasDummy24;
+    private int dummy24_;
+    public bool HasDummy24 {
+      get { return hasDummy24; }
+    }
+    public int Dummy24 {
+      get { return dummy24_; }
+    }
+    
+    public const int Dummy25FieldNumber = 25;
+    private bool hasDummy25;
+    private int dummy25_;
+    public bool HasDummy25 {
+      get { return hasDummy25; }
+    }
+    public int Dummy25 {
+      get { return dummy25_; }
+    }
+    
+    public const int Dummy26FieldNumber = 26;
+    private bool hasDummy26;
+    private int dummy26_;
+    public bool HasDummy26 {
+      get { return hasDummy26; }
+    }
+    public int Dummy26 {
+      get { return dummy26_; }
+    }
+    
+    public const int Dummy27FieldNumber = 27;
+    private bool hasDummy27;
+    private int dummy27_;
+    public bool HasDummy27 {
+      get { return hasDummy27; }
+    }
+    public int Dummy27 {
+      get { return dummy27_; }
+    }
+    
+    public const int Dummy28FieldNumber = 28;
+    private bool hasDummy28;
+    private int dummy28_;
+    public bool HasDummy28 {
+      get { return hasDummy28; }
+    }
+    public int Dummy28 {
+      get { return dummy28_; }
+    }
+    
+    public const int Dummy29FieldNumber = 29;
+    private bool hasDummy29;
+    private int dummy29_;
+    public bool HasDummy29 {
+      get { return hasDummy29; }
+    }
+    public int Dummy29 {
+      get { return dummy29_; }
+    }
+    
+    public const int Dummy30FieldNumber = 30;
+    private bool hasDummy30;
+    private int dummy30_;
+    public bool HasDummy30 {
+      get { return hasDummy30; }
+    }
+    public int Dummy30 {
+      get { return dummy30_; }
+    }
+    
+    public const int Dummy31FieldNumber = 31;
+    private bool hasDummy31;
+    private int dummy31_;
+    public bool HasDummy31 {
+      get { return hasDummy31; }
+    }
+    public int Dummy31 {
+      get { return dummy31_; }
+    }
+    
+    public const int Dummy32FieldNumber = 32;
+    private bool hasDummy32;
+    private int dummy32_;
+    public bool HasDummy32 {
+      get { return hasDummy32; }
+    }
+    public int Dummy32 {
+      get { return dummy32_; }
+    }
+    
+    public const int CFieldNumber = 33;
+    private bool hasC;
+    private int c_;
+    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::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testRequiredFieldNames;
+      if (hasA) {
+        output.WriteInt32(1, field_names[0], A);
+      }
+      if (hasDummy2) {
+        output.WriteInt32(2, field_names[13], Dummy2);
+      }
+      if (hasB) {
+        output.WriteInt32(3, field_names[1], B);
+      }
+      if (hasDummy4) {
+        output.WriteInt32(4, field_names[27], Dummy4);
+      }
+      if (hasDummy5) {
+        output.WriteInt32(5, field_names[28], Dummy5);
+      }
+      if (hasDummy6) {
+        output.WriteInt32(6, field_names[29], Dummy6);
+      }
+      if (hasDummy7) {
+        output.WriteInt32(7, field_names[30], Dummy7);
+      }
+      if (hasDummy8) {
+        output.WriteInt32(8, field_names[31], Dummy8);
+      }
+      if (hasDummy9) {
+        output.WriteInt32(9, field_names[32], Dummy9);
+      }
+      if (hasDummy10) {
+        output.WriteInt32(10, field_names[3], Dummy10);
+      }
+      if (hasDummy11) {
+        output.WriteInt32(11, field_names[4], Dummy11);
+      }
+      if (hasDummy12) {
+        output.WriteInt32(12, field_names[5], Dummy12);
+      }
+      if (hasDummy13) {
+        output.WriteInt32(13, field_names[6], Dummy13);
+      }
+      if (hasDummy14) {
+        output.WriteInt32(14, field_names[7], Dummy14);
+      }
+      if (hasDummy15) {
+        output.WriteInt32(15, field_names[8], Dummy15);
+      }
+      if (hasDummy16) {
+        output.WriteInt32(16, field_names[9], Dummy16);
+      }
+      if (hasDummy17) {
+        output.WriteInt32(17, field_names[10], Dummy17);
+      }
+      if (hasDummy18) {
+        output.WriteInt32(18, field_names[11], Dummy18);
+      }
+      if (hasDummy19) {
+        output.WriteInt32(19, field_names[12], Dummy19);
+      }
+      if (hasDummy20) {
+        output.WriteInt32(20, field_names[14], Dummy20);
+      }
+      if (hasDummy21) {
+        output.WriteInt32(21, field_names[15], Dummy21);
+      }
+      if (hasDummy22) {
+        output.WriteInt32(22, field_names[16], Dummy22);
+      }
+      if (hasDummy23) {
+        output.WriteInt32(23, field_names[17], Dummy23);
+      }
+      if (hasDummy24) {
+        output.WriteInt32(24, field_names[18], Dummy24);
+      }
+      if (hasDummy25) {
+        output.WriteInt32(25, field_names[19], Dummy25);
+      }
+      if (hasDummy26) {
+        output.WriteInt32(26, field_names[20], Dummy26);
+      }
+      if (hasDummy27) {
+        output.WriteInt32(27, field_names[21], Dummy27);
+      }
+      if (hasDummy28) {
+        output.WriteInt32(28, field_names[22], Dummy28);
+      }
+      if (hasDummy29) {
+        output.WriteInt32(29, field_names[23], Dummy29);
+      }
+      if (hasDummy30) {
+        output.WriteInt32(30, field_names[24], Dummy30);
+      }
+      if (hasDummy31) {
+        output.WriteInt32(31, field_names[25], Dummy31);
+      }
+      if (hasDummy32) {
+        output.WriteInt32(32, field_names[26], Dummy32);
+      }
+      if (hasC) {
+        output.WriteInt32(33, field_names[2], C);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      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 TestRequired ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestRequired ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestRequired ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestRequired ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestRequired ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestRequired ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestRequired ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestRequired ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestRequired ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestRequired ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestRequired MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestRequired prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestRequired, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestRequired cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private TestRequired result;
+      
+      private TestRequired PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestRequired original = result;
+          result = new TestRequired();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override TestRequired MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestRequired.Descriptor; }
+      }
+      
+      public override TestRequired DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestRequired.DefaultInstance; }
+      }
+      
+      public override TestRequired BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestRequired) {
+          return MergeFrom((TestRequired) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(TestRequired other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestRequired.DefaultInstance) return this;
+        PrepareBuilder();
+        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 Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testRequiredFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testRequiredFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasA = input.ReadInt32(ref result.a_);
+              break;
+            }
+            case 16: {
+              result.hasDummy2 = input.ReadInt32(ref result.dummy2_);
+              break;
+            }
+            case 24: {
+              result.hasB = input.ReadInt32(ref result.b_);
+              break;
+            }
+            case 32: {
+              result.hasDummy4 = input.ReadInt32(ref result.dummy4_);
+              break;
+            }
+            case 40: {
+              result.hasDummy5 = input.ReadInt32(ref result.dummy5_);
+              break;
+            }
+            case 48: {
+              result.hasDummy6 = input.ReadInt32(ref result.dummy6_);
+              break;
+            }
+            case 56: {
+              result.hasDummy7 = input.ReadInt32(ref result.dummy7_);
+              break;
+            }
+            case 64: {
+              result.hasDummy8 = input.ReadInt32(ref result.dummy8_);
+              break;
+            }
+            case 72: {
+              result.hasDummy9 = input.ReadInt32(ref result.dummy9_);
+              break;
+            }
+            case 80: {
+              result.hasDummy10 = input.ReadInt32(ref result.dummy10_);
+              break;
+            }
+            case 88: {
+              result.hasDummy11 = input.ReadInt32(ref result.dummy11_);
+              break;
+            }
+            case 96: {
+              result.hasDummy12 = input.ReadInt32(ref result.dummy12_);
+              break;
+            }
+            case 104: {
+              result.hasDummy13 = input.ReadInt32(ref result.dummy13_);
+              break;
+            }
+            case 112: {
+              result.hasDummy14 = input.ReadInt32(ref result.dummy14_);
+              break;
+            }
+            case 120: {
+              result.hasDummy15 = input.ReadInt32(ref result.dummy15_);
+              break;
+            }
+            case 128: {
+              result.hasDummy16 = input.ReadInt32(ref result.dummy16_);
+              break;
+            }
+            case 136: {
+              result.hasDummy17 = input.ReadInt32(ref result.dummy17_);
+              break;
+            }
+            case 144: {
+              result.hasDummy18 = input.ReadInt32(ref result.dummy18_);
+              break;
+            }
+            case 152: {
+              result.hasDummy19 = input.ReadInt32(ref result.dummy19_);
+              break;
+            }
+            case 160: {
+              result.hasDummy20 = input.ReadInt32(ref result.dummy20_);
+              break;
+            }
+            case 168: {
+              result.hasDummy21 = input.ReadInt32(ref result.dummy21_);
+              break;
+            }
+            case 176: {
+              result.hasDummy22 = input.ReadInt32(ref result.dummy22_);
+              break;
+            }
+            case 184: {
+              result.hasDummy23 = input.ReadInt32(ref result.dummy23_);
+              break;
+            }
+            case 192: {
+              result.hasDummy24 = input.ReadInt32(ref result.dummy24_);
+              break;
+            }
+            case 200: {
+              result.hasDummy25 = input.ReadInt32(ref result.dummy25_);
+              break;
+            }
+            case 208: {
+              result.hasDummy26 = input.ReadInt32(ref result.dummy26_);
+              break;
+            }
+            case 216: {
+              result.hasDummy27 = input.ReadInt32(ref result.dummy27_);
+              break;
+            }
+            case 224: {
+              result.hasDummy28 = input.ReadInt32(ref result.dummy28_);
+              break;
+            }
+            case 232: {
+              result.hasDummy29 = input.ReadInt32(ref result.dummy29_);
+              break;
+            }
+            case 240: {
+              result.hasDummy30 = input.ReadInt32(ref result.dummy30_);
+              break;
+            }
+            case 248: {
+              result.hasDummy31 = input.ReadInt32(ref result.dummy31_);
+              break;
+            }
+            case 256: {
+              result.hasDummy32 = input.ReadInt32(ref result.dummy32_);
+              break;
+            }
+            case 264: {
+              result.hasC = input.ReadInt32(ref result.c_);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public bool HasA {
+        get { return result.hasA; }
+      }
+      public int A {
+        get { return result.A; }
+        set { SetA(value); }
+      }
+      public Builder SetA(int value) {
+        PrepareBuilder();
+        result.hasA = true;
+        result.a_ = value;
+        return this;
+      }
+      public Builder ClearA() {
+        PrepareBuilder();
+        result.hasA = false;
+        result.a_ = 0;
+        return this;
+      }
+      
+      public bool HasDummy2 {
+        get { return result.hasDummy2; }
+      }
+      public int Dummy2 {
+        get { return result.Dummy2; }
+        set { SetDummy2(value); }
+      }
+      public Builder SetDummy2(int value) {
+        PrepareBuilder();
+        result.hasDummy2 = true;
+        result.dummy2_ = value;
+        return this;
+      }
+      public Builder ClearDummy2() {
+        PrepareBuilder();
+        result.hasDummy2 = false;
+        result.dummy2_ = 0;
+        return this;
+      }
+      
+      public bool HasB {
+        get { return result.hasB; }
+      }
+      public int B {
+        get { return result.B; }
+        set { SetB(value); }
+      }
+      public Builder SetB(int value) {
+        PrepareBuilder();
+        result.hasB = true;
+        result.b_ = value;
+        return this;
+      }
+      public Builder ClearB() {
+        PrepareBuilder();
+        result.hasB = false;
+        result.b_ = 0;
+        return this;
+      }
+      
+      public bool HasDummy4 {
+        get { return result.hasDummy4; }
+      }
+      public int Dummy4 {
+        get { return result.Dummy4; }
+        set { SetDummy4(value); }
+      }
+      public Builder SetDummy4(int value) {
+        PrepareBuilder();
+        result.hasDummy4 = true;
+        result.dummy4_ = value;
+        return this;
+      }
+      public Builder ClearDummy4() {
+        PrepareBuilder();
+        result.hasDummy4 = false;
+        result.dummy4_ = 0;
+        return this;
+      }
+      
+      public bool HasDummy5 {
+        get { return result.hasDummy5; }
+      }
+      public int Dummy5 {
+        get { return result.Dummy5; }
+        set { SetDummy5(value); }
+      }
+      public Builder SetDummy5(int value) {
+        PrepareBuilder();
+        result.hasDummy5 = true;
+        result.dummy5_ = value;
+        return this;
+      }
+      public Builder ClearDummy5() {
+        PrepareBuilder();
+        result.hasDummy5 = false;
+        result.dummy5_ = 0;
+        return this;
+      }
+      
+      public bool HasDummy6 {
+        get { return result.hasDummy6; }
+      }
+      public int Dummy6 {
+        get { return result.Dummy6; }
+        set { SetDummy6(value); }
+      }
+      public Builder SetDummy6(int value) {
+        PrepareBuilder();
+        result.hasDummy6 = true;
+        result.dummy6_ = value;
+        return this;
+      }
+      public Builder ClearDummy6() {
+        PrepareBuilder();
+        result.hasDummy6 = false;
+        result.dummy6_ = 0;
+        return this;
+      }
+      
+      public bool HasDummy7 {
+        get { return result.hasDummy7; }
+      }
+      public int Dummy7 {
+        get { return result.Dummy7; }
+        set { SetDummy7(value); }
+      }
+      public Builder SetDummy7(int value) {
+        PrepareBuilder();
+        result.hasDummy7 = true;
+        result.dummy7_ = value;
+        return this;
+      }
+      public Builder ClearDummy7() {
+        PrepareBuilder();
+        result.hasDummy7 = false;
+        result.dummy7_ = 0;
+        return this;
+      }
+      
+      public bool HasDummy8 {
+        get { return result.hasDummy8; }
+      }
+      public int Dummy8 {
+        get { return result.Dummy8; }
+        set { SetDummy8(value); }
+      }
+      public Builder SetDummy8(int value) {
+        PrepareBuilder();
+        result.hasDummy8 = true;
+        result.dummy8_ = value;
+        return this;
+      }
+      public Builder ClearDummy8() {
+        PrepareBuilder();
+        result.hasDummy8 = false;
+        result.dummy8_ = 0;
+        return this;
+      }
+      
+      public bool HasDummy9 {
+        get { return result.hasDummy9; }
+      }
+      public int Dummy9 {
+        get { return result.Dummy9; }
+        set { SetDummy9(value); }
+      }
+      public Builder SetDummy9(int value) {
+        PrepareBuilder();
+        result.hasDummy9 = true;
+        result.dummy9_ = value;
+        return this;
+      }
+      public Builder ClearDummy9() {
+        PrepareBuilder();
+        result.hasDummy9 = false;
+        result.dummy9_ = 0;
+        return this;
+      }
+      
+      public bool HasDummy10 {
+        get { return result.hasDummy10; }
+      }
+      public int Dummy10 {
+        get { return result.Dummy10; }
+        set { SetDummy10(value); }
+      }
+      public Builder SetDummy10(int value) {
+        PrepareBuilder();
+        result.hasDummy10 = true;
+        result.dummy10_ = value;
+        return this;
+      }
+      public Builder ClearDummy10() {
+        PrepareBuilder();
+        result.hasDummy10 = false;
+        result.dummy10_ = 0;
+        return this;
+      }
+      
+      public bool HasDummy11 {
+        get { return result.hasDummy11; }
+      }
+      public int Dummy11 {
+        get { return result.Dummy11; }
+        set { SetDummy11(value); }
+      }
+      public Builder SetDummy11(int value) {
+        PrepareBuilder();
+        result.hasDummy11 = true;
+        result.dummy11_ = value;
+        return this;
+      }
+      public Builder ClearDummy11() {
+        PrepareBuilder();
+        result.hasDummy11 = false;
+        result.dummy11_ = 0;
+        return this;
+      }
+      
+      public bool HasDummy12 {
+        get { return result.hasDummy12; }
+      }
+      public int Dummy12 {
+        get { return result.Dummy12; }
+        set { SetDummy12(value); }
+      }
+      public Builder SetDummy12(int value) {
+        PrepareBuilder();
+        result.hasDummy12 = true;
+        result.dummy12_ = value;
+        return this;
+      }
+      public Builder ClearDummy12() {
+        PrepareBuilder();
+        result.hasDummy12 = false;
+        result.dummy12_ = 0;
+        return this;
+      }
+      
+      public bool HasDummy13 {
+        get { return result.hasDummy13; }
+      }
+      public int Dummy13 {
+        get { return result.Dummy13; }
+        set { SetDummy13(value); }
+      }
+      public Builder SetDummy13(int value) {
+        PrepareBuilder();
+        result.hasDummy13 = true;
+        result.dummy13_ = value;
+        return this;
+      }
+      public Builder ClearDummy13() {
+        PrepareBuilder();
+        result.hasDummy13 = false;
+        result.dummy13_ = 0;
+        return this;
+      }
+      
+      public bool HasDummy14 {
+        get { return result.hasDummy14; }
+      }
+      public int Dummy14 {
+        get { return result.Dummy14; }
+        set { SetDummy14(value); }
+      }
+      public Builder SetDummy14(int value) {
+        PrepareBuilder();
+        result.hasDummy14 = true;
+        result.dummy14_ = value;
+        return this;
+      }
+      public Builder ClearDummy14() {
+        PrepareBuilder();
+        result.hasDummy14 = false;
+        result.dummy14_ = 0;
+        return this;
+      }
+      
+      public bool HasDummy15 {
+        get { return result.hasDummy15; }
+      }
+      public int Dummy15 {
+        get { return result.Dummy15; }
+        set { SetDummy15(value); }
+      }
+      public Builder SetDummy15(int value) {
+        PrepareBuilder();
+        result.hasDummy15 = true;
+        result.dummy15_ = value;
+        return this;
+      }
+      public Builder ClearDummy15() {
+        PrepareBuilder();
+        result.hasDummy15 = false;
+        result.dummy15_ = 0;
+        return this;
+      }
+      
+      public bool HasDummy16 {
+        get { return result.hasDummy16; }
+      }
+      public int Dummy16 {
+        get { return result.Dummy16; }
+        set { SetDummy16(value); }
+      }
+      public Builder SetDummy16(int value) {
+        PrepareBuilder();
+        result.hasDummy16 = true;
+        result.dummy16_ = value;
+        return this;
+      }
+      public Builder ClearDummy16() {
+        PrepareBuilder();
+        result.hasDummy16 = false;
+        result.dummy16_ = 0;
+        return this;
+      }
+      
+      public bool HasDummy17 {
+        get { return result.hasDummy17; }
+      }
+      public int Dummy17 {
+        get { return result.Dummy17; }
+        set { SetDummy17(value); }
+      }
+      public Builder SetDummy17(int value) {
+        PrepareBuilder();
+        result.hasDummy17 = true;
+        result.dummy17_ = value;
+        return this;
+      }
+      public Builder ClearDummy17() {
+        PrepareBuilder();
+        result.hasDummy17 = false;
+        result.dummy17_ = 0;
+        return this;
+      }
+      
+      public bool HasDummy18 {
+        get { return result.hasDummy18; }
+      }
+      public int Dummy18 {
+        get { return result.Dummy18; }
+        set { SetDummy18(value); }
+      }
+      public Builder SetDummy18(int value) {
+        PrepareBuilder();
+        result.hasDummy18 = true;
+        result.dummy18_ = value;
+        return this;
+      }
+      public Builder ClearDummy18() {
+        PrepareBuilder();
+        result.hasDummy18 = false;
+        result.dummy18_ = 0;
+        return this;
+      }
+      
+      public bool HasDummy19 {
+        get { return result.hasDummy19; }
+      }
+      public int Dummy19 {
+        get { return result.Dummy19; }
+        set { SetDummy19(value); }
+      }
+      public Builder SetDummy19(int value) {
+        PrepareBuilder();
+        result.hasDummy19 = true;
+        result.dummy19_ = value;
+        return this;
+      }
+      public Builder ClearDummy19() {
+        PrepareBuilder();
+        result.hasDummy19 = false;
+        result.dummy19_ = 0;
+        return this;
+      }
+      
+      public bool HasDummy20 {
+        get { return result.hasDummy20; }
+      }
+      public int Dummy20 {
+        get { return result.Dummy20; }
+        set { SetDummy20(value); }
+      }
+      public Builder SetDummy20(int value) {
+        PrepareBuilder();
+        result.hasDummy20 = true;
+        result.dummy20_ = value;
+        return this;
+      }
+      public Builder ClearDummy20() {
+        PrepareBuilder();
+        result.hasDummy20 = false;
+        result.dummy20_ = 0;
+        return this;
+      }
+      
+      public bool HasDummy21 {
+        get { return result.hasDummy21; }
+      }
+      public int Dummy21 {
+        get { return result.Dummy21; }
+        set { SetDummy21(value); }
+      }
+      public Builder SetDummy21(int value) {
+        PrepareBuilder();
+        result.hasDummy21 = true;
+        result.dummy21_ = value;
+        return this;
+      }
+      public Builder ClearDummy21() {
+        PrepareBuilder();
+        result.hasDummy21 = false;
+        result.dummy21_ = 0;
+        return this;
+      }
+      
+      public bool HasDummy22 {
+        get { return result.hasDummy22; }
+      }
+      public int Dummy22 {
+        get { return result.Dummy22; }
+        set { SetDummy22(value); }
+      }
+      public Builder SetDummy22(int value) {
+        PrepareBuilder();
+        result.hasDummy22 = true;
+        result.dummy22_ = value;
+        return this;
+      }
+      public Builder ClearDummy22() {
+        PrepareBuilder();
+        result.hasDummy22 = false;
+        result.dummy22_ = 0;
+        return this;
+      }
+      
+      public bool HasDummy23 {
+        get { return result.hasDummy23; }
+      }
+      public int Dummy23 {
+        get { return result.Dummy23; }
+        set { SetDummy23(value); }
+      }
+      public Builder SetDummy23(int value) {
+        PrepareBuilder();
+        result.hasDummy23 = true;
+        result.dummy23_ = value;
+        return this;
+      }
+      public Builder ClearDummy23() {
+        PrepareBuilder();
+        result.hasDummy23 = false;
+        result.dummy23_ = 0;
+        return this;
+      }
+      
+      public bool HasDummy24 {
+        get { return result.hasDummy24; }
+      }
+      public int Dummy24 {
+        get { return result.Dummy24; }
+        set { SetDummy24(value); }
+      }
+      public Builder SetDummy24(int value) {
+        PrepareBuilder();
+        result.hasDummy24 = true;
+        result.dummy24_ = value;
+        return this;
+      }
+      public Builder ClearDummy24() {
+        PrepareBuilder();
+        result.hasDummy24 = false;
+        result.dummy24_ = 0;
+        return this;
+      }
+      
+      public bool HasDummy25 {
+        get { return result.hasDummy25; }
+      }
+      public int Dummy25 {
+        get { return result.Dummy25; }
+        set { SetDummy25(value); }
+      }
+      public Builder SetDummy25(int value) {
+        PrepareBuilder();
+        result.hasDummy25 = true;
+        result.dummy25_ = value;
+        return this;
+      }
+      public Builder ClearDummy25() {
+        PrepareBuilder();
+        result.hasDummy25 = false;
+        result.dummy25_ = 0;
+        return this;
+      }
+      
+      public bool HasDummy26 {
+        get { return result.hasDummy26; }
+      }
+      public int Dummy26 {
+        get { return result.Dummy26; }
+        set { SetDummy26(value); }
+      }
+      public Builder SetDummy26(int value) {
+        PrepareBuilder();
+        result.hasDummy26 = true;
+        result.dummy26_ = value;
+        return this;
+      }
+      public Builder ClearDummy26() {
+        PrepareBuilder();
+        result.hasDummy26 = false;
+        result.dummy26_ = 0;
+        return this;
+      }
+      
+      public bool HasDummy27 {
+        get { return result.hasDummy27; }
+      }
+      public int Dummy27 {
+        get { return result.Dummy27; }
+        set { SetDummy27(value); }
+      }
+      public Builder SetDummy27(int value) {
+        PrepareBuilder();
+        result.hasDummy27 = true;
+        result.dummy27_ = value;
+        return this;
+      }
+      public Builder ClearDummy27() {
+        PrepareBuilder();
+        result.hasDummy27 = false;
+        result.dummy27_ = 0;
+        return this;
+      }
+      
+      public bool HasDummy28 {
+        get { return result.hasDummy28; }
+      }
+      public int Dummy28 {
+        get { return result.Dummy28; }
+        set { SetDummy28(value); }
+      }
+      public Builder SetDummy28(int value) {
+        PrepareBuilder();
+        result.hasDummy28 = true;
+        result.dummy28_ = value;
+        return this;
+      }
+      public Builder ClearDummy28() {
+        PrepareBuilder();
+        result.hasDummy28 = false;
+        result.dummy28_ = 0;
+        return this;
+      }
+      
+      public bool HasDummy29 {
+        get { return result.hasDummy29; }
+      }
+      public int Dummy29 {
+        get { return result.Dummy29; }
+        set { SetDummy29(value); }
+      }
+      public Builder SetDummy29(int value) {
+        PrepareBuilder();
+        result.hasDummy29 = true;
+        result.dummy29_ = value;
+        return this;
+      }
+      public Builder ClearDummy29() {
+        PrepareBuilder();
+        result.hasDummy29 = false;
+        result.dummy29_ = 0;
+        return this;
+      }
+      
+      public bool HasDummy30 {
+        get { return result.hasDummy30; }
+      }
+      public int Dummy30 {
+        get { return result.Dummy30; }
+        set { SetDummy30(value); }
+      }
+      public Builder SetDummy30(int value) {
+        PrepareBuilder();
+        result.hasDummy30 = true;
+        result.dummy30_ = value;
+        return this;
+      }
+      public Builder ClearDummy30() {
+        PrepareBuilder();
+        result.hasDummy30 = false;
+        result.dummy30_ = 0;
+        return this;
+      }
+      
+      public bool HasDummy31 {
+        get { return result.hasDummy31; }
+      }
+      public int Dummy31 {
+        get { return result.Dummy31; }
+        set { SetDummy31(value); }
+      }
+      public Builder SetDummy31(int value) {
+        PrepareBuilder();
+        result.hasDummy31 = true;
+        result.dummy31_ = value;
+        return this;
+      }
+      public Builder ClearDummy31() {
+        PrepareBuilder();
+        result.hasDummy31 = false;
+        result.dummy31_ = 0;
+        return this;
+      }
+      
+      public bool HasDummy32 {
+        get { return result.hasDummy32; }
+      }
+      public int Dummy32 {
+        get { return result.Dummy32; }
+        set { SetDummy32(value); }
+      }
+      public Builder SetDummy32(int value) {
+        PrepareBuilder();
+        result.hasDummy32 = true;
+        result.dummy32_ = value;
+        return this;
+      }
+      public Builder ClearDummy32() {
+        PrepareBuilder();
+        result.hasDummy32 = false;
+        result.dummy32_ = 0;
+        return this;
+      }
+      
+      public bool HasC {
+        get { return result.hasC; }
+      }
+      public int C {
+        get { return result.C; }
+        set { SetC(value); }
+      }
+      public Builder SetC(int value) {
+        PrepareBuilder();
+        result.hasC = true;
+        result.c_ = value;
+        return this;
+      }
+      public Builder ClearC() {
+        PrepareBuilder();
+        result.hasC = false;
+        result.c_ = 0;
+        return this;
+      }
+    }
+    static TestRequired() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestRequiredForeign : pb::GeneratedMessage<TestRequiredForeign, TestRequiredForeign.Builder> {
+    private TestRequiredForeign() { }
+    private static readonly TestRequiredForeign defaultInstance = new TestRequiredForeign().MakeReadOnly();
+    private static readonly string[] _testRequiredForeignFieldNames = new string[] { "dummy", "optional_message", "repeated_message" };
+    private static readonly uint[] _testRequiredForeignFieldTags = new uint[] { 24, 10, 18 };
+    public static TestRequiredForeign DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestRequiredForeign DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override TestRequiredForeign ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestRequiredForeign__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<TestRequiredForeign, TestRequiredForeign.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestRequiredForeign__FieldAccessorTable; }
+    }
+    
+    public const int OptionalMessageFieldNumber = 1;
+    private bool hasOptionalMessage;
+    private global::Google.ProtocolBuffers.TestProtos.TestRequired optionalMessage_;
+    public bool HasOptionalMessage {
+      get { return hasOptionalMessage; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestRequired OptionalMessage {
+      get { return optionalMessage_ ?? global::Google.ProtocolBuffers.TestProtos.TestRequired.DefaultInstance; }
+    }
+    
+    public const int RepeatedMessageFieldNumber = 2;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestRequired> repeatedMessage_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestRequired>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.TestRequired> RepeatedMessageList {
+      get { return repeatedMessage_; }
+    }
+    public int RepeatedMessageCount {
+      get { return repeatedMessage_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestRequired GetRepeatedMessage(int index) {
+      return repeatedMessage_[index];
+    }
+    
+    public const int DummyFieldNumber = 3;
+    private bool hasDummy;
+    private int dummy_;
+    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 (global::Google.ProtocolBuffers.TestProtos.TestRequired element in RepeatedMessageList) {
+          if (!element.IsInitialized) return false;
+        }
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testRequiredForeignFieldNames;
+      if (hasOptionalMessage) {
+        output.WriteMessage(1, field_names[1], OptionalMessage);
+      }
+      if (repeatedMessage_.Count > 0) {
+        output.WriteMessageArray(2, field_names[2], repeatedMessage_);
+      }
+      if (hasDummy) {
+        output.WriteInt32(3, field_names[0], Dummy);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+      
+      size = 0;
+      if (hasOptionalMessage) {
+        size += pb::CodedOutputStream.ComputeMessageSize(1, OptionalMessage);
+      }
+      foreach (global::Google.ProtocolBuffers.TestProtos.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 TestRequiredForeign ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestRequiredForeign ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestRequiredForeign ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestRequiredForeign ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestRequiredForeign ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestRequiredForeign ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestRequiredForeign ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestRequiredForeign ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestRequiredForeign ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestRequiredForeign ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestRequiredForeign MakeReadOnly() {
+      repeatedMessage_.MakeReadOnly();
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestRequiredForeign prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestRequiredForeign, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestRequiredForeign cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private TestRequiredForeign result;
+      
+      private TestRequiredForeign PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestRequiredForeign original = result;
+          result = new TestRequiredForeign();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override TestRequiredForeign MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestRequiredForeign.Descriptor; }
+      }
+      
+      public override TestRequiredForeign DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestRequiredForeign.DefaultInstance; }
+      }
+      
+      public override TestRequiredForeign BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestRequiredForeign) {
+          return MergeFrom((TestRequiredForeign) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(TestRequiredForeign other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestRequiredForeign.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasOptionalMessage) {
+          MergeOptionalMessage(other.OptionalMessage);
+        }
+        if (other.repeatedMessage_.Count != 0) {
+          result.repeatedMessage_.Add(other.repeatedMessage_);
+        }
+        if (other.HasDummy) {
+          Dummy = other.Dummy;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testRequiredForeignFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testRequiredForeignFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              global::Google.ProtocolBuffers.TestProtos.TestRequired.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestRequired.CreateBuilder();
+              if (result.hasOptionalMessage) {
+                subBuilder.MergeFrom(OptionalMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              OptionalMessage = subBuilder.BuildPartial();
+              break;
+            }
+            case 18: {
+              input.ReadMessageArray(tag, field_name, result.repeatedMessage_, global::Google.ProtocolBuffers.TestProtos.TestRequired.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 24: {
+              result.hasDummy = input.ReadInt32(ref result.dummy_);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public bool HasOptionalMessage {
+       get { return result.hasOptionalMessage; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestRequired OptionalMessage {
+        get { return result.OptionalMessage; }
+        set { SetOptionalMessage(value); }
+      }
+      public Builder SetOptionalMessage(global::Google.ProtocolBuffers.TestProtos.TestRequired value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasOptionalMessage = true;
+        result.optionalMessage_ = value;
+        return this;
+      }
+      public Builder SetOptionalMessage(global::Google.ProtocolBuffers.TestProtos.TestRequired.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasOptionalMessage = true;
+        result.optionalMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalMessage(global::Google.ProtocolBuffers.TestProtos.TestRequired value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasOptionalMessage &&
+            result.optionalMessage_ != global::Google.ProtocolBuffers.TestProtos.TestRequired.DefaultInstance) {
+            result.optionalMessage_ = global::Google.ProtocolBuffers.TestProtos.TestRequired.CreateBuilder(result.optionalMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalMessage_ = value;
+        }
+        result.hasOptionalMessage = true;
+        return this;
+      }
+      public Builder ClearOptionalMessage() {
+        PrepareBuilder();
+        result.hasOptionalMessage = false;
+        result.optionalMessage_ = null;
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.TestRequired> RepeatedMessageList {
+        get { return PrepareBuilder().repeatedMessage_; }
+      }
+      public int RepeatedMessageCount {
+        get { return result.RepeatedMessageCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestRequired GetRepeatedMessage(int index) {
+        return result.GetRepeatedMessage(index);
+      }
+      public Builder SetRepeatedMessage(int index, global::Google.ProtocolBuffers.TestProtos.TestRequired value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedMessage_[index] = value;
+        return this;
+      }
+      public Builder SetRepeatedMessage(int index, global::Google.ProtocolBuffers.TestProtos.TestRequired.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.repeatedMessage_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRepeatedMessage(global::Google.ProtocolBuffers.TestProtos.TestRequired value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedMessage_.Add(value);
+        return this;
+      }
+      public Builder AddRepeatedMessage(global::Google.ProtocolBuffers.TestProtos.TestRequired.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.repeatedMessage_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRepeatedMessage(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.TestRequired> values) {
+        PrepareBuilder();
+        result.repeatedMessage_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedMessage() {
+        PrepareBuilder();
+        result.repeatedMessage_.Clear();
+        return this;
+      }
+      
+      public bool HasDummy {
+        get { return result.hasDummy; }
+      }
+      public int Dummy {
+        get { return result.Dummy; }
+        set { SetDummy(value); }
+      }
+      public Builder SetDummy(int value) {
+        PrepareBuilder();
+        result.hasDummy = true;
+        result.dummy_ = value;
+        return this;
+      }
+      public Builder ClearDummy() {
+        PrepareBuilder();
+        result.hasDummy = false;
+        result.dummy_ = 0;
+        return this;
+      }
+    }
+    static TestRequiredForeign() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestForeignNested : pb::GeneratedMessage<TestForeignNested, TestForeignNested.Builder> {
+    private TestForeignNested() { }
+    private static readonly TestForeignNested defaultInstance = new TestForeignNested().MakeReadOnly();
+    private static readonly string[] _testForeignNestedFieldNames = new string[] { "foreign_nested" };
+    private static readonly uint[] _testForeignNestedFieldTags = new uint[] { 10 };
+    public static TestForeignNested DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestForeignNested DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override TestForeignNested ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestForeignNested__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<TestForeignNested, TestForeignNested.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestForeignNested__FieldAccessorTable; }
+    }
+    
+    public const int ForeignNestedFieldNumber = 1;
+    private bool hasForeignNested;
+    private global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage foreignNested_;
+    public bool HasForeignNested {
+      get { return hasForeignNested; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage ForeignNested {
+      get { return foreignNested_ ?? global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testForeignNestedFieldNames;
+      if (hasForeignNested) {
+        output.WriteMessage(1, field_names[0], ForeignNested);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      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 TestForeignNested ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestForeignNested ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestForeignNested ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestForeignNested ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestForeignNested ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestForeignNested ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestForeignNested ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestForeignNested ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestForeignNested ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestForeignNested ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestForeignNested MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestForeignNested prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestForeignNested, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestForeignNested cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private TestForeignNested result;
+      
+      private TestForeignNested PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestForeignNested original = result;
+          result = new TestForeignNested();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override TestForeignNested MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestForeignNested.Descriptor; }
+      }
+      
+      public override TestForeignNested DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestForeignNested.DefaultInstance; }
+      }
+      
+      public override TestForeignNested BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestForeignNested) {
+          return MergeFrom((TestForeignNested) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(TestForeignNested other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestForeignNested.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasForeignNested) {
+          MergeForeignNested(other.ForeignNested);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testForeignNestedFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testForeignNestedFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.CreateBuilder();
+              if (result.hasForeignNested) {
+                subBuilder.MergeFrom(ForeignNested);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              ForeignNested = subBuilder.BuildPartial();
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public bool HasForeignNested {
+       get { return result.hasForeignNested; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage ForeignNested {
+        get { return result.ForeignNested; }
+        set { SetForeignNested(value); }
+      }
+      public Builder SetForeignNested(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasForeignNested = true;
+        result.foreignNested_ = value;
+        return this;
+      }
+      public Builder SetForeignNested(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasForeignNested = true;
+        result.foreignNested_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeForeignNested(global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasForeignNested &&
+            result.foreignNested_ != global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.DefaultInstance) {
+            result.foreignNested_ = global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.CreateBuilder(result.foreignNested_).MergeFrom(value).BuildPartial();
+        } else {
+          result.foreignNested_ = value;
+        }
+        result.hasForeignNested = true;
+        return this;
+      }
+      public Builder ClearForeignNested() {
+        PrepareBuilder();
+        result.hasForeignNested = false;
+        result.foreignNested_ = null;
+        return this;
+      }
+    }
+    static TestForeignNested() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestEmptyMessage : pb::GeneratedMessage<TestEmptyMessage, TestEmptyMessage.Builder> {
+    private TestEmptyMessage() { }
+    private static readonly TestEmptyMessage defaultInstance = new TestEmptyMessage().MakeReadOnly();
+    private static readonly string[] _testEmptyMessageFieldNames = new string[] {  };
+    private static readonly uint[] _testEmptyMessageFieldTags = new uint[] {  };
+    public static TestEmptyMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestEmptyMessage DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override TestEmptyMessage ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestEmptyMessage__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<TestEmptyMessage, TestEmptyMessage.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestEmptyMessage__FieldAccessorTable; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testEmptyMessageFieldNames;
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+      
+      size = 0;
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestEmptyMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestEmptyMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestEmptyMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestEmptyMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestEmptyMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestEmptyMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestEmptyMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestEmptyMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestEmptyMessage ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestEmptyMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestEmptyMessage MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestEmptyMessage prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestEmptyMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestEmptyMessage cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private TestEmptyMessage result;
+      
+      private TestEmptyMessage PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestEmptyMessage original = result;
+          result = new TestEmptyMessage();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override TestEmptyMessage MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestEmptyMessage.Descriptor; }
+      }
+      
+      public override TestEmptyMessage DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestEmptyMessage.DefaultInstance; }
+      }
+      
+      public override TestEmptyMessage BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestEmptyMessage) {
+          return MergeFrom((TestEmptyMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(TestEmptyMessage other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestEmptyMessage.DefaultInstance) return this;
+        PrepareBuilder();
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testEmptyMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testEmptyMessageFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+    }
+    static TestEmptyMessage() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestEmptyMessageWithExtensions : pb::ExtendableMessage<TestEmptyMessageWithExtensions, TestEmptyMessageWithExtensions.Builder> {
+    private TestEmptyMessageWithExtensions() { }
+    private static readonly TestEmptyMessageWithExtensions defaultInstance = new TestEmptyMessageWithExtensions().MakeReadOnly();
+    private static readonly string[] _testEmptyMessageWithExtensionsFieldNames = new string[] {  };
+    private static readonly uint[] _testEmptyMessageWithExtensionsFieldTags = new uint[] {  };
+    public static TestEmptyMessageWithExtensions DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestEmptyMessageWithExtensions DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override TestEmptyMessageWithExtensions ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<TestEmptyMessageWithExtensions, TestEmptyMessageWithExtensions.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__FieldAccessorTable; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (!ExtensionsAreInitialized) return false;
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testEmptyMessageWithExtensionsFieldNames;
+      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;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+      
+      size = 0;
+      size += ExtensionsSerializedSize;
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestEmptyMessageWithExtensions ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestEmptyMessageWithExtensions ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestEmptyMessageWithExtensions ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestEmptyMessageWithExtensions ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestEmptyMessageWithExtensions ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestEmptyMessageWithExtensions ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestEmptyMessageWithExtensions ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestEmptyMessageWithExtensions ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestEmptyMessageWithExtensions ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestEmptyMessageWithExtensions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestEmptyMessageWithExtensions MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestEmptyMessageWithExtensions prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::ExtendableBuilder<TestEmptyMessageWithExtensions, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestEmptyMessageWithExtensions cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private TestEmptyMessageWithExtensions result;
+      
+      private TestEmptyMessageWithExtensions PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestEmptyMessageWithExtensions original = result;
+          result = new TestEmptyMessageWithExtensions();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override TestEmptyMessageWithExtensions MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestEmptyMessageWithExtensions.Descriptor; }
+      }
+      
+      public override TestEmptyMessageWithExtensions DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestEmptyMessageWithExtensions.DefaultInstance; }
+      }
+      
+      public override TestEmptyMessageWithExtensions BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestEmptyMessageWithExtensions) {
+          return MergeFrom((TestEmptyMessageWithExtensions) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(TestEmptyMessageWithExtensions other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestEmptyMessageWithExtensions.DefaultInstance) return this;
+        PrepareBuilder();
+          this.MergeExtensionFields(other);
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testEmptyMessageWithExtensionsFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testEmptyMessageWithExtensionsFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+    }
+    static TestEmptyMessageWithExtensions() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestMultipleExtensionRanges : pb::ExtendableMessage<TestMultipleExtensionRanges, TestMultipleExtensionRanges.Builder> {
+    private TestMultipleExtensionRanges() { }
+    private static readonly TestMultipleExtensionRanges defaultInstance = new TestMultipleExtensionRanges().MakeReadOnly();
+    private static readonly string[] _testMultipleExtensionRangesFieldNames = new string[] {  };
+    private static readonly uint[] _testMultipleExtensionRangesFieldTags = new uint[] {  };
+    public static TestMultipleExtensionRanges DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestMultipleExtensionRanges DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override TestMultipleExtensionRanges ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestMultipleExtensionRanges__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<TestMultipleExtensionRanges, TestMultipleExtensionRanges.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestMultipleExtensionRanges__FieldAccessorTable; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (!ExtensionsAreInitialized) return false;
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testMultipleExtensionRangesFieldNames;
+      pb::ExtendableMessage<TestMultipleExtensionRanges, TestMultipleExtensionRanges.Builder>.ExtensionWriter extensionWriter = CreateExtensionWriter(this);
+      extensionWriter.WriteUntil(43, output);
+      extensionWriter.WriteUntil(4244, output);
+      extensionWriter.WriteUntil(536870912, output);
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+      
+      size = 0;
+      size += ExtensionsSerializedSize;
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestMultipleExtensionRanges ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestMultipleExtensionRanges ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestMultipleExtensionRanges ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestMultipleExtensionRanges ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestMultipleExtensionRanges ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestMultipleExtensionRanges ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestMultipleExtensionRanges ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestMultipleExtensionRanges ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestMultipleExtensionRanges ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestMultipleExtensionRanges ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestMultipleExtensionRanges MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestMultipleExtensionRanges prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::ExtendableBuilder<TestMultipleExtensionRanges, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestMultipleExtensionRanges cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private TestMultipleExtensionRanges result;
+      
+      private TestMultipleExtensionRanges PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestMultipleExtensionRanges original = result;
+          result = new TestMultipleExtensionRanges();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override TestMultipleExtensionRanges MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestMultipleExtensionRanges.Descriptor; }
+      }
+      
+      public override TestMultipleExtensionRanges DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestMultipleExtensionRanges.DefaultInstance; }
+      }
+      
+      public override TestMultipleExtensionRanges BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestMultipleExtensionRanges) {
+          return MergeFrom((TestMultipleExtensionRanges) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(TestMultipleExtensionRanges other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestMultipleExtensionRanges.DefaultInstance) return this;
+        PrepareBuilder();
+          this.MergeExtensionFields(other);
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testMultipleExtensionRangesFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testMultipleExtensionRangesFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+    }
+    static TestMultipleExtensionRanges() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestReallyLargeTagNumber : pb::GeneratedMessage<TestReallyLargeTagNumber, TestReallyLargeTagNumber.Builder> {
+    private TestReallyLargeTagNumber() { }
+    private static readonly TestReallyLargeTagNumber defaultInstance = new TestReallyLargeTagNumber().MakeReadOnly();
+    private static readonly string[] _testReallyLargeTagNumberFieldNames = new string[] { "a", "bb" };
+    private static readonly uint[] _testReallyLargeTagNumberFieldTags = new uint[] { 8, 2147483640 };
+    public static TestReallyLargeTagNumber DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestReallyLargeTagNumber DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override TestReallyLargeTagNumber ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestReallyLargeTagNumber__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<TestReallyLargeTagNumber, TestReallyLargeTagNumber.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestReallyLargeTagNumber__FieldAccessorTable; }
+    }
+    
+    public const int AFieldNumber = 1;
+    private bool hasA;
+    private int a_;
+    public bool HasA {
+      get { return hasA; }
+    }
+    public int A {
+      get { return a_; }
+    }
+    
+    public const int BbFieldNumber = 268435455;
+    private bool hasBb;
+    private int bb_;
+    public bool HasBb {
+      get { return hasBb; }
+    }
+    public int Bb {
+      get { return bb_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testReallyLargeTagNumberFieldNames;
+      if (hasA) {
+        output.WriteInt32(1, field_names[0], A);
+      }
+      if (hasBb) {
+        output.WriteInt32(268435455, field_names[1], Bb);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      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 TestReallyLargeTagNumber ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestReallyLargeTagNumber ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestReallyLargeTagNumber ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestReallyLargeTagNumber ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestReallyLargeTagNumber ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestReallyLargeTagNumber ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestReallyLargeTagNumber ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestReallyLargeTagNumber ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestReallyLargeTagNumber ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestReallyLargeTagNumber ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestReallyLargeTagNumber MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestReallyLargeTagNumber prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestReallyLargeTagNumber, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestReallyLargeTagNumber cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private TestReallyLargeTagNumber result;
+      
+      private TestReallyLargeTagNumber PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestReallyLargeTagNumber original = result;
+          result = new TestReallyLargeTagNumber();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override TestReallyLargeTagNumber MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestReallyLargeTagNumber.Descriptor; }
+      }
+      
+      public override TestReallyLargeTagNumber DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestReallyLargeTagNumber.DefaultInstance; }
+      }
+      
+      public override TestReallyLargeTagNumber BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestReallyLargeTagNumber) {
+          return MergeFrom((TestReallyLargeTagNumber) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(TestReallyLargeTagNumber other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestReallyLargeTagNumber.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasA) {
+          A = other.A;
+        }
+        if (other.HasBb) {
+          Bb = other.Bb;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testReallyLargeTagNumberFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testReallyLargeTagNumberFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasA = input.ReadInt32(ref result.a_);
+              break;
+            }
+            case 2147483640: {
+              result.hasBb = input.ReadInt32(ref result.bb_);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public bool HasA {
+        get { return result.hasA; }
+      }
+      public int A {
+        get { return result.A; }
+        set { SetA(value); }
+      }
+      public Builder SetA(int value) {
+        PrepareBuilder();
+        result.hasA = true;
+        result.a_ = value;
+        return this;
+      }
+      public Builder ClearA() {
+        PrepareBuilder();
+        result.hasA = false;
+        result.a_ = 0;
+        return this;
+      }
+      
+      public bool HasBb {
+        get { return result.hasBb; }
+      }
+      public int Bb {
+        get { return result.Bb; }
+        set { SetBb(value); }
+      }
+      public Builder SetBb(int value) {
+        PrepareBuilder();
+        result.hasBb = true;
+        result.bb_ = value;
+        return this;
+      }
+      public Builder ClearBb() {
+        PrepareBuilder();
+        result.hasBb = false;
+        result.bb_ = 0;
+        return this;
+      }
+    }
+    static TestReallyLargeTagNumber() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestRecursiveMessage : pb::GeneratedMessage<TestRecursiveMessage, TestRecursiveMessage.Builder> {
+    private TestRecursiveMessage() { }
+    private static readonly TestRecursiveMessage defaultInstance = new TestRecursiveMessage().MakeReadOnly();
+    private static readonly string[] _testRecursiveMessageFieldNames = new string[] { "a", "i" };
+    private static readonly uint[] _testRecursiveMessageFieldTags = new uint[] { 10, 16 };
+    public static TestRecursiveMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestRecursiveMessage DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override TestRecursiveMessage ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestRecursiveMessage__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<TestRecursiveMessage, TestRecursiveMessage.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestRecursiveMessage__FieldAccessorTable; }
+    }
+    
+    public const int AFieldNumber = 1;
+    private bool hasA;
+    private global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage a_;
+    public bool HasA {
+      get { return hasA; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage A {
+      get { return a_ ?? global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.DefaultInstance; }
+    }
+    
+    public const int IFieldNumber = 2;
+    private bool hasI;
+    private int i_;
+    public bool HasI {
+      get { return hasI; }
+    }
+    public int I {
+      get { return i_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testRecursiveMessageFieldNames;
+      if (hasA) {
+        output.WriteMessage(1, field_names[0], A);
+      }
+      if (hasI) {
+        output.WriteInt32(2, field_names[1], I);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      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 TestRecursiveMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestRecursiveMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestRecursiveMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestRecursiveMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestRecursiveMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestRecursiveMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestRecursiveMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestRecursiveMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestRecursiveMessage ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestRecursiveMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestRecursiveMessage MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestRecursiveMessage prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestRecursiveMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestRecursiveMessage cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private TestRecursiveMessage result;
+      
+      private TestRecursiveMessage PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestRecursiveMessage original = result;
+          result = new TestRecursiveMessage();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override TestRecursiveMessage MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.Descriptor; }
+      }
+      
+      public override TestRecursiveMessage DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.DefaultInstance; }
+      }
+      
+      public override TestRecursiveMessage BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestRecursiveMessage) {
+          return MergeFrom((TestRecursiveMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(TestRecursiveMessage other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasA) {
+          MergeA(other.A);
+        }
+        if (other.HasI) {
+          I = other.I;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testRecursiveMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testRecursiveMessageFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.CreateBuilder();
+              if (result.hasA) {
+                subBuilder.MergeFrom(A);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              A = subBuilder.BuildPartial();
+              break;
+            }
+            case 16: {
+              result.hasI = input.ReadInt32(ref result.i_);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public bool HasA {
+       get { return result.hasA; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage A {
+        get { return result.A; }
+        set { SetA(value); }
+      }
+      public Builder SetA(global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasA = true;
+        result.a_ = value;
+        return this;
+      }
+      public Builder SetA(global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasA = true;
+        result.a_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeA(global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasA &&
+            result.a_ != global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.DefaultInstance) {
+            result.a_ = global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.CreateBuilder(result.a_).MergeFrom(value).BuildPartial();
+        } else {
+          result.a_ = value;
+        }
+        result.hasA = true;
+        return this;
+      }
+      public Builder ClearA() {
+        PrepareBuilder();
+        result.hasA = false;
+        result.a_ = null;
+        return this;
+      }
+      
+      public bool HasI {
+        get { return result.hasI; }
+      }
+      public int I {
+        get { return result.I; }
+        set { SetI(value); }
+      }
+      public Builder SetI(int value) {
+        PrepareBuilder();
+        result.hasI = true;
+        result.i_ = value;
+        return this;
+      }
+      public Builder ClearI() {
+        PrepareBuilder();
+        result.hasI = false;
+        result.i_ = 0;
+        return this;
+      }
+    }
+    static TestRecursiveMessage() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestMutualRecursionA : pb::GeneratedMessage<TestMutualRecursionA, TestMutualRecursionA.Builder> {
+    private TestMutualRecursionA() { }
+    private static readonly TestMutualRecursionA defaultInstance = new TestMutualRecursionA().MakeReadOnly();
+    private static readonly string[] _testMutualRecursionAFieldNames = new string[] { "bb" };
+    private static readonly uint[] _testMutualRecursionAFieldTags = new uint[] { 10 };
+    public static TestMutualRecursionA DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestMutualRecursionA DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override TestMutualRecursionA ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestMutualRecursionA__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<TestMutualRecursionA, TestMutualRecursionA.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestMutualRecursionA__FieldAccessorTable; }
+    }
+    
+    public const int BbFieldNumber = 1;
+    private bool hasBb;
+    private global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB bb_;
+    public bool HasBb {
+      get { return hasBb; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB Bb {
+      get { return bb_ ?? global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.DefaultInstance; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testMutualRecursionAFieldNames;
+      if (hasBb) {
+        output.WriteMessage(1, field_names[0], Bb);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      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 TestMutualRecursionA ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestMutualRecursionA ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestMutualRecursionA ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestMutualRecursionA ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestMutualRecursionA ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestMutualRecursionA ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestMutualRecursionA ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestMutualRecursionA ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestMutualRecursionA ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestMutualRecursionA ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestMutualRecursionA MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestMutualRecursionA prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestMutualRecursionA, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestMutualRecursionA cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private TestMutualRecursionA result;
+      
+      private TestMutualRecursionA PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestMutualRecursionA original = result;
+          result = new TestMutualRecursionA();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override TestMutualRecursionA MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.Descriptor; }
+      }
+      
+      public override TestMutualRecursionA DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.DefaultInstance; }
+      }
+      
+      public override TestMutualRecursionA BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestMutualRecursionA) {
+          return MergeFrom((TestMutualRecursionA) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(TestMutualRecursionA other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasBb) {
+          MergeBb(other.Bb);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testMutualRecursionAFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testMutualRecursionAFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.CreateBuilder();
+              if (result.hasBb) {
+                subBuilder.MergeFrom(Bb);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              Bb = subBuilder.BuildPartial();
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public bool HasBb {
+       get { return result.hasBb; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB Bb {
+        get { return result.Bb; }
+        set { SetBb(value); }
+      }
+      public Builder SetBb(global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasBb = true;
+        result.bb_ = value;
+        return this;
+      }
+      public Builder SetBb(global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasBb = true;
+        result.bb_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeBb(global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasBb &&
+            result.bb_ != global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.DefaultInstance) {
+            result.bb_ = global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.CreateBuilder(result.bb_).MergeFrom(value).BuildPartial();
+        } else {
+          result.bb_ = value;
+        }
+        result.hasBb = true;
+        return this;
+      }
+      public Builder ClearBb() {
+        PrepareBuilder();
+        result.hasBb = false;
+        result.bb_ = null;
+        return this;
+      }
+    }
+    static TestMutualRecursionA() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestMutualRecursionB : pb::GeneratedMessage<TestMutualRecursionB, TestMutualRecursionB.Builder> {
+    private TestMutualRecursionB() { }
+    private static readonly TestMutualRecursionB defaultInstance = new TestMutualRecursionB().MakeReadOnly();
+    private static readonly string[] _testMutualRecursionBFieldNames = new string[] { "a", "optional_int32" };
+    private static readonly uint[] _testMutualRecursionBFieldTags = new uint[] { 10, 16 };
+    public static TestMutualRecursionB DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestMutualRecursionB DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override TestMutualRecursionB ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestMutualRecursionB__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<TestMutualRecursionB, TestMutualRecursionB.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestMutualRecursionB__FieldAccessorTable; }
+    }
+    
+    public const int AFieldNumber = 1;
+    private bool hasA;
+    private global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA a_;
+    public bool HasA {
+      get { return hasA; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA A {
+      get { return a_ ?? global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.DefaultInstance; }
+    }
+    
+    public const int OptionalInt32FieldNumber = 2;
+    private bool hasOptionalInt32;
+    private int optionalInt32_;
+    public bool HasOptionalInt32 {
+      get { return hasOptionalInt32; }
+    }
+    public int OptionalInt32 {
+      get { return optionalInt32_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testMutualRecursionBFieldNames;
+      if (hasA) {
+        output.WriteMessage(1, field_names[0], A);
+      }
+      if (hasOptionalInt32) {
+        output.WriteInt32(2, field_names[1], OptionalInt32);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      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 TestMutualRecursionB ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestMutualRecursionB ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestMutualRecursionB ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestMutualRecursionB ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestMutualRecursionB ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestMutualRecursionB ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestMutualRecursionB ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestMutualRecursionB ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestMutualRecursionB ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestMutualRecursionB ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestMutualRecursionB MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestMutualRecursionB prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestMutualRecursionB, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestMutualRecursionB cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private TestMutualRecursionB result;
+      
+      private TestMutualRecursionB PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestMutualRecursionB original = result;
+          result = new TestMutualRecursionB();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override TestMutualRecursionB MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.Descriptor; }
+      }
+      
+      public override TestMutualRecursionB DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.DefaultInstance; }
+      }
+      
+      public override TestMutualRecursionB BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestMutualRecursionB) {
+          return MergeFrom((TestMutualRecursionB) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(TestMutualRecursionB other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasA) {
+          MergeA(other.A);
+        }
+        if (other.HasOptionalInt32) {
+          OptionalInt32 = other.OptionalInt32;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testMutualRecursionBFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testMutualRecursionBFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.CreateBuilder();
+              if (result.hasA) {
+                subBuilder.MergeFrom(A);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              A = subBuilder.BuildPartial();
+              break;
+            }
+            case 16: {
+              result.hasOptionalInt32 = input.ReadInt32(ref result.optionalInt32_);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public bool HasA {
+       get { return result.hasA; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA A {
+        get { return result.A; }
+        set { SetA(value); }
+      }
+      public Builder SetA(global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasA = true;
+        result.a_ = value;
+        return this;
+      }
+      public Builder SetA(global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasA = true;
+        result.a_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeA(global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasA &&
+            result.a_ != global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.DefaultInstance) {
+            result.a_ = global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.CreateBuilder(result.a_).MergeFrom(value).BuildPartial();
+        } else {
+          result.a_ = value;
+        }
+        result.hasA = true;
+        return this;
+      }
+      public Builder ClearA() {
+        PrepareBuilder();
+        result.hasA = false;
+        result.a_ = null;
+        return this;
+      }
+      
+      public bool HasOptionalInt32 {
+        get { return result.hasOptionalInt32; }
+      }
+      public int OptionalInt32 {
+        get { return result.OptionalInt32; }
+        set { SetOptionalInt32(value); }
+      }
+      public Builder SetOptionalInt32(int value) {
+        PrepareBuilder();
+        result.hasOptionalInt32 = true;
+        result.optionalInt32_ = value;
+        return this;
+      }
+      public Builder ClearOptionalInt32() {
+        PrepareBuilder();
+        result.hasOptionalInt32 = false;
+        result.optionalInt32_ = 0;
+        return this;
+      }
+    }
+    static TestMutualRecursionB() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestDupFieldNumber : pb::GeneratedMessage<TestDupFieldNumber, TestDupFieldNumber.Builder> {
+    private TestDupFieldNumber() { }
+    private static readonly TestDupFieldNumber defaultInstance = new TestDupFieldNumber().MakeReadOnly();
+    private static readonly string[] _testDupFieldNumberFieldNames = new string[] { "a", "bar", "foo" };
+    private static readonly uint[] _testDupFieldNumberFieldTags = new uint[] { 8, 27, 19 };
+    public static TestDupFieldNumber DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestDupFieldNumber DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override TestDupFieldNumber ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<TestDupFieldNumber, TestDupFieldNumber.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestDupFieldNumber__FieldAccessorTable; }
+    }
+    
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public static partial class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class Foo : pb::GeneratedMessage<Foo, Foo.Builder> {
+        private Foo() { }
+        private static readonly Foo defaultInstance = new Foo().MakeReadOnly();
+        private static readonly string[] _fooFieldNames = new string[] { "a" };
+        private static readonly uint[] _fooFieldTags = new uint[] { 8 };
+        public static Foo DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override Foo DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+        
+        protected override Foo ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestDupFieldNumber_Foo__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<Foo, Foo.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestDupFieldNumber_Foo__FieldAccessorTable; }
+        }
+        
+        public const int AFieldNumber = 1;
+        private bool hasA;
+        private int a_;
+        public bool HasA {
+          get { return hasA; }
+        }
+        public int A {
+          get { return a_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          CalcSerializedSize();
+          string[] field_names = _fooFieldNames;
+          if (hasA) {
+            output.WriteInt32(1, field_names[0], A);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            return CalcSerializedSize();
+          }
+        }
+        
+        private int CalcSerializedSize() {
+          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 Foo ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static Foo ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static Foo ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static Foo ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static Foo ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static Foo ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static Foo ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static Foo ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static Foo ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static Foo ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private Foo MakeReadOnly() {
+          return this;
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(Foo prototype) {
+          return new Builder(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public sealed partial class Builder : pb::GeneratedBuilder<Foo, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(Foo cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+          
+          private bool resultIsReadOnly;
+          private Foo result;
+          
+          private Foo PrepareBuilder() {
+            if (resultIsReadOnly) {
+              Foo original = result;
+              result = new Foo();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+          
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+          
+          protected override Foo MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+          
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+          
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.Descriptor; }
+          }
+          
+          public override Foo DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.DefaultInstance; }
+          }
+          
+          public override Foo BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is Foo) {
+              return MergeFrom((Foo) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(Foo other) {
+            if (other == global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasA) {
+              A = other.A;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_fooFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _fooFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 8: {
+                  result.hasA = input.ReadInt32(ref result.a_);
+                  break;
+                }
+              }
+            }
+            
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+          
+          
+          public bool HasA {
+            get { return result.hasA; }
+          }
+          public int A {
+            get { return result.A; }
+            set { SetA(value); }
+          }
+          public Builder SetA(int value) {
+            PrepareBuilder();
+            result.hasA = true;
+            result.a_ = value;
+            return this;
+          }
+          public Builder ClearA() {
+            PrepareBuilder();
+            result.hasA = false;
+            result.a_ = 0;
+            return this;
+          }
+        }
+        static Foo() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+        }
+      }
+      
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class Bar : pb::GeneratedMessage<Bar, Bar.Builder> {
+        private Bar() { }
+        private static readonly Bar defaultInstance = new Bar().MakeReadOnly();
+        private static readonly string[] _barFieldNames = new string[] { "a" };
+        private static readonly uint[] _barFieldTags = new uint[] { 8 };
+        public static Bar DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override Bar DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+        
+        protected override Bar ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestDupFieldNumber_Bar__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<Bar, Bar.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestDupFieldNumber_Bar__FieldAccessorTable; }
+        }
+        
+        public const int AFieldNumber = 1;
+        private bool hasA;
+        private int a_;
+        public bool HasA {
+          get { return hasA; }
+        }
+        public int A {
+          get { return a_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          CalcSerializedSize();
+          string[] field_names = _barFieldNames;
+          if (hasA) {
+            output.WriteInt32(1, field_names[0], A);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            return CalcSerializedSize();
+          }
+        }
+        
+        private int CalcSerializedSize() {
+          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 Bar ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static Bar ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static Bar ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static Bar ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static Bar ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static Bar ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static Bar ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static Bar ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static Bar ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static Bar ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private Bar MakeReadOnly() {
+          return this;
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(Bar prototype) {
+          return new Builder(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public sealed partial class Builder : pb::GeneratedBuilder<Bar, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(Bar cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+          
+          private bool resultIsReadOnly;
+          private Bar result;
+          
+          private Bar PrepareBuilder() {
+            if (resultIsReadOnly) {
+              Bar original = result;
+              result = new Bar();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+          
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+          
+          protected override Bar MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+          
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+          
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.Descriptor; }
+          }
+          
+          public override Bar DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.DefaultInstance; }
+          }
+          
+          public override Bar BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is Bar) {
+              return MergeFrom((Bar) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(Bar other) {
+            if (other == global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasA) {
+              A = other.A;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_barFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _barFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 8: {
+                  result.hasA = input.ReadInt32(ref result.a_);
+                  break;
+                }
+              }
+            }
+            
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+          
+          
+          public bool HasA {
+            get { return result.hasA; }
+          }
+          public int A {
+            get { return result.A; }
+            set { SetA(value); }
+          }
+          public Builder SetA(int value) {
+            PrepareBuilder();
+            result.hasA = true;
+            result.a_ = value;
+            return this;
+          }
+          public Builder ClearA() {
+            PrepareBuilder();
+            result.hasA = false;
+            result.a_ = 0;
+            return this;
+          }
+        }
+        static Bar() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+        }
+      }
+      
+    }
+    #endregion
+    
+    public const int AFieldNumber = 1;
+    private bool hasA;
+    private int a_;
+    public bool HasA {
+      get { return hasA; }
+    }
+    public int A {
+      get { return a_; }
+    }
+    
+    public const int FooFieldNumber = 2;
+    private bool hasFoo;
+    private global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo foo_;
+    public bool HasFoo {
+      get { return hasFoo; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo Foo {
+      get { return foo_ ?? global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.DefaultInstance; }
+    }
+    
+    public const int BarFieldNumber = 3;
+    private bool hasBar;
+    private global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar bar_;
+    public bool HasBar {
+      get { return hasBar; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar Bar {
+      get { return bar_ ?? global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.DefaultInstance; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testDupFieldNumberFieldNames;
+      if (hasA) {
+        output.WriteInt32(1, field_names[0], A);
+      }
+      if (hasFoo) {
+        output.WriteGroup(2, field_names[2], Foo);
+      }
+      if (hasBar) {
+        output.WriteGroup(3, field_names[1], Bar);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      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 TestDupFieldNumber ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestDupFieldNumber ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestDupFieldNumber ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestDupFieldNumber ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestDupFieldNumber ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestDupFieldNumber ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestDupFieldNumber ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestDupFieldNumber ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestDupFieldNumber ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestDupFieldNumber ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestDupFieldNumber MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestDupFieldNumber prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestDupFieldNumber, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestDupFieldNumber cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private TestDupFieldNumber result;
+      
+      private TestDupFieldNumber PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestDupFieldNumber original = result;
+          result = new TestDupFieldNumber();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override TestDupFieldNumber MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Descriptor; }
+      }
+      
+      public override TestDupFieldNumber DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.DefaultInstance; }
+      }
+      
+      public override TestDupFieldNumber BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestDupFieldNumber) {
+          return MergeFrom((TestDupFieldNumber) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(TestDupFieldNumber other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.DefaultInstance) return this;
+        PrepareBuilder();
+        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 Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testDupFieldNumberFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testDupFieldNumberFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasA = input.ReadInt32(ref result.a_);
+              break;
+            }
+            case 19: {
+              global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.CreateBuilder();
+              if (result.hasFoo) {
+                subBuilder.MergeFrom(Foo);
+              }
+              input.ReadGroup(2, subBuilder, extensionRegistry);
+              Foo = subBuilder.BuildPartial();
+              break;
+            }
+            case 27: {
+              global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.CreateBuilder();
+              if (result.hasBar) {
+                subBuilder.MergeFrom(Bar);
+              }
+              input.ReadGroup(3, subBuilder, extensionRegistry);
+              Bar = subBuilder.BuildPartial();
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public bool HasA {
+        get { return result.hasA; }
+      }
+      public int A {
+        get { return result.A; }
+        set { SetA(value); }
+      }
+      public Builder SetA(int value) {
+        PrepareBuilder();
+        result.hasA = true;
+        result.a_ = value;
+        return this;
+      }
+      public Builder ClearA() {
+        PrepareBuilder();
+        result.hasA = false;
+        result.a_ = 0;
+        return this;
+      }
+      
+      public bool HasFoo {
+       get { return result.hasFoo; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo Foo {
+        get { return result.Foo; }
+        set { SetFoo(value); }
+      }
+      public Builder SetFoo(global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasFoo = true;
+        result.foo_ = value;
+        return this;
+      }
+      public Builder SetFoo(global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasFoo = true;
+        result.foo_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeFoo(global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasFoo &&
+            result.foo_ != global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.DefaultInstance) {
+            result.foo_ = global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.CreateBuilder(result.foo_).MergeFrom(value).BuildPartial();
+        } else {
+          result.foo_ = value;
+        }
+        result.hasFoo = true;
+        return this;
+      }
+      public Builder ClearFoo() {
+        PrepareBuilder();
+        result.hasFoo = false;
+        result.foo_ = null;
+        return this;
+      }
+      
+      public bool HasBar {
+       get { return result.hasBar; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar Bar {
+        get { return result.Bar; }
+        set { SetBar(value); }
+      }
+      public Builder SetBar(global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasBar = true;
+        result.bar_ = value;
+        return this;
+      }
+      public Builder SetBar(global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasBar = true;
+        result.bar_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeBar(global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasBar &&
+            result.bar_ != global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.DefaultInstance) {
+            result.bar_ = global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.CreateBuilder(result.bar_).MergeFrom(value).BuildPartial();
+        } else {
+          result.bar_ = value;
+        }
+        result.hasBar = true;
+        return this;
+      }
+      public Builder ClearBar() {
+        PrepareBuilder();
+        result.hasBar = false;
+        result.bar_ = null;
+        return this;
+      }
+    }
+    static TestDupFieldNumber() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestNestedMessageHasBits : pb::GeneratedMessage<TestNestedMessageHasBits, TestNestedMessageHasBits.Builder> {
+    private TestNestedMessageHasBits() { }
+    private static readonly TestNestedMessageHasBits defaultInstance = new TestNestedMessageHasBits().MakeReadOnly();
+    private static readonly string[] _testNestedMessageHasBitsFieldNames = new string[] { "optional_nested_message" };
+    private static readonly uint[] _testNestedMessageHasBitsFieldTags = new uint[] { 10 };
+    public static TestNestedMessageHasBits DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestNestedMessageHasBits DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override TestNestedMessageHasBits ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestNestedMessageHasBits__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<TestNestedMessageHasBits, TestNestedMessageHasBits.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestNestedMessageHasBits__FieldAccessorTable; }
+    }
+    
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public static partial class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class NestedMessage : pb::GeneratedMessage<NestedMessage, NestedMessage.Builder> {
+        private NestedMessage() { }
+        private static readonly NestedMessage defaultInstance = new NestedMessage().MakeReadOnly();
+        private static readonly string[] _nestedMessageFieldNames = new string[] { "nestedmessage_repeated_foreignmessage", "nestedmessage_repeated_int32" };
+        private static readonly uint[] _nestedMessageFieldTags = new uint[] { 18, 8 };
+        public static NestedMessage DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override NestedMessage DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+        
+        protected override NestedMessage ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<NestedMessage, NestedMessage.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__FieldAccessorTable; }
+        }
+        
+        public const int NestedmessageRepeatedInt32FieldNumber = 1;
+        private pbc::PopsicleList<int> nestedmessageRepeatedInt32_ = new pbc::PopsicleList<int>();
+        public scg::IList<int> NestedmessageRepeatedInt32List {
+          get { return pbc::Lists.AsReadOnly(nestedmessageRepeatedInt32_); }
+        }
+        public int NestedmessageRepeatedInt32Count {
+          get { return nestedmessageRepeatedInt32_.Count; }
+        }
+        public int GetNestedmessageRepeatedInt32(int index) {
+          return nestedmessageRepeatedInt32_[index];
+        }
+        
+        public const int NestedmessageRepeatedForeignmessageFieldNumber = 2;
+        private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> nestedmessageRepeatedForeignmessage_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignMessage>();
+        public scg::IList<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> NestedmessageRepeatedForeignmessageList {
+          get { return nestedmessageRepeatedForeignmessage_; }
+        }
+        public int NestedmessageRepeatedForeignmessageCount {
+          get { return nestedmessageRepeatedForeignmessage_.Count; }
+        }
+        public global::Google.ProtocolBuffers.TestProtos.ForeignMessage GetNestedmessageRepeatedForeignmessage(int index) {
+          return nestedmessageRepeatedForeignmessage_[index];
+        }
+        
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          CalcSerializedSize();
+          string[] field_names = _nestedMessageFieldNames;
+          if (nestedmessageRepeatedInt32_.Count > 0) {
+            output.WriteInt32Array(1, field_names[1], nestedmessageRepeatedInt32_);
+          }
+          if (nestedmessageRepeatedForeignmessage_.Count > 0) {
+            output.WriteMessageArray(2, field_names[0], nestedmessageRepeatedForeignmessage_);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            return CalcSerializedSize();
+          }
+        }
+        
+        private int CalcSerializedSize() {
+          int size = memoizedSerializedSize;
+          if (size != -1) return size;
+          
+          size = 0;
+          {
+            int dataSize = 0;
+            foreach (int element in NestedmessageRepeatedInt32List) {
+              dataSize += pb::CodedOutputStream.ComputeInt32SizeNoTag(element);
+            }
+            size += dataSize;
+            size += 1 * nestedmessageRepeatedInt32_.Count;
+          }
+          foreach (global::Google.ProtocolBuffers.TestProtos.ForeignMessage element in NestedmessageRepeatedForeignmessageList) {
+            size += pb::CodedOutputStream.ComputeMessageSize(2, element);
+          }
+          size += UnknownFields.SerializedSize;
+          memoizedSerializedSize = size;
+          return size;
+        }
+        public static NestedMessage ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static NestedMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static NestedMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static NestedMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private NestedMessage MakeReadOnly() {
+          nestedmessageRepeatedInt32_.MakeReadOnly();
+          nestedmessageRepeatedForeignmessage_.MakeReadOnly();
+          return this;
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(NestedMessage prototype) {
+          return new Builder(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public sealed partial class Builder : pb::GeneratedBuilder<NestedMessage, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(NestedMessage cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+          
+          private bool resultIsReadOnly;
+          private NestedMessage result;
+          
+          private NestedMessage PrepareBuilder() {
+            if (resultIsReadOnly) {
+              NestedMessage original = result;
+              result = new NestedMessage();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+          
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+          
+          protected override NestedMessage MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+          
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+          
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.Descriptor; }
+          }
+          
+          public override NestedMessage DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.DefaultInstance; }
+          }
+          
+          public override NestedMessage BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is NestedMessage) {
+              return MergeFrom((NestedMessage) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(NestedMessage other) {
+            if (other == global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.nestedmessageRepeatedInt32_.Count != 0) {
+              result.nestedmessageRepeatedInt32_.Add(other.nestedmessageRepeatedInt32_);
+            }
+            if (other.nestedmessageRepeatedForeignmessage_.Count != 0) {
+              result.nestedmessageRepeatedForeignmessage_.Add(other.nestedmessageRepeatedForeignmessage_);
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_nestedMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _nestedMessageFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 10:
+                case 8: {
+                  input.ReadInt32Array(tag, field_name, result.nestedmessageRepeatedInt32_);
+                  break;
+                }
+                case 18: {
+                  input.ReadMessageArray(tag, field_name, result.nestedmessageRepeatedForeignmessage_, global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance, extensionRegistry);
+                  break;
+                }
+              }
+            }
+            
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+          
+          
+          public pbc::IPopsicleList<int> NestedmessageRepeatedInt32List {
+            get { return PrepareBuilder().nestedmessageRepeatedInt32_; }
+          }
+          public int NestedmessageRepeatedInt32Count {
+            get { return result.NestedmessageRepeatedInt32Count; }
+          }
+          public int GetNestedmessageRepeatedInt32(int index) {
+            return result.GetNestedmessageRepeatedInt32(index);
+          }
+          public Builder SetNestedmessageRepeatedInt32(int index, int value) {
+            PrepareBuilder();
+            result.nestedmessageRepeatedInt32_[index] = value;
+            return this;
+          }
+          public Builder AddNestedmessageRepeatedInt32(int value) {
+            PrepareBuilder();
+            result.nestedmessageRepeatedInt32_.Add(value);
+            return this;
+          }
+          public Builder AddRangeNestedmessageRepeatedInt32(scg::IEnumerable<int> values) {
+            PrepareBuilder();
+            result.nestedmessageRepeatedInt32_.Add(values);
+            return this;
+          }
+          public Builder ClearNestedmessageRepeatedInt32() {
+            PrepareBuilder();
+            result.nestedmessageRepeatedInt32_.Clear();
+            return this;
+          }
+          
+          public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> NestedmessageRepeatedForeignmessageList {
+            get { return PrepareBuilder().nestedmessageRepeatedForeignmessage_; }
+          }
+          public int NestedmessageRepeatedForeignmessageCount {
+            get { return result.NestedmessageRepeatedForeignmessageCount; }
+          }
+          public global::Google.ProtocolBuffers.TestProtos.ForeignMessage GetNestedmessageRepeatedForeignmessage(int index) {
+            return result.GetNestedmessageRepeatedForeignmessage(index);
+          }
+          public Builder SetNestedmessageRepeatedForeignmessage(int index, global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.nestedmessageRepeatedForeignmessage_[index] = value;
+            return this;
+          }
+          public Builder SetNestedmessageRepeatedForeignmessage(int index, global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder builderForValue) {
+            pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+            PrepareBuilder();
+            result.nestedmessageRepeatedForeignmessage_[index] = builderForValue.Build();
+            return this;
+          }
+          public Builder AddNestedmessageRepeatedForeignmessage(global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.nestedmessageRepeatedForeignmessage_.Add(value);
+            return this;
+          }
+          public Builder AddNestedmessageRepeatedForeignmessage(global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder builderForValue) {
+            pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+            PrepareBuilder();
+            result.nestedmessageRepeatedForeignmessage_.Add(builderForValue.Build());
+            return this;
+          }
+          public Builder AddRangeNestedmessageRepeatedForeignmessage(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> values) {
+            PrepareBuilder();
+            result.nestedmessageRepeatedForeignmessage_.Add(values);
+            return this;
+          }
+          public Builder ClearNestedmessageRepeatedForeignmessage() {
+            PrepareBuilder();
+            result.nestedmessageRepeatedForeignmessage_.Clear();
+            return this;
+          }
+        }
+        static NestedMessage() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+        }
+      }
+      
+    }
+    #endregion
+    
+    public const int OptionalNestedMessageFieldNumber = 1;
+    private bool hasOptionalNestedMessage;
+    private global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage optionalNestedMessage_;
+    public bool HasOptionalNestedMessage {
+      get { return hasOptionalNestedMessage; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage OptionalNestedMessage {
+      get { return optionalNestedMessage_ ?? global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.DefaultInstance; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testNestedMessageHasBitsFieldNames;
+      if (hasOptionalNestedMessage) {
+        output.WriteMessage(1, field_names[0], OptionalNestedMessage);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      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 TestNestedMessageHasBits ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestNestedMessageHasBits ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestNestedMessageHasBits ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestNestedMessageHasBits ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestNestedMessageHasBits ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestNestedMessageHasBits ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestNestedMessageHasBits ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestNestedMessageHasBits ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestNestedMessageHasBits ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestNestedMessageHasBits ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestNestedMessageHasBits MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestNestedMessageHasBits prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestNestedMessageHasBits, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestNestedMessageHasBits cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private TestNestedMessageHasBits result;
+      
+      private TestNestedMessageHasBits PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestNestedMessageHasBits original = result;
+          result = new TestNestedMessageHasBits();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override TestNestedMessageHasBits MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Descriptor; }
+      }
+      
+      public override TestNestedMessageHasBits DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.DefaultInstance; }
+      }
+      
+      public override TestNestedMessageHasBits BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestNestedMessageHasBits) {
+          return MergeFrom((TestNestedMessageHasBits) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(TestNestedMessageHasBits other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasOptionalNestedMessage) {
+          MergeOptionalNestedMessage(other.OptionalNestedMessage);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testNestedMessageHasBitsFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testNestedMessageHasBitsFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.CreateBuilder();
+              if (result.hasOptionalNestedMessage) {
+                subBuilder.MergeFrom(OptionalNestedMessage);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              OptionalNestedMessage = subBuilder.BuildPartial();
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public bool HasOptionalNestedMessage {
+       get { return result.hasOptionalNestedMessage; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage OptionalNestedMessage {
+        get { return result.OptionalNestedMessage; }
+        set { SetOptionalNestedMessage(value); }
+      }
+      public Builder SetOptionalNestedMessage(global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasOptionalNestedMessage = true;
+        result.optionalNestedMessage_ = value;
+        return this;
+      }
+      public Builder SetOptionalNestedMessage(global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasOptionalNestedMessage = true;
+        result.optionalNestedMessage_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeOptionalNestedMessage(global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasOptionalNestedMessage &&
+            result.optionalNestedMessage_ != global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.DefaultInstance) {
+            result.optionalNestedMessage_ = global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.CreateBuilder(result.optionalNestedMessage_).MergeFrom(value).BuildPartial();
+        } else {
+          result.optionalNestedMessage_ = value;
+        }
+        result.hasOptionalNestedMessage = true;
+        return this;
+      }
+      public Builder ClearOptionalNestedMessage() {
+        PrepareBuilder();
+        result.hasOptionalNestedMessage = false;
+        result.optionalNestedMessage_ = null;
+        return this;
+      }
+    }
+    static TestNestedMessageHasBits() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestCamelCaseFieldNames : pb::GeneratedMessage<TestCamelCaseFieldNames, TestCamelCaseFieldNames.Builder> {
+    private TestCamelCaseFieldNames() { }
+    private static readonly TestCamelCaseFieldNames defaultInstance = new TestCamelCaseFieldNames().MakeReadOnly();
+    private static readonly string[] _testCamelCaseFieldNamesFieldNames = new string[] { "CordField", "EnumField", "MessageField", "PrimitiveField", "RepeatedCordField", "RepeatedEnumField", "RepeatedMessageField", "RepeatedPrimitiveField", "RepeatedStringField", "RepeatedStringPieceField", "StringField", "StringPieceField" };
+    private static readonly uint[] _testCamelCaseFieldNamesFieldTags = new uint[] { 50, 24, 34, 8, 98, 72, 82, 56, 66, 90, 18, 42 };
+    public static TestCamelCaseFieldNames DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestCamelCaseFieldNames DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override TestCamelCaseFieldNames ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestCamelCaseFieldNames__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<TestCamelCaseFieldNames, TestCamelCaseFieldNames.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestCamelCaseFieldNames__FieldAccessorTable; }
+    }
+    
+    public const int PrimitiveFieldFieldNumber = 1;
+    private bool hasPrimitiveField;
+    private int primitiveField_;
+    public bool HasPrimitiveField {
+      get { return hasPrimitiveField; }
+    }
+    public int PrimitiveField {
+      get { return primitiveField_; }
+    }
+    
+    public const int StringFieldFieldNumber = 2;
+    private bool hasStringField;
+    private string stringField_ = "";
+    public bool HasStringField {
+      get { return hasStringField; }
+    }
+    public string StringField {
+      get { return stringField_; }
+    }
+    
+    public const int EnumFieldFieldNumber = 3;
+    private bool hasEnumField;
+    private global::Google.ProtocolBuffers.TestProtos.ForeignEnum enumField_ = global::Google.ProtocolBuffers.TestProtos.ForeignEnum.FOREIGN_FOO;
+    public bool HasEnumField {
+      get { return hasEnumField; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ForeignEnum EnumField {
+      get { return enumField_; }
+    }
+    
+    public const int MessageFieldFieldNumber = 4;
+    private bool hasMessageField;
+    private global::Google.ProtocolBuffers.TestProtos.ForeignMessage messageField_;
+    public bool HasMessageField {
+      get { return hasMessageField; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ForeignMessage MessageField {
+      get { return messageField_ ?? global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance; }
+    }
+    
+    public const int StringPieceFieldFieldNumber = 5;
+    private bool hasStringPieceField;
+    private string stringPieceField_ = "";
+    public bool HasStringPieceField {
+      get { return hasStringPieceField; }
+    }
+    public string StringPieceField {
+      get { return stringPieceField_; }
+    }
+    
+    public const int CordFieldFieldNumber = 6;
+    private bool hasCordField;
+    private string cordField_ = "";
+    public bool HasCordField {
+      get { return hasCordField; }
+    }
+    public string CordField {
+      get { return cordField_; }
+    }
+    
+    public const int RepeatedPrimitiveFieldFieldNumber = 7;
+    private pbc::PopsicleList<int> repeatedPrimitiveField_ = new pbc::PopsicleList<int>();
+    public scg::IList<int> RepeatedPrimitiveFieldList {
+      get { return pbc::Lists.AsReadOnly(repeatedPrimitiveField_); }
+    }
+    public int RepeatedPrimitiveFieldCount {
+      get { return repeatedPrimitiveField_.Count; }
+    }
+    public int GetRepeatedPrimitiveField(int index) {
+      return repeatedPrimitiveField_[index];
+    }
+    
+    public const int RepeatedStringFieldFieldNumber = 8;
+    private pbc::PopsicleList<string> repeatedStringField_ = new pbc::PopsicleList<string>();
+    public scg::IList<string> RepeatedStringFieldList {
+      get { return pbc::Lists.AsReadOnly(repeatedStringField_); }
+    }
+    public int RepeatedStringFieldCount {
+      get { return repeatedStringField_.Count; }
+    }
+    public string GetRepeatedStringField(int index) {
+      return repeatedStringField_[index];
+    }
+    
+    public const int RepeatedEnumFieldFieldNumber = 9;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> repeatedEnumField_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> RepeatedEnumFieldList {
+      get { return pbc::Lists.AsReadOnly(repeatedEnumField_); }
+    }
+    public int RepeatedEnumFieldCount {
+      get { return repeatedEnumField_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ForeignEnum GetRepeatedEnumField(int index) {
+      return repeatedEnumField_[index];
+    }
+    
+    public const int RepeatedMessageFieldFieldNumber = 10;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> repeatedMessageField_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignMessage>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> RepeatedMessageFieldList {
+      get { return repeatedMessageField_; }
+    }
+    public int RepeatedMessageFieldCount {
+      get { return repeatedMessageField_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ForeignMessage GetRepeatedMessageField(int index) {
+      return repeatedMessageField_[index];
+    }
+    
+    public const int RepeatedStringPieceFieldFieldNumber = 11;
+    private pbc::PopsicleList<string> repeatedStringPieceField_ = new pbc::PopsicleList<string>();
+    public scg::IList<string> RepeatedStringPieceFieldList {
+      get { return pbc::Lists.AsReadOnly(repeatedStringPieceField_); }
+    }
+    public int RepeatedStringPieceFieldCount {
+      get { return repeatedStringPieceField_.Count; }
+    }
+    public string GetRepeatedStringPieceField(int index) {
+      return repeatedStringPieceField_[index];
+    }
+    
+    public const int RepeatedCordFieldFieldNumber = 12;
+    private pbc::PopsicleList<string> repeatedCordField_ = new pbc::PopsicleList<string>();
+    public scg::IList<string> RepeatedCordFieldList {
+      get { return pbc::Lists.AsReadOnly(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::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testCamelCaseFieldNamesFieldNames;
+      if (hasPrimitiveField) {
+        output.WriteInt32(1, field_names[3], PrimitiveField);
+      }
+      if (hasStringField) {
+        output.WriteString(2, field_names[10], StringField);
+      }
+      if (hasEnumField) {
+        output.WriteEnum(3, field_names[1], (int) EnumField, EnumField);
+      }
+      if (hasMessageField) {
+        output.WriteMessage(4, field_names[2], MessageField);
+      }
+      if (hasStringPieceField) {
+        output.WriteString(5, field_names[11], StringPieceField);
+      }
+      if (hasCordField) {
+        output.WriteString(6, field_names[0], CordField);
+      }
+      if (repeatedPrimitiveField_.Count > 0) {
+        output.WriteInt32Array(7, field_names[7], repeatedPrimitiveField_);
+      }
+      if (repeatedStringField_.Count > 0) {
+        output.WriteStringArray(8, field_names[8], repeatedStringField_);
+      }
+      if (repeatedEnumField_.Count > 0) {
+        output.WriteEnumArray(9, field_names[5], repeatedEnumField_);
+      }
+      if (repeatedMessageField_.Count > 0) {
+        output.WriteMessageArray(10, field_names[6], repeatedMessageField_);
+      }
+      if (repeatedStringPieceField_.Count > 0) {
+        output.WriteStringArray(11, field_names[9], repeatedStringPieceField_);
+      }
+      if (repeatedCordField_.Count > 0) {
+        output.WriteStringArray(12, field_names[4], repeatedCordField_);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      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);
+      }
+      {
+        int dataSize = 0;
+        foreach (int element in RepeatedPrimitiveFieldList) {
+          dataSize += pb::CodedOutputStream.ComputeInt32SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 1 * repeatedPrimitiveField_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (string element in RepeatedStringFieldList) {
+          dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+        }
+        size += dataSize;
+        size += 1 * repeatedStringField_.Count;
+      }
+      {
+        int dataSize = 0;
+        if (repeatedEnumField_.Count > 0) {
+          foreach (global::Google.ProtocolBuffers.TestProtos.ForeignEnum element in repeatedEnumField_) {
+            dataSize += pb::CodedOutputStream.ComputeEnumSizeNoTag((int) element);
+          }
+          size += dataSize;
+          size += 1 * repeatedEnumField_.Count;
+        }
+      }
+      foreach (global::Google.ProtocolBuffers.TestProtos.ForeignMessage element in RepeatedMessageFieldList) {
+        size += pb::CodedOutputStream.ComputeMessageSize(10, element);
+      }
+      {
+        int dataSize = 0;
+        foreach (string element in RepeatedStringPieceFieldList) {
+          dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+        }
+        size += dataSize;
+        size += 1 * repeatedStringPieceField_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (string element in RepeatedCordFieldList) {
+          dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+        }
+        size += dataSize;
+        size += 1 * repeatedCordField_.Count;
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestCamelCaseFieldNames ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestCamelCaseFieldNames ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestCamelCaseFieldNames ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestCamelCaseFieldNames ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestCamelCaseFieldNames ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestCamelCaseFieldNames ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestCamelCaseFieldNames ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestCamelCaseFieldNames ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestCamelCaseFieldNames ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestCamelCaseFieldNames ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestCamelCaseFieldNames MakeReadOnly() {
+      repeatedPrimitiveField_.MakeReadOnly();
+      repeatedStringField_.MakeReadOnly();
+      repeatedEnumField_.MakeReadOnly();
+      repeatedMessageField_.MakeReadOnly();
+      repeatedStringPieceField_.MakeReadOnly();
+      repeatedCordField_.MakeReadOnly();
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestCamelCaseFieldNames prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestCamelCaseFieldNames, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestCamelCaseFieldNames cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private TestCamelCaseFieldNames result;
+      
+      private TestCamelCaseFieldNames PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestCamelCaseFieldNames original = result;
+          result = new TestCamelCaseFieldNames();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override TestCamelCaseFieldNames MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestCamelCaseFieldNames.Descriptor; }
+      }
+      
+      public override TestCamelCaseFieldNames DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestCamelCaseFieldNames.DefaultInstance; }
+      }
+      
+      public override TestCamelCaseFieldNames BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestCamelCaseFieldNames) {
+          return MergeFrom((TestCamelCaseFieldNames) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(TestCamelCaseFieldNames other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestCamelCaseFieldNames.DefaultInstance) return this;
+        PrepareBuilder();
+        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) {
+          result.repeatedPrimitiveField_.Add(other.repeatedPrimitiveField_);
+        }
+        if (other.repeatedStringField_.Count != 0) {
+          result.repeatedStringField_.Add(other.repeatedStringField_);
+        }
+        if (other.repeatedEnumField_.Count != 0) {
+          result.repeatedEnumField_.Add(other.repeatedEnumField_);
+        }
+        if (other.repeatedMessageField_.Count != 0) {
+          result.repeatedMessageField_.Add(other.repeatedMessageField_);
+        }
+        if (other.repeatedStringPieceField_.Count != 0) {
+          result.repeatedStringPieceField_.Add(other.repeatedStringPieceField_);
+        }
+        if (other.repeatedCordField_.Count != 0) {
+          result.repeatedCordField_.Add(other.repeatedCordField_);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testCamelCaseFieldNamesFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testCamelCaseFieldNamesFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasPrimitiveField = input.ReadInt32(ref result.primitiveField_);
+              break;
+            }
+            case 18: {
+              result.hasStringField = input.ReadString(ref result.stringField_);
+              break;
+            }
+            case 24: {
+              object unknown;
+              if(input.ReadEnum(ref result.enumField_, out unknown)) {
+                result.hasEnumField = true;
+              } else if(unknown is int) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                unknownFields.MergeVarintField(3, (ulong)(int)unknown);
+              }
+              break;
+            }
+            case 34: {
+              global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.ForeignMessage.CreateBuilder();
+              if (result.hasMessageField) {
+                subBuilder.MergeFrom(MessageField);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              MessageField = subBuilder.BuildPartial();
+              break;
+            }
+            case 42: {
+              result.hasStringPieceField = input.ReadString(ref result.stringPieceField_);
+              break;
+            }
+            case 50: {
+              result.hasCordField = input.ReadString(ref result.cordField_);
+              break;
+            }
+            case 58:
+            case 56: {
+              input.ReadInt32Array(tag, field_name, result.repeatedPrimitiveField_);
+              break;
+            }
+            case 66: {
+              input.ReadStringArray(tag, field_name, result.repeatedStringField_);
+              break;
+            }
+            case 74:
+            case 72: {
+              scg::ICollection<object> unknownItems;
+              input.ReadEnumArray<global::Google.ProtocolBuffers.TestProtos.ForeignEnum>(tag, field_name, result.repeatedEnumField_, out unknownItems);
+              if (unknownItems != null) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                foreach (object rawValue in unknownItems)
+                  if (rawValue is int)
+                    unknownFields.MergeVarintField(9, (ulong)(int)rawValue);
+              }
+              break;
+            }
+            case 82: {
+              input.ReadMessageArray(tag, field_name, result.repeatedMessageField_, global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 90: {
+              input.ReadStringArray(tag, field_name, result.repeatedStringPieceField_);
+              break;
+            }
+            case 98: {
+              input.ReadStringArray(tag, field_name, result.repeatedCordField_);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public bool HasPrimitiveField {
+        get { return result.hasPrimitiveField; }
+      }
+      public int PrimitiveField {
+        get { return result.PrimitiveField; }
+        set { SetPrimitiveField(value); }
+      }
+      public Builder SetPrimitiveField(int value) {
+        PrepareBuilder();
+        result.hasPrimitiveField = true;
+        result.primitiveField_ = value;
+        return this;
+      }
+      public Builder ClearPrimitiveField() {
+        PrepareBuilder();
+        result.hasPrimitiveField = false;
+        result.primitiveField_ = 0;
+        return this;
+      }
+      
+      public bool HasStringField {
+        get { return result.hasStringField; }
+      }
+      public string StringField {
+        get { return result.StringField; }
+        set { SetStringField(value); }
+      }
+      public Builder SetStringField(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasStringField = true;
+        result.stringField_ = value;
+        return this;
+      }
+      public Builder ClearStringField() {
+        PrepareBuilder();
+        result.hasStringField = false;
+        result.stringField_ = "";
+        return this;
+      }
+      
+      public bool HasEnumField {
+       get { return result.hasEnumField; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ForeignEnum EnumField {
+        get { return result.EnumField; }
+        set { SetEnumField(value); }
+      }
+      public Builder SetEnumField(global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {
+        PrepareBuilder();
+        result.hasEnumField = true;
+        result.enumField_ = value;
+        return this;
+      }
+      public Builder ClearEnumField() {
+        PrepareBuilder();
+        result.hasEnumField = false;
+        result.enumField_ = global::Google.ProtocolBuffers.TestProtos.ForeignEnum.FOREIGN_FOO;
+        return this;
+      }
+      
+      public bool HasMessageField {
+       get { return result.hasMessageField; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ForeignMessage MessageField {
+        get { return result.MessageField; }
+        set { SetMessageField(value); }
+      }
+      public Builder SetMessageField(global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasMessageField = true;
+        result.messageField_ = value;
+        return this;
+      }
+      public Builder SetMessageField(global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasMessageField = true;
+        result.messageField_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeMessageField(global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasMessageField &&
+            result.messageField_ != global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance) {
+            result.messageField_ = global::Google.ProtocolBuffers.TestProtos.ForeignMessage.CreateBuilder(result.messageField_).MergeFrom(value).BuildPartial();
+        } else {
+          result.messageField_ = value;
+        }
+        result.hasMessageField = true;
+        return this;
+      }
+      public Builder ClearMessageField() {
+        PrepareBuilder();
+        result.hasMessageField = false;
+        result.messageField_ = null;
+        return this;
+      }
+      
+      public bool HasStringPieceField {
+        get { return result.hasStringPieceField; }
+      }
+      public string StringPieceField {
+        get { return result.StringPieceField; }
+        set { SetStringPieceField(value); }
+      }
+      public Builder SetStringPieceField(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasStringPieceField = true;
+        result.stringPieceField_ = value;
+        return this;
+      }
+      public Builder ClearStringPieceField() {
+        PrepareBuilder();
+        result.hasStringPieceField = false;
+        result.stringPieceField_ = "";
+        return this;
+      }
+      
+      public bool HasCordField {
+        get { return result.hasCordField; }
+      }
+      public string CordField {
+        get { return result.CordField; }
+        set { SetCordField(value); }
+      }
+      public Builder SetCordField(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasCordField = true;
+        result.cordField_ = value;
+        return this;
+      }
+      public Builder ClearCordField() {
+        PrepareBuilder();
+        result.hasCordField = false;
+        result.cordField_ = "";
+        return this;
+      }
+      
+      public pbc::IPopsicleList<int> RepeatedPrimitiveFieldList {
+        get { return PrepareBuilder().repeatedPrimitiveField_; }
+      }
+      public int RepeatedPrimitiveFieldCount {
+        get { return result.RepeatedPrimitiveFieldCount; }
+      }
+      public int GetRepeatedPrimitiveField(int index) {
+        return result.GetRepeatedPrimitiveField(index);
+      }
+      public Builder SetRepeatedPrimitiveField(int index, int value) {
+        PrepareBuilder();
+        result.repeatedPrimitiveField_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedPrimitiveField(int value) {
+        PrepareBuilder();
+        result.repeatedPrimitiveField_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedPrimitiveField(scg::IEnumerable<int> values) {
+        PrepareBuilder();
+        result.repeatedPrimitiveField_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedPrimitiveField() {
+        PrepareBuilder();
+        result.repeatedPrimitiveField_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<string> RepeatedStringFieldList {
+        get { return PrepareBuilder().repeatedStringField_; }
+      }
+      public int RepeatedStringFieldCount {
+        get { return result.RepeatedStringFieldCount; }
+      }
+      public string GetRepeatedStringField(int index) {
+        return result.GetRepeatedStringField(index);
+      }
+      public Builder SetRepeatedStringField(int index, string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedStringField_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedStringField(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedStringField_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedStringField(scg::IEnumerable<string> values) {
+        PrepareBuilder();
+        result.repeatedStringField_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedStringField() {
+        PrepareBuilder();
+        result.repeatedStringField_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> RepeatedEnumFieldList {
+        get { return PrepareBuilder().repeatedEnumField_; }
+      }
+      public int RepeatedEnumFieldCount {
+        get { return result.RepeatedEnumFieldCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ForeignEnum GetRepeatedEnumField(int index) {
+        return result.GetRepeatedEnumField(index);
+      }
+      public Builder SetRepeatedEnumField(int index, global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {
+        PrepareBuilder();
+        result.repeatedEnumField_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedEnumField(global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {
+        PrepareBuilder();
+        result.repeatedEnumField_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedEnumField(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> values) {
+        PrepareBuilder();
+        result.repeatedEnumField_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedEnumField() {
+        PrepareBuilder();
+        result.repeatedEnumField_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> RepeatedMessageFieldList {
+        get { return PrepareBuilder().repeatedMessageField_; }
+      }
+      public int RepeatedMessageFieldCount {
+        get { return result.RepeatedMessageFieldCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ForeignMessage GetRepeatedMessageField(int index) {
+        return result.GetRepeatedMessageField(index);
+      }
+      public Builder SetRepeatedMessageField(int index, global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedMessageField_[index] = value;
+        return this;
+      }
+      public Builder SetRepeatedMessageField(int index, global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.repeatedMessageField_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRepeatedMessageField(global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedMessageField_.Add(value);
+        return this;
+      }
+      public Builder AddRepeatedMessageField(global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.repeatedMessageField_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRepeatedMessageField(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.ForeignMessage> values) {
+        PrepareBuilder();
+        result.repeatedMessageField_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedMessageField() {
+        PrepareBuilder();
+        result.repeatedMessageField_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<string> RepeatedStringPieceFieldList {
+        get { return PrepareBuilder().repeatedStringPieceField_; }
+      }
+      public int RepeatedStringPieceFieldCount {
+        get { return result.RepeatedStringPieceFieldCount; }
+      }
+      public string GetRepeatedStringPieceField(int index) {
+        return result.GetRepeatedStringPieceField(index);
+      }
+      public Builder SetRepeatedStringPieceField(int index, string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedStringPieceField_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedStringPieceField(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedStringPieceField_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedStringPieceField(scg::IEnumerable<string> values) {
+        PrepareBuilder();
+        result.repeatedStringPieceField_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedStringPieceField() {
+        PrepareBuilder();
+        result.repeatedStringPieceField_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<string> RepeatedCordFieldList {
+        get { return PrepareBuilder().repeatedCordField_; }
+      }
+      public int RepeatedCordFieldCount {
+        get { return result.RepeatedCordFieldCount; }
+      }
+      public string GetRepeatedCordField(int index) {
+        return result.GetRepeatedCordField(index);
+      }
+      public Builder SetRepeatedCordField(int index, string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedCordField_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedCordField(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedCordField_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedCordField(scg::IEnumerable<string> values) {
+        PrepareBuilder();
+        result.repeatedCordField_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedCordField() {
+        PrepareBuilder();
+        result.repeatedCordField_.Clear();
+        return this;
+      }
+    }
+    static TestCamelCaseFieldNames() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestFieldOrderings : pb::ExtendableMessage<TestFieldOrderings, TestFieldOrderings.Builder> {
+    private TestFieldOrderings() { }
+    private static readonly TestFieldOrderings defaultInstance = new TestFieldOrderings().MakeReadOnly();
+    private static readonly string[] _testFieldOrderingsFieldNames = new string[] { "my_float", "my_int", "my_string" };
+    private static readonly uint[] _testFieldOrderingsFieldTags = new uint[] { 813, 8, 90 };
+    public static TestFieldOrderings DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestFieldOrderings DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override TestFieldOrderings ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestFieldOrderings__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<TestFieldOrderings, TestFieldOrderings.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestFieldOrderings__FieldAccessorTable; }
+    }
+    
+    public const int MyStringFieldNumber = 11;
+    private bool hasMyString;
+    private string myString_ = "";
+    public bool HasMyString {
+      get { return hasMyString; }
+    }
+    public string MyString {
+      get { return myString_; }
+    }
+    
+    public const int MyIntFieldNumber = 1;
+    private bool hasMyInt;
+    private long myInt_;
+    public bool HasMyInt {
+      get { return hasMyInt; }
+    }
+    public long MyInt {
+      get { return myInt_; }
+    }
+    
+    public const int MyFloatFieldNumber = 101;
+    private bool hasMyFloat;
+    private float myFloat_;
+    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::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testFieldOrderingsFieldNames;
+      pb::ExtendableMessage<TestFieldOrderings, TestFieldOrderings.Builder>.ExtensionWriter extensionWriter = CreateExtensionWriter(this);
+      if (hasMyInt) {
+        output.WriteInt64(1, field_names[1], MyInt);
+      }
+      extensionWriter.WriteUntil(11, output);
+      if (hasMyString) {
+        output.WriteString(11, field_names[2], MyString);
+      }
+      extensionWriter.WriteUntil(101, output);
+      if (hasMyFloat) {
+        output.WriteFloat(101, field_names[0], MyFloat);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+      
+      size = 0;
+      if (hasMyString) {
+        size += pb::CodedOutputStream.ComputeStringSize(11, MyString);
+      }
+      if (hasMyInt) {
+        size += pb::CodedOutputStream.ComputeInt64Size(1, MyInt);
+      }
+      if (hasMyFloat) {
+        size += pb::CodedOutputStream.ComputeFloatSize(101, MyFloat);
+      }
+      size += ExtensionsSerializedSize;
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestFieldOrderings ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestFieldOrderings ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestFieldOrderings ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestFieldOrderings ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestFieldOrderings ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestFieldOrderings ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestFieldOrderings ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestFieldOrderings ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestFieldOrderings ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestFieldOrderings ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestFieldOrderings MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestFieldOrderings prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::ExtendableBuilder<TestFieldOrderings, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestFieldOrderings cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private TestFieldOrderings result;
+      
+      private TestFieldOrderings PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestFieldOrderings original = result;
+          result = new TestFieldOrderings();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override TestFieldOrderings MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.Descriptor; }
+      }
+      
+      public override TestFieldOrderings DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.DefaultInstance; }
+      }
+      
+      public override TestFieldOrderings BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestFieldOrderings) {
+          return MergeFrom((TestFieldOrderings) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(TestFieldOrderings other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasMyString) {
+          MyString = other.MyString;
+        }
+        if (other.HasMyInt) {
+          MyInt = other.MyInt;
+        }
+        if (other.HasMyFloat) {
+          MyFloat = other.MyFloat;
+        }
+          this.MergeExtensionFields(other);
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testFieldOrderingsFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testFieldOrderingsFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasMyInt = input.ReadInt64(ref result.myInt_);
+              break;
+            }
+            case 90: {
+              result.hasMyString = input.ReadString(ref result.myString_);
+              break;
+            }
+            case 813: {
+              result.hasMyFloat = input.ReadFloat(ref result.myFloat_);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public bool HasMyString {
+        get { return result.hasMyString; }
+      }
+      public string MyString {
+        get { return result.MyString; }
+        set { SetMyString(value); }
+      }
+      public Builder SetMyString(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasMyString = true;
+        result.myString_ = value;
+        return this;
+      }
+      public Builder ClearMyString() {
+        PrepareBuilder();
+        result.hasMyString = false;
+        result.myString_ = "";
+        return this;
+      }
+      
+      public bool HasMyInt {
+        get { return result.hasMyInt; }
+      }
+      public long MyInt {
+        get { return result.MyInt; }
+        set { SetMyInt(value); }
+      }
+      public Builder SetMyInt(long value) {
+        PrepareBuilder();
+        result.hasMyInt = true;
+        result.myInt_ = value;
+        return this;
+      }
+      public Builder ClearMyInt() {
+        PrepareBuilder();
+        result.hasMyInt = false;
+        result.myInt_ = 0L;
+        return this;
+      }
+      
+      public bool HasMyFloat {
+        get { return result.hasMyFloat; }
+      }
+      public float MyFloat {
+        get { return result.MyFloat; }
+        set { SetMyFloat(value); }
+      }
+      public Builder SetMyFloat(float value) {
+        PrepareBuilder();
+        result.hasMyFloat = true;
+        result.myFloat_ = value;
+        return this;
+      }
+      public Builder ClearMyFloat() {
+        PrepareBuilder();
+        result.hasMyFloat = false;
+        result.myFloat_ = 0F;
+        return this;
+      }
+    }
+    static TestFieldOrderings() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestExtremeDefaultValues : pb::GeneratedMessage<TestExtremeDefaultValues, TestExtremeDefaultValues.Builder> {
+    private TestExtremeDefaultValues() { }
+    private static readonly TestExtremeDefaultValues defaultInstance = new TestExtremeDefaultValues().MakeReadOnly();
+    private static readonly string[] _testExtremeDefaultValuesFieldNames = new string[] { "cpp_trigraph", "escaped_bytes", "inf_double", "inf_float", "large_float", "large_uint32", "large_uint64", "nan_double", "nan_float", "neg_inf_double", "neg_inf_float", "negative_float", "negative_one_float", "one_float", "small_float", "small_int32", "small_int64", "small_negative_float", "utf8_string", "zero_float" };
+    private static readonly uint[] _testExtremeDefaultValuesFieldTags = new uint[] { 162, 10, 113, 141, 101, 16, 24, 129, 157, 121, 149, 93, 85, 69, 77, 32, 40, 109, 50, 61 };
+    public static TestExtremeDefaultValues DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestExtremeDefaultValues DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override TestExtremeDefaultValues ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestExtremeDefaultValues__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<TestExtremeDefaultValues, TestExtremeDefaultValues.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestExtremeDefaultValues__FieldAccessorTable; }
+    }
+    
+    public const int EscapedBytesFieldNumber = 1;
+    private bool hasEscapedBytes;
+    private pb::ByteString escapedBytes_ = (pb::ByteString) global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.Descriptor.Fields[0].DefaultValue;
+    public bool HasEscapedBytes {
+      get { return hasEscapedBytes; }
+    }
+    public pb::ByteString EscapedBytes {
+      get { return escapedBytes_; }
+    }
+    
+    public const int LargeUint32FieldNumber = 2;
+    private bool hasLargeUint32;
+    private uint largeUint32_ = 4294967295;
+    public bool HasLargeUint32 {
+      get { return hasLargeUint32; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint LargeUint32 {
+      get { return largeUint32_; }
+    }
+    
+    public const int LargeUint64FieldNumber = 3;
+    private bool hasLargeUint64;
+    private ulong largeUint64_ = 18446744073709551615UL;
+    public bool HasLargeUint64 {
+      get { return hasLargeUint64; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong LargeUint64 {
+      get { return largeUint64_; }
+    }
+    
+    public const int SmallInt32FieldNumber = 4;
+    private bool hasSmallInt32;
+    private int smallInt32_ = -2147483647;
+    public bool HasSmallInt32 {
+      get { return hasSmallInt32; }
+    }
+    public int SmallInt32 {
+      get { return smallInt32_; }
+    }
+    
+    public const int SmallInt64FieldNumber = 5;
+    private bool hasSmallInt64;
+    private long smallInt64_ = -9223372036854775807L;
+    public bool HasSmallInt64 {
+      get { return hasSmallInt64; }
+    }
+    public long SmallInt64 {
+      get { return smallInt64_; }
+    }
+    
+    public const int Utf8StringFieldNumber = 6;
+    private bool hasUtf8String;
+    private string utf8String_ = (string) global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.Descriptor.Fields[5].DefaultValue;
+    public bool HasUtf8String {
+      get { return hasUtf8String; }
+    }
+    public string Utf8String {
+      get { return utf8String_; }
+    }
+    
+    public const int ZeroFloatFieldNumber = 7;
+    private bool hasZeroFloat;
+    private float zeroFloat_;
+    public bool HasZeroFloat {
+      get { return hasZeroFloat; }
+    }
+    public float ZeroFloat {
+      get { return zeroFloat_; }
+    }
+    
+    public const int OneFloatFieldNumber = 8;
+    private bool hasOneFloat;
+    private float oneFloat_ = 1F;
+    public bool HasOneFloat {
+      get { return hasOneFloat; }
+    }
+    public float OneFloat {
+      get { return oneFloat_; }
+    }
+    
+    public const int SmallFloatFieldNumber = 9;
+    private bool hasSmallFloat;
+    private float smallFloat_ = 1.5F;
+    public bool HasSmallFloat {
+      get { return hasSmallFloat; }
+    }
+    public float SmallFloat {
+      get { return smallFloat_; }
+    }
+    
+    public const int NegativeOneFloatFieldNumber = 10;
+    private bool hasNegativeOneFloat;
+    private float negativeOneFloat_ = -1F;
+    public bool HasNegativeOneFloat {
+      get { return hasNegativeOneFloat; }
+    }
+    public float NegativeOneFloat {
+      get { return negativeOneFloat_; }
+    }
+    
+    public const int NegativeFloatFieldNumber = 11;
+    private bool hasNegativeFloat;
+    private float negativeFloat_ = -1.5F;
+    public bool HasNegativeFloat {
+      get { return hasNegativeFloat; }
+    }
+    public float NegativeFloat {
+      get { return negativeFloat_; }
+    }
+    
+    public const int LargeFloatFieldNumber = 12;
+    private bool hasLargeFloat;
+    private float largeFloat_ = 2E+08F;
+    public bool HasLargeFloat {
+      get { return hasLargeFloat; }
+    }
+    public float LargeFloat {
+      get { return largeFloat_; }
+    }
+    
+    public const int SmallNegativeFloatFieldNumber = 13;
+    private bool hasSmallNegativeFloat;
+    private float smallNegativeFloat_ = -8E-28F;
+    public bool HasSmallNegativeFloat {
+      get { return hasSmallNegativeFloat; }
+    }
+    public float SmallNegativeFloat {
+      get { return smallNegativeFloat_; }
+    }
+    
+    public const int InfDoubleFieldNumber = 14;
+    private bool hasInfDouble;
+    private double infDouble_ = double.PositiveInfinity;
+    public bool HasInfDouble {
+      get { return hasInfDouble; }
+    }
+    public double InfDouble {
+      get { return infDouble_; }
+    }
+    
+    public const int NegInfDoubleFieldNumber = 15;
+    private bool hasNegInfDouble;
+    private double negInfDouble_ = double.NegativeInfinity;
+    public bool HasNegInfDouble {
+      get { return hasNegInfDouble; }
+    }
+    public double NegInfDouble {
+      get { return negInfDouble_; }
+    }
+    
+    public const int NanDoubleFieldNumber = 16;
+    private bool hasNanDouble;
+    private double nanDouble_ = double.NaN;
+    public bool HasNanDouble {
+      get { return hasNanDouble; }
+    }
+    public double NanDouble {
+      get { return nanDouble_; }
+    }
+    
+    public const int InfFloatFieldNumber = 17;
+    private bool hasInfFloat;
+    private float infFloat_ = float.PositiveInfinity;
+    public bool HasInfFloat {
+      get { return hasInfFloat; }
+    }
+    public float InfFloat {
+      get { return infFloat_; }
+    }
+    
+    public const int NegInfFloatFieldNumber = 18;
+    private bool hasNegInfFloat;
+    private float negInfFloat_ = float.NegativeInfinity;
+    public bool HasNegInfFloat {
+      get { return hasNegInfFloat; }
+    }
+    public float NegInfFloat {
+      get { return negInfFloat_; }
+    }
+    
+    public const int NanFloatFieldNumber = 19;
+    private bool hasNanFloat;
+    private float nanFloat_ = float.NaN;
+    public bool HasNanFloat {
+      get { return hasNanFloat; }
+    }
+    public float NanFloat {
+      get { return nanFloat_; }
+    }
+    
+    public const int CppTrigraphFieldNumber = 20;
+    private bool hasCppTrigraph;
+    private string cppTrigraph_ = "? ? ?? ?? ??? ??/ ??-";
+    public bool HasCppTrigraph {
+      get { return hasCppTrigraph; }
+    }
+    public string CppTrigraph {
+      get { return cppTrigraph_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testExtremeDefaultValuesFieldNames;
+      if (hasEscapedBytes) {
+        output.WriteBytes(1, field_names[1], EscapedBytes);
+      }
+      if (hasLargeUint32) {
+        output.WriteUInt32(2, field_names[5], LargeUint32);
+      }
+      if (hasLargeUint64) {
+        output.WriteUInt64(3, field_names[6], LargeUint64);
+      }
+      if (hasSmallInt32) {
+        output.WriteInt32(4, field_names[15], SmallInt32);
+      }
+      if (hasSmallInt64) {
+        output.WriteInt64(5, field_names[16], SmallInt64);
+      }
+      if (hasUtf8String) {
+        output.WriteString(6, field_names[18], Utf8String);
+      }
+      if (hasZeroFloat) {
+        output.WriteFloat(7, field_names[19], ZeroFloat);
+      }
+      if (hasOneFloat) {
+        output.WriteFloat(8, field_names[13], OneFloat);
+      }
+      if (hasSmallFloat) {
+        output.WriteFloat(9, field_names[14], SmallFloat);
+      }
+      if (hasNegativeOneFloat) {
+        output.WriteFloat(10, field_names[12], NegativeOneFloat);
+      }
+      if (hasNegativeFloat) {
+        output.WriteFloat(11, field_names[11], NegativeFloat);
+      }
+      if (hasLargeFloat) {
+        output.WriteFloat(12, field_names[4], LargeFloat);
+      }
+      if (hasSmallNegativeFloat) {
+        output.WriteFloat(13, field_names[17], SmallNegativeFloat);
+      }
+      if (hasInfDouble) {
+        output.WriteDouble(14, field_names[2], InfDouble);
+      }
+      if (hasNegInfDouble) {
+        output.WriteDouble(15, field_names[9], NegInfDouble);
+      }
+      if (hasNanDouble) {
+        output.WriteDouble(16, field_names[7], NanDouble);
+      }
+      if (hasInfFloat) {
+        output.WriteFloat(17, field_names[3], InfFloat);
+      }
+      if (hasNegInfFloat) {
+        output.WriteFloat(18, field_names[10], NegInfFloat);
+      }
+      if (hasNanFloat) {
+        output.WriteFloat(19, field_names[8], NanFloat);
+      }
+      if (hasCppTrigraph) {
+        output.WriteString(20, field_names[0], CppTrigraph);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      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);
+      }
+      if (hasZeroFloat) {
+        size += pb::CodedOutputStream.ComputeFloatSize(7, ZeroFloat);
+      }
+      if (hasOneFloat) {
+        size += pb::CodedOutputStream.ComputeFloatSize(8, OneFloat);
+      }
+      if (hasSmallFloat) {
+        size += pb::CodedOutputStream.ComputeFloatSize(9, SmallFloat);
+      }
+      if (hasNegativeOneFloat) {
+        size += pb::CodedOutputStream.ComputeFloatSize(10, NegativeOneFloat);
+      }
+      if (hasNegativeFloat) {
+        size += pb::CodedOutputStream.ComputeFloatSize(11, NegativeFloat);
+      }
+      if (hasLargeFloat) {
+        size += pb::CodedOutputStream.ComputeFloatSize(12, LargeFloat);
+      }
+      if (hasSmallNegativeFloat) {
+        size += pb::CodedOutputStream.ComputeFloatSize(13, SmallNegativeFloat);
+      }
+      if (hasInfDouble) {
+        size += pb::CodedOutputStream.ComputeDoubleSize(14, InfDouble);
+      }
+      if (hasNegInfDouble) {
+        size += pb::CodedOutputStream.ComputeDoubleSize(15, NegInfDouble);
+      }
+      if (hasNanDouble) {
+        size += pb::CodedOutputStream.ComputeDoubleSize(16, NanDouble);
+      }
+      if (hasInfFloat) {
+        size += pb::CodedOutputStream.ComputeFloatSize(17, InfFloat);
+      }
+      if (hasNegInfFloat) {
+        size += pb::CodedOutputStream.ComputeFloatSize(18, NegInfFloat);
+      }
+      if (hasNanFloat) {
+        size += pb::CodedOutputStream.ComputeFloatSize(19, NanFloat);
+      }
+      if (hasCppTrigraph) {
+        size += pb::CodedOutputStream.ComputeStringSize(20, CppTrigraph);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestExtremeDefaultValues ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestExtremeDefaultValues ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestExtremeDefaultValues ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestExtremeDefaultValues ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestExtremeDefaultValues ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestExtremeDefaultValues ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestExtremeDefaultValues ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestExtremeDefaultValues ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestExtremeDefaultValues ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestExtremeDefaultValues ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestExtremeDefaultValues MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestExtremeDefaultValues prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestExtremeDefaultValues, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestExtremeDefaultValues cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private TestExtremeDefaultValues result;
+      
+      private TestExtremeDefaultValues PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestExtremeDefaultValues original = result;
+          result = new TestExtremeDefaultValues();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override TestExtremeDefaultValues MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.Descriptor; }
+      }
+      
+      public override TestExtremeDefaultValues DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.DefaultInstance; }
+      }
+      
+      public override TestExtremeDefaultValues BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestExtremeDefaultValues) {
+          return MergeFrom((TestExtremeDefaultValues) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(TestExtremeDefaultValues other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.DefaultInstance) return this;
+        PrepareBuilder();
+        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;
+        }
+        if (other.HasZeroFloat) {
+          ZeroFloat = other.ZeroFloat;
+        }
+        if (other.HasOneFloat) {
+          OneFloat = other.OneFloat;
+        }
+        if (other.HasSmallFloat) {
+          SmallFloat = other.SmallFloat;
+        }
+        if (other.HasNegativeOneFloat) {
+          NegativeOneFloat = other.NegativeOneFloat;
+        }
+        if (other.HasNegativeFloat) {
+          NegativeFloat = other.NegativeFloat;
+        }
+        if (other.HasLargeFloat) {
+          LargeFloat = other.LargeFloat;
+        }
+        if (other.HasSmallNegativeFloat) {
+          SmallNegativeFloat = other.SmallNegativeFloat;
+        }
+        if (other.HasInfDouble) {
+          InfDouble = other.InfDouble;
+        }
+        if (other.HasNegInfDouble) {
+          NegInfDouble = other.NegInfDouble;
+        }
+        if (other.HasNanDouble) {
+          NanDouble = other.NanDouble;
+        }
+        if (other.HasInfFloat) {
+          InfFloat = other.InfFloat;
+        }
+        if (other.HasNegInfFloat) {
+          NegInfFloat = other.NegInfFloat;
+        }
+        if (other.HasNanFloat) {
+          NanFloat = other.NanFloat;
+        }
+        if (other.HasCppTrigraph) {
+          CppTrigraph = other.CppTrigraph;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testExtremeDefaultValuesFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testExtremeDefaultValuesFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              result.hasEscapedBytes = input.ReadBytes(ref result.escapedBytes_);
+              break;
+            }
+            case 16: {
+              result.hasLargeUint32 = input.ReadUInt32(ref result.largeUint32_);
+              break;
+            }
+            case 24: {
+              result.hasLargeUint64 = input.ReadUInt64(ref result.largeUint64_);
+              break;
+            }
+            case 32: {
+              result.hasSmallInt32 = input.ReadInt32(ref result.smallInt32_);
+              break;
+            }
+            case 40: {
+              result.hasSmallInt64 = input.ReadInt64(ref result.smallInt64_);
+              break;
+            }
+            case 50: {
+              result.hasUtf8String = input.ReadString(ref result.utf8String_);
+              break;
+            }
+            case 61: {
+              result.hasZeroFloat = input.ReadFloat(ref result.zeroFloat_);
+              break;
+            }
+            case 69: {
+              result.hasOneFloat = input.ReadFloat(ref result.oneFloat_);
+              break;
+            }
+            case 77: {
+              result.hasSmallFloat = input.ReadFloat(ref result.smallFloat_);
+              break;
+            }
+            case 85: {
+              result.hasNegativeOneFloat = input.ReadFloat(ref result.negativeOneFloat_);
+              break;
+            }
+            case 93: {
+              result.hasNegativeFloat = input.ReadFloat(ref result.negativeFloat_);
+              break;
+            }
+            case 101: {
+              result.hasLargeFloat = input.ReadFloat(ref result.largeFloat_);
+              break;
+            }
+            case 109: {
+              result.hasSmallNegativeFloat = input.ReadFloat(ref result.smallNegativeFloat_);
+              break;
+            }
+            case 113: {
+              result.hasInfDouble = input.ReadDouble(ref result.infDouble_);
+              break;
+            }
+            case 121: {
+              result.hasNegInfDouble = input.ReadDouble(ref result.negInfDouble_);
+              break;
+            }
+            case 129: {
+              result.hasNanDouble = input.ReadDouble(ref result.nanDouble_);
+              break;
+            }
+            case 141: {
+              result.hasInfFloat = input.ReadFloat(ref result.infFloat_);
+              break;
+            }
+            case 149: {
+              result.hasNegInfFloat = input.ReadFloat(ref result.negInfFloat_);
+              break;
+            }
+            case 157: {
+              result.hasNanFloat = input.ReadFloat(ref result.nanFloat_);
+              break;
+            }
+            case 162: {
+              result.hasCppTrigraph = input.ReadString(ref result.cppTrigraph_);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public bool HasEscapedBytes {
+        get { return result.hasEscapedBytes; }
+      }
+      public pb::ByteString EscapedBytes {
+        get { return result.EscapedBytes; }
+        set { SetEscapedBytes(value); }
+      }
+      public Builder SetEscapedBytes(pb::ByteString value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasEscapedBytes = true;
+        result.escapedBytes_ = value;
+        return this;
+      }
+      public Builder ClearEscapedBytes() {
+        PrepareBuilder();
+        result.hasEscapedBytes = false;
+        result.escapedBytes_ = (pb::ByteString) global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.Descriptor.Fields[0].DefaultValue;
+        return this;
+      }
+      
+      public bool HasLargeUint32 {
+        get { return result.hasLargeUint32; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint LargeUint32 {
+        get { return result.LargeUint32; }
+        set { SetLargeUint32(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetLargeUint32(uint value) {
+        PrepareBuilder();
+        result.hasLargeUint32 = true;
+        result.largeUint32_ = value;
+        return this;
+      }
+      public Builder ClearLargeUint32() {
+        PrepareBuilder();
+        result.hasLargeUint32 = false;
+        result.largeUint32_ = 4294967295;
+        return this;
+      }
+      
+      public bool HasLargeUint64 {
+        get { return result.hasLargeUint64; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong LargeUint64 {
+        get { return result.LargeUint64; }
+        set { SetLargeUint64(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetLargeUint64(ulong value) {
+        PrepareBuilder();
+        result.hasLargeUint64 = true;
+        result.largeUint64_ = value;
+        return this;
+      }
+      public Builder ClearLargeUint64() {
+        PrepareBuilder();
+        result.hasLargeUint64 = false;
+        result.largeUint64_ = 18446744073709551615UL;
+        return this;
+      }
+      
+      public bool HasSmallInt32 {
+        get { return result.hasSmallInt32; }
+      }
+      public int SmallInt32 {
+        get { return result.SmallInt32; }
+        set { SetSmallInt32(value); }
+      }
+      public Builder SetSmallInt32(int value) {
+        PrepareBuilder();
+        result.hasSmallInt32 = true;
+        result.smallInt32_ = value;
+        return this;
+      }
+      public Builder ClearSmallInt32() {
+        PrepareBuilder();
+        result.hasSmallInt32 = false;
+        result.smallInt32_ = -2147483647;
+        return this;
+      }
+      
+      public bool HasSmallInt64 {
+        get { return result.hasSmallInt64; }
+      }
+      public long SmallInt64 {
+        get { return result.SmallInt64; }
+        set { SetSmallInt64(value); }
+      }
+      public Builder SetSmallInt64(long value) {
+        PrepareBuilder();
+        result.hasSmallInt64 = true;
+        result.smallInt64_ = value;
+        return this;
+      }
+      public Builder ClearSmallInt64() {
+        PrepareBuilder();
+        result.hasSmallInt64 = false;
+        result.smallInt64_ = -9223372036854775807L;
+        return this;
+      }
+      
+      public bool HasUtf8String {
+        get { return result.hasUtf8String; }
+      }
+      public string Utf8String {
+        get { return result.Utf8String; }
+        set { SetUtf8String(value); }
+      }
+      public Builder SetUtf8String(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasUtf8String = true;
+        result.utf8String_ = value;
+        return this;
+      }
+      public Builder ClearUtf8String() {
+        PrepareBuilder();
+        result.hasUtf8String = false;
+        result.utf8String_ = (string) global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.Descriptor.Fields[5].DefaultValue;
+        return this;
+      }
+      
+      public bool HasZeroFloat {
+        get { return result.hasZeroFloat; }
+      }
+      public float ZeroFloat {
+        get { return result.ZeroFloat; }
+        set { SetZeroFloat(value); }
+      }
+      public Builder SetZeroFloat(float value) {
+        PrepareBuilder();
+        result.hasZeroFloat = true;
+        result.zeroFloat_ = value;
+        return this;
+      }
+      public Builder ClearZeroFloat() {
+        PrepareBuilder();
+        result.hasZeroFloat = false;
+        result.zeroFloat_ = 0F;
+        return this;
+      }
+      
+      public bool HasOneFloat {
+        get { return result.hasOneFloat; }
+      }
+      public float OneFloat {
+        get { return result.OneFloat; }
+        set { SetOneFloat(value); }
+      }
+      public Builder SetOneFloat(float value) {
+        PrepareBuilder();
+        result.hasOneFloat = true;
+        result.oneFloat_ = value;
+        return this;
+      }
+      public Builder ClearOneFloat() {
+        PrepareBuilder();
+        result.hasOneFloat = false;
+        result.oneFloat_ = 1F;
+        return this;
+      }
+      
+      public bool HasSmallFloat {
+        get { return result.hasSmallFloat; }
+      }
+      public float SmallFloat {
+        get { return result.SmallFloat; }
+        set { SetSmallFloat(value); }
+      }
+      public Builder SetSmallFloat(float value) {
+        PrepareBuilder();
+        result.hasSmallFloat = true;
+        result.smallFloat_ = value;
+        return this;
+      }
+      public Builder ClearSmallFloat() {
+        PrepareBuilder();
+        result.hasSmallFloat = false;
+        result.smallFloat_ = 1.5F;
+        return this;
+      }
+      
+      public bool HasNegativeOneFloat {
+        get { return result.hasNegativeOneFloat; }
+      }
+      public float NegativeOneFloat {
+        get { return result.NegativeOneFloat; }
+        set { SetNegativeOneFloat(value); }
+      }
+      public Builder SetNegativeOneFloat(float value) {
+        PrepareBuilder();
+        result.hasNegativeOneFloat = true;
+        result.negativeOneFloat_ = value;
+        return this;
+      }
+      public Builder ClearNegativeOneFloat() {
+        PrepareBuilder();
+        result.hasNegativeOneFloat = false;
+        result.negativeOneFloat_ = -1F;
+        return this;
+      }
+      
+      public bool HasNegativeFloat {
+        get { return result.hasNegativeFloat; }
+      }
+      public float NegativeFloat {
+        get { return result.NegativeFloat; }
+        set { SetNegativeFloat(value); }
+      }
+      public Builder SetNegativeFloat(float value) {
+        PrepareBuilder();
+        result.hasNegativeFloat = true;
+        result.negativeFloat_ = value;
+        return this;
+      }
+      public Builder ClearNegativeFloat() {
+        PrepareBuilder();
+        result.hasNegativeFloat = false;
+        result.negativeFloat_ = -1.5F;
+        return this;
+      }
+      
+      public bool HasLargeFloat {
+        get { return result.hasLargeFloat; }
+      }
+      public float LargeFloat {
+        get { return result.LargeFloat; }
+        set { SetLargeFloat(value); }
+      }
+      public Builder SetLargeFloat(float value) {
+        PrepareBuilder();
+        result.hasLargeFloat = true;
+        result.largeFloat_ = value;
+        return this;
+      }
+      public Builder ClearLargeFloat() {
+        PrepareBuilder();
+        result.hasLargeFloat = false;
+        result.largeFloat_ = 2E+08F;
+        return this;
+      }
+      
+      public bool HasSmallNegativeFloat {
+        get { return result.hasSmallNegativeFloat; }
+      }
+      public float SmallNegativeFloat {
+        get { return result.SmallNegativeFloat; }
+        set { SetSmallNegativeFloat(value); }
+      }
+      public Builder SetSmallNegativeFloat(float value) {
+        PrepareBuilder();
+        result.hasSmallNegativeFloat = true;
+        result.smallNegativeFloat_ = value;
+        return this;
+      }
+      public Builder ClearSmallNegativeFloat() {
+        PrepareBuilder();
+        result.hasSmallNegativeFloat = false;
+        result.smallNegativeFloat_ = -8E-28F;
+        return this;
+      }
+      
+      public bool HasInfDouble {
+        get { return result.hasInfDouble; }
+      }
+      public double InfDouble {
+        get { return result.InfDouble; }
+        set { SetInfDouble(value); }
+      }
+      public Builder SetInfDouble(double value) {
+        PrepareBuilder();
+        result.hasInfDouble = true;
+        result.infDouble_ = value;
+        return this;
+      }
+      public Builder ClearInfDouble() {
+        PrepareBuilder();
+        result.hasInfDouble = false;
+        result.infDouble_ = double.PositiveInfinity;
+        return this;
+      }
+      
+      public bool HasNegInfDouble {
+        get { return result.hasNegInfDouble; }
+      }
+      public double NegInfDouble {
+        get { return result.NegInfDouble; }
+        set { SetNegInfDouble(value); }
+      }
+      public Builder SetNegInfDouble(double value) {
+        PrepareBuilder();
+        result.hasNegInfDouble = true;
+        result.negInfDouble_ = value;
+        return this;
+      }
+      public Builder ClearNegInfDouble() {
+        PrepareBuilder();
+        result.hasNegInfDouble = false;
+        result.negInfDouble_ = double.NegativeInfinity;
+        return this;
+      }
+      
+      public bool HasNanDouble {
+        get { return result.hasNanDouble; }
+      }
+      public double NanDouble {
+        get { return result.NanDouble; }
+        set { SetNanDouble(value); }
+      }
+      public Builder SetNanDouble(double value) {
+        PrepareBuilder();
+        result.hasNanDouble = true;
+        result.nanDouble_ = value;
+        return this;
+      }
+      public Builder ClearNanDouble() {
+        PrepareBuilder();
+        result.hasNanDouble = false;
+        result.nanDouble_ = double.NaN;
+        return this;
+      }
+      
+      public bool HasInfFloat {
+        get { return result.hasInfFloat; }
+      }
+      public float InfFloat {
+        get { return result.InfFloat; }
+        set { SetInfFloat(value); }
+      }
+      public Builder SetInfFloat(float value) {
+        PrepareBuilder();
+        result.hasInfFloat = true;
+        result.infFloat_ = value;
+        return this;
+      }
+      public Builder ClearInfFloat() {
+        PrepareBuilder();
+        result.hasInfFloat = false;
+        result.infFloat_ = float.PositiveInfinity;
+        return this;
+      }
+      
+      public bool HasNegInfFloat {
+        get { return result.hasNegInfFloat; }
+      }
+      public float NegInfFloat {
+        get { return result.NegInfFloat; }
+        set { SetNegInfFloat(value); }
+      }
+      public Builder SetNegInfFloat(float value) {
+        PrepareBuilder();
+        result.hasNegInfFloat = true;
+        result.negInfFloat_ = value;
+        return this;
+      }
+      public Builder ClearNegInfFloat() {
+        PrepareBuilder();
+        result.hasNegInfFloat = false;
+        result.negInfFloat_ = float.NegativeInfinity;
+        return this;
+      }
+      
+      public bool HasNanFloat {
+        get { return result.hasNanFloat; }
+      }
+      public float NanFloat {
+        get { return result.NanFloat; }
+        set { SetNanFloat(value); }
+      }
+      public Builder SetNanFloat(float value) {
+        PrepareBuilder();
+        result.hasNanFloat = true;
+        result.nanFloat_ = value;
+        return this;
+      }
+      public Builder ClearNanFloat() {
+        PrepareBuilder();
+        result.hasNanFloat = false;
+        result.nanFloat_ = float.NaN;
+        return this;
+      }
+      
+      public bool HasCppTrigraph {
+        get { return result.hasCppTrigraph; }
+      }
+      public string CppTrigraph {
+        get { return result.CppTrigraph; }
+        set { SetCppTrigraph(value); }
+      }
+      public Builder SetCppTrigraph(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasCppTrigraph = true;
+        result.cppTrigraph_ = value;
+        return this;
+      }
+      public Builder ClearCppTrigraph() {
+        PrepareBuilder();
+        result.hasCppTrigraph = false;
+        result.cppTrigraph_ = "? ? ?? ?? ??? ??/ ??-";
+        return this;
+      }
+    }
+    static TestExtremeDefaultValues() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class SparseEnumMessage : pb::GeneratedMessage<SparseEnumMessage, SparseEnumMessage.Builder> {
+    private SparseEnumMessage() { }
+    private static readonly SparseEnumMessage defaultInstance = new SparseEnumMessage().MakeReadOnly();
+    private static readonly string[] _sparseEnumMessageFieldNames = new string[] { "sparse_enum" };
+    private static readonly uint[] _sparseEnumMessageFieldTags = new uint[] { 8 };
+    public static SparseEnumMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override SparseEnumMessage DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override SparseEnumMessage ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_SparseEnumMessage__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<SparseEnumMessage, SparseEnumMessage.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_SparseEnumMessage__FieldAccessorTable; }
+    }
+    
+    public const int SparseEnumFieldNumber = 1;
+    private bool hasSparseEnum;
+    private global::Google.ProtocolBuffers.TestProtos.TestSparseEnum sparseEnum_ = global::Google.ProtocolBuffers.TestProtos.TestSparseEnum.SPARSE_A;
+    public bool HasSparseEnum {
+      get { return hasSparseEnum; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestSparseEnum SparseEnum {
+      get { return sparseEnum_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _sparseEnumMessageFieldNames;
+      if (hasSparseEnum) {
+        output.WriteEnum(1, field_names[0], (int) SparseEnum, SparseEnum);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+      
+      size = 0;
+      if (hasSparseEnum) {
+        size += pb::CodedOutputStream.ComputeEnumSize(1, (int) SparseEnum);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static SparseEnumMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SparseEnumMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SparseEnumMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SparseEnumMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SparseEnumMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SparseEnumMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static SparseEnumMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static SparseEnumMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static SparseEnumMessage ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SparseEnumMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private SparseEnumMessage MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(SparseEnumMessage prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<SparseEnumMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(SparseEnumMessage cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private SparseEnumMessage result;
+      
+      private SparseEnumMessage PrepareBuilder() {
+        if (resultIsReadOnly) {
+          SparseEnumMessage original = result;
+          result = new SparseEnumMessage();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override SparseEnumMessage MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SparseEnumMessage.Descriptor; }
+      }
+      
+      public override SparseEnumMessage DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SparseEnumMessage.DefaultInstance; }
+      }
+      
+      public override SparseEnumMessage BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is SparseEnumMessage) {
+          return MergeFrom((SparseEnumMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(SparseEnumMessage other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.SparseEnumMessage.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasSparseEnum) {
+          SparseEnum = other.SparseEnum;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_sparseEnumMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _sparseEnumMessageFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              object unknown;
+              if(input.ReadEnum(ref result.sparseEnum_, out unknown)) {
+                result.hasSparseEnum = true;
+              } else if(unknown is int) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                unknownFields.MergeVarintField(1, (ulong)(int)unknown);
+              }
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public bool HasSparseEnum {
+       get { return result.hasSparseEnum; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestSparseEnum SparseEnum {
+        get { return result.SparseEnum; }
+        set { SetSparseEnum(value); }
+      }
+      public Builder SetSparseEnum(global::Google.ProtocolBuffers.TestProtos.TestSparseEnum value) {
+        PrepareBuilder();
+        result.hasSparseEnum = true;
+        result.sparseEnum_ = value;
+        return this;
+      }
+      public Builder ClearSparseEnum() {
+        PrepareBuilder();
+        result.hasSparseEnum = false;
+        result.sparseEnum_ = global::Google.ProtocolBuffers.TestProtos.TestSparseEnum.SPARSE_A;
+        return this;
+      }
+    }
+    static SparseEnumMessage() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class OneString : pb::GeneratedMessage<OneString, OneString.Builder> {
+    private OneString() { }
+    private static readonly OneString defaultInstance = new OneString().MakeReadOnly();
+    private static readonly string[] _oneStringFieldNames = new string[] { "data" };
+    private static readonly uint[] _oneStringFieldTags = new uint[] { 10 };
+    public static OneString DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override OneString DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override OneString ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_OneString__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<OneString, OneString.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_OneString__FieldAccessorTable; }
+    }
+    
+    public const int DataFieldNumber = 1;
+    private bool hasData;
+    private string data_ = "";
+    public bool HasData {
+      get { return hasData; }
+    }
+    public string Data {
+      get { return data_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _oneStringFieldNames;
+      if (hasData) {
+        output.WriteString(1, field_names[0], Data);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+      
+      size = 0;
+      if (hasData) {
+        size += pb::CodedOutputStream.ComputeStringSize(1, Data);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static OneString ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static OneString ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static OneString ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static OneString ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static OneString ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static OneString ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static OneString ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static OneString ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static OneString ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static OneString ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private OneString MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(OneString prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<OneString, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(OneString cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private OneString result;
+      
+      private OneString PrepareBuilder() {
+        if (resultIsReadOnly) {
+          OneString original = result;
+          result = new OneString();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override OneString MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.OneString.Descriptor; }
+      }
+      
+      public override OneString DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.OneString.DefaultInstance; }
+      }
+      
+      public override OneString BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is OneString) {
+          return MergeFrom((OneString) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(OneString other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.OneString.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasData) {
+          Data = other.Data;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_oneStringFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _oneStringFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              result.hasData = input.ReadString(ref result.data_);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public bool HasData {
+        get { return result.hasData; }
+      }
+      public string Data {
+        get { return result.Data; }
+        set { SetData(value); }
+      }
+      public Builder SetData(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasData = true;
+        result.data_ = value;
+        return this;
+      }
+      public Builder ClearData() {
+        PrepareBuilder();
+        result.hasData = false;
+        result.data_ = "";
+        return this;
+      }
+    }
+    static OneString() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class OneBytes : pb::GeneratedMessage<OneBytes, OneBytes.Builder> {
+    private OneBytes() { }
+    private static readonly OneBytes defaultInstance = new OneBytes().MakeReadOnly();
+    private static readonly string[] _oneBytesFieldNames = new string[] { "data" };
+    private static readonly uint[] _oneBytesFieldTags = new uint[] { 10 };
+    public static OneBytes DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override OneBytes DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override OneBytes ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_OneBytes__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<OneBytes, OneBytes.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_OneBytes__FieldAccessorTable; }
+    }
+    
+    public const int DataFieldNumber = 1;
+    private bool hasData;
+    private pb::ByteString data_ = pb::ByteString.Empty;
+    public bool HasData {
+      get { return hasData; }
+    }
+    public pb::ByteString Data {
+      get { return data_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _oneBytesFieldNames;
+      if (hasData) {
+        output.WriteBytes(1, field_names[0], Data);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+      
+      size = 0;
+      if (hasData) {
+        size += pb::CodedOutputStream.ComputeBytesSize(1, Data);
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static OneBytes ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static OneBytes ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static OneBytes ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static OneBytes ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static OneBytes ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static OneBytes ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static OneBytes ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static OneBytes ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static OneBytes ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static OneBytes ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private OneBytes MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(OneBytes prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<OneBytes, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(OneBytes cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private OneBytes result;
+      
+      private OneBytes PrepareBuilder() {
+        if (resultIsReadOnly) {
+          OneBytes original = result;
+          result = new OneBytes();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override OneBytes MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.OneBytes.Descriptor; }
+      }
+      
+      public override OneBytes DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.OneBytes.DefaultInstance; }
+      }
+      
+      public override OneBytes BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is OneBytes) {
+          return MergeFrom((OneBytes) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(OneBytes other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.OneBytes.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasData) {
+          Data = other.Data;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_oneBytesFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _oneBytesFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 10: {
+              result.hasData = input.ReadBytes(ref result.data_);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public bool HasData {
+        get { return result.hasData; }
+      }
+      public pb::ByteString Data {
+        get { return result.Data; }
+        set { SetData(value); }
+      }
+      public Builder SetData(pb::ByteString value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasData = true;
+        result.data_ = value;
+        return this;
+      }
+      public Builder ClearData() {
+        PrepareBuilder();
+        result.hasData = false;
+        result.data_ = pb::ByteString.Empty;
+        return this;
+      }
+    }
+    static OneBytes() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestPackedTypes : pb::GeneratedMessage<TestPackedTypes, TestPackedTypes.Builder> {
+    private TestPackedTypes() { }
+    private static readonly TestPackedTypes defaultInstance = new TestPackedTypes().MakeReadOnly();
+    private static readonly string[] _testPackedTypesFieldNames = new string[] { "packed_bool", "packed_double", "packed_enum", "packed_fixed32", "packed_fixed64", "packed_float", "packed_int32", "packed_int64", "packed_sfixed32", "packed_sfixed64", "packed_sint32", "packed_sint64", "packed_uint32", "packed_uint64" };
+    private static readonly uint[] _testPackedTypesFieldTags = new uint[] { 818, 810, 826, 770, 778, 802, 722, 730, 786, 794, 754, 762, 738, 746 };
+    public static TestPackedTypes DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestPackedTypes DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override TestPackedTypes ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestPackedTypes__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<TestPackedTypes, TestPackedTypes.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestPackedTypes__FieldAccessorTable; }
+    }
+    
+    public const int PackedInt32FieldNumber = 90;
+    private int packedInt32MemoizedSerializedSize;
+    private pbc::PopsicleList<int> packedInt32_ = new pbc::PopsicleList<int>();
+    public scg::IList<int> PackedInt32List {
+      get { return pbc::Lists.AsReadOnly(packedInt32_); }
+    }
+    public int PackedInt32Count {
+      get { return packedInt32_.Count; }
+    }
+    public int GetPackedInt32(int index) {
+      return packedInt32_[index];
+    }
+    
+    public const int PackedInt64FieldNumber = 91;
+    private int packedInt64MemoizedSerializedSize;
+    private pbc::PopsicleList<long> packedInt64_ = new pbc::PopsicleList<long>();
+    public scg::IList<long> PackedInt64List {
+      get { return pbc::Lists.AsReadOnly(packedInt64_); }
+    }
+    public int PackedInt64Count {
+      get { return packedInt64_.Count; }
+    }
+    public long GetPackedInt64(int index) {
+      return packedInt64_[index];
+    }
+    
+    public const int PackedUint32FieldNumber = 92;
+    private int packedUint32MemoizedSerializedSize;
+    private pbc::PopsicleList<uint> packedUint32_ = new pbc::PopsicleList<uint>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<uint> PackedUint32List {
+      get { return pbc::Lists.AsReadOnly(packedUint32_); }
+    }
+    public int PackedUint32Count {
+      get { return packedUint32_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint GetPackedUint32(int index) {
+      return packedUint32_[index];
+    }
+    
+    public const int PackedUint64FieldNumber = 93;
+    private int packedUint64MemoizedSerializedSize;
+    private pbc::PopsicleList<ulong> packedUint64_ = new pbc::PopsicleList<ulong>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<ulong> PackedUint64List {
+      get { return pbc::Lists.AsReadOnly(packedUint64_); }
+    }
+    public int PackedUint64Count {
+      get { return packedUint64_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong GetPackedUint64(int index) {
+      return packedUint64_[index];
+    }
+    
+    public const int PackedSint32FieldNumber = 94;
+    private int packedSint32MemoizedSerializedSize;
+    private pbc::PopsicleList<int> packedSint32_ = new pbc::PopsicleList<int>();
+    public scg::IList<int> PackedSint32List {
+      get { return pbc::Lists.AsReadOnly(packedSint32_); }
+    }
+    public int PackedSint32Count {
+      get { return packedSint32_.Count; }
+    }
+    public int GetPackedSint32(int index) {
+      return packedSint32_[index];
+    }
+    
+    public const int PackedSint64FieldNumber = 95;
+    private int packedSint64MemoizedSerializedSize;
+    private pbc::PopsicleList<long> packedSint64_ = new pbc::PopsicleList<long>();
+    public scg::IList<long> PackedSint64List {
+      get { return pbc::Lists.AsReadOnly(packedSint64_); }
+    }
+    public int PackedSint64Count {
+      get { return packedSint64_.Count; }
+    }
+    public long GetPackedSint64(int index) {
+      return packedSint64_[index];
+    }
+    
+    public const int PackedFixed32FieldNumber = 96;
+    private int packedFixed32MemoizedSerializedSize;
+    private pbc::PopsicleList<uint> packedFixed32_ = new pbc::PopsicleList<uint>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<uint> PackedFixed32List {
+      get { return pbc::Lists.AsReadOnly(packedFixed32_); }
+    }
+    public int PackedFixed32Count {
+      get { return packedFixed32_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint GetPackedFixed32(int index) {
+      return packedFixed32_[index];
+    }
+    
+    public const int PackedFixed64FieldNumber = 97;
+    private int packedFixed64MemoizedSerializedSize;
+    private pbc::PopsicleList<ulong> packedFixed64_ = new pbc::PopsicleList<ulong>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<ulong> PackedFixed64List {
+      get { return pbc::Lists.AsReadOnly(packedFixed64_); }
+    }
+    public int PackedFixed64Count {
+      get { return packedFixed64_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong GetPackedFixed64(int index) {
+      return packedFixed64_[index];
+    }
+    
+    public const int PackedSfixed32FieldNumber = 98;
+    private int packedSfixed32MemoizedSerializedSize;
+    private pbc::PopsicleList<int> packedSfixed32_ = new pbc::PopsicleList<int>();
+    public scg::IList<int> PackedSfixed32List {
+      get { return pbc::Lists.AsReadOnly(packedSfixed32_); }
+    }
+    public int PackedSfixed32Count {
+      get { return packedSfixed32_.Count; }
+    }
+    public int GetPackedSfixed32(int index) {
+      return packedSfixed32_[index];
+    }
+    
+    public const int PackedSfixed64FieldNumber = 99;
+    private int packedSfixed64MemoizedSerializedSize;
+    private pbc::PopsicleList<long> packedSfixed64_ = new pbc::PopsicleList<long>();
+    public scg::IList<long> PackedSfixed64List {
+      get { return pbc::Lists.AsReadOnly(packedSfixed64_); }
+    }
+    public int PackedSfixed64Count {
+      get { return packedSfixed64_.Count; }
+    }
+    public long GetPackedSfixed64(int index) {
+      return packedSfixed64_[index];
+    }
+    
+    public const int PackedFloatFieldNumber = 100;
+    private int packedFloatMemoizedSerializedSize;
+    private pbc::PopsicleList<float> packedFloat_ = new pbc::PopsicleList<float>();
+    public scg::IList<float> PackedFloatList {
+      get { return pbc::Lists.AsReadOnly(packedFloat_); }
+    }
+    public int PackedFloatCount {
+      get { return packedFloat_.Count; }
+    }
+    public float GetPackedFloat(int index) {
+      return packedFloat_[index];
+    }
+    
+    public const int PackedDoubleFieldNumber = 101;
+    private int packedDoubleMemoizedSerializedSize;
+    private pbc::PopsicleList<double> packedDouble_ = new pbc::PopsicleList<double>();
+    public scg::IList<double> PackedDoubleList {
+      get { return pbc::Lists.AsReadOnly(packedDouble_); }
+    }
+    public int PackedDoubleCount {
+      get { return packedDouble_.Count; }
+    }
+    public double GetPackedDouble(int index) {
+      return packedDouble_[index];
+    }
+    
+    public const int PackedBoolFieldNumber = 102;
+    private int packedBoolMemoizedSerializedSize;
+    private pbc::PopsicleList<bool> packedBool_ = new pbc::PopsicleList<bool>();
+    public scg::IList<bool> PackedBoolList {
+      get { return pbc::Lists.AsReadOnly(packedBool_); }
+    }
+    public int PackedBoolCount {
+      get { return packedBool_.Count; }
+    }
+    public bool GetPackedBool(int index) {
+      return packedBool_[index];
+    }
+    
+    public const int PackedEnumFieldNumber = 103;
+    private int packedEnumMemoizedSerializedSize;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> packedEnum_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> PackedEnumList {
+      get { return pbc::Lists.AsReadOnly(packedEnum_); }
+    }
+    public int PackedEnumCount {
+      get { return packedEnum_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ForeignEnum GetPackedEnum(int index) {
+      return packedEnum_[index];
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testPackedTypesFieldNames;
+      if (packedInt32_.Count > 0) {
+        output.WritePackedInt32Array(90, field_names[6], packedInt32MemoizedSerializedSize, packedInt32_);
+      }
+      if (packedInt64_.Count > 0) {
+        output.WritePackedInt64Array(91, field_names[7], packedInt64MemoizedSerializedSize, packedInt64_);
+      }
+      if (packedUint32_.Count > 0) {
+        output.WritePackedUInt32Array(92, field_names[12], packedUint32MemoizedSerializedSize, packedUint32_);
+      }
+      if (packedUint64_.Count > 0) {
+        output.WritePackedUInt64Array(93, field_names[13], packedUint64MemoizedSerializedSize, packedUint64_);
+      }
+      if (packedSint32_.Count > 0) {
+        output.WritePackedSInt32Array(94, field_names[10], packedSint32MemoizedSerializedSize, packedSint32_);
+      }
+      if (packedSint64_.Count > 0) {
+        output.WritePackedSInt64Array(95, field_names[11], packedSint64MemoizedSerializedSize, packedSint64_);
+      }
+      if (packedFixed32_.Count > 0) {
+        output.WritePackedFixed32Array(96, field_names[3], packedFixed32MemoizedSerializedSize, packedFixed32_);
+      }
+      if (packedFixed64_.Count > 0) {
+        output.WritePackedFixed64Array(97, field_names[4], packedFixed64MemoizedSerializedSize, packedFixed64_);
+      }
+      if (packedSfixed32_.Count > 0) {
+        output.WritePackedSFixed32Array(98, field_names[8], packedSfixed32MemoizedSerializedSize, packedSfixed32_);
+      }
+      if (packedSfixed64_.Count > 0) {
+        output.WritePackedSFixed64Array(99, field_names[9], packedSfixed64MemoizedSerializedSize, packedSfixed64_);
+      }
+      if (packedFloat_.Count > 0) {
+        output.WritePackedFloatArray(100, field_names[5], packedFloatMemoizedSerializedSize, packedFloat_);
+      }
+      if (packedDouble_.Count > 0) {
+        output.WritePackedDoubleArray(101, field_names[1], packedDoubleMemoizedSerializedSize, packedDouble_);
+      }
+      if (packedBool_.Count > 0) {
+        output.WritePackedBoolArray(102, field_names[0], packedBoolMemoizedSerializedSize, packedBool_);
+      }
+      if (packedEnum_.Count > 0) {
+        output.WritePackedEnumArray(103, field_names[2], packedEnumMemoizedSerializedSize, packedEnum_);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+      
+      size = 0;
+      {
+        int dataSize = 0;
+        foreach (int element in PackedInt32List) {
+          dataSize += pb::CodedOutputStream.ComputeInt32SizeNoTag(element);
+        }
+        size += dataSize;
+        if (packedInt32_.Count != 0) {
+          size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+        }
+        packedInt32MemoizedSerializedSize = dataSize;
+      }
+      {
+        int dataSize = 0;
+        foreach (long element in PackedInt64List) {
+          dataSize += pb::CodedOutputStream.ComputeInt64SizeNoTag(element);
+        }
+        size += dataSize;
+        if (packedInt64_.Count != 0) {
+          size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+        }
+        packedInt64MemoizedSerializedSize = dataSize;
+      }
+      {
+        int dataSize = 0;
+        foreach (uint element in PackedUint32List) {
+          dataSize += pb::CodedOutputStream.ComputeUInt32SizeNoTag(element);
+        }
+        size += dataSize;
+        if (packedUint32_.Count != 0) {
+          size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+        }
+        packedUint32MemoizedSerializedSize = dataSize;
+      }
+      {
+        int dataSize = 0;
+        foreach (ulong element in PackedUint64List) {
+          dataSize += pb::CodedOutputStream.ComputeUInt64SizeNoTag(element);
+        }
+        size += dataSize;
+        if (packedUint64_.Count != 0) {
+          size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+        }
+        packedUint64MemoizedSerializedSize = dataSize;
+      }
+      {
+        int dataSize = 0;
+        foreach (int element in PackedSint32List) {
+          dataSize += pb::CodedOutputStream.ComputeSInt32SizeNoTag(element);
+        }
+        size += dataSize;
+        if (packedSint32_.Count != 0) {
+          size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+        }
+        packedSint32MemoizedSerializedSize = dataSize;
+      }
+      {
+        int dataSize = 0;
+        foreach (long element in PackedSint64List) {
+          dataSize += pb::CodedOutputStream.ComputeSInt64SizeNoTag(element);
+        }
+        size += dataSize;
+        if (packedSint64_.Count != 0) {
+          size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+        }
+        packedSint64MemoizedSerializedSize = dataSize;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 4 * packedFixed32_.Count;
+        size += dataSize;
+        if (packedFixed32_.Count != 0) {
+          size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+        }
+        packedFixed32MemoizedSerializedSize = dataSize;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 8 * packedFixed64_.Count;
+        size += dataSize;
+        if (packedFixed64_.Count != 0) {
+          size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+        }
+        packedFixed64MemoizedSerializedSize = dataSize;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 4 * packedSfixed32_.Count;
+        size += dataSize;
+        if (packedSfixed32_.Count != 0) {
+          size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+        }
+        packedSfixed32MemoizedSerializedSize = dataSize;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 8 * packedSfixed64_.Count;
+        size += dataSize;
+        if (packedSfixed64_.Count != 0) {
+          size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+        }
+        packedSfixed64MemoizedSerializedSize = dataSize;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 4 * packedFloat_.Count;
+        size += dataSize;
+        if (packedFloat_.Count != 0) {
+          size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+        }
+        packedFloatMemoizedSerializedSize = dataSize;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 8 * packedDouble_.Count;
+        size += dataSize;
+        if (packedDouble_.Count != 0) {
+          size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+        }
+        packedDoubleMemoizedSerializedSize = dataSize;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 1 * packedBool_.Count;
+        size += dataSize;
+        if (packedBool_.Count != 0) {
+          size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+        }
+        packedBoolMemoizedSerializedSize = dataSize;
+      }
+      {
+        int dataSize = 0;
+        if (packedEnum_.Count > 0) {
+          foreach (global::Google.ProtocolBuffers.TestProtos.ForeignEnum element in packedEnum_) {
+            dataSize += pb::CodedOutputStream.ComputeEnumSizeNoTag((int) element);
+          }
+          size += dataSize;
+          size += 2;
+          size += pb::CodedOutputStream.ComputeRawVarint32Size((uint) dataSize);
+        }
+        packedEnumMemoizedSerializedSize = dataSize;
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestPackedTypes ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestPackedTypes ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestPackedTypes ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestPackedTypes ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestPackedTypes ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestPackedTypes ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestPackedTypes ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestPackedTypes ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestPackedTypes ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestPackedTypes ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestPackedTypes MakeReadOnly() {
+      packedInt32_.MakeReadOnly();
+      packedInt64_.MakeReadOnly();
+      packedUint32_.MakeReadOnly();
+      packedUint64_.MakeReadOnly();
+      packedSint32_.MakeReadOnly();
+      packedSint64_.MakeReadOnly();
+      packedFixed32_.MakeReadOnly();
+      packedFixed64_.MakeReadOnly();
+      packedSfixed32_.MakeReadOnly();
+      packedSfixed64_.MakeReadOnly();
+      packedFloat_.MakeReadOnly();
+      packedDouble_.MakeReadOnly();
+      packedBool_.MakeReadOnly();
+      packedEnum_.MakeReadOnly();
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestPackedTypes prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestPackedTypes, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestPackedTypes cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private TestPackedTypes result;
+      
+      private TestPackedTypes PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestPackedTypes original = result;
+          result = new TestPackedTypes();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override TestPackedTypes MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestPackedTypes.Descriptor; }
+      }
+      
+      public override TestPackedTypes DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestPackedTypes.DefaultInstance; }
+      }
+      
+      public override TestPackedTypes BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestPackedTypes) {
+          return MergeFrom((TestPackedTypes) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(TestPackedTypes other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestPackedTypes.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.packedInt32_.Count != 0) {
+          result.packedInt32_.Add(other.packedInt32_);
+        }
+        if (other.packedInt64_.Count != 0) {
+          result.packedInt64_.Add(other.packedInt64_);
+        }
+        if (other.packedUint32_.Count != 0) {
+          result.packedUint32_.Add(other.packedUint32_);
+        }
+        if (other.packedUint64_.Count != 0) {
+          result.packedUint64_.Add(other.packedUint64_);
+        }
+        if (other.packedSint32_.Count != 0) {
+          result.packedSint32_.Add(other.packedSint32_);
+        }
+        if (other.packedSint64_.Count != 0) {
+          result.packedSint64_.Add(other.packedSint64_);
+        }
+        if (other.packedFixed32_.Count != 0) {
+          result.packedFixed32_.Add(other.packedFixed32_);
+        }
+        if (other.packedFixed64_.Count != 0) {
+          result.packedFixed64_.Add(other.packedFixed64_);
+        }
+        if (other.packedSfixed32_.Count != 0) {
+          result.packedSfixed32_.Add(other.packedSfixed32_);
+        }
+        if (other.packedSfixed64_.Count != 0) {
+          result.packedSfixed64_.Add(other.packedSfixed64_);
+        }
+        if (other.packedFloat_.Count != 0) {
+          result.packedFloat_.Add(other.packedFloat_);
+        }
+        if (other.packedDouble_.Count != 0) {
+          result.packedDouble_.Add(other.packedDouble_);
+        }
+        if (other.packedBool_.Count != 0) {
+          result.packedBool_.Add(other.packedBool_);
+        }
+        if (other.packedEnum_.Count != 0) {
+          result.packedEnum_.Add(other.packedEnum_);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testPackedTypesFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testPackedTypesFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 722:
+            case 720: {
+              input.ReadInt32Array(tag, field_name, result.packedInt32_);
+              break;
+            }
+            case 730:
+            case 728: {
+              input.ReadInt64Array(tag, field_name, result.packedInt64_);
+              break;
+            }
+            case 738:
+            case 736: {
+              input.ReadUInt32Array(tag, field_name, result.packedUint32_);
+              break;
+            }
+            case 746:
+            case 744: {
+              input.ReadUInt64Array(tag, field_name, result.packedUint64_);
+              break;
+            }
+            case 754:
+            case 752: {
+              input.ReadSInt32Array(tag, field_name, result.packedSint32_);
+              break;
+            }
+            case 762:
+            case 760: {
+              input.ReadSInt64Array(tag, field_name, result.packedSint64_);
+              break;
+            }
+            case 770:
+            case 773: {
+              input.ReadFixed32Array(tag, field_name, result.packedFixed32_);
+              break;
+            }
+            case 778:
+            case 777: {
+              input.ReadFixed64Array(tag, field_name, result.packedFixed64_);
+              break;
+            }
+            case 786:
+            case 789: {
+              input.ReadSFixed32Array(tag, field_name, result.packedSfixed32_);
+              break;
+            }
+            case 794:
+            case 793: {
+              input.ReadSFixed64Array(tag, field_name, result.packedSfixed64_);
+              break;
+            }
+            case 802:
+            case 805: {
+              input.ReadFloatArray(tag, field_name, result.packedFloat_);
+              break;
+            }
+            case 810:
+            case 809: {
+              input.ReadDoubleArray(tag, field_name, result.packedDouble_);
+              break;
+            }
+            case 818:
+            case 816: {
+              input.ReadBoolArray(tag, field_name, result.packedBool_);
+              break;
+            }
+            case 826:
+            case 824: {
+              scg::ICollection<object> unknownItems;
+              input.ReadEnumArray<global::Google.ProtocolBuffers.TestProtos.ForeignEnum>(tag, field_name, result.packedEnum_, out unknownItems);
+              if (unknownItems != null) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                foreach (object rawValue in unknownItems)
+                  if (rawValue is int)
+                    unknownFields.MergeVarintField(103, (ulong)(int)rawValue);
+              }
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public pbc::IPopsicleList<int> PackedInt32List {
+        get { return PrepareBuilder().packedInt32_; }
+      }
+      public int PackedInt32Count {
+        get { return result.PackedInt32Count; }
+      }
+      public int GetPackedInt32(int index) {
+        return result.GetPackedInt32(index);
+      }
+      public Builder SetPackedInt32(int index, int value) {
+        PrepareBuilder();
+        result.packedInt32_[index] = value;
+        return this;
+      }
+      public Builder AddPackedInt32(int value) {
+        PrepareBuilder();
+        result.packedInt32_.Add(value);
+        return this;
+      }
+      public Builder AddRangePackedInt32(scg::IEnumerable<int> values) {
+        PrepareBuilder();
+        result.packedInt32_.Add(values);
+        return this;
+      }
+      public Builder ClearPackedInt32() {
+        PrepareBuilder();
+        result.packedInt32_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<long> PackedInt64List {
+        get { return PrepareBuilder().packedInt64_; }
+      }
+      public int PackedInt64Count {
+        get { return result.PackedInt64Count; }
+      }
+      public long GetPackedInt64(int index) {
+        return result.GetPackedInt64(index);
+      }
+      public Builder SetPackedInt64(int index, long value) {
+        PrepareBuilder();
+        result.packedInt64_[index] = value;
+        return this;
+      }
+      public Builder AddPackedInt64(long value) {
+        PrepareBuilder();
+        result.packedInt64_.Add(value);
+        return this;
+      }
+      public Builder AddRangePackedInt64(scg::IEnumerable<long> values) {
+        PrepareBuilder();
+        result.packedInt64_.Add(values);
+        return this;
+      }
+      public Builder ClearPackedInt64() {
+        PrepareBuilder();
+        result.packedInt64_.Clear();
+        return this;
+      }
+      
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<uint> PackedUint32List {
+        get { return PrepareBuilder().packedUint32_; }
+      }
+      public int PackedUint32Count {
+        get { return result.PackedUint32Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint GetPackedUint32(int index) {
+        return result.GetPackedUint32(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetPackedUint32(int index, uint value) {
+        PrepareBuilder();
+        result.packedUint32_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddPackedUint32(uint value) {
+        PrepareBuilder();
+        result.packedUint32_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangePackedUint32(scg::IEnumerable<uint> values) {
+        PrepareBuilder();
+        result.packedUint32_.Add(values);
+        return this;
+      }
+      public Builder ClearPackedUint32() {
+        PrepareBuilder();
+        result.packedUint32_.Clear();
+        return this;
+      }
+      
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<ulong> PackedUint64List {
+        get { return PrepareBuilder().packedUint64_; }
+      }
+      public int PackedUint64Count {
+        get { return result.PackedUint64Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong GetPackedUint64(int index) {
+        return result.GetPackedUint64(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetPackedUint64(int index, ulong value) {
+        PrepareBuilder();
+        result.packedUint64_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddPackedUint64(ulong value) {
+        PrepareBuilder();
+        result.packedUint64_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangePackedUint64(scg::IEnumerable<ulong> values) {
+        PrepareBuilder();
+        result.packedUint64_.Add(values);
+        return this;
+      }
+      public Builder ClearPackedUint64() {
+        PrepareBuilder();
+        result.packedUint64_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<int> PackedSint32List {
+        get { return PrepareBuilder().packedSint32_; }
+      }
+      public int PackedSint32Count {
+        get { return result.PackedSint32Count; }
+      }
+      public int GetPackedSint32(int index) {
+        return result.GetPackedSint32(index);
+      }
+      public Builder SetPackedSint32(int index, int value) {
+        PrepareBuilder();
+        result.packedSint32_[index] = value;
+        return this;
+      }
+      public Builder AddPackedSint32(int value) {
+        PrepareBuilder();
+        result.packedSint32_.Add(value);
+        return this;
+      }
+      public Builder AddRangePackedSint32(scg::IEnumerable<int> values) {
+        PrepareBuilder();
+        result.packedSint32_.Add(values);
+        return this;
+      }
+      public Builder ClearPackedSint32() {
+        PrepareBuilder();
+        result.packedSint32_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<long> PackedSint64List {
+        get { return PrepareBuilder().packedSint64_; }
+      }
+      public int PackedSint64Count {
+        get { return result.PackedSint64Count; }
+      }
+      public long GetPackedSint64(int index) {
+        return result.GetPackedSint64(index);
+      }
+      public Builder SetPackedSint64(int index, long value) {
+        PrepareBuilder();
+        result.packedSint64_[index] = value;
+        return this;
+      }
+      public Builder AddPackedSint64(long value) {
+        PrepareBuilder();
+        result.packedSint64_.Add(value);
+        return this;
+      }
+      public Builder AddRangePackedSint64(scg::IEnumerable<long> values) {
+        PrepareBuilder();
+        result.packedSint64_.Add(values);
+        return this;
+      }
+      public Builder ClearPackedSint64() {
+        PrepareBuilder();
+        result.packedSint64_.Clear();
+        return this;
+      }
+      
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<uint> PackedFixed32List {
+        get { return PrepareBuilder().packedFixed32_; }
+      }
+      public int PackedFixed32Count {
+        get { return result.PackedFixed32Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint GetPackedFixed32(int index) {
+        return result.GetPackedFixed32(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetPackedFixed32(int index, uint value) {
+        PrepareBuilder();
+        result.packedFixed32_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddPackedFixed32(uint value) {
+        PrepareBuilder();
+        result.packedFixed32_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangePackedFixed32(scg::IEnumerable<uint> values) {
+        PrepareBuilder();
+        result.packedFixed32_.Add(values);
+        return this;
+      }
+      public Builder ClearPackedFixed32() {
+        PrepareBuilder();
+        result.packedFixed32_.Clear();
+        return this;
+      }
+      
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<ulong> PackedFixed64List {
+        get { return PrepareBuilder().packedFixed64_; }
+      }
+      public int PackedFixed64Count {
+        get { return result.PackedFixed64Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong GetPackedFixed64(int index) {
+        return result.GetPackedFixed64(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetPackedFixed64(int index, ulong value) {
+        PrepareBuilder();
+        result.packedFixed64_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddPackedFixed64(ulong value) {
+        PrepareBuilder();
+        result.packedFixed64_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangePackedFixed64(scg::IEnumerable<ulong> values) {
+        PrepareBuilder();
+        result.packedFixed64_.Add(values);
+        return this;
+      }
+      public Builder ClearPackedFixed64() {
+        PrepareBuilder();
+        result.packedFixed64_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<int> PackedSfixed32List {
+        get { return PrepareBuilder().packedSfixed32_; }
+      }
+      public int PackedSfixed32Count {
+        get { return result.PackedSfixed32Count; }
+      }
+      public int GetPackedSfixed32(int index) {
+        return result.GetPackedSfixed32(index);
+      }
+      public Builder SetPackedSfixed32(int index, int value) {
+        PrepareBuilder();
+        result.packedSfixed32_[index] = value;
+        return this;
+      }
+      public Builder AddPackedSfixed32(int value) {
+        PrepareBuilder();
+        result.packedSfixed32_.Add(value);
+        return this;
+      }
+      public Builder AddRangePackedSfixed32(scg::IEnumerable<int> values) {
+        PrepareBuilder();
+        result.packedSfixed32_.Add(values);
+        return this;
+      }
+      public Builder ClearPackedSfixed32() {
+        PrepareBuilder();
+        result.packedSfixed32_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<long> PackedSfixed64List {
+        get { return PrepareBuilder().packedSfixed64_; }
+      }
+      public int PackedSfixed64Count {
+        get { return result.PackedSfixed64Count; }
+      }
+      public long GetPackedSfixed64(int index) {
+        return result.GetPackedSfixed64(index);
+      }
+      public Builder SetPackedSfixed64(int index, long value) {
+        PrepareBuilder();
+        result.packedSfixed64_[index] = value;
+        return this;
+      }
+      public Builder AddPackedSfixed64(long value) {
+        PrepareBuilder();
+        result.packedSfixed64_.Add(value);
+        return this;
+      }
+      public Builder AddRangePackedSfixed64(scg::IEnumerable<long> values) {
+        PrepareBuilder();
+        result.packedSfixed64_.Add(values);
+        return this;
+      }
+      public Builder ClearPackedSfixed64() {
+        PrepareBuilder();
+        result.packedSfixed64_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<float> PackedFloatList {
+        get { return PrepareBuilder().packedFloat_; }
+      }
+      public int PackedFloatCount {
+        get { return result.PackedFloatCount; }
+      }
+      public float GetPackedFloat(int index) {
+        return result.GetPackedFloat(index);
+      }
+      public Builder SetPackedFloat(int index, float value) {
+        PrepareBuilder();
+        result.packedFloat_[index] = value;
+        return this;
+      }
+      public Builder AddPackedFloat(float value) {
+        PrepareBuilder();
+        result.packedFloat_.Add(value);
+        return this;
+      }
+      public Builder AddRangePackedFloat(scg::IEnumerable<float> values) {
+        PrepareBuilder();
+        result.packedFloat_.Add(values);
+        return this;
+      }
+      public Builder ClearPackedFloat() {
+        PrepareBuilder();
+        result.packedFloat_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<double> PackedDoubleList {
+        get { return PrepareBuilder().packedDouble_; }
+      }
+      public int PackedDoubleCount {
+        get { return result.PackedDoubleCount; }
+      }
+      public double GetPackedDouble(int index) {
+        return result.GetPackedDouble(index);
+      }
+      public Builder SetPackedDouble(int index, double value) {
+        PrepareBuilder();
+        result.packedDouble_[index] = value;
+        return this;
+      }
+      public Builder AddPackedDouble(double value) {
+        PrepareBuilder();
+        result.packedDouble_.Add(value);
+        return this;
+      }
+      public Builder AddRangePackedDouble(scg::IEnumerable<double> values) {
+        PrepareBuilder();
+        result.packedDouble_.Add(values);
+        return this;
+      }
+      public Builder ClearPackedDouble() {
+        PrepareBuilder();
+        result.packedDouble_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<bool> PackedBoolList {
+        get { return PrepareBuilder().packedBool_; }
+      }
+      public int PackedBoolCount {
+        get { return result.PackedBoolCount; }
+      }
+      public bool GetPackedBool(int index) {
+        return result.GetPackedBool(index);
+      }
+      public Builder SetPackedBool(int index, bool value) {
+        PrepareBuilder();
+        result.packedBool_[index] = value;
+        return this;
+      }
+      public Builder AddPackedBool(bool value) {
+        PrepareBuilder();
+        result.packedBool_.Add(value);
+        return this;
+      }
+      public Builder AddRangePackedBool(scg::IEnumerable<bool> values) {
+        PrepareBuilder();
+        result.packedBool_.Add(values);
+        return this;
+      }
+      public Builder ClearPackedBool() {
+        PrepareBuilder();
+        result.packedBool_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> PackedEnumList {
+        get { return PrepareBuilder().packedEnum_; }
+      }
+      public int PackedEnumCount {
+        get { return result.PackedEnumCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ForeignEnum GetPackedEnum(int index) {
+        return result.GetPackedEnum(index);
+      }
+      public Builder SetPackedEnum(int index, global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {
+        PrepareBuilder();
+        result.packedEnum_[index] = value;
+        return this;
+      }
+      public Builder AddPackedEnum(global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {
+        PrepareBuilder();
+        result.packedEnum_.Add(value);
+        return this;
+      }
+      public Builder AddRangePackedEnum(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> values) {
+        PrepareBuilder();
+        result.packedEnum_.Add(values);
+        return this;
+      }
+      public Builder ClearPackedEnum() {
+        PrepareBuilder();
+        result.packedEnum_.Clear();
+        return this;
+      }
+    }
+    static TestPackedTypes() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestUnpackedTypes : pb::GeneratedMessage<TestUnpackedTypes, TestUnpackedTypes.Builder> {
+    private TestUnpackedTypes() { }
+    private static readonly TestUnpackedTypes defaultInstance = new TestUnpackedTypes().MakeReadOnly();
+    private static readonly string[] _testUnpackedTypesFieldNames = new string[] { "unpacked_bool", "unpacked_double", "unpacked_enum", "unpacked_fixed32", "unpacked_fixed64", "unpacked_float", "unpacked_int32", "unpacked_int64", "unpacked_sfixed32", "unpacked_sfixed64", "unpacked_sint32", "unpacked_sint64", "unpacked_uint32", "unpacked_uint64" };
+    private static readonly uint[] _testUnpackedTypesFieldTags = new uint[] { 816, 809, 824, 773, 777, 805, 720, 728, 789, 793, 752, 760, 736, 744 };
+    public static TestUnpackedTypes DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestUnpackedTypes DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override TestUnpackedTypes ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestUnpackedTypes__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<TestUnpackedTypes, TestUnpackedTypes.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestUnpackedTypes__FieldAccessorTable; }
+    }
+    
+    public const int UnpackedInt32FieldNumber = 90;
+    private pbc::PopsicleList<int> unpackedInt32_ = new pbc::PopsicleList<int>();
+    public scg::IList<int> UnpackedInt32List {
+      get { return pbc::Lists.AsReadOnly(unpackedInt32_); }
+    }
+    public int UnpackedInt32Count {
+      get { return unpackedInt32_.Count; }
+    }
+    public int GetUnpackedInt32(int index) {
+      return unpackedInt32_[index];
+    }
+    
+    public const int UnpackedInt64FieldNumber = 91;
+    private pbc::PopsicleList<long> unpackedInt64_ = new pbc::PopsicleList<long>();
+    public scg::IList<long> UnpackedInt64List {
+      get { return pbc::Lists.AsReadOnly(unpackedInt64_); }
+    }
+    public int UnpackedInt64Count {
+      get { return unpackedInt64_.Count; }
+    }
+    public long GetUnpackedInt64(int index) {
+      return unpackedInt64_[index];
+    }
+    
+    public const int UnpackedUint32FieldNumber = 92;
+    private pbc::PopsicleList<uint> unpackedUint32_ = new pbc::PopsicleList<uint>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<uint> UnpackedUint32List {
+      get { return pbc::Lists.AsReadOnly(unpackedUint32_); }
+    }
+    public int UnpackedUint32Count {
+      get { return unpackedUint32_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint GetUnpackedUint32(int index) {
+      return unpackedUint32_[index];
+    }
+    
+    public const int UnpackedUint64FieldNumber = 93;
+    private pbc::PopsicleList<ulong> unpackedUint64_ = new pbc::PopsicleList<ulong>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<ulong> UnpackedUint64List {
+      get { return pbc::Lists.AsReadOnly(unpackedUint64_); }
+    }
+    public int UnpackedUint64Count {
+      get { return unpackedUint64_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong GetUnpackedUint64(int index) {
+      return unpackedUint64_[index];
+    }
+    
+    public const int UnpackedSint32FieldNumber = 94;
+    private pbc::PopsicleList<int> unpackedSint32_ = new pbc::PopsicleList<int>();
+    public scg::IList<int> UnpackedSint32List {
+      get { return pbc::Lists.AsReadOnly(unpackedSint32_); }
+    }
+    public int UnpackedSint32Count {
+      get { return unpackedSint32_.Count; }
+    }
+    public int GetUnpackedSint32(int index) {
+      return unpackedSint32_[index];
+    }
+    
+    public const int UnpackedSint64FieldNumber = 95;
+    private pbc::PopsicleList<long> unpackedSint64_ = new pbc::PopsicleList<long>();
+    public scg::IList<long> UnpackedSint64List {
+      get { return pbc::Lists.AsReadOnly(unpackedSint64_); }
+    }
+    public int UnpackedSint64Count {
+      get { return unpackedSint64_.Count; }
+    }
+    public long GetUnpackedSint64(int index) {
+      return unpackedSint64_[index];
+    }
+    
+    public const int UnpackedFixed32FieldNumber = 96;
+    private pbc::PopsicleList<uint> unpackedFixed32_ = new pbc::PopsicleList<uint>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<uint> UnpackedFixed32List {
+      get { return pbc::Lists.AsReadOnly(unpackedFixed32_); }
+    }
+    public int UnpackedFixed32Count {
+      get { return unpackedFixed32_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint GetUnpackedFixed32(int index) {
+      return unpackedFixed32_[index];
+    }
+    
+    public const int UnpackedFixed64FieldNumber = 97;
+    private pbc::PopsicleList<ulong> unpackedFixed64_ = new pbc::PopsicleList<ulong>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<ulong> UnpackedFixed64List {
+      get { return pbc::Lists.AsReadOnly(unpackedFixed64_); }
+    }
+    public int UnpackedFixed64Count {
+      get { return unpackedFixed64_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong GetUnpackedFixed64(int index) {
+      return unpackedFixed64_[index];
+    }
+    
+    public const int UnpackedSfixed32FieldNumber = 98;
+    private pbc::PopsicleList<int> unpackedSfixed32_ = new pbc::PopsicleList<int>();
+    public scg::IList<int> UnpackedSfixed32List {
+      get { return pbc::Lists.AsReadOnly(unpackedSfixed32_); }
+    }
+    public int UnpackedSfixed32Count {
+      get { return unpackedSfixed32_.Count; }
+    }
+    public int GetUnpackedSfixed32(int index) {
+      return unpackedSfixed32_[index];
+    }
+    
+    public const int UnpackedSfixed64FieldNumber = 99;
+    private pbc::PopsicleList<long> unpackedSfixed64_ = new pbc::PopsicleList<long>();
+    public scg::IList<long> UnpackedSfixed64List {
+      get { return pbc::Lists.AsReadOnly(unpackedSfixed64_); }
+    }
+    public int UnpackedSfixed64Count {
+      get { return unpackedSfixed64_.Count; }
+    }
+    public long GetUnpackedSfixed64(int index) {
+      return unpackedSfixed64_[index];
+    }
+    
+    public const int UnpackedFloatFieldNumber = 100;
+    private pbc::PopsicleList<float> unpackedFloat_ = new pbc::PopsicleList<float>();
+    public scg::IList<float> UnpackedFloatList {
+      get { return pbc::Lists.AsReadOnly(unpackedFloat_); }
+    }
+    public int UnpackedFloatCount {
+      get { return unpackedFloat_.Count; }
+    }
+    public float GetUnpackedFloat(int index) {
+      return unpackedFloat_[index];
+    }
+    
+    public const int UnpackedDoubleFieldNumber = 101;
+    private pbc::PopsicleList<double> unpackedDouble_ = new pbc::PopsicleList<double>();
+    public scg::IList<double> UnpackedDoubleList {
+      get { return pbc::Lists.AsReadOnly(unpackedDouble_); }
+    }
+    public int UnpackedDoubleCount {
+      get { return unpackedDouble_.Count; }
+    }
+    public double GetUnpackedDouble(int index) {
+      return unpackedDouble_[index];
+    }
+    
+    public const int UnpackedBoolFieldNumber = 102;
+    private pbc::PopsicleList<bool> unpackedBool_ = new pbc::PopsicleList<bool>();
+    public scg::IList<bool> UnpackedBoolList {
+      get { return pbc::Lists.AsReadOnly(unpackedBool_); }
+    }
+    public int UnpackedBoolCount {
+      get { return unpackedBool_.Count; }
+    }
+    public bool GetUnpackedBool(int index) {
+      return unpackedBool_[index];
+    }
+    
+    public const int UnpackedEnumFieldNumber = 103;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> unpackedEnum_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> UnpackedEnumList {
+      get { return pbc::Lists.AsReadOnly(unpackedEnum_); }
+    }
+    public int UnpackedEnumCount {
+      get { return unpackedEnum_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ForeignEnum GetUnpackedEnum(int index) {
+      return unpackedEnum_[index];
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testUnpackedTypesFieldNames;
+      if (unpackedInt32_.Count > 0) {
+        output.WriteInt32Array(90, field_names[6], unpackedInt32_);
+      }
+      if (unpackedInt64_.Count > 0) {
+        output.WriteInt64Array(91, field_names[7], unpackedInt64_);
+      }
+      if (unpackedUint32_.Count > 0) {
+        output.WriteUInt32Array(92, field_names[12], unpackedUint32_);
+      }
+      if (unpackedUint64_.Count > 0) {
+        output.WriteUInt64Array(93, field_names[13], unpackedUint64_);
+      }
+      if (unpackedSint32_.Count > 0) {
+        output.WriteSInt32Array(94, field_names[10], unpackedSint32_);
+      }
+      if (unpackedSint64_.Count > 0) {
+        output.WriteSInt64Array(95, field_names[11], unpackedSint64_);
+      }
+      if (unpackedFixed32_.Count > 0) {
+        output.WriteFixed32Array(96, field_names[3], unpackedFixed32_);
+      }
+      if (unpackedFixed64_.Count > 0) {
+        output.WriteFixed64Array(97, field_names[4], unpackedFixed64_);
+      }
+      if (unpackedSfixed32_.Count > 0) {
+        output.WriteSFixed32Array(98, field_names[8], unpackedSfixed32_);
+      }
+      if (unpackedSfixed64_.Count > 0) {
+        output.WriteSFixed64Array(99, field_names[9], unpackedSfixed64_);
+      }
+      if (unpackedFloat_.Count > 0) {
+        output.WriteFloatArray(100, field_names[5], unpackedFloat_);
+      }
+      if (unpackedDouble_.Count > 0) {
+        output.WriteDoubleArray(101, field_names[1], unpackedDouble_);
+      }
+      if (unpackedBool_.Count > 0) {
+        output.WriteBoolArray(102, field_names[0], unpackedBool_);
+      }
+      if (unpackedEnum_.Count > 0) {
+        output.WriteEnumArray(103, field_names[2], unpackedEnum_);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+      
+      size = 0;
+      {
+        int dataSize = 0;
+        foreach (int element in UnpackedInt32List) {
+          dataSize += pb::CodedOutputStream.ComputeInt32SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * unpackedInt32_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (long element in UnpackedInt64List) {
+          dataSize += pb::CodedOutputStream.ComputeInt64SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * unpackedInt64_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (uint element in UnpackedUint32List) {
+          dataSize += pb::CodedOutputStream.ComputeUInt32SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * unpackedUint32_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (ulong element in UnpackedUint64List) {
+          dataSize += pb::CodedOutputStream.ComputeUInt64SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * unpackedUint64_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (int element in UnpackedSint32List) {
+          dataSize += pb::CodedOutputStream.ComputeSInt32SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * unpackedSint32_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (long element in UnpackedSint64List) {
+          dataSize += pb::CodedOutputStream.ComputeSInt64SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * unpackedSint64_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 4 * unpackedFixed32_.Count;
+        size += dataSize;
+        size += 2 * unpackedFixed32_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 8 * unpackedFixed64_.Count;
+        size += dataSize;
+        size += 2 * unpackedFixed64_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 4 * unpackedSfixed32_.Count;
+        size += dataSize;
+        size += 2 * unpackedSfixed32_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 8 * unpackedSfixed64_.Count;
+        size += dataSize;
+        size += 2 * unpackedSfixed64_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 4 * unpackedFloat_.Count;
+        size += dataSize;
+        size += 2 * unpackedFloat_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 8 * unpackedDouble_.Count;
+        size += dataSize;
+        size += 2 * unpackedDouble_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 1 * unpackedBool_.Count;
+        size += dataSize;
+        size += 2 * unpackedBool_.Count;
+      }
+      {
+        int dataSize = 0;
+        if (unpackedEnum_.Count > 0) {
+          foreach (global::Google.ProtocolBuffers.TestProtos.ForeignEnum element in unpackedEnum_) {
+            dataSize += pb::CodedOutputStream.ComputeEnumSizeNoTag((int) element);
+          }
+          size += dataSize;
+          size += 2 * unpackedEnum_.Count;
+        }
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestUnpackedTypes ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestUnpackedTypes ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestUnpackedTypes ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestUnpackedTypes ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestUnpackedTypes ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestUnpackedTypes ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestUnpackedTypes ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestUnpackedTypes ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestUnpackedTypes ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestUnpackedTypes ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestUnpackedTypes MakeReadOnly() {
+      unpackedInt32_.MakeReadOnly();
+      unpackedInt64_.MakeReadOnly();
+      unpackedUint32_.MakeReadOnly();
+      unpackedUint64_.MakeReadOnly();
+      unpackedSint32_.MakeReadOnly();
+      unpackedSint64_.MakeReadOnly();
+      unpackedFixed32_.MakeReadOnly();
+      unpackedFixed64_.MakeReadOnly();
+      unpackedSfixed32_.MakeReadOnly();
+      unpackedSfixed64_.MakeReadOnly();
+      unpackedFloat_.MakeReadOnly();
+      unpackedDouble_.MakeReadOnly();
+      unpackedBool_.MakeReadOnly();
+      unpackedEnum_.MakeReadOnly();
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestUnpackedTypes prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestUnpackedTypes, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestUnpackedTypes cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private TestUnpackedTypes result;
+      
+      private TestUnpackedTypes PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestUnpackedTypes original = result;
+          result = new TestUnpackedTypes();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override TestUnpackedTypes MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestUnpackedTypes.Descriptor; }
+      }
+      
+      public override TestUnpackedTypes DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestUnpackedTypes.DefaultInstance; }
+      }
+      
+      public override TestUnpackedTypes BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestUnpackedTypes) {
+          return MergeFrom((TestUnpackedTypes) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(TestUnpackedTypes other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestUnpackedTypes.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.unpackedInt32_.Count != 0) {
+          result.unpackedInt32_.Add(other.unpackedInt32_);
+        }
+        if (other.unpackedInt64_.Count != 0) {
+          result.unpackedInt64_.Add(other.unpackedInt64_);
+        }
+        if (other.unpackedUint32_.Count != 0) {
+          result.unpackedUint32_.Add(other.unpackedUint32_);
+        }
+        if (other.unpackedUint64_.Count != 0) {
+          result.unpackedUint64_.Add(other.unpackedUint64_);
+        }
+        if (other.unpackedSint32_.Count != 0) {
+          result.unpackedSint32_.Add(other.unpackedSint32_);
+        }
+        if (other.unpackedSint64_.Count != 0) {
+          result.unpackedSint64_.Add(other.unpackedSint64_);
+        }
+        if (other.unpackedFixed32_.Count != 0) {
+          result.unpackedFixed32_.Add(other.unpackedFixed32_);
+        }
+        if (other.unpackedFixed64_.Count != 0) {
+          result.unpackedFixed64_.Add(other.unpackedFixed64_);
+        }
+        if (other.unpackedSfixed32_.Count != 0) {
+          result.unpackedSfixed32_.Add(other.unpackedSfixed32_);
+        }
+        if (other.unpackedSfixed64_.Count != 0) {
+          result.unpackedSfixed64_.Add(other.unpackedSfixed64_);
+        }
+        if (other.unpackedFloat_.Count != 0) {
+          result.unpackedFloat_.Add(other.unpackedFloat_);
+        }
+        if (other.unpackedDouble_.Count != 0) {
+          result.unpackedDouble_.Add(other.unpackedDouble_);
+        }
+        if (other.unpackedBool_.Count != 0) {
+          result.unpackedBool_.Add(other.unpackedBool_);
+        }
+        if (other.unpackedEnum_.Count != 0) {
+          result.unpackedEnum_.Add(other.unpackedEnum_);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testUnpackedTypesFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testUnpackedTypesFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 722:
+            case 720: {
+              input.ReadInt32Array(tag, field_name, result.unpackedInt32_);
+              break;
+            }
+            case 730:
+            case 728: {
+              input.ReadInt64Array(tag, field_name, result.unpackedInt64_);
+              break;
+            }
+            case 738:
+            case 736: {
+              input.ReadUInt32Array(tag, field_name, result.unpackedUint32_);
+              break;
+            }
+            case 746:
+            case 744: {
+              input.ReadUInt64Array(tag, field_name, result.unpackedUint64_);
+              break;
+            }
+            case 754:
+            case 752: {
+              input.ReadSInt32Array(tag, field_name, result.unpackedSint32_);
+              break;
+            }
+            case 762:
+            case 760: {
+              input.ReadSInt64Array(tag, field_name, result.unpackedSint64_);
+              break;
+            }
+            case 770:
+            case 773: {
+              input.ReadFixed32Array(tag, field_name, result.unpackedFixed32_);
+              break;
+            }
+            case 778:
+            case 777: {
+              input.ReadFixed64Array(tag, field_name, result.unpackedFixed64_);
+              break;
+            }
+            case 786:
+            case 789: {
+              input.ReadSFixed32Array(tag, field_name, result.unpackedSfixed32_);
+              break;
+            }
+            case 794:
+            case 793: {
+              input.ReadSFixed64Array(tag, field_name, result.unpackedSfixed64_);
+              break;
+            }
+            case 802:
+            case 805: {
+              input.ReadFloatArray(tag, field_name, result.unpackedFloat_);
+              break;
+            }
+            case 810:
+            case 809: {
+              input.ReadDoubleArray(tag, field_name, result.unpackedDouble_);
+              break;
+            }
+            case 818:
+            case 816: {
+              input.ReadBoolArray(tag, field_name, result.unpackedBool_);
+              break;
+            }
+            case 826:
+            case 824: {
+              scg::ICollection<object> unknownItems;
+              input.ReadEnumArray<global::Google.ProtocolBuffers.TestProtos.ForeignEnum>(tag, field_name, result.unpackedEnum_, out unknownItems);
+              if (unknownItems != null) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                foreach (object rawValue in unknownItems)
+                  if (rawValue is int)
+                    unknownFields.MergeVarintField(103, (ulong)(int)rawValue);
+              }
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public pbc::IPopsicleList<int> UnpackedInt32List {
+        get { return PrepareBuilder().unpackedInt32_; }
+      }
+      public int UnpackedInt32Count {
+        get { return result.UnpackedInt32Count; }
+      }
+      public int GetUnpackedInt32(int index) {
+        return result.GetUnpackedInt32(index);
+      }
+      public Builder SetUnpackedInt32(int index, int value) {
+        PrepareBuilder();
+        result.unpackedInt32_[index] = value;
+        return this;
+      }
+      public Builder AddUnpackedInt32(int value) {
+        PrepareBuilder();
+        result.unpackedInt32_.Add(value);
+        return this;
+      }
+      public Builder AddRangeUnpackedInt32(scg::IEnumerable<int> values) {
+        PrepareBuilder();
+        result.unpackedInt32_.Add(values);
+        return this;
+      }
+      public Builder ClearUnpackedInt32() {
+        PrepareBuilder();
+        result.unpackedInt32_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<long> UnpackedInt64List {
+        get { return PrepareBuilder().unpackedInt64_; }
+      }
+      public int UnpackedInt64Count {
+        get { return result.UnpackedInt64Count; }
+      }
+      public long GetUnpackedInt64(int index) {
+        return result.GetUnpackedInt64(index);
+      }
+      public Builder SetUnpackedInt64(int index, long value) {
+        PrepareBuilder();
+        result.unpackedInt64_[index] = value;
+        return this;
+      }
+      public Builder AddUnpackedInt64(long value) {
+        PrepareBuilder();
+        result.unpackedInt64_.Add(value);
+        return this;
+      }
+      public Builder AddRangeUnpackedInt64(scg::IEnumerable<long> values) {
+        PrepareBuilder();
+        result.unpackedInt64_.Add(values);
+        return this;
+      }
+      public Builder ClearUnpackedInt64() {
+        PrepareBuilder();
+        result.unpackedInt64_.Clear();
+        return this;
+      }
+      
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<uint> UnpackedUint32List {
+        get { return PrepareBuilder().unpackedUint32_; }
+      }
+      public int UnpackedUint32Count {
+        get { return result.UnpackedUint32Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint GetUnpackedUint32(int index) {
+        return result.GetUnpackedUint32(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetUnpackedUint32(int index, uint value) {
+        PrepareBuilder();
+        result.unpackedUint32_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddUnpackedUint32(uint value) {
+        PrepareBuilder();
+        result.unpackedUint32_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangeUnpackedUint32(scg::IEnumerable<uint> values) {
+        PrepareBuilder();
+        result.unpackedUint32_.Add(values);
+        return this;
+      }
+      public Builder ClearUnpackedUint32() {
+        PrepareBuilder();
+        result.unpackedUint32_.Clear();
+        return this;
+      }
+      
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<ulong> UnpackedUint64List {
+        get { return PrepareBuilder().unpackedUint64_; }
+      }
+      public int UnpackedUint64Count {
+        get { return result.UnpackedUint64Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong GetUnpackedUint64(int index) {
+        return result.GetUnpackedUint64(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetUnpackedUint64(int index, ulong value) {
+        PrepareBuilder();
+        result.unpackedUint64_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddUnpackedUint64(ulong value) {
+        PrepareBuilder();
+        result.unpackedUint64_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangeUnpackedUint64(scg::IEnumerable<ulong> values) {
+        PrepareBuilder();
+        result.unpackedUint64_.Add(values);
+        return this;
+      }
+      public Builder ClearUnpackedUint64() {
+        PrepareBuilder();
+        result.unpackedUint64_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<int> UnpackedSint32List {
+        get { return PrepareBuilder().unpackedSint32_; }
+      }
+      public int UnpackedSint32Count {
+        get { return result.UnpackedSint32Count; }
+      }
+      public int GetUnpackedSint32(int index) {
+        return result.GetUnpackedSint32(index);
+      }
+      public Builder SetUnpackedSint32(int index, int value) {
+        PrepareBuilder();
+        result.unpackedSint32_[index] = value;
+        return this;
+      }
+      public Builder AddUnpackedSint32(int value) {
+        PrepareBuilder();
+        result.unpackedSint32_.Add(value);
+        return this;
+      }
+      public Builder AddRangeUnpackedSint32(scg::IEnumerable<int> values) {
+        PrepareBuilder();
+        result.unpackedSint32_.Add(values);
+        return this;
+      }
+      public Builder ClearUnpackedSint32() {
+        PrepareBuilder();
+        result.unpackedSint32_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<long> UnpackedSint64List {
+        get { return PrepareBuilder().unpackedSint64_; }
+      }
+      public int UnpackedSint64Count {
+        get { return result.UnpackedSint64Count; }
+      }
+      public long GetUnpackedSint64(int index) {
+        return result.GetUnpackedSint64(index);
+      }
+      public Builder SetUnpackedSint64(int index, long value) {
+        PrepareBuilder();
+        result.unpackedSint64_[index] = value;
+        return this;
+      }
+      public Builder AddUnpackedSint64(long value) {
+        PrepareBuilder();
+        result.unpackedSint64_.Add(value);
+        return this;
+      }
+      public Builder AddRangeUnpackedSint64(scg::IEnumerable<long> values) {
+        PrepareBuilder();
+        result.unpackedSint64_.Add(values);
+        return this;
+      }
+      public Builder ClearUnpackedSint64() {
+        PrepareBuilder();
+        result.unpackedSint64_.Clear();
+        return this;
+      }
+      
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<uint> UnpackedFixed32List {
+        get { return PrepareBuilder().unpackedFixed32_; }
+      }
+      public int UnpackedFixed32Count {
+        get { return result.UnpackedFixed32Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint GetUnpackedFixed32(int index) {
+        return result.GetUnpackedFixed32(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetUnpackedFixed32(int index, uint value) {
+        PrepareBuilder();
+        result.unpackedFixed32_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddUnpackedFixed32(uint value) {
+        PrepareBuilder();
+        result.unpackedFixed32_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangeUnpackedFixed32(scg::IEnumerable<uint> values) {
+        PrepareBuilder();
+        result.unpackedFixed32_.Add(values);
+        return this;
+      }
+      public Builder ClearUnpackedFixed32() {
+        PrepareBuilder();
+        result.unpackedFixed32_.Clear();
+        return this;
+      }
+      
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<ulong> UnpackedFixed64List {
+        get { return PrepareBuilder().unpackedFixed64_; }
+      }
+      public int UnpackedFixed64Count {
+        get { return result.UnpackedFixed64Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong GetUnpackedFixed64(int index) {
+        return result.GetUnpackedFixed64(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetUnpackedFixed64(int index, ulong value) {
+        PrepareBuilder();
+        result.unpackedFixed64_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddUnpackedFixed64(ulong value) {
+        PrepareBuilder();
+        result.unpackedFixed64_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangeUnpackedFixed64(scg::IEnumerable<ulong> values) {
+        PrepareBuilder();
+        result.unpackedFixed64_.Add(values);
+        return this;
+      }
+      public Builder ClearUnpackedFixed64() {
+        PrepareBuilder();
+        result.unpackedFixed64_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<int> UnpackedSfixed32List {
+        get { return PrepareBuilder().unpackedSfixed32_; }
+      }
+      public int UnpackedSfixed32Count {
+        get { return result.UnpackedSfixed32Count; }
+      }
+      public int GetUnpackedSfixed32(int index) {
+        return result.GetUnpackedSfixed32(index);
+      }
+      public Builder SetUnpackedSfixed32(int index, int value) {
+        PrepareBuilder();
+        result.unpackedSfixed32_[index] = value;
+        return this;
+      }
+      public Builder AddUnpackedSfixed32(int value) {
+        PrepareBuilder();
+        result.unpackedSfixed32_.Add(value);
+        return this;
+      }
+      public Builder AddRangeUnpackedSfixed32(scg::IEnumerable<int> values) {
+        PrepareBuilder();
+        result.unpackedSfixed32_.Add(values);
+        return this;
+      }
+      public Builder ClearUnpackedSfixed32() {
+        PrepareBuilder();
+        result.unpackedSfixed32_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<long> UnpackedSfixed64List {
+        get { return PrepareBuilder().unpackedSfixed64_; }
+      }
+      public int UnpackedSfixed64Count {
+        get { return result.UnpackedSfixed64Count; }
+      }
+      public long GetUnpackedSfixed64(int index) {
+        return result.GetUnpackedSfixed64(index);
+      }
+      public Builder SetUnpackedSfixed64(int index, long value) {
+        PrepareBuilder();
+        result.unpackedSfixed64_[index] = value;
+        return this;
+      }
+      public Builder AddUnpackedSfixed64(long value) {
+        PrepareBuilder();
+        result.unpackedSfixed64_.Add(value);
+        return this;
+      }
+      public Builder AddRangeUnpackedSfixed64(scg::IEnumerable<long> values) {
+        PrepareBuilder();
+        result.unpackedSfixed64_.Add(values);
+        return this;
+      }
+      public Builder ClearUnpackedSfixed64() {
+        PrepareBuilder();
+        result.unpackedSfixed64_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<float> UnpackedFloatList {
+        get { return PrepareBuilder().unpackedFloat_; }
+      }
+      public int UnpackedFloatCount {
+        get { return result.UnpackedFloatCount; }
+      }
+      public float GetUnpackedFloat(int index) {
+        return result.GetUnpackedFloat(index);
+      }
+      public Builder SetUnpackedFloat(int index, float value) {
+        PrepareBuilder();
+        result.unpackedFloat_[index] = value;
+        return this;
+      }
+      public Builder AddUnpackedFloat(float value) {
+        PrepareBuilder();
+        result.unpackedFloat_.Add(value);
+        return this;
+      }
+      public Builder AddRangeUnpackedFloat(scg::IEnumerable<float> values) {
+        PrepareBuilder();
+        result.unpackedFloat_.Add(values);
+        return this;
+      }
+      public Builder ClearUnpackedFloat() {
+        PrepareBuilder();
+        result.unpackedFloat_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<double> UnpackedDoubleList {
+        get { return PrepareBuilder().unpackedDouble_; }
+      }
+      public int UnpackedDoubleCount {
+        get { return result.UnpackedDoubleCount; }
+      }
+      public double GetUnpackedDouble(int index) {
+        return result.GetUnpackedDouble(index);
+      }
+      public Builder SetUnpackedDouble(int index, double value) {
+        PrepareBuilder();
+        result.unpackedDouble_[index] = value;
+        return this;
+      }
+      public Builder AddUnpackedDouble(double value) {
+        PrepareBuilder();
+        result.unpackedDouble_.Add(value);
+        return this;
+      }
+      public Builder AddRangeUnpackedDouble(scg::IEnumerable<double> values) {
+        PrepareBuilder();
+        result.unpackedDouble_.Add(values);
+        return this;
+      }
+      public Builder ClearUnpackedDouble() {
+        PrepareBuilder();
+        result.unpackedDouble_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<bool> UnpackedBoolList {
+        get { return PrepareBuilder().unpackedBool_; }
+      }
+      public int UnpackedBoolCount {
+        get { return result.UnpackedBoolCount; }
+      }
+      public bool GetUnpackedBool(int index) {
+        return result.GetUnpackedBool(index);
+      }
+      public Builder SetUnpackedBool(int index, bool value) {
+        PrepareBuilder();
+        result.unpackedBool_[index] = value;
+        return this;
+      }
+      public Builder AddUnpackedBool(bool value) {
+        PrepareBuilder();
+        result.unpackedBool_.Add(value);
+        return this;
+      }
+      public Builder AddRangeUnpackedBool(scg::IEnumerable<bool> values) {
+        PrepareBuilder();
+        result.unpackedBool_.Add(values);
+        return this;
+      }
+      public Builder ClearUnpackedBool() {
+        PrepareBuilder();
+        result.unpackedBool_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> UnpackedEnumList {
+        get { return PrepareBuilder().unpackedEnum_; }
+      }
+      public int UnpackedEnumCount {
+        get { return result.UnpackedEnumCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ForeignEnum GetUnpackedEnum(int index) {
+        return result.GetUnpackedEnum(index);
+      }
+      public Builder SetUnpackedEnum(int index, global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {
+        PrepareBuilder();
+        result.unpackedEnum_[index] = value;
+        return this;
+      }
+      public Builder AddUnpackedEnum(global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {
+        PrepareBuilder();
+        result.unpackedEnum_.Add(value);
+        return this;
+      }
+      public Builder AddRangeUnpackedEnum(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.ForeignEnum> values) {
+        PrepareBuilder();
+        result.unpackedEnum_.Add(values);
+        return this;
+      }
+      public Builder ClearUnpackedEnum() {
+        PrepareBuilder();
+        result.unpackedEnum_.Clear();
+        return this;
+      }
+    }
+    static TestUnpackedTypes() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestPackedExtensions : pb::ExtendableMessage<TestPackedExtensions, TestPackedExtensions.Builder> {
+    private TestPackedExtensions() { }
+    private static readonly TestPackedExtensions defaultInstance = new TestPackedExtensions().MakeReadOnly();
+    private static readonly string[] _testPackedExtensionsFieldNames = new string[] {  };
+    private static readonly uint[] _testPackedExtensionsFieldTags = new uint[] {  };
+    public static TestPackedExtensions DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestPackedExtensions DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override TestPackedExtensions ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestPackedExtensions__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<TestPackedExtensions, TestPackedExtensions.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestPackedExtensions__FieldAccessorTable; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (!ExtensionsAreInitialized) return false;
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testPackedExtensionsFieldNames;
+      pb::ExtendableMessage<TestPackedExtensions, TestPackedExtensions.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;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+      
+      size = 0;
+      size += ExtensionsSerializedSize;
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestPackedExtensions ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestPackedExtensions ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestPackedExtensions ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestPackedExtensions ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestPackedExtensions ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestPackedExtensions ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestPackedExtensions ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestPackedExtensions ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestPackedExtensions ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestPackedExtensions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestPackedExtensions MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestPackedExtensions prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::ExtendableBuilder<TestPackedExtensions, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestPackedExtensions cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private TestPackedExtensions result;
+      
+      private TestPackedExtensions PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestPackedExtensions original = result;
+          result = new TestPackedExtensions();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override TestPackedExtensions MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestPackedExtensions.Descriptor; }
+      }
+      
+      public override TestPackedExtensions DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestPackedExtensions.DefaultInstance; }
+      }
+      
+      public override TestPackedExtensions BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestPackedExtensions) {
+          return MergeFrom((TestPackedExtensions) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(TestPackedExtensions other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestPackedExtensions.DefaultInstance) return this;
+        PrepareBuilder();
+          this.MergeExtensionFields(other);
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testPackedExtensionsFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testPackedExtensionsFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+    }
+    static TestPackedExtensions() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestDynamicExtensions : pb::GeneratedMessage<TestDynamicExtensions, TestDynamicExtensions.Builder> {
+    private TestDynamicExtensions() { }
+    private static readonly TestDynamicExtensions defaultInstance = new TestDynamicExtensions().MakeReadOnly();
+    private static readonly string[] _testDynamicExtensionsFieldNames = new string[] { "dynamic_enum_extension", "dynamic_message_extension", "enum_extension", "message_extension", "packed_extension", "repeated_extension", "scalar_extension" };
+    private static readonly uint[] _testDynamicExtensionsFieldTags = new uint[] { 16016, 16034, 16008, 16026, 16050, 16042, 16005 };
+    public static TestDynamicExtensions DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestDynamicExtensions DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override TestDynamicExtensions ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestDynamicExtensions__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<TestDynamicExtensions, TestDynamicExtensions.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestDynamicExtensions__FieldAccessorTable; }
+    }
+    
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public static partial class Types {
+      public enum DynamicEnumType {
+        DYNAMIC_FOO = 2200,
+        DYNAMIC_BAR = 2201,
+        DYNAMIC_BAZ = 2202,
+      }
+      
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class DynamicMessageType : pb::GeneratedMessage<DynamicMessageType, DynamicMessageType.Builder> {
+        private DynamicMessageType() { }
+        private static readonly DynamicMessageType defaultInstance = new DynamicMessageType().MakeReadOnly();
+        private static readonly string[] _dynamicMessageTypeFieldNames = new string[] { "dynamic_field" };
+        private static readonly uint[] _dynamicMessageTypeFieldTags = new uint[] { 16800 };
+        public static DynamicMessageType DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override DynamicMessageType DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+        
+        protected override DynamicMessageType ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestDynamicExtensions_DynamicMessageType__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<DynamicMessageType, DynamicMessageType.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestDynamicExtensions_DynamicMessageType__FieldAccessorTable; }
+        }
+        
+        public const int DynamicFieldFieldNumber = 2100;
+        private bool hasDynamicField;
+        private int dynamicField_;
+        public bool HasDynamicField {
+          get { return hasDynamicField; }
+        }
+        public int DynamicField {
+          get { return dynamicField_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          CalcSerializedSize();
+          string[] field_names = _dynamicMessageTypeFieldNames;
+          if (hasDynamicField) {
+            output.WriteInt32(2100, field_names[0], DynamicField);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            return CalcSerializedSize();
+          }
+        }
+        
+        private int CalcSerializedSize() {
+          int size = memoizedSerializedSize;
+          if (size != -1) return size;
+          
+          size = 0;
+          if (hasDynamicField) {
+            size += pb::CodedOutputStream.ComputeInt32Size(2100, DynamicField);
+          }
+          size += UnknownFields.SerializedSize;
+          memoizedSerializedSize = size;
+          return size;
+        }
+        public static DynamicMessageType ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static DynamicMessageType ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static DynamicMessageType ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static DynamicMessageType ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static DynamicMessageType ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static DynamicMessageType ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static DynamicMessageType ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static DynamicMessageType ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static DynamicMessageType ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static DynamicMessageType ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private DynamicMessageType MakeReadOnly() {
+          return this;
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(DynamicMessageType prototype) {
+          return new Builder(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public sealed partial class Builder : pb::GeneratedBuilder<DynamicMessageType, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(DynamicMessageType cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+          
+          private bool resultIsReadOnly;
+          private DynamicMessageType result;
+          
+          private DynamicMessageType PrepareBuilder() {
+            if (resultIsReadOnly) {
+              DynamicMessageType original = result;
+              result = new DynamicMessageType();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+          
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+          
+          protected override DynamicMessageType MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+          
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+          
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType.Descriptor; }
+          }
+          
+          public override DynamicMessageType DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType.DefaultInstance; }
+          }
+          
+          public override DynamicMessageType BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is DynamicMessageType) {
+              return MergeFrom((DynamicMessageType) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(DynamicMessageType other) {
+            if (other == global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasDynamicField) {
+              DynamicField = other.DynamicField;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_dynamicMessageTypeFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _dynamicMessageTypeFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 16800: {
+                  result.hasDynamicField = input.ReadInt32(ref result.dynamicField_);
+                  break;
+                }
+              }
+            }
+            
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+          
+          
+          public bool HasDynamicField {
+            get { return result.hasDynamicField; }
+          }
+          public int DynamicField {
+            get { return result.DynamicField; }
+            set { SetDynamicField(value); }
+          }
+          public Builder SetDynamicField(int value) {
+            PrepareBuilder();
+            result.hasDynamicField = true;
+            result.dynamicField_ = value;
+            return this;
+          }
+          public Builder ClearDynamicField() {
+            PrepareBuilder();
+            result.hasDynamicField = false;
+            result.dynamicField_ = 0;
+            return this;
+          }
+        }
+        static DynamicMessageType() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+        }
+      }
+      
+    }
+    #endregion
+    
+    public const int ScalarExtensionFieldNumber = 2000;
+    private bool hasScalarExtension;
+    private uint scalarExtension_;
+    public bool HasScalarExtension {
+      get { return hasScalarExtension; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint ScalarExtension {
+      get { return scalarExtension_; }
+    }
+    
+    public const int EnumExtensionFieldNumber = 2001;
+    private bool hasEnumExtension;
+    private global::Google.ProtocolBuffers.TestProtos.ForeignEnum enumExtension_ = global::Google.ProtocolBuffers.TestProtos.ForeignEnum.FOREIGN_FOO;
+    public bool HasEnumExtension {
+      get { return hasEnumExtension; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ForeignEnum EnumExtension {
+      get { return enumExtension_; }
+    }
+    
+    public const int DynamicEnumExtensionFieldNumber = 2002;
+    private bool hasDynamicEnumExtension;
+    private global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicEnumType dynamicEnumExtension_ = global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicEnumType.DYNAMIC_FOO;
+    public bool HasDynamicEnumExtension {
+      get { return hasDynamicEnumExtension; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicEnumType DynamicEnumExtension {
+      get { return dynamicEnumExtension_; }
+    }
+    
+    public const int MessageExtensionFieldNumber = 2003;
+    private bool hasMessageExtension;
+    private global::Google.ProtocolBuffers.TestProtos.ForeignMessage messageExtension_;
+    public bool HasMessageExtension {
+      get { return hasMessageExtension; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.ForeignMessage MessageExtension {
+      get { return messageExtension_ ?? global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance; }
+    }
+    
+    public const int DynamicMessageExtensionFieldNumber = 2004;
+    private bool hasDynamicMessageExtension;
+    private global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType dynamicMessageExtension_;
+    public bool HasDynamicMessageExtension {
+      get { return hasDynamicMessageExtension; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType DynamicMessageExtension {
+      get { return dynamicMessageExtension_ ?? global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType.DefaultInstance; }
+    }
+    
+    public const int RepeatedExtensionFieldNumber = 2005;
+    private pbc::PopsicleList<string> repeatedExtension_ = new pbc::PopsicleList<string>();
+    public scg::IList<string> RepeatedExtensionList {
+      get { return pbc::Lists.AsReadOnly(repeatedExtension_); }
+    }
+    public int RepeatedExtensionCount {
+      get { return repeatedExtension_.Count; }
+    }
+    public string GetRepeatedExtension(int index) {
+      return repeatedExtension_[index];
+    }
+    
+    public const int PackedExtensionFieldNumber = 2006;
+    private int packedExtensionMemoizedSerializedSize;
+    private pbc::PopsicleList<int> packedExtension_ = new pbc::PopsicleList<int>();
+    public scg::IList<int> PackedExtensionList {
+      get { return pbc::Lists.AsReadOnly(packedExtension_); }
+    }
+    public int PackedExtensionCount {
+      get { return packedExtension_.Count; }
+    }
+    public int GetPackedExtension(int index) {
+      return packedExtension_[index];
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testDynamicExtensionsFieldNames;
+      if (hasScalarExtension) {
+        output.WriteFixed32(2000, field_names[6], ScalarExtension);
+      }
+      if (hasEnumExtension) {
+        output.WriteEnum(2001, field_names[2], (int) EnumExtension, EnumExtension);
+      }
+      if (hasDynamicEnumExtension) {
+        output.WriteEnum(2002, field_names[0], (int) DynamicEnumExtension, DynamicEnumExtension);
+      }
+      if (hasMessageExtension) {
+        output.WriteMessage(2003, field_names[3], MessageExtension);
+      }
+      if (hasDynamicMessageExtension) {
+        output.WriteMessage(2004, field_names[1], DynamicMessageExtension);
+      }
+      if (repeatedExtension_.Count > 0) {
+        output.WriteStringArray(2005, field_names[5], repeatedExtension_);
+      }
+      if (packedExtension_.Count > 0) {
+        output.WritePackedSInt32Array(2006, field_names[4], packedExtensionMemoizedSerializedSize, packedExtension_);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+      
+      size = 0;
+      if (hasScalarExtension) {
+        size += pb::CodedOutputStream.ComputeFixed32Size(2000, ScalarExtension);
+      }
+      if (hasEnumExtension) {
+        size += pb::CodedOutputStream.ComputeEnumSize(2001, (int) EnumExtension);
+      }
+      if (hasDynamicEnumExtension) {
+        size += pb::CodedOutputStream.ComputeEnumSize(2002, (int) DynamicEnumExtension);
+      }
+      if (hasMessageExtension) {
+        size += pb::CodedOutputStream.ComputeMessageSize(2003, MessageExtension);
+      }
+      if (hasDynamicMessageExtension) {
+        size += pb::CodedOutputStream.ComputeMessageSize(2004, DynamicMessageExtension);
+      }
+      {
+        int dataSize = 0;
+        foreach (string element in RepeatedExtensionList) {
+          dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * repeatedExtension_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (int element in PackedExtensionList) {
+          dataSize += pb::CodedOutputStream.ComputeSInt32SizeNoTag(element);
+        }
+        size += dataSize;
+        if (packedExtension_.Count != 0) {
+          size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+        }
+        packedExtensionMemoizedSerializedSize = dataSize;
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestDynamicExtensions ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestDynamicExtensions ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestDynamicExtensions ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestDynamicExtensions ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestDynamicExtensions ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestDynamicExtensions ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestDynamicExtensions ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestDynamicExtensions ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestDynamicExtensions ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestDynamicExtensions ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestDynamicExtensions MakeReadOnly() {
+      repeatedExtension_.MakeReadOnly();
+      packedExtension_.MakeReadOnly();
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestDynamicExtensions prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestDynamicExtensions, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestDynamicExtensions cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private TestDynamicExtensions result;
+      
+      private TestDynamicExtensions PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestDynamicExtensions original = result;
+          result = new TestDynamicExtensions();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override TestDynamicExtensions MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Descriptor; }
+      }
+      
+      public override TestDynamicExtensions DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.DefaultInstance; }
+      }
+      
+      public override TestDynamicExtensions BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestDynamicExtensions) {
+          return MergeFrom((TestDynamicExtensions) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(TestDynamicExtensions other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasScalarExtension) {
+          ScalarExtension = other.ScalarExtension;
+        }
+        if (other.HasEnumExtension) {
+          EnumExtension = other.EnumExtension;
+        }
+        if (other.HasDynamicEnumExtension) {
+          DynamicEnumExtension = other.DynamicEnumExtension;
+        }
+        if (other.HasMessageExtension) {
+          MergeMessageExtension(other.MessageExtension);
+        }
+        if (other.HasDynamicMessageExtension) {
+          MergeDynamicMessageExtension(other.DynamicMessageExtension);
+        }
+        if (other.repeatedExtension_.Count != 0) {
+          result.repeatedExtension_.Add(other.repeatedExtension_);
+        }
+        if (other.packedExtension_.Count != 0) {
+          result.packedExtension_.Add(other.packedExtension_);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testDynamicExtensionsFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testDynamicExtensionsFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 16005: {
+              result.hasScalarExtension = input.ReadFixed32(ref result.scalarExtension_);
+              break;
+            }
+            case 16008: {
+              object unknown;
+              if(input.ReadEnum(ref result.enumExtension_, out unknown)) {
+                result.hasEnumExtension = true;
+              } else if(unknown is int) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                unknownFields.MergeVarintField(2001, (ulong)(int)unknown);
+              }
+              break;
+            }
+            case 16016: {
+              object unknown;
+              if(input.ReadEnum(ref result.dynamicEnumExtension_, out unknown)) {
+                result.hasDynamicEnumExtension = true;
+              } else if(unknown is int) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                unknownFields.MergeVarintField(2002, (ulong)(int)unknown);
+              }
+              break;
+            }
+            case 16026: {
+              global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.ForeignMessage.CreateBuilder();
+              if (result.hasMessageExtension) {
+                subBuilder.MergeFrom(MessageExtension);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              MessageExtension = subBuilder.BuildPartial();
+              break;
+            }
+            case 16034: {
+              global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType.CreateBuilder();
+              if (result.hasDynamicMessageExtension) {
+                subBuilder.MergeFrom(DynamicMessageExtension);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              DynamicMessageExtension = subBuilder.BuildPartial();
+              break;
+            }
+            case 16042: {
+              input.ReadStringArray(tag, field_name, result.repeatedExtension_);
+              break;
+            }
+            case 16050:
+            case 16048: {
+              input.ReadSInt32Array(tag, field_name, result.packedExtension_);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public bool HasScalarExtension {
+        get { return result.hasScalarExtension; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint ScalarExtension {
+        get { return result.ScalarExtension; }
+        set { SetScalarExtension(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetScalarExtension(uint value) {
+        PrepareBuilder();
+        result.hasScalarExtension = true;
+        result.scalarExtension_ = value;
+        return this;
+      }
+      public Builder ClearScalarExtension() {
+        PrepareBuilder();
+        result.hasScalarExtension = false;
+        result.scalarExtension_ = 0;
+        return this;
+      }
+      
+      public bool HasEnumExtension {
+       get { return result.hasEnumExtension; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ForeignEnum EnumExtension {
+        get { return result.EnumExtension; }
+        set { SetEnumExtension(value); }
+      }
+      public Builder SetEnumExtension(global::Google.ProtocolBuffers.TestProtos.ForeignEnum value) {
+        PrepareBuilder();
+        result.hasEnumExtension = true;
+        result.enumExtension_ = value;
+        return this;
+      }
+      public Builder ClearEnumExtension() {
+        PrepareBuilder();
+        result.hasEnumExtension = false;
+        result.enumExtension_ = global::Google.ProtocolBuffers.TestProtos.ForeignEnum.FOREIGN_FOO;
+        return this;
+      }
+      
+      public bool HasDynamicEnumExtension {
+       get { return result.hasDynamicEnumExtension; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicEnumType DynamicEnumExtension {
+        get { return result.DynamicEnumExtension; }
+        set { SetDynamicEnumExtension(value); }
+      }
+      public Builder SetDynamicEnumExtension(global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicEnumType value) {
+        PrepareBuilder();
+        result.hasDynamicEnumExtension = true;
+        result.dynamicEnumExtension_ = value;
+        return this;
+      }
+      public Builder ClearDynamicEnumExtension() {
+        PrepareBuilder();
+        result.hasDynamicEnumExtension = false;
+        result.dynamicEnumExtension_ = global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicEnumType.DYNAMIC_FOO;
+        return this;
+      }
+      
+      public bool HasMessageExtension {
+       get { return result.hasMessageExtension; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.ForeignMessage MessageExtension {
+        get { return result.MessageExtension; }
+        set { SetMessageExtension(value); }
+      }
+      public Builder SetMessageExtension(global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasMessageExtension = true;
+        result.messageExtension_ = value;
+        return this;
+      }
+      public Builder SetMessageExtension(global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasMessageExtension = true;
+        result.messageExtension_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeMessageExtension(global::Google.ProtocolBuffers.TestProtos.ForeignMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasMessageExtension &&
+            result.messageExtension_ != global::Google.ProtocolBuffers.TestProtos.ForeignMessage.DefaultInstance) {
+            result.messageExtension_ = global::Google.ProtocolBuffers.TestProtos.ForeignMessage.CreateBuilder(result.messageExtension_).MergeFrom(value).BuildPartial();
+        } else {
+          result.messageExtension_ = value;
+        }
+        result.hasMessageExtension = true;
+        return this;
+      }
+      public Builder ClearMessageExtension() {
+        PrepareBuilder();
+        result.hasMessageExtension = false;
+        result.messageExtension_ = null;
+        return this;
+      }
+      
+      public bool HasDynamicMessageExtension {
+       get { return result.hasDynamicMessageExtension; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType DynamicMessageExtension {
+        get { return result.DynamicMessageExtension; }
+        set { SetDynamicMessageExtension(value); }
+      }
+      public Builder SetDynamicMessageExtension(global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.hasDynamicMessageExtension = true;
+        result.dynamicMessageExtension_ = value;
+        return this;
+      }
+      public Builder SetDynamicMessageExtension(global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.hasDynamicMessageExtension = true;
+        result.dynamicMessageExtension_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeDynamicMessageExtension(global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        if (result.hasDynamicMessageExtension &&
+            result.dynamicMessageExtension_ != global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType.DefaultInstance) {
+            result.dynamicMessageExtension_ = global::Google.ProtocolBuffers.TestProtos.TestDynamicExtensions.Types.DynamicMessageType.CreateBuilder(result.dynamicMessageExtension_).MergeFrom(value).BuildPartial();
+        } else {
+          result.dynamicMessageExtension_ = value;
+        }
+        result.hasDynamicMessageExtension = true;
+        return this;
+      }
+      public Builder ClearDynamicMessageExtension() {
+        PrepareBuilder();
+        result.hasDynamicMessageExtension = false;
+        result.dynamicMessageExtension_ = null;
+        return this;
+      }
+      
+      public pbc::IPopsicleList<string> RepeatedExtensionList {
+        get { return PrepareBuilder().repeatedExtension_; }
+      }
+      public int RepeatedExtensionCount {
+        get { return result.RepeatedExtensionCount; }
+      }
+      public string GetRepeatedExtension(int index) {
+        return result.GetRepeatedExtension(index);
+      }
+      public Builder SetRepeatedExtension(int index, string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedExtension_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedExtension(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.repeatedExtension_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedExtension(scg::IEnumerable<string> values) {
+        PrepareBuilder();
+        result.repeatedExtension_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedExtension() {
+        PrepareBuilder();
+        result.repeatedExtension_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<int> PackedExtensionList {
+        get { return PrepareBuilder().packedExtension_; }
+      }
+      public int PackedExtensionCount {
+        get { return result.PackedExtensionCount; }
+      }
+      public int GetPackedExtension(int index) {
+        return result.GetPackedExtension(index);
+      }
+      public Builder SetPackedExtension(int index, int value) {
+        PrepareBuilder();
+        result.packedExtension_[index] = value;
+        return this;
+      }
+      public Builder AddPackedExtension(int value) {
+        PrepareBuilder();
+        result.packedExtension_.Add(value);
+        return this;
+      }
+      public Builder AddRangePackedExtension(scg::IEnumerable<int> values) {
+        PrepareBuilder();
+        result.packedExtension_.Add(values);
+        return this;
+      }
+      public Builder ClearPackedExtension() {
+        PrepareBuilder();
+        result.packedExtension_.Clear();
+        return this;
+      }
+    }
+    static TestDynamicExtensions() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestRepeatedScalarDifferentTagSizes : pb::GeneratedMessage<TestRepeatedScalarDifferentTagSizes, TestRepeatedScalarDifferentTagSizes.Builder> {
+    private TestRepeatedScalarDifferentTagSizes() { }
+    private static readonly TestRepeatedScalarDifferentTagSizes defaultInstance = new TestRepeatedScalarDifferentTagSizes().MakeReadOnly();
+    private static readonly string[] _testRepeatedScalarDifferentTagSizesFieldNames = new string[] { "repeated_fixed32", "repeated_fixed64", "repeated_float", "repeated_int32", "repeated_int64", "repeated_uint64" };
+    private static readonly uint[] _testRepeatedScalarDifferentTagSizesFieldTags = new uint[] { 101, 16369, 2097141, 104, 16376, 2097144 };
+    public static TestRepeatedScalarDifferentTagSizes DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestRepeatedScalarDifferentTagSizes DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override TestRepeatedScalarDifferentTagSizes ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestRepeatedScalarDifferentTagSizes__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<TestRepeatedScalarDifferentTagSizes, TestRepeatedScalarDifferentTagSizes.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestRepeatedScalarDifferentTagSizes__FieldAccessorTable; }
+    }
+    
+    public const int RepeatedFixed32FieldNumber = 12;
+    private pbc::PopsicleList<uint> repeatedFixed32_ = new pbc::PopsicleList<uint>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<uint> RepeatedFixed32List {
+      get { return pbc::Lists.AsReadOnly(repeatedFixed32_); }
+    }
+    public int RepeatedFixed32Count {
+      get { return repeatedFixed32_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint GetRepeatedFixed32(int index) {
+      return repeatedFixed32_[index];
+    }
+    
+    public const int RepeatedInt32FieldNumber = 13;
+    private pbc::PopsicleList<int> repeatedInt32_ = new pbc::PopsicleList<int>();
+    public scg::IList<int> RepeatedInt32List {
+      get { return pbc::Lists.AsReadOnly(repeatedInt32_); }
+    }
+    public int RepeatedInt32Count {
+      get { return repeatedInt32_.Count; }
+    }
+    public int GetRepeatedInt32(int index) {
+      return repeatedInt32_[index];
+    }
+    
+    public const int RepeatedFixed64FieldNumber = 2046;
+    private pbc::PopsicleList<ulong> repeatedFixed64_ = new pbc::PopsicleList<ulong>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<ulong> RepeatedFixed64List {
+      get { return pbc::Lists.AsReadOnly(repeatedFixed64_); }
+    }
+    public int RepeatedFixed64Count {
+      get { return repeatedFixed64_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong GetRepeatedFixed64(int index) {
+      return repeatedFixed64_[index];
+    }
+    
+    public const int RepeatedInt64FieldNumber = 2047;
+    private pbc::PopsicleList<long> repeatedInt64_ = new pbc::PopsicleList<long>();
+    public scg::IList<long> RepeatedInt64List {
+      get { return pbc::Lists.AsReadOnly(repeatedInt64_); }
+    }
+    public int RepeatedInt64Count {
+      get { return repeatedInt64_.Count; }
+    }
+    public long GetRepeatedInt64(int index) {
+      return repeatedInt64_[index];
+    }
+    
+    public const int RepeatedFloatFieldNumber = 262142;
+    private pbc::PopsicleList<float> repeatedFloat_ = new pbc::PopsicleList<float>();
+    public scg::IList<float> RepeatedFloatList {
+      get { return pbc::Lists.AsReadOnly(repeatedFloat_); }
+    }
+    public int RepeatedFloatCount {
+      get { return repeatedFloat_.Count; }
+    }
+    public float GetRepeatedFloat(int index) {
+      return repeatedFloat_[index];
+    }
+    
+    public const int RepeatedUint64FieldNumber = 262143;
+    private pbc::PopsicleList<ulong> repeatedUint64_ = new pbc::PopsicleList<ulong>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<ulong> RepeatedUint64List {
+      get { return pbc::Lists.AsReadOnly(repeatedUint64_); }
+    }
+    public int RepeatedUint64Count {
+      get { return repeatedUint64_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong GetRepeatedUint64(int index) {
+      return repeatedUint64_[index];
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _testRepeatedScalarDifferentTagSizesFieldNames;
+      if (repeatedFixed32_.Count > 0) {
+        output.WriteFixed32Array(12, field_names[0], repeatedFixed32_);
+      }
+      if (repeatedInt32_.Count > 0) {
+        output.WriteInt32Array(13, field_names[3], repeatedInt32_);
+      }
+      if (repeatedFixed64_.Count > 0) {
+        output.WriteFixed64Array(2046, field_names[1], repeatedFixed64_);
+      }
+      if (repeatedInt64_.Count > 0) {
+        output.WriteInt64Array(2047, field_names[4], repeatedInt64_);
+      }
+      if (repeatedFloat_.Count > 0) {
+        output.WriteFloatArray(262142, field_names[2], repeatedFloat_);
+      }
+      if (repeatedUint64_.Count > 0) {
+        output.WriteUInt64Array(262143, field_names[5], repeatedUint64_);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+      
+      size = 0;
+      {
+        int dataSize = 0;
+        dataSize = 4 * repeatedFixed32_.Count;
+        size += dataSize;
+        size += 1 * repeatedFixed32_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (int element in RepeatedInt32List) {
+          dataSize += pb::CodedOutputStream.ComputeInt32SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 1 * repeatedInt32_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 8 * repeatedFixed64_.Count;
+        size += dataSize;
+        size += 2 * repeatedFixed64_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (long element in RepeatedInt64List) {
+          dataSize += pb::CodedOutputStream.ComputeInt64SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 2 * repeatedInt64_.Count;
+      }
+      {
+        int dataSize = 0;
+        dataSize = 4 * repeatedFloat_.Count;
+        size += dataSize;
+        size += 3 * repeatedFloat_.Count;
+      }
+      {
+        int dataSize = 0;
+        foreach (ulong element in RepeatedUint64List) {
+          dataSize += pb::CodedOutputStream.ComputeUInt64SizeNoTag(element);
+        }
+        size += dataSize;
+        size += 3 * repeatedUint64_.Count;
+      }
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static TestRepeatedScalarDifferentTagSizes ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestRepeatedScalarDifferentTagSizes ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestRepeatedScalarDifferentTagSizes ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestRepeatedScalarDifferentTagSizes ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestRepeatedScalarDifferentTagSizes ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestRepeatedScalarDifferentTagSizes ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestRepeatedScalarDifferentTagSizes ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestRepeatedScalarDifferentTagSizes ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestRepeatedScalarDifferentTagSizes ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestRepeatedScalarDifferentTagSizes ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private TestRepeatedScalarDifferentTagSizes MakeReadOnly() {
+      repeatedFixed32_.MakeReadOnly();
+      repeatedInt32_.MakeReadOnly();
+      repeatedFixed64_.MakeReadOnly();
+      repeatedInt64_.MakeReadOnly();
+      repeatedFloat_.MakeReadOnly();
+      repeatedUint64_.MakeReadOnly();
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestRepeatedScalarDifferentTagSizes prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestRepeatedScalarDifferentTagSizes, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(TestRepeatedScalarDifferentTagSizes cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private TestRepeatedScalarDifferentTagSizes result;
+      
+      private TestRepeatedScalarDifferentTagSizes PrepareBuilder() {
+        if (resultIsReadOnly) {
+          TestRepeatedScalarDifferentTagSizes original = result;
+          result = new TestRepeatedScalarDifferentTagSizes();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override TestRepeatedScalarDifferentTagSizes MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestRepeatedScalarDifferentTagSizes.Descriptor; }
+      }
+      
+      public override TestRepeatedScalarDifferentTagSizes DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestRepeatedScalarDifferentTagSizes.DefaultInstance; }
+      }
+      
+      public override TestRepeatedScalarDifferentTagSizes BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestRepeatedScalarDifferentTagSizes) {
+          return MergeFrom((TestRepeatedScalarDifferentTagSizes) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(TestRepeatedScalarDifferentTagSizes other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestRepeatedScalarDifferentTagSizes.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.repeatedFixed32_.Count != 0) {
+          result.repeatedFixed32_.Add(other.repeatedFixed32_);
+        }
+        if (other.repeatedInt32_.Count != 0) {
+          result.repeatedInt32_.Add(other.repeatedInt32_);
+        }
+        if (other.repeatedFixed64_.Count != 0) {
+          result.repeatedFixed64_.Add(other.repeatedFixed64_);
+        }
+        if (other.repeatedInt64_.Count != 0) {
+          result.repeatedInt64_.Add(other.repeatedInt64_);
+        }
+        if (other.repeatedFloat_.Count != 0) {
+          result.repeatedFloat_.Add(other.repeatedFloat_);
+        }
+        if (other.repeatedUint64_.Count != 0) {
+          result.repeatedUint64_.Add(other.repeatedUint64_);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_testRepeatedScalarDifferentTagSizesFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _testRepeatedScalarDifferentTagSizesFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 98:
+            case 101: {
+              input.ReadFixed32Array(tag, field_name, result.repeatedFixed32_);
+              break;
+            }
+            case 106:
+            case 104: {
+              input.ReadInt32Array(tag, field_name, result.repeatedInt32_);
+              break;
+            }
+            case 16370:
+            case 16369: {
+              input.ReadFixed64Array(tag, field_name, result.repeatedFixed64_);
+              break;
+            }
+            case 16378:
+            case 16376: {
+              input.ReadInt64Array(tag, field_name, result.repeatedInt64_);
+              break;
+            }
+            case 2097138:
+            case 2097141: {
+              input.ReadFloatArray(tag, field_name, result.repeatedFloat_);
+              break;
+            }
+            case 2097146:
+            case 2097144: {
+              input.ReadUInt64Array(tag, field_name, result.repeatedUint64_);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<uint> RepeatedFixed32List {
+        get { return PrepareBuilder().repeatedFixed32_; }
+      }
+      public int RepeatedFixed32Count {
+        get { return result.RepeatedFixed32Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint GetRepeatedFixed32(int index) {
+        return result.GetRepeatedFixed32(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetRepeatedFixed32(int index, uint value) {
+        PrepareBuilder();
+        result.repeatedFixed32_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRepeatedFixed32(uint value) {
+        PrepareBuilder();
+        result.repeatedFixed32_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangeRepeatedFixed32(scg::IEnumerable<uint> values) {
+        PrepareBuilder();
+        result.repeatedFixed32_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedFixed32() {
+        PrepareBuilder();
+        result.repeatedFixed32_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<int> RepeatedInt32List {
+        get { return PrepareBuilder().repeatedInt32_; }
+      }
+      public int RepeatedInt32Count {
+        get { return result.RepeatedInt32Count; }
+      }
+      public int GetRepeatedInt32(int index) {
+        return result.GetRepeatedInt32(index);
+      }
+      public Builder SetRepeatedInt32(int index, int value) {
+        PrepareBuilder();
+        result.repeatedInt32_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedInt32(int value) {
+        PrepareBuilder();
+        result.repeatedInt32_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedInt32(scg::IEnumerable<int> values) {
+        PrepareBuilder();
+        result.repeatedInt32_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedInt32() {
+        PrepareBuilder();
+        result.repeatedInt32_.Clear();
+        return this;
+      }
+      
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<ulong> RepeatedFixed64List {
+        get { return PrepareBuilder().repeatedFixed64_; }
+      }
+      public int RepeatedFixed64Count {
+        get { return result.RepeatedFixed64Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong GetRepeatedFixed64(int index) {
+        return result.GetRepeatedFixed64(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetRepeatedFixed64(int index, ulong value) {
+        PrepareBuilder();
+        result.repeatedFixed64_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRepeatedFixed64(ulong value) {
+        PrepareBuilder();
+        result.repeatedFixed64_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangeRepeatedFixed64(scg::IEnumerable<ulong> values) {
+        PrepareBuilder();
+        result.repeatedFixed64_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedFixed64() {
+        PrepareBuilder();
+        result.repeatedFixed64_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<long> RepeatedInt64List {
+        get { return PrepareBuilder().repeatedInt64_; }
+      }
+      public int RepeatedInt64Count {
+        get { return result.RepeatedInt64Count; }
+      }
+      public long GetRepeatedInt64(int index) {
+        return result.GetRepeatedInt64(index);
+      }
+      public Builder SetRepeatedInt64(int index, long value) {
+        PrepareBuilder();
+        result.repeatedInt64_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedInt64(long value) {
+        PrepareBuilder();
+        result.repeatedInt64_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedInt64(scg::IEnumerable<long> values) {
+        PrepareBuilder();
+        result.repeatedInt64_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedInt64() {
+        PrepareBuilder();
+        result.repeatedInt64_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<float> RepeatedFloatList {
+        get { return PrepareBuilder().repeatedFloat_; }
+      }
+      public int RepeatedFloatCount {
+        get { return result.RepeatedFloatCount; }
+      }
+      public float GetRepeatedFloat(int index) {
+        return result.GetRepeatedFloat(index);
+      }
+      public Builder SetRepeatedFloat(int index, float value) {
+        PrepareBuilder();
+        result.repeatedFloat_[index] = value;
+        return this;
+      }
+      public Builder AddRepeatedFloat(float value) {
+        PrepareBuilder();
+        result.repeatedFloat_.Add(value);
+        return this;
+      }
+      public Builder AddRangeRepeatedFloat(scg::IEnumerable<float> values) {
+        PrepareBuilder();
+        result.repeatedFloat_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedFloat() {
+        PrepareBuilder();
+        result.repeatedFloat_.Clear();
+        return this;
+      }
+      
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<ulong> RepeatedUint64List {
+        get { return PrepareBuilder().repeatedUint64_; }
+      }
+      public int RepeatedUint64Count {
+        get { return result.RepeatedUint64Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong GetRepeatedUint64(int index) {
+        return result.GetRepeatedUint64(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetRepeatedUint64(int index, ulong value) {
+        PrepareBuilder();
+        result.repeatedUint64_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRepeatedUint64(ulong value) {
+        PrepareBuilder();
+        result.repeatedUint64_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangeRepeatedUint64(scg::IEnumerable<ulong> values) {
+        PrepareBuilder();
+        result.repeatedUint64_.Add(values);
+        return this;
+      }
+      public Builder ClearRepeatedUint64() {
+        PrepareBuilder();
+        result.repeatedUint64_.Clear();
+        return this;
+      }
+    }
+    static TestRepeatedScalarDifferentTagSizes() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class FooRequest : pb::GeneratedMessage<FooRequest, FooRequest.Builder> {
+    private FooRequest() { }
+    private static readonly FooRequest defaultInstance = new FooRequest().MakeReadOnly();
+    private static readonly string[] _fooRequestFieldNames = new string[] {  };
+    private static readonly uint[] _fooRequestFieldTags = new uint[] {  };
+    public static FooRequest DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override FooRequest DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override FooRequest ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_FooRequest__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<FooRequest, FooRequest.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_FooRequest__FieldAccessorTable; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _fooRequestFieldNames;
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+      
+      size = 0;
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static FooRequest ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static FooRequest ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static FooRequest ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static FooRequest ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static FooRequest ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static FooRequest ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static FooRequest ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static FooRequest ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static FooRequest ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static FooRequest ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private FooRequest MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(FooRequest prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<FooRequest, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(FooRequest cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private FooRequest result;
+      
+      private FooRequest PrepareBuilder() {
+        if (resultIsReadOnly) {
+          FooRequest original = result;
+          result = new FooRequest();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override FooRequest MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.FooRequest.Descriptor; }
+      }
+      
+      public override FooRequest DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.FooRequest.DefaultInstance; }
+      }
+      
+      public override FooRequest BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is FooRequest) {
+          return MergeFrom((FooRequest) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(FooRequest other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.FooRequest.DefaultInstance) return this;
+        PrepareBuilder();
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_fooRequestFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _fooRequestFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+    }
+    static FooRequest() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class FooResponse : pb::GeneratedMessage<FooResponse, FooResponse.Builder> {
+    private FooResponse() { }
+    private static readonly FooResponse defaultInstance = new FooResponse().MakeReadOnly();
+    private static readonly string[] _fooResponseFieldNames = new string[] {  };
+    private static readonly uint[] _fooResponseFieldTags = new uint[] {  };
+    public static FooResponse DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override FooResponse DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override FooResponse ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_FooResponse__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<FooResponse, FooResponse.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_FooResponse__FieldAccessorTable; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _fooResponseFieldNames;
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+      
+      size = 0;
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static FooResponse ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static FooResponse ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static FooResponse ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static FooResponse ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static FooResponse ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static FooResponse ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static FooResponse ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static FooResponse ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static FooResponse ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static FooResponse ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private FooResponse MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(FooResponse prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<FooResponse, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(FooResponse cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private FooResponse result;
+      
+      private FooResponse PrepareBuilder() {
+        if (resultIsReadOnly) {
+          FooResponse original = result;
+          result = new FooResponse();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override FooResponse MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.FooResponse.Descriptor; }
+      }
+      
+      public override FooResponse DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.FooResponse.DefaultInstance; }
+      }
+      
+      public override FooResponse BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is FooResponse) {
+          return MergeFrom((FooResponse) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(FooResponse other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.FooResponse.DefaultInstance) return this;
+        PrepareBuilder();
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_fooResponseFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _fooResponseFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+    }
+    static FooResponse() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class BarRequest : pb::GeneratedMessage<BarRequest, BarRequest.Builder> {
+    private BarRequest() { }
+    private static readonly BarRequest defaultInstance = new BarRequest().MakeReadOnly();
+    private static readonly string[] _barRequestFieldNames = new string[] {  };
+    private static readonly uint[] _barRequestFieldTags = new uint[] {  };
+    public static BarRequest DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override BarRequest DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override BarRequest ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_BarRequest__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<BarRequest, BarRequest.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_BarRequest__FieldAccessorTable; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _barRequestFieldNames;
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+      
+      size = 0;
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static BarRequest ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static BarRequest ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static BarRequest ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static BarRequest ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static BarRequest ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static BarRequest ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static BarRequest ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static BarRequest ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static BarRequest ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static BarRequest ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private BarRequest MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(BarRequest prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<BarRequest, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(BarRequest cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private BarRequest result;
+      
+      private BarRequest PrepareBuilder() {
+        if (resultIsReadOnly) {
+          BarRequest original = result;
+          result = new BarRequest();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override BarRequest MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.BarRequest.Descriptor; }
+      }
+      
+      public override BarRequest DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.BarRequest.DefaultInstance; }
+      }
+      
+      public override BarRequest BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is BarRequest) {
+          return MergeFrom((BarRequest) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(BarRequest other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.BarRequest.DefaultInstance) return this;
+        PrepareBuilder();
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_barRequestFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _barRequestFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+    }
+    static BarRequest() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class BarResponse : pb::GeneratedMessage<BarResponse, BarResponse.Builder> {
+    private BarResponse() { }
+    private static readonly BarResponse defaultInstance = new BarResponse().MakeReadOnly();
+    private static readonly string[] _barResponseFieldNames = new string[] {  };
+    private static readonly uint[] _barResponseFieldTags = new uint[] {  };
+    public static BarResponse DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override BarResponse DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override BarResponse ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_BarResponse__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<BarResponse, BarResponse.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_BarResponse__FieldAccessorTable; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      CalcSerializedSize();
+      string[] field_names = _barResponseFieldNames;
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        return CalcSerializedSize();
+      }
+    }
+    
+    private int CalcSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+      
+      size = 0;
+      size += UnknownFields.SerializedSize;
+      memoizedSerializedSize = size;
+      return size;
+    }
+    public static BarResponse ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static BarResponse ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static BarResponse ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static BarResponse ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static BarResponse ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static BarResponse ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static BarResponse ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static BarResponse ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static BarResponse ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static BarResponse ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private BarResponse MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(BarResponse prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public sealed partial class Builder : pb::GeneratedBuilder<BarResponse, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(BarResponse cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private BarResponse result;
+      
+      private BarResponse PrepareBuilder() {
+        if (resultIsReadOnly) {
+          BarResponse original = result;
+          result = new BarResponse();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override BarResponse MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.BarResponse.Descriptor; }
+      }
+      
+      public override BarResponse DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.BarResponse.DefaultInstance; }
+      }
+      
+      public override BarResponse BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is BarResponse) {
+          return MergeFrom((BarResponse) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(BarResponse other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.BarResponse.DefaultInstance) return this;
+        PrepareBuilder();
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_barResponseFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _barResponseFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+    }
+    static BarResponse() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  #endregion
+  
+  #region Services
+  /*
+  * Service generation is now disabled by default, use the following option to enable:
+  * option (google.protobuf.csharp_file_options).service_generator_type = GENERIC;
+  */
+  #endregion
+  
+}
+
+#endregion Designer generated code

BIN
csharp/src/ProtoBench/google_message1.dat


BIN
csharp/src/ProtoBench/google_message2.dat


+ 88 - 0
csharp/src/ProtoDump/Program.cs

@@ -0,0 +1,88 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+using System.IO;
+
+namespace Google.ProtocolBuffers.ProtoDump
+{
+    /// <summary>
+    /// Small utility to load a binary message and dump it in text form
+    /// </summary>
+    internal class Program
+    {
+        private static int Main(string[] args)
+        {
+            if (args.Length != 2)
+            {
+                Console.Error.WriteLine("Usage: ProtoDump <descriptor type name> <input data>");
+                Console.Error.WriteLine("The descriptor type name is the fully-qualified message name,");
+                Console.Error.WriteLine("including assembly e.g. ProjectNamespace.Message,Company.Project");
+                return 1;
+            }
+            IMessage defaultMessage;
+            try
+            {
+                defaultMessage = MessageUtil.GetDefaultMessage(args[0]);
+            }
+            catch (ArgumentException e)
+            {
+                Console.Error.WriteLine(e.Message);
+                return 1;
+            }
+            try
+            {
+                IBuilder builder = defaultMessage.WeakCreateBuilderForType();
+                if (builder == null)
+                {
+                    Console.Error.WriteLine("Unable to create builder");
+                    return 1;
+                }
+                byte[] inputData = File.ReadAllBytes(args[1]);
+                builder.WeakMergeFrom(ByteString.CopyFrom(inputData));
+                Console.WriteLine(TextFormat.PrintToString(builder.WeakBuild()));
+                return 0;
+            }
+            catch (Exception e)
+            {
+                Console.Error.WriteLine("Error: {0}", e.Message);
+                Console.Error.WriteLine();
+                Console.Error.WriteLine("Detailed exception information: {0}", e);
+                return 1;
+            }
+        }
+    }
+}

+ 30 - 0
csharp/src/ProtoDump/Properties/AssemblyInfo.cs

@@ -0,0 +1,30 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+
+[assembly: AssemblyTitle("ProtoDump")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("ProtoDump")]
+[assembly: AssemblyCopyright("Copyright ©  2009")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("2.4.1.555")]
+
+[assembly: AssemblyVersion("2.4.1.555")]
+[assembly: AssemblyFileVersion("2.4.1.555")]

+ 65 - 0
csharp/src/ProtoDump/ProtoDump.csproj

@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <EnvironmentFlavor>CLIENTPROFILE</EnvironmentFlavor>
+    <EnvironmentTemplate>NET35</EnvironmentTemplate>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{D7282E99-2DC3-405B-946F-177DB2FD2AE2}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Google.ProtocolBuffers.ProtoDump</RootNamespace>
+    <AssemblyName>ProtoDump</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\NET35\Debug</OutputPath>
+    <IntermediateOutputPath>obj\NET35\Debug\</IntermediateOutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
+    <NoStdLib>true</NoStdLib>
+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\NET35\Release</OutputPath>
+    <IntermediateOutputPath>obj\NET35\Release\</IntermediateOutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
+    <NoStdLib>true</NoStdLib>
+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="mscorlib" />
+    <Reference Include="System" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\ProtocolBuffers\ProtocolBuffers.csproj">
+      <Project>{6908BDCE-D925-43F3-94AC-A531E6DF2591}</Project>
+      <Name>ProtocolBuffers</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>

+ 150 - 0
csharp/src/ProtoGen.Test/DependencyResolutionTest.cs

@@ -0,0 +1,150 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System.Collections.Generic;
+using Google.ProtocolBuffers.DescriptorProtos;
+using Google.ProtocolBuffers.Descriptors;
+using NUnit.Framework;
+
+namespace Google.ProtocolBuffers.ProtoGen
+{
+    /// <summary>
+    /// Tests for the dependency resolution in Generator.
+    /// </summary>
+    [TestFixture]
+    public class DependencyResolutionTest
+    {
+        [Test]
+        public void TwoDistinctFiles()
+        {
+            FileDescriptorProto first = new FileDescriptorProto.Builder {Name = "First"}.Build();
+            FileDescriptorProto second = new FileDescriptorProto.Builder {Name = "Second"}.Build();
+            var set = new List<FileDescriptorProto> { first, second };
+
+            IList<FileDescriptor> converted = Generator.ConvertDescriptors(CSharpFileOptions.DefaultInstance, set);
+            Assert.AreEqual(2, converted.Count);
+            Assert.AreEqual("First", converted[0].Name);
+            Assert.AreEqual(0, converted[0].Dependencies.Count);
+            Assert.AreEqual("Second", converted[1].Name);
+            Assert.AreEqual(0, converted[1].Dependencies.Count);
+        }
+
+        [Test]
+        public void FirstDependsOnSecond()
+        {
+            FileDescriptorProto first =
+                new FileDescriptorProto.Builder {Name = "First", DependencyList = {"Second"}}.Build();
+            FileDescriptorProto second = new FileDescriptorProto.Builder {Name = "Second"}.Build();
+            var set = new List<FileDescriptorProto> { first, second };
+            IList<FileDescriptor> converted = Generator.ConvertDescriptors(CSharpFileOptions.DefaultInstance, set);
+            Assert.AreEqual(2, converted.Count);
+            Assert.AreEqual("First", converted[0].Name);
+            Assert.AreEqual(1, converted[0].Dependencies.Count);
+            Assert.AreEqual(converted[1], converted[0].Dependencies[0]);
+            Assert.AreEqual("Second", converted[1].Name);
+            Assert.AreEqual(0, converted[1].Dependencies.Count);
+        }
+
+        [Test]
+        public void SecondDependsOnFirst()
+        {
+            FileDescriptorProto first = new FileDescriptorProto.Builder {Name = "First"}.Build();
+            FileDescriptorProto second =
+                new FileDescriptorProto.Builder {Name = "Second", DependencyList = {"First"}}.Build();
+            var set = new List<FileDescriptorProto> { first, second };
+            IList<FileDescriptor> converted = Generator.ConvertDescriptors(CSharpFileOptions.DefaultInstance, set);
+            Assert.AreEqual(2, converted.Count);
+            Assert.AreEqual("First", converted[0].Name);
+            Assert.AreEqual(0, converted[0].Dependencies.Count);
+            Assert.AreEqual("Second", converted[1].Name);
+            Assert.AreEqual(1, converted[1].Dependencies.Count);
+            Assert.AreEqual(converted[0], converted[1].Dependencies[0]);
+        }
+
+        [Test]
+        public void CircularDependency()
+        {
+            FileDescriptorProto first =
+                new FileDescriptorProto.Builder {Name = "First", DependencyList = {"Second"}}.Build();
+            FileDescriptorProto second =
+                new FileDescriptorProto.Builder {Name = "Second", DependencyList = {"First"}}.Build();
+            var set = new List<FileDescriptorProto> { first, second };
+            try
+            {
+                Generator.ConvertDescriptors(CSharpFileOptions.DefaultInstance, set);
+                Assert.Fail("Expected exception");
+            }
+            catch (DependencyResolutionException)
+            {
+                // Expected
+            }
+        }
+
+        [Test]
+        public void MissingDependency()
+        {
+            FileDescriptorProto first =
+                new FileDescriptorProto.Builder {Name = "First", DependencyList = {"Second"}}.Build();
+            var set = new List<FileDescriptorProto> { first };
+            try
+            {
+                Generator.ConvertDescriptors(CSharpFileOptions.DefaultInstance, set);
+                Assert.Fail("Expected exception");
+            }
+            catch (DependencyResolutionException)
+            {
+                // Expected
+            }
+        }
+
+        [Test]
+        public void SelfDependency()
+        {
+            FileDescriptorProto first =
+                new FileDescriptorProto.Builder {Name = "First", DependencyList = {"First"}}.Build();
+            var set = new List<FileDescriptorProto> { first };
+            try
+            {
+                Generator.ConvertDescriptors(CSharpFileOptions.DefaultInstance, set);
+                Assert.Fail("Expected exception");
+            }
+            catch (DependencyResolutionException)
+            {
+                // Expected
+            }
+        }
+    }
+}

+ 30 - 0
csharp/src/ProtoGen.Test/Properties/AssemblyInfo.cs

@@ -0,0 +1,30 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+
+[assembly: AssemblyTitle("ProtoGen.Test")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("ProtoGen.Test")]
+[assembly: AssemblyCopyright("Copyright ©  2008")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("2.4.1.555")]
+
+[assembly: AssemblyVersion("2.4.1.555")]
+[assembly: AssemblyFileVersion("2.4.1.555")]

+ 99 - 0
csharp/src/ProtoGen.Test/ProtoGen.Test.csproj

@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <EnvironmentFlavor>CLIENTPROFILE</EnvironmentFlavor>
+    <EnvironmentTemplate>NET35</EnvironmentTemplate>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{C268DA4C-4004-47DA-AF23-44C983281A68}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Google.ProtocolBuffers.ProtoGen</RootNamespace>
+    <AssemblyName>Google.ProtocolBuffers.ProtoGen.Test</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\NET35\Debug</OutputPath>
+    <IntermediateOutputPath>obj\NET35\Debug\</IntermediateOutputPath>
+    <DefineConstants>DEBUG;TRACE;$(EnvironmentFlavor);$(EnvironmentTemplate)</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
+    <NoStdLib>true</NoStdLib>
+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\NET35\Release</OutputPath>
+    <IntermediateOutputPath>obj\NET35\Release\</IntermediateOutputPath>
+    <DefineConstants>TRACE;$(EnvironmentFlavor);$(EnvironmentTemplate)</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
+    <NoStdLib>true</NoStdLib>
+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\lib\NUnit\lib\nunit.framework.dll</HintPath>
+    </Reference>
+    <Reference Include="mscorlib" />
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="DependencyResolutionTest.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="TempFile.cs" />
+    <Compile Include="TestPreprocessing.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\ProtocolBuffers\ProtocolBuffers.csproj">
+      <Project>{6908BDCE-D925-43F3-94AC-A531E6DF2591}</Project>
+      <Name>ProtocolBuffers</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\ProtoGen\ProtoGen.csproj">
+      <Project>{250ADE34-82FD-4BAE-86D5-985FBE589C4A}</Project>
+      <Name>ProtoGen</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="..\..\lib\protoc.exe">
+      <Link>protoc.exe</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="..\..\protos\google\protobuf\csharp_options.proto">
+      <Link>google\protobuf\csharp_options.proto</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="..\..\protos\google\protobuf\descriptor.proto">
+      <Link>google\protobuf\descriptor.proto</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <StartAction>Program</StartAction>
+    <StartProgram>$(ProjectDir)..\..\lib\NUnit\tools\nunit-console.exe</StartProgram>
+    <StartArguments>/nologo /noshadow /labels /wait $(AssemblyName).dll</StartArguments>
+    <StartWorkingDirectory>$(ProjectDir)$(OutputPath)</StartWorkingDirectory>
+  </PropertyGroup>
+</Project>

+ 683 - 0
csharp/src/ProtoGen.Test/ProtocGenCsUnittests.cs

@@ -0,0 +1,683 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using NUnit.Framework;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Reflection;
+using System.Text;
+
+namespace Google.ProtocolBuffers.ProtoGen
+{
+    /// <summary>
+    /// Tests protoc-gen-cs plugin.
+    /// </summary>
+    [TestFixture]
+    [Category("Preprocessor")]
+    public partial class ProtocGenCsUnittests
+    {
+        private static readonly string TempPath = Path.Combine(Path.GetTempPath(), "protoc-gen-cs.Test");
+
+        private const string DefaultProto =
+            @"
+package nunit.simple;
+// Test a very simple message.
+message MyMessage {
+  optional string name = 1;
+}";
+
+        #region TestFixture SetUp/TearDown
+
+        private static readonly string OriginalWorkingDirectory = Environment.CurrentDirectory;
+
+        private StringBuilder buffer = new StringBuilder();
+
+        [TestFixtureSetUp]
+        public virtual void Setup()
+        {
+            Teardown();
+            Directory.CreateDirectory(TempPath);
+            Environment.CurrentDirectory = TempPath;
+            this.buffer.Length = 0;
+        }
+
+        [TestFixtureTearDown]
+        public virtual void Teardown()
+        {
+            Environment.CurrentDirectory = OriginalWorkingDirectory;
+            if (Directory.Exists(TempPath))
+            {
+                Directory.Delete(TempPath, true);
+            }
+        }
+
+        #endregion
+
+        #region Helper Methods RunProtoGen / RunCsc
+
+        private void RunProtoc(int expect, string protoFile, params string[] args)
+        {
+            string protoPath = string.Format("-I. -I\"{0}\"", OriginalWorkingDirectory);
+            string plugin = string.Format("--plugin=\"{0}\"", Path.Combine(OriginalWorkingDirectory, "protoc-gen-cs.exe"));
+            string csOut = args.Length == 0 ? "--cs_out=." : string.Format("--cs_out=\"{0}:.\"", string.Join(" ", args));
+            // Start the child process.
+            Process p = new Process();
+            // Redirect the output stream of the child process.
+            p.StartInfo.CreateNoWindow = true;
+            p.StartInfo.UseShellExecute = false;
+            p.StartInfo.RedirectStandardError = true;
+            p.StartInfo.RedirectStandardOutput = true;
+            p.StartInfo.WorkingDirectory = TempPath;
+            p.StartInfo.FileName = Path.Combine(OriginalWorkingDirectory, "protoc.exe");
+            p.StartInfo.Arguments = string.Join(" ", new string[] { plugin, csOut, protoPath, protoFile });
+            p.Start();
+            // Read the output stream first and then wait.
+            buffer.AppendLine(string.Format("{0}> \"{1}\" {2}", p.StartInfo.WorkingDirectory, p.StartInfo.FileName, p.StartInfo.Arguments));
+            buffer.AppendLine(p.StandardError.ReadToEnd());
+            buffer.AppendLine(p.StandardOutput.ReadToEnd());
+            p.WaitForExit();
+            Assert.AreEqual(expect, p.ExitCode, this.buffer.ToString());
+        }
+
+        private Assembly RunCsc(int expect, params string[] sources)
+        {
+            using (TempFile tempDll = new TempFile(String.Empty))
+            {
+                tempDll.ChangeExtension(".dll");
+                List<string> args = new List<string>();
+                args.Add("/nologo");
+                args.Add("/target:library");
+                args.Add("/debug-");
+                args.Add(String.Format(@"""/out:{0}""", tempDll.TempPath));
+                args.Add("/r:System.dll");
+                args.Add(String.Format(@"""/r:{0}""",
+                                       typeof(Google.ProtocolBuffers.DescriptorProtos.DescriptorProto).Assembly.
+                                           Location));
+                args.AddRange(sources);
+
+                string exe = Path.Combine(System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory(),
+                                          "csc.exe");
+                ProcessStartInfo psi = new ProcessStartInfo(exe);
+                psi.WorkingDirectory = TempPath;
+                psi.CreateNoWindow = true;
+                psi.UseShellExecute = false;
+                psi.RedirectStandardOutput = true;
+                psi.RedirectStandardError = true;
+                psi.Arguments = string.Join(" ", args.ToArray());
+                Process p = Process.Start(psi);
+                buffer.AppendLine(string.Format("{0}> \"{1}\" {2}", p.StartInfo.WorkingDirectory, p.StartInfo.FileName, p.StartInfo.Arguments));
+                buffer.AppendLine(p.StandardError.ReadToEnd());
+                buffer.AppendLine(p.StandardOutput.ReadToEnd());
+                p.WaitForExit();
+                Assert.AreEqual(expect, p.ExitCode, this.buffer.ToString());
+
+                Assembly asm = null;
+                if (p.ExitCode == 0)
+                {
+                    byte[] allbytes = File.ReadAllBytes(tempDll.TempPath);
+                    asm = Assembly.Load(allbytes);
+
+                    foreach (Type t in asm.GetTypes())
+                    {
+                        Debug.WriteLine(t.FullName, asm.FullName);
+                    }
+                }
+                return asm;
+            }
+        }
+
+        #endregion
+
+        // *******************************************************************
+        // The following tests excercise options for protogen.exe
+        // *******************************************************************
+
+        [Test]
+        public void TestProtoFile()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(test + ".cs"))
+            using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto))
+            {
+                RunProtoc(0, proto.TempPath);
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t = a.GetType("nunit.simple.MyMessage", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("nunit.simple." + test, true, true);
+            }
+        }
+
+        [Test]
+        public void TestProtoFileWithConflictingType()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(test + ".cs"))
+            using (
+                ProtoFile proto = new ProtoFile(test + ".proto",
+                                                @"
+package nunit.simple;
+// Test a very simple message.
+message " +
+                                                test + @" {
+  optional string name = 1;
+} "))
+            {
+                RunProtoc(0, proto.TempPath);
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t = a.GetType("nunit.simple." + test, true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("nunit.simple.Proto." + test, true, true);
+            }
+        }
+
+        [Test]
+        public void TestProtoFileWithNamespace()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(test + ".cs"))
+            using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto))
+            {
+                RunProtoc(0, proto.TempPath, "-namespace=MyNewNamespace");
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t = a.GetType("MyNewNamespace.MyMessage", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("MyNewNamespace." + test, true, true);
+            }
+        }
+
+        [Test]
+        public void TestProtoFileWithUmbrellaClassName()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach("MyUmbrellaClassname.cs"))
+            using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto))
+            {
+                RunProtoc(0, proto.TempPath, "/umbrella_classname=MyUmbrellaClassname");
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t = a.GetType("nunit.simple.MyMessage", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("nunit.simple.MyUmbrellaClassname", true, true);
+            }
+        }
+
+        [Test]
+        public void TestProtoFileWithNestedClass()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(test + ".cs"))
+            using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto))
+            {
+                RunProtoc(0, proto.TempPath, "-nest_classes=true");
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t = a.GetType("nunit.simple." + test + "+MyMessage", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("nunit.simple." + test, true, true);
+            }
+        }
+
+        [Test]
+        public void TestProtoFileWithExpandedNsDirectories()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(@"nunit\simple\" + test + ".cs"))
+            using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto))
+            {
+                RunProtoc(0, proto.TempPath, "-expand_namespace_directories=true");
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t = a.GetType("nunit.simple.MyMessage", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("nunit.simple." + test, true, true);
+            }
+        }
+
+        [Test]
+        public void TestProtoFileWithNewExtension()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(test + ".Generated.cs"))
+            using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto))
+            {
+                RunProtoc(0, proto.TempPath, "-file_extension=.Generated.cs");
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t = a.GetType("nunit.simple.MyMessage", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("nunit.simple." + test, true, true);
+            }
+        }
+
+        [Test]
+        public void TestProtoFileWithUmbrellaNamespace()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(test + ".cs"))
+            using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto))
+            {
+                RunProtoc(0, proto.TempPath, "-umbrella_namespace=MyUmbrella.Namespace");
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t = a.GetType("nunit.simple.MyMessage", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("nunit.simple.MyUmbrella.Namespace." + test, true, true);
+            }
+        }
+
+        [Test]
+        public void TestProtoFileWithIgnoredUmbrellaNamespaceDueToNesting()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(test + ".cs"))
+            using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto))
+            {
+                RunProtoc(0, proto.TempPath, "-nest_classes=true", "-umbrella_namespace=MyUmbrella.Namespace");
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t = a.GetType("nunit.simple." + test + "+MyMessage", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("nunit.simple." + test, true, true);
+            }
+        }
+
+        [Test]
+        public void TestProtoFileWithExplicitEmptyUmbrellaNamespace()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(test + ".cs"))
+            using (
+                ProtoFile proto = new ProtoFile(test + ".proto",
+                                                @"
+package nunit.simple;
+// Test a very simple message.
+message " +
+                                                test + @" {
+  optional string name = 1;
+} "))
+            {
+                //Forces the umbrella class to not use a namespace even if a collision with a type is detected.
+                RunProtoc(0, proto.TempPath, "-umbrella_namespace=");
+                //error CS0441: 'nunit.simple.TestProtoFileWithExplicitEmptyUmbrellaNamespace': a class cannot be both static and sealed
+                RunCsc(1, source.TempPath);
+            }
+        }
+
+        [Test]
+        public void TestProtoFileWithNewOutputFolder()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(@"generated-code\" + test + ".cs"))
+            using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto))
+            {
+                RunProtoc(1, proto.TempPath, "-output_directory=generated-code");
+                Directory.CreateDirectory("generated-code");
+                RunProtoc(0, proto.TempPath, "-output_directory=generated-code");
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t = a.GetType("nunit.simple.MyMessage", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("nunit.simple." + test, true, true);
+            }
+        }
+
+        [Test]
+        public void TestProtoFileAndIgnoreGoogleProtobuf()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(test + ".cs"))
+            using (
+                ProtoFile proto = new ProtoFile(test + ".proto",
+                                                @"
+import ""google/protobuf/csharp_options.proto"";
+option (google.protobuf.csharp_file_options).namespace = ""MyNewNamespace"";
+" +
+                                                DefaultProto))
+            {
+                string google = Path.Combine(TempPath, "google\\protobuf");
+                Directory.CreateDirectory(google);
+                foreach (string file in Directory.GetFiles(Path.Combine(OriginalWorkingDirectory, "google\\protobuf")))
+                {
+                    File.Copy(file, Path.Combine(google, Path.GetFileName(file)));
+                }
+
+                Assert.AreEqual(0, Directory.GetFiles(TempPath, "*.cs").Length);
+                RunProtoc(0, proto.TempPath);
+                Assert.AreEqual(1, Directory.GetFiles(TempPath, "*.cs").Length);
+
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t = a.GetType("MyNewNamespace.MyMessage", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("MyNewNamespace." + test, true, true);
+            }
+        }
+
+        [Test]
+        public void TestProtoFileWithoutIgnoreGoogleProtobuf()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(test + ".cs"))
+            using (
+                ProtoFile proto = new ProtoFile(test + ".proto",
+                                                @"
+import ""google/protobuf/csharp_options.proto"";
+option (google.protobuf.csharp_file_options).namespace = ""MyNewNamespace"";
+" +
+                                                DefaultProto))
+            {
+                string google = Path.Combine(TempPath, "google\\protobuf");
+                Directory.CreateDirectory(google);
+                foreach (string file in Directory.GetFiles(Path.Combine(OriginalWorkingDirectory, "google\\protobuf")))
+                {
+                    File.Copy(file, Path.Combine(google, Path.GetFileName(file)));
+                }
+
+                Assert.AreEqual(0, Directory.GetFiles(TempPath, "*.cs").Length);
+                //Without the option this fails due to being unable to resolve google/protobuf descriptors
+                RunProtoc(0, proto.TempPath);
+            }
+        }
+
+        // *******************************************************************
+        // The following tests excercise options for protoc.exe
+        // *******************************************************************
+
+        [Test]
+        public void TestProtoFileWithIncludeImports()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(test + ".cs"))
+            using (
+                ProtoFile proto = new ProtoFile(test + ".proto",
+                                                @"
+import ""google/protobuf/csharp_options.proto"";
+option (google.protobuf.csharp_file_options).namespace = ""MyNewNamespace"";
+
+package nunit.simple;
+// Test a very simple message.
+message MyMessage {
+  optional string name = 1;
+} ")
+                )
+            {
+                string google = Path.Combine(TempPath, "google\\protobuf");
+                Directory.CreateDirectory(google);
+                foreach (string file in Directory.GetFiles(Path.Combine(OriginalWorkingDirectory, "google\\protobuf")))
+                {
+                    File.Copy(file, Path.Combine(google, Path.GetFileName(file)));
+                }
+
+                Assert.AreEqual(0, Directory.GetFiles(TempPath, "*.cs").Length);
+                //if you specify the protoc option --include_imports this should build three source files
+                RunProtoc(0, proto.TempPath);
+                Assert.AreEqual(1, Directory.GetFiles(TempPath, "*.cs").Length);
+
+                //you can (and should) simply omit the inclusion of the extra source files in your project
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t = a.GetType("MyNewNamespace.MyMessage", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("MyNewNamespace." + test, true, true);
+            }
+        }
+
+        //Seems the --proto_path or -I option is non-functional for me.  Maybe others have luck?
+        [Test]
+        public void TestProtoFileInDifferentDirectory()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(test + ".cs"))
+            using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto))
+            {
+                Environment.CurrentDirectory = OriginalWorkingDirectory;
+                RunProtoc(0, proto.TempPath);
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t = a.GetType("nunit.simple.MyMessage", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("nunit.simple." + test, true, true);
+            }
+        }
+
+        // *******************************************************************
+        // Handling of mutliple input files
+        // *******************************************************************
+
+        [Test]
+        public void TestMultipleProtoFiles()
+        {
+            Setup();
+            using (TempFile source1 = TempFile.Attach("MyMessage.cs"))
+            using (
+                ProtoFile proto1 = new ProtoFile("MyMessage.proto",
+                                                 @"
+package nunit.simple;
+// Test a very simple message.
+message MyMessage {
+  optional string name = 1;
+}")
+                )
+            using (TempFile source2 = TempFile.Attach("MyMessageList.cs"))
+            using (
+                ProtoFile proto2 = new ProtoFile("MyMessageList.proto",
+                                                 @"
+package nunit.simple;
+import ""MyMessage.proto"";
+// Test a very simple message.
+message MyMessageList {
+  repeated MyMessage messages = 1;
+}")
+                )
+            {
+                RunProtoc(0, proto1.TempPath);
+                RunProtoc(0, proto2.TempPath);
+                Assembly a = RunCsc(0, source1.TempPath, source2.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t1 = a.GetType("nunit.simple.MyMessage", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t1), "Expect an IMessage");
+                //assert that the message type is in the expected namespace
+                Type t2 = a.GetType("nunit.simple.MyMessageList", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t2), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("nunit.simple.Proto.MyMessage", true, true);
+                a.GetType("nunit.simple.Proto.MyMessageList", true, true);
+            }
+        }
+
+        [Test]
+        public void TestOneProtoFileWithBufferFile()
+        {
+            Setup();
+            using (TempFile source1 = TempFile.Attach("MyMessage.cs"))
+            using (
+                ProtoFile proto1 = new ProtoFile("MyMessage.proto",
+                                                 @"
+package nunit.simple;
+// Test a very simple message.
+message MyMessage {
+  optional string name = 1;
+}")
+                )
+            using (TempFile source2 = TempFile.Attach("MyMessageList.cs"))
+            using (
+                ProtoFile proto2 = new ProtoFile("MyMessageList.proto",
+                                                 @"
+package nunit.simple;
+import ""MyMessage.proto"";
+// Test a very simple message.
+message MyMessageList {
+  repeated MyMessage messages = 1;
+}")
+                )
+            {
+                //build the proto buffer for MyMessage
+                RunProtoc(0, proto1.TempPath);
+                //build the MyMessageList proto-buffer and generate code by including MyMessage.pb
+                RunProtoc(0, proto2.TempPath);
+                Assembly a = RunCsc(0, source1.TempPath, source2.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t1 = a.GetType("nunit.simple.MyMessage", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t1), "Expect an IMessage");
+                //assert that the message type is in the expected namespace
+                Type t2 = a.GetType("nunit.simple.MyMessageList", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t2), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("nunit.simple.Proto.MyMessage", true, true);
+                a.GetType("nunit.simple.Proto.MyMessageList", true, true);
+            }
+        }
+
+        [Test]
+        public void TestProtoFileWithService()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(test + ".cs"))
+            using (ProtoFile proto = new ProtoFile(test + ".proto",
+@"
+import ""google/protobuf/csharp_options.proto"";
+option (google.protobuf.csharp_file_options).service_generator_type = GENERIC;
+
+package nunit.simple;
+// Test a very simple message.
+message MyMessage {
+  optional string name = 1;
+}
+// test a very simple service.
+service TestService {
+  rpc Execute (MyMessage) returns (MyMessage);
+}"))
+            {
+                CopyInGoogleProtoFiles();
+
+                RunProtoc(0, proto.TempPath, "-nest_classes=false");
+                Assert.AreEqual(1, Directory.GetFiles(TempPath, "*.cs").Length);
+
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the service type is in the expected namespace
+                Type t1 = a.GetType("nunit.simple.TestService", true, true);
+                Assert.IsTrue(typeof(IService).IsAssignableFrom(t1), "Expect an IService");
+                Assert.IsTrue(t1.IsAbstract, "Expect abstract class");
+                //assert that the Stub subclass type is in the expected namespace
+                Type t2 = a.GetType("nunit.simple.TestService+Stub", true, true);
+                Assert.IsTrue(t1.IsAssignableFrom(t2), "Expect a sub of TestService");
+                Assert.IsFalse(t2.IsAbstract, "Expect concrete class");
+            }
+        }
+
+        [Test]
+        public void TestProtoFileWithServiceInternal()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(test + ".cs"))
+            using (ProtoFile proto = new ProtoFile(test + ".proto",
+@"
+import ""google/protobuf/csharp_options.proto"";
+option (google.protobuf.csharp_file_options).service_generator_type = GENERIC;
+
+package nunit.simple;
+// Test a very simple message.
+message MyMessage {
+  optional string name = 1;
+}
+// test a very simple service.
+service TestService {
+  rpc Execute (MyMessage) returns (MyMessage);
+}"))
+            {
+                CopyInGoogleProtoFiles();
+
+                RunProtoc(0, proto.TempPath, "-nest_classes=false", "-public_classes=false");
+                Assert.AreEqual(1, Directory.GetFiles(TempPath, "*.cs").Length);
+
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the service type is in the expected namespace
+                Type t1 = a.GetType("nunit.simple.TestService", true, true);
+                Assert.IsTrue(typeof(IService).IsAssignableFrom(t1), "Expect an IService");
+                Assert.IsTrue(t1.IsAbstract, "Expect abstract class");
+                //assert that the Stub subclass type is in the expected namespace
+                Type t2 = a.GetType("nunit.simple.TestService+Stub", true, true);
+                Assert.IsTrue(t1.IsAssignableFrom(t2), "Expect a sub of TestService");
+                Assert.IsFalse(t2.IsAbstract, "Expect concrete class");
+            }
+        }
+
+        private static void CopyInGoogleProtoFiles()
+        {
+            string google = Path.Combine(TempPath, "google\\protobuf");
+            Directory.CreateDirectory(google);
+            foreach (string file in Directory.GetFiles(Path.Combine(OriginalWorkingDirectory, "google\\protobuf")))
+            {
+                File.Copy(file, Path.Combine(google, Path.GetFileName(file)));
+            }
+        }
+    }
+}

+ 59 - 0
csharp/src/ProtoGen.Test/TempFile.cs

@@ -0,0 +1,59 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+
+namespace Google.ProtocolBuffers.ProtoGen
+{
+    internal class ProtoFile : TempFile
+    {
+        public ProtoFile(string filename, string contents)
+            : base(filename, contents)
+        {
+        }
+    }
+
+    internal class TempFile : IDisposable
+    {
+        private string tempFile;
+
+        public static TempFile Attach(string path)
+        {
+            return new TempFile(path, null);
+        }
+
+        protected TempFile(string filename, string contents)
+        {
+            tempFile = filename;
+            if (contents != null)
+            {
+                File.WriteAllText(tempFile, contents, new UTF8Encoding(false));
+            }
+        }
+
+        public TempFile(string contents)
+            : this(Path.GetTempFileName(), contents)
+        {
+        }
+
+        public string TempPath
+        {
+            get { return tempFile; }
+        }
+
+        public void ChangeExtension(string ext)
+        {
+            string newFile = Path.ChangeExtension(tempFile, ext);
+            File.Move(tempFile, newFile);
+            tempFile = newFile;
+        }
+
+        public void Dispose()
+        {
+            if (File.Exists(tempFile))
+            {
+                File.Delete(tempFile);
+            }
+        }
+    }
+}

+ 733 - 0
csharp/src/ProtoGen.Test/TestPreprocessing.cs

@@ -0,0 +1,733 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Reflection;
+using NUnit.Framework;
+
+namespace Google.ProtocolBuffers.ProtoGen
+{
+    [TestFixture]
+    [Category("Preprocessor")]
+    public partial class TestPreprocessing
+    {
+        private static readonly string TempPath = Path.Combine(Path.GetTempPath(), "proto-gen-test");
+
+        private const string DefaultProto =
+            @"
+package nunit.simple;
+// Test a very simple message.
+message MyMessage {
+  optional string name = 1;
+}";
+
+        #region TestFixture SetUp/TearDown
+
+        private static readonly string OriginalWorkingDirectory = Environment.CurrentDirectory;
+
+        [TestFixtureSetUp]
+        public virtual void Setup()
+        {
+            Teardown();
+            Directory.CreateDirectory(TempPath);
+            Environment.CurrentDirectory = TempPath;
+        }
+
+        [TestFixtureTearDown]
+        public virtual void Teardown()
+        {
+            Environment.CurrentDirectory = OriginalWorkingDirectory;
+            if (Directory.Exists(TempPath))
+            {
+                Directory.Delete(TempPath, true);
+            }
+        }
+
+        #endregion
+
+        #region Helper Methods RunProtoGen / RunCsc
+
+        private void RunProtoGen(int expect, params string[] args)
+        {
+            TextWriter tout = Console.Out, terr = Console.Error;
+            StringWriter temp = new StringWriter();
+            Console.SetOut(temp);
+            Console.SetError(temp);
+            try
+            {
+                Assert.AreEqual(expect, ProgramPreprocess.Run(args), "ProtoGen Failed: {0}", temp);
+            }
+            finally
+            {
+                Console.SetOut(tout);
+                Console.SetError(terr);
+            }
+        }
+
+        private Assembly RunCsc(int expect, params string[] sources)
+        {
+            using (TempFile tempDll = new TempFile(String.Empty))
+            {
+                tempDll.ChangeExtension(".dll");
+                List<string> args = new List<string>();
+                args.Add("/nologo");
+                args.Add("/target:library");
+                args.Add("/debug-");
+                args.Add(String.Format(@"""/out:{0}""", tempDll.TempPath));
+                args.Add("/r:System.dll");
+                args.Add(String.Format(@"""/r:{0}""",
+                                       typeof(Google.ProtocolBuffers.DescriptorProtos.DescriptorProto).Assembly.
+                                           Location));
+                args.AddRange(sources);
+
+                string exe = Path.Combine(System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory(),
+                                          "csc.exe");
+                ProcessStartInfo psi = new ProcessStartInfo(exe);
+                psi.CreateNoWindow = true;
+                psi.UseShellExecute = false;
+                psi.RedirectStandardOutput = true;
+                psi.RedirectStandardError = true;
+                psi.Arguments = string.Join(" ", args.ToArray());
+                Process p = Process.Start(psi);
+                p.WaitForExit();
+                string errorText = p.StandardOutput.ReadToEnd() + p.StandardError.ReadToEnd();
+                Assert.AreEqual(expect, p.ExitCode, "CSC.exe Failed: {0}", errorText);
+
+                Assembly asm = null;
+                if (p.ExitCode == 0)
+                {
+                    byte[] allbytes = File.ReadAllBytes(tempDll.TempPath);
+                    asm = Assembly.Load(allbytes);
+
+                    foreach (Type t in asm.GetTypes())
+                    {
+                        Debug.WriteLine(t.FullName, asm.FullName);
+                    }
+                }
+                return asm;
+            }
+        }
+
+        #endregion
+
+        // *******************************************************************
+        // The following tests excercise options for protogen.exe
+        // *******************************************************************
+
+        [Test]
+        public void TestProtoFile()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(test + ".cs"))
+            using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto))
+            {
+                RunProtoGen(0, proto.TempPath);
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t = a.GetType("nunit.simple.MyMessage", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("nunit.simple." + test, true, true);
+            }
+        }
+
+        [Test]
+        public void TestProtoFileWithConflictingType()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(test + ".cs"))
+            using (
+                ProtoFile proto = new ProtoFile(test + ".proto",
+                                                @"
+package nunit.simple;
+// Test a very simple message.
+message " +
+                                                test + @" {
+  optional string name = 1;
+} "))
+            {
+                RunProtoGen(0, proto.TempPath);
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t = a.GetType("nunit.simple." + test, true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("nunit.simple.Proto." + test, true, true);
+            }
+        }
+
+        [Test]
+        public void TestProtoFileWithNamespace()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(test + ".cs"))
+            using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto))
+            {
+                RunProtoGen(0, proto.TempPath, "-namespace:MyNewNamespace");
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t = a.GetType("MyNewNamespace.MyMessage", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("MyNewNamespace." + test, true, true);
+            }
+        }
+
+        [Test]
+        public void TestProtoFileWithUmbrellaClassName()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach("MyUmbrellaClassname.cs"))
+            using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto))
+            {
+                RunProtoGen(0, proto.TempPath, "/umbrella_classname=MyUmbrellaClassname");
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t = a.GetType("nunit.simple.MyMessage", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("nunit.simple.MyUmbrellaClassname", true, true);
+            }
+        }
+
+        [Test]
+        public void TestProtoFileWithNestedClass()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(test + ".cs"))
+            using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto))
+            {
+                RunProtoGen(0, proto.TempPath, "-nest_classes:true");
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t = a.GetType("nunit.simple." + test + "+MyMessage", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("nunit.simple." + test, true, true);
+            }
+        }
+
+        [Test]
+        public void TestProtoFileWithExpandedNsDirectories()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(@"nunit\simple\" + test + ".cs"))
+            using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto))
+            {
+                RunProtoGen(0, proto.TempPath, "-expand_namespace_directories:true");
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t = a.GetType("nunit.simple.MyMessage", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("nunit.simple." + test, true, true);
+            }
+        }
+
+        [Test]
+        public void TestProtoFileWithNewExtension()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(test + ".Generated.cs"))
+            using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto))
+            {
+                RunProtoGen(0, proto.TempPath, "-file_extension:.Generated.cs");
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t = a.GetType("nunit.simple.MyMessage", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("nunit.simple." + test, true, true);
+            }
+        }
+
+        [Test]
+        public void TestProtoFileWithUmbrellaNamespace()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(test + ".cs"))
+            using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto))
+            {
+                RunProtoGen(0, proto.TempPath, "-umbrella_namespace:MyUmbrella.Namespace");
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t = a.GetType("nunit.simple.MyMessage", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("nunit.simple.MyUmbrella.Namespace." + test, true, true);
+            }
+        }
+
+        [Test]
+        public void TestProtoFileWithIgnoredUmbrellaNamespaceDueToNesting()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(test + ".cs"))
+            using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto))
+            {
+                RunProtoGen(0, proto.TempPath, "-nest_classes:true", "-umbrella_namespace:MyUmbrella.Namespace");
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t = a.GetType("nunit.simple." + test + "+MyMessage", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("nunit.simple." + test, true, true);
+            }
+        }
+
+        [Test]
+        public void TestProtoFileWithExplicitEmptyUmbrellaNamespace()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(test + ".cs"))
+            using (
+                ProtoFile proto = new ProtoFile(test + ".proto",
+                                                @"
+package nunit.simple;
+// Test a very simple message.
+message " +
+                                                test + @" {
+  optional string name = 1;
+} "))
+            {
+                //Forces the umbrella class to not use a namespace even if a collision with a type is detected.
+                RunProtoGen(0, proto.TempPath, "-umbrella_namespace:");
+                //error CS0441: 'nunit.simple.TestProtoFileWithExplicitEmptyUmbrellaNamespace': a class cannot be both static and sealed
+                RunCsc(1, source.TempPath);
+            }
+        }
+
+        [Test]
+        public void TestProtoFileWithNewOutputFolder()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(@"generated-code\" + test + ".cs"))
+            using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto))
+            {
+                RunProtoGen(1, proto.TempPath, "-output_directory:generated-code");
+                Directory.CreateDirectory("generated-code");
+                RunProtoGen(0, proto.TempPath, "-output_directory:generated-code");
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t = a.GetType("nunit.simple.MyMessage", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("nunit.simple." + test, true, true);
+            }
+        }
+
+        [Test]
+        public void TestProtoFileAndIgnoreGoogleProtobuf()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(test + ".cs"))
+            using (
+                ProtoFile proto = new ProtoFile(test + ".proto",
+                                                @"
+import ""google/protobuf/csharp_options.proto"";
+option (google.protobuf.csharp_file_options).namespace = ""MyNewNamespace"";
+" +
+                                                DefaultProto))
+            {
+                string google = Path.Combine(TempPath, "google\\protobuf");
+                Directory.CreateDirectory(google);
+                foreach (string file in Directory.GetFiles(Path.Combine(OriginalWorkingDirectory, "google\\protobuf")))
+                {
+                    File.Copy(file, Path.Combine(google, Path.GetFileName(file)));
+                }
+
+                Assert.AreEqual(0, Directory.GetFiles(TempPath, "*.cs").Length);
+                RunProtoGen(0, proto.TempPath, "-ignore_google_protobuf:true");
+                Assert.AreEqual(1, Directory.GetFiles(TempPath, "*.cs").Length);
+
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t = a.GetType("MyNewNamespace.MyMessage", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("MyNewNamespace." + test, true, true);
+            }
+        }
+
+        [Test]
+        public void TestProtoFileWithoutIgnoreGoogleProtobuf()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(test + ".cs"))
+            using (
+                ProtoFile proto = new ProtoFile(test + ".proto",
+                                                @"
+import ""google/protobuf/csharp_options.proto"";
+option (google.protobuf.csharp_file_options).namespace = ""MyNewNamespace"";
+" +
+                                                DefaultProto))
+            {
+                string google = Path.Combine(TempPath, "google\\protobuf");
+                Directory.CreateDirectory(google);
+                foreach (string file in Directory.GetFiles(Path.Combine(OriginalWorkingDirectory, "google\\protobuf")))
+                {
+                    File.Copy(file, Path.Combine(google, Path.GetFileName(file)));
+                }
+
+                Assert.AreEqual(0, Directory.GetFiles(TempPath, "*.cs").Length);
+                //Without the option this fails due to being unable to resolve google/protobuf descriptors
+                RunProtoGen(1, proto.TempPath, "-ignore_google_protobuf:false");
+            }
+        }
+
+        // *******************************************************************
+        // The following tests excercise options for protoc.exe
+        // *******************************************************************
+
+        [Test]
+        public void TestProtoFileWithIncludeImports()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(test + ".cs"))
+            using (
+                ProtoFile proto = new ProtoFile(test + ".proto",
+                                                @"
+import ""google/protobuf/csharp_options.proto"";
+option (google.protobuf.csharp_file_options).namespace = ""MyNewNamespace"";
+
+package nunit.simple;
+// Test a very simple message.
+message MyMessage {
+  optional string name = 1;
+} ")
+                )
+            {
+                string google = Path.Combine(TempPath, "google\\protobuf");
+                Directory.CreateDirectory(google);
+                foreach (string file in Directory.GetFiles(Path.Combine(OriginalWorkingDirectory, "google\\protobuf")))
+                {
+                    File.Copy(file, Path.Combine(google, Path.GetFileName(file)));
+                }
+
+                Assert.AreEqual(0, Directory.GetFiles(TempPath, "*.cs").Length);
+                //if you specify the protoc option --include_imports this should build three source files
+                RunProtoGen(0, proto.TempPath, "--include_imports");
+                Assert.AreEqual(3, Directory.GetFiles(TempPath, "*.cs").Length);
+
+                //you can (and should) simply omit the inclusion of the extra source files in your project
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t = a.GetType("MyNewNamespace.MyMessage", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("MyNewNamespace." + test, true, true);
+            }
+        }
+
+        [Test]
+        public void TestProtoFileWithIncludeImportsAndIgnoreGoogleProtobuf()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(test + ".cs"))
+            using (
+                ProtoFile proto = new ProtoFile(test + ".proto",
+                                                @"
+import ""google/protobuf/csharp_options.proto"";
+option (google.protobuf.csharp_file_options).namespace = ""MyNewNamespace"";
+
+package nunit.simple;
+// Test a very simple message.
+message MyMessage {
+  optional string name = 1;
+} ")
+                )
+            {
+                string google = Path.Combine(TempPath, "google\\protobuf");
+                Directory.CreateDirectory(google);
+                foreach (string file in Directory.GetFiles(Path.Combine(OriginalWorkingDirectory, "google\\protobuf")))
+                    File.Copy(file, Path.Combine(google, Path.GetFileName(file)));
+
+                Assert.AreEqual(0, Directory.GetFiles(TempPath, "*.cs").Length);
+                //Even with --include_imports, if you provide -ignore_google_protobuf:true you only get the one source file
+                RunProtoGen(0, proto.TempPath, "-ignore_google_protobuf:true", "--include_imports");
+                Assert.AreEqual(1, Directory.GetFiles(TempPath, "*.cs").Length);
+
+                //you can (and should) simply omit the inclusion of the extra source files in your project
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t = a.GetType("MyNewNamespace.MyMessage", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("MyNewNamespace." + test, true, true);
+            }
+        }
+
+        [Test]
+        public void TestProtoFileKeepingTheProtoBuffer()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile protobuf = TempFile.Attach(test + ".pb"))
+            using (TempFile source = TempFile.Attach(test + ".cs"))
+            using (
+                ProtoFile proto = new ProtoFile(test + ".proto",
+                                                @"
+package nunit.simple;
+// Test a very simple message.
+message MyMessage {
+  optional string name = 1;
+} ")
+                )
+            {
+                RunProtoGen(0, proto.TempPath, "--descriptor_set_out=" + protobuf.TempPath);
+                Assert.IsTrue(File.Exists(protobuf.TempPath), "Missing: " + protobuf.TempPath);
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t = a.GetType("nunit.simple.MyMessage", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("nunit.simple." + test, true, true);
+            }
+        }
+
+        //Seems the --proto_path or -I option is non-functional for me.  Maybe others have luck?
+        [Test]
+        public void TestProtoFileInDifferentDirectory()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(test + ".cs"))
+            using (ProtoFile proto = new ProtoFile(test + ".proto", DefaultProto))
+            {
+                Environment.CurrentDirectory = OriginalWorkingDirectory;
+                RunProtoGen(0, proto.TempPath, "--proto_path=" + TempPath);
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t = a.GetType("nunit.simple.MyMessage", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("nunit.simple." + test, true, true);
+            }
+        }
+
+        // *******************************************************************
+        // Handling of mutliple input files
+        // *******************************************************************
+
+        [Test]
+        public void TestMultipleProtoFiles()
+        {
+            Setup();
+            using (TempFile source1 = TempFile.Attach("MyMessage.cs"))
+            using (
+                ProtoFile proto1 = new ProtoFile("MyMessage.proto",
+                                                 @"
+package nunit.simple;
+// Test a very simple message.
+message MyMessage {
+  optional string name = 1;
+}")
+                )
+            using (TempFile source2 = TempFile.Attach("MyMessageList.cs"))
+            using (
+                ProtoFile proto2 = new ProtoFile("MyMessageList.proto",
+                                                 @"
+package nunit.simple;
+import ""MyMessage.proto"";
+// Test a very simple message.
+message MyMessageList {
+  repeated MyMessage messages = 1;
+}")
+                )
+            {
+                RunProtoGen(0, proto1.TempPath, proto2.TempPath);
+                Assembly a = RunCsc(0, source1.TempPath, source2.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t1 = a.GetType("nunit.simple.MyMessage", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t1), "Expect an IMessage");
+                //assert that the message type is in the expected namespace
+                Type t2 = a.GetType("nunit.simple.MyMessageList", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t2), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("nunit.simple.Proto.MyMessage", true, true);
+                a.GetType("nunit.simple.Proto.MyMessageList", true, true);
+            }
+        }
+
+        [Test]
+        public void TestOneProtoFileWithBufferFile()
+        {
+            Setup();
+            using (TempFile source1 = TempFile.Attach("MyMessage.cs"))
+            using (TempFile protobuf = TempFile.Attach("MyMessage.pb"))
+            using (
+                ProtoFile proto1 = new ProtoFile("MyMessage.proto",
+                                                 @"
+package nunit.simple;
+// Test a very simple message.
+message MyMessage {
+  optional string name = 1;
+}")
+                )
+            using (TempFile source2 = TempFile.Attach("MyMessageList.cs"))
+            using (
+                ProtoFile proto2 = new ProtoFile("MyMessageList.proto",
+                                                 @"
+package nunit.simple;
+import ""MyMessage.proto"";
+// Test a very simple message.
+message MyMessageList {
+  repeated MyMessage messages = 1;
+}")
+                )
+            {
+                //build the proto buffer for MyMessage
+                RunProtoGen(0, proto1.TempPath, "--descriptor_set_out=" + protobuf.TempPath);
+                //build the MyMessageList proto-buffer and generate code by including MyMessage.pb
+                RunProtoGen(0, proto2.TempPath, protobuf.TempPath);
+                Assembly a = RunCsc(0, source1.TempPath, source2.TempPath);
+                //assert that the message type is in the expected namespace
+                Type t1 = a.GetType("nunit.simple.MyMessage", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t1), "Expect an IMessage");
+                //assert that the message type is in the expected namespace
+                Type t2 = a.GetType("nunit.simple.MyMessageList", true, true);
+                Assert.IsTrue(typeof(IMessage).IsAssignableFrom(t2), "Expect an IMessage");
+                //assert that we can find the static descriptor type
+                a.GetType("nunit.simple.Proto.MyMessage", true, true);
+                a.GetType("nunit.simple.Proto.MyMessageList", true, true);
+            }
+        }
+
+        [Test]
+        public void TestProtoFileWithService()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(test + ".cs"))
+            using (ProtoFile proto = new ProtoFile(test + ".proto",
+@"
+import ""google/protobuf/csharp_options.proto"";
+option (google.protobuf.csharp_file_options).service_generator_type = GENERIC;
+
+package nunit.simple;
+// Test a very simple message.
+message MyMessage {
+  optional string name = 1;
+}
+// test a very simple service.
+service TestService {
+  rpc Execute (MyMessage) returns (MyMessage);
+}"))
+            {
+                CopyInGoogleProtoFiles();
+
+                RunProtoGen(0, proto.TempPath, "-ignore_google_protobuf:true", "-nest_classes=false");
+                Assert.AreEqual(1, Directory.GetFiles(TempPath, "*.cs").Length);
+
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the service type is in the expected namespace
+                Type t1 = a.GetType("nunit.simple.TestService", true, true);
+                Assert.IsTrue(typeof(IService).IsAssignableFrom(t1), "Expect an IService");
+                Assert.IsTrue(t1.IsAbstract, "Expect abstract class");
+                //assert that the Stub subclass type is in the expected namespace
+                Type t2 = a.GetType("nunit.simple.TestService+Stub", true, true);
+                Assert.IsTrue(t1.IsAssignableFrom(t2), "Expect a sub of TestService");
+                Assert.IsFalse(t2.IsAbstract, "Expect concrete class");
+            }
+        }
+
+        [Test]
+        public void TestProtoFileWithServiceInternal()
+        {
+            string test = new StackFrame(false).GetMethod().Name;
+            Setup();
+            using (TempFile source = TempFile.Attach(test + ".cs"))
+            using (ProtoFile proto = new ProtoFile(test + ".proto",
+@"
+import ""google/protobuf/csharp_options.proto"";
+option (google.protobuf.csharp_file_options).service_generator_type = GENERIC;
+
+package nunit.simple;
+// Test a very simple message.
+message MyMessage {
+  optional string name = 1;
+}
+// test a very simple service.
+service TestService {
+  rpc Execute (MyMessage) returns (MyMessage);
+}"))
+            {
+                CopyInGoogleProtoFiles();
+
+                RunProtoGen(0, proto.TempPath, "-ignore_google_protobuf:true", "-nest_classes=false", "-public_classes=false");
+                Assert.AreEqual(1, Directory.GetFiles(TempPath, "*.cs").Length);
+
+                Assembly a = RunCsc(0, source.TempPath);
+                //assert that the service type is in the expected namespace
+                Type t1 = a.GetType("nunit.simple.TestService", true, true);
+                Assert.IsTrue(typeof(IService).IsAssignableFrom(t1), "Expect an IService");
+                Assert.IsTrue(t1.IsAbstract, "Expect abstract class");
+                //assert that the Stub subclass type is in the expected namespace
+                Type t2 = a.GetType("nunit.simple.TestService+Stub", true, true);
+                Assert.IsTrue(t1.IsAssignableFrom(t2), "Expect a sub of TestService");
+                Assert.IsFalse(t2.IsAbstract, "Expect concrete class");
+            }
+        }
+
+        private static void CopyInGoogleProtoFiles()
+        {
+            string google = Path.Combine(TempPath, "google\\protobuf");
+            Directory.CreateDirectory(google);
+            foreach (string file in Directory.GetFiles(Path.Combine(OriginalWorkingDirectory, "google\\protobuf")))
+            {
+                File.Copy(file, Path.Combine(google, Path.GetFileName(file)));
+            }
+        }
+    }
+}

+ 101 - 0
csharp/src/ProtoGen.Test/protoc-gen-cs.Test.csproj

@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <EnvironmentFlavor>CLIENTPROFILE</EnvironmentFlavor>
+    <EnvironmentTemplate>NET35</EnvironmentTemplate>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{C1024C9C-8176-48C3-B547-B9F6DF6B80A6}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Google.ProtocolBuffers.ProtoGen</RootNamespace>
+    <AssemblyName>protoc-gen-cs.Test</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\NET35\Debug</OutputPath>
+    <IntermediateOutputPath>obj\NET35\Debug\</IntermediateOutputPath>
+    <DefineConstants>DEBUG;TRACE;$(EnvironmentFlavor);$(EnvironmentTemplate)</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
+    <NoStdLib>true</NoStdLib>
+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\NET35\Release</OutputPath>
+    <IntermediateOutputPath>obj\NET35\Release\</IntermediateOutputPath>
+    <DefineConstants>TRACE;$(EnvironmentFlavor);$(EnvironmentTemplate)</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
+    <NoStdLib>true</NoStdLib>
+    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\lib\NUnit\lib\nunit.framework.dll</HintPath>
+    </Reference>
+    <Reference Include="mscorlib" />
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="ProtocGenCsUnittests.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="TempFile.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\ProtocolBuffers\ProtocolBuffers.csproj">
+      <Project>{6908bdce-d925-43f3-94ac-a531e6df2591}</Project>
+      <Name>ProtocolBuffers</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\ProtoGen\protoc-gen-cs.csproj">
+      <Project>{250ade34-82fd-4bae-86d5-985fbe589c4b}</Project>
+      <Name>protoc-gen-cs</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="..\..\lib\protoc.exe">
+      <Link>protoc.exe</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="..\..\protos\google\protobuf\csharp_options.proto">
+      <Link>google\protobuf\csharp_options.proto</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="..\..\protos\google\protobuf\descriptor.proto">
+      <Link>google\protobuf\descriptor.proto</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <StartAction>Program</StartAction>
+    <StartProgram>$(ProjectDir)..\..\lib\NUnit\tools\nunit-console.exe</StartProgram>
+    <StartArguments>/nologo /noshadow /labels /wait $(AssemblyName).dll</StartArguments>
+    <StartWorkingDirectory>$(ProjectDir)$(OutputPath)</StartWorkingDirectory>
+  </PropertyGroup>
+</Project>

+ 55 - 0
csharp/src/ProtoGen/DependencyResolutionException.cs

@@ -0,0 +1,55 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+
+namespace Google.ProtocolBuffers.ProtoGen
+{
+    /// <summary>
+    /// Exception thrown when dependencies within a descriptor set can't be resolved.
+    /// </summary>
+    public sealed class DependencyResolutionException : Exception
+    {
+        public DependencyResolutionException(string message) : base(message)
+        {
+        }
+
+        public DependencyResolutionException(string format, params object[] args)
+            : base(string.Format(format, args))
+        {
+        }
+    }
+}

+ 106 - 0
csharp/src/ProtoGen/DescriptorUtil.cs

@@ -0,0 +1,106 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+using Google.ProtocolBuffers.DescriptorProtos;
+using Google.ProtocolBuffers.Descriptors;
+
+namespace Google.ProtocolBuffers.ProtoGen
+{
+    /// <summary>
+    /// Utility class for determining namespaces etc.
+    /// </summary>
+    internal static class DescriptorUtil
+    {
+        internal static string GetFullUmbrellaClassName(IDescriptor descriptor)
+        {
+            CSharpFileOptions options = descriptor.File.CSharpOptions;
+            string result = options.Namespace;
+            if (result != "")
+            {
+                result += '.';
+            }
+            result += GetQualifiedUmbrellaClassName(options);
+            return "global::" + result;
+        }
+
+        /// <summary>
+        /// Evaluates the options and returns the qualified name of the umbrella class
+        /// relative to the descriptor type's namespace.  Basically concatenates the
+        /// UmbrellaNamespace + UmbrellaClassname fields.
+        /// </summary>
+        internal static string GetQualifiedUmbrellaClassName(CSharpFileOptions options)
+        {
+            string fullName = options.UmbrellaClassname;
+            if (!options.NestClasses && options.UmbrellaNamespace != "")
+            {
+                fullName = String.Format("{0}.{1}", options.UmbrellaNamespace, options.UmbrellaClassname);
+            }
+            return fullName;
+        }
+
+        internal static string GetMappedTypeName(MappedType type)
+        {
+            switch (type)
+            {
+                case MappedType.Int32:
+                    return "int";
+                case MappedType.Int64:
+                    return "long";
+                case MappedType.UInt32:
+                    return "uint";
+                case MappedType.UInt64:
+                    return "ulong";
+                case MappedType.Single:
+                    return "float";
+                case MappedType.Double:
+                    return "double";
+                case MappedType.Boolean:
+                    return "bool";
+                case MappedType.String:
+                    return "string";
+                case MappedType.ByteString:
+                    return "pb::ByteString";
+                case MappedType.Enum:
+                    return null;
+                case MappedType.Message:
+                    return null;
+                default:
+                    throw new ArgumentOutOfRangeException("Unknown mapped type " + type);
+            }
+        }
+    }
+}

+ 148 - 0
csharp/src/ProtoGen/EnumFieldGenerator.cs

@@ -0,0 +1,148 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using Google.ProtocolBuffers.Descriptors;
+
+namespace Google.ProtocolBuffers.ProtoGen
+{
+    internal class EnumFieldGenerator : FieldGeneratorBase, IFieldSourceGenerator
+    {
+        internal EnumFieldGenerator(FieldDescriptor descriptor, int fieldOrdinal)
+            : base(descriptor, fieldOrdinal)
+        {
+        }
+
+        public void GenerateMembers(TextGenerator writer)
+        {
+            writer.WriteLine("private bool has{0};", PropertyName);
+            writer.WriteLine("private {0} {1}_ = {2};", TypeName, Name, DefaultValue);
+            AddDeprecatedFlag(writer);
+            writer.WriteLine("public bool Has{0} {{", PropertyName);
+            writer.WriteLine("  get {{ return has{0}; }}", PropertyName);
+            writer.WriteLine("}");
+            AddPublicMemberAttributes(writer);
+            writer.WriteLine("public {0} {1} {{", TypeName, PropertyName);
+            writer.WriteLine("  get {{ return {0}_; }}", Name);
+            writer.WriteLine("}");
+        }
+
+        public void GenerateBuilderMembers(TextGenerator writer)
+        {
+            AddDeprecatedFlag(writer);
+            writer.WriteLine("public bool Has{0} {{", PropertyName);
+            writer.WriteLine(" get {{ return result.has{0}; }}", PropertyName);
+            writer.WriteLine("}");
+            AddPublicMemberAttributes(writer);
+            writer.WriteLine("public {0} {1} {{", TypeName, PropertyName);
+            writer.WriteLine("  get {{ return result.{0}; }}", PropertyName);
+            writer.WriteLine("  set {{ Set{0}(value); }}", PropertyName);
+            writer.WriteLine("}");
+            AddPublicMemberAttributes(writer);
+            writer.WriteLine("public Builder Set{0}({1} value) {{", PropertyName, TypeName);
+            writer.WriteLine("  PrepareBuilder();");
+            writer.WriteLine("  result.has{0} = true;", PropertyName);
+            writer.WriteLine("  result.{0}_ = value;", Name);
+            writer.WriteLine("  return this;");
+            writer.WriteLine("}");
+            AddDeprecatedFlag(writer);
+            writer.WriteLine("public Builder Clear{0}() {{", PropertyName);
+            writer.WriteLine("  PrepareBuilder();");
+            writer.WriteLine("  result.has{0} = false;", PropertyName);
+            writer.WriteLine("  result.{0}_ = {1};", Name, DefaultValue);
+            writer.WriteLine("  return this;");
+            writer.WriteLine("}");
+        }
+
+        public void GenerateMergingCode(TextGenerator writer)
+        {
+            writer.WriteLine("if (other.Has{0}) {{", PropertyName);
+            writer.WriteLine("  {0} = other.{0};", PropertyName);
+            writer.WriteLine("}");
+        }
+
+        public void GenerateBuildingCode(TextGenerator writer)
+        {
+            // Nothing to do here for enum types
+        }
+
+        public void GenerateParsingCode(TextGenerator writer)
+        {
+            writer.WriteLine("object unknown;");
+            writer.WriteLine("if(input.ReadEnum(ref result.{0}_, out unknown)) {{", Name);
+            writer.WriteLine("  result.has{0} = true;", PropertyName);
+            writer.WriteLine("} else if(unknown is int) {");
+            if (!UseLiteRuntime)
+            {
+                writer.WriteLine("  if (unknownFields == null) {"); // First unknown field - create builder now
+                writer.WriteLine("    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);");
+                writer.WriteLine("  }");
+                writer.WriteLine("  unknownFields.MergeVarintField({0}, (ulong)(int)unknown);", Number);
+            }
+            writer.WriteLine("}");
+        }
+
+        public void GenerateSerializationCode(TextGenerator writer)
+        {
+            writer.WriteLine("if (has{0}) {{", PropertyName);
+            writer.WriteLine("  output.WriteEnum({0}, field_names[{2}], (int) {1}, {1});", Number, PropertyName,
+                             FieldOrdinal);
+            writer.WriteLine("}");
+        }
+
+        public void GenerateSerializedSizeCode(TextGenerator writer)
+        {
+            writer.WriteLine("if (has{0}) {{", PropertyName);
+            writer.WriteLine("  size += pb::CodedOutputStream.ComputeEnumSize({0}, (int) {1});", Number, PropertyName);
+            writer.WriteLine("}");
+        }
+
+        public override void WriteHash(TextGenerator writer)
+        {
+            writer.WriteLine("if (has{0}) hash ^= {1}_.GetHashCode();", PropertyName, Name);
+        }
+
+        public override void WriteEquals(TextGenerator writer)
+        {
+            writer.WriteLine("if (has{0} != other.has{0} || (has{0} && !{1}_.Equals(other.{1}_))) return false;",
+                             PropertyName, Name);
+        }
+
+        public override void WriteToString(TextGenerator writer)
+        {
+            writer.WriteLine("PrintField(\"{0}\", has{1}, {2}_, writer);", Descriptor.Name, PropertyName, Name);
+        }
+    }
+}

+ 62 - 0
csharp/src/ProtoGen/EnumGenerator.cs

@@ -0,0 +1,62 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using Google.ProtocolBuffers.Descriptors;
+
+namespace Google.ProtocolBuffers.ProtoGen
+{
+    internal class EnumGenerator : SourceGeneratorBase<EnumDescriptor>, ISourceGenerator
+    {
+        internal EnumGenerator(EnumDescriptor descriptor) : base(descriptor)
+        {
+        }
+
+        // TODO(jonskeet): Write out enum descriptors? Can be retrieved from file...
+        public void Generate(TextGenerator writer)
+        {
+            WriteGeneratedCodeAttributes(writer);
+            writer.WriteLine("{0} enum {1} {{", ClassAccessLevel, Descriptor.Name);
+            writer.Indent();
+            foreach (EnumValueDescriptor value in Descriptor.Values)
+            {
+                writer.WriteLine("{0} = {1},", value.Name, value.Number);
+            }
+            writer.Outdent();
+            writer.WriteLine("}");
+            writer.WriteLine();
+        }
+    }
+}

+ 183 - 0
csharp/src/ProtoGen/ExtensionGenerator.cs

@@ -0,0 +1,183 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+using Google.ProtocolBuffers.Descriptors;
+
+namespace Google.ProtocolBuffers.ProtoGen
+{
+    internal class ExtensionGenerator : FieldGeneratorBase, ISourceGenerator
+    {
+        private readonly string extends;
+        private readonly string scope;
+        private readonly string type;
+        private readonly string name;
+
+        internal ExtensionGenerator(FieldDescriptor descriptor)
+            : base(descriptor, 0)
+        {
+            if (Descriptor.ExtensionScope != null)
+            {
+                scope = GetClassName(Descriptor.ExtensionScope);
+            }
+            else
+            {
+                scope = DescriptorUtil.GetFullUmbrellaClassName(Descriptor.File);
+            }
+            switch (Descriptor.MappedType)
+            {
+                case MappedType.Message:
+                    type = GetClassName(Descriptor.MessageType);
+                    break;
+                case MappedType.Enum:
+                    type = GetClassName(Descriptor.EnumType);
+                    break;
+                default:
+                    type = DescriptorUtil.GetMappedTypeName(Descriptor.MappedType);
+                    break;
+            }
+            extends = GetClassName(Descriptor.ContainingType);
+            name = Descriptor.CSharpOptions.PropertyName;
+        }
+
+        public void Generate(TextGenerator writer)
+        {
+            if (Descriptor.File.CSharpOptions.ClsCompliance && GetFieldConstantName(Descriptor).StartsWith("_"))
+            {
+                writer.WriteLine("[global::System.CLSCompliant(false)]");
+            }
+
+            writer.WriteLine("public const int {0} = {1};", GetFieldConstantName(Descriptor), Descriptor.FieldNumber);
+
+            if (UseLiteRuntime)
+            {
+                if (Descriptor.MappedType == MappedType.Message && Descriptor.MessageType.Options.MessageSetWireFormat)
+                {
+                    throw new ArgumentException(
+                        "option message_set_wire_format = true; is not supported in Lite runtime extensions.");
+                }
+                if (!Descriptor.IsCLSCompliant && Descriptor.File.CSharpOptions.ClsCompliance)
+                {
+                    writer.WriteLine("[global::System.CLSCompliant(false)]");
+                }
+                writer.WriteLine("{0} static pb::{4}<{1}, {2}> {3};", ClassAccessLevel, extends, type, name,
+                                 Descriptor.IsRepeated ? "GeneratedRepeatExtensionLite" : "GeneratedExtensionLite");
+            }
+            else if (Descriptor.IsRepeated)
+            {
+                if (!Descriptor.IsCLSCompliant && Descriptor.File.CSharpOptions.ClsCompliance)
+                {
+                    writer.WriteLine("[global::System.CLSCompliant(false)]");
+                }
+                writer.WriteLine("{0} static pb::GeneratedExtensionBase<scg::IList<{1}>> {2};", ClassAccessLevel, type,
+                                 name);
+            }
+            else
+            {
+                if (!Descriptor.IsCLSCompliant && Descriptor.File.CSharpOptions.ClsCompliance)
+                {
+                    writer.WriteLine("[global::System.CLSCompliant(false)]");
+                }
+                writer.WriteLine("{0} static pb::GeneratedExtensionBase<{1}> {2};", ClassAccessLevel, type, name);
+            }
+        }
+
+        internal void GenerateStaticVariableInitializers(TextGenerator writer)
+        {
+            if (UseLiteRuntime)
+            {
+                writer.WriteLine("{0}.{1} = ", scope, name);
+                writer.Indent();
+                writer.WriteLine("new pb::{0}<{1}, {2}>(",
+                                 Descriptor.IsRepeated ? "GeneratedRepeatExtensionLite" : "GeneratedExtensionLite",
+                                 extends, type);
+                writer.Indent();
+                writer.WriteLine("\"{0}\",", Descriptor.FullName);
+                writer.WriteLine("{0}.DefaultInstance,", extends);
+                if (!Descriptor.IsRepeated)
+                {
+                    writer.WriteLine("{0},",
+                                     Descriptor.HasDefaultValue
+                                         ? DefaultValue
+                                         : IsNullableType ? "null" : "default(" + type + ")");
+                }
+                writer.WriteLine("{0},",
+                                 (Descriptor.MappedType == MappedType.Message) ? type + ".DefaultInstance" : "null");
+                writer.WriteLine("{0},",
+                                 (Descriptor.MappedType == MappedType.Enum) ? "new EnumLiteMap<" + type + ">()" : "null");
+                writer.WriteLine("{0}.{1}FieldNumber,", scope, name);
+                writer.Write("pbd::FieldType.{0}", Descriptor.FieldType);
+                if (Descriptor.IsRepeated)
+                {
+                    writer.WriteLine(",");
+                    writer.Write(Descriptor.IsPacked ? "true" : "false");
+                }
+                writer.Outdent();
+                writer.WriteLine(");");
+                writer.Outdent();
+            }
+            else if (Descriptor.IsRepeated)
+            {
+                writer.WriteLine(
+                    "{0}.{1} = pb::GeneratedRepeatExtension<{2}>.CreateInstance({0}.Descriptor.Extensions[{3}]);", scope,
+                    name, type, Descriptor.Index);
+            }
+            else
+            {
+                writer.WriteLine(
+                    "{0}.{1} = pb::GeneratedSingleExtension<{2}>.CreateInstance({0}.Descriptor.Extensions[{3}]);", scope,
+                    name, type, Descriptor.Index);
+            }
+        }
+
+        internal void GenerateExtensionRegistrationCode(TextGenerator writer)
+        {
+            writer.WriteLine("registry.Add({0}.{1});", scope, name);
+        }
+
+        public override void WriteHash(TextGenerator writer)
+        {
+        }
+
+        public override void WriteEquals(TextGenerator writer)
+        {
+        }
+
+        public override void WriteToString(TextGenerator writer)
+        {
+        }
+    }
+}

+ 389 - 0
csharp/src/ProtoGen/FieldGeneratorBase.cs

@@ -0,0 +1,389 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+using System.Globalization;
+using System.Text;
+using Google.ProtocolBuffers.Descriptors;
+
+namespace Google.ProtocolBuffers.ProtoGen
+{
+    internal abstract class FieldGeneratorBase : SourceGeneratorBase<FieldDescriptor>
+    {
+        private readonly int _fieldOrdinal;
+
+        protected FieldGeneratorBase(FieldDescriptor descriptor, int fieldOrdinal)
+            : base(descriptor)
+        {
+            _fieldOrdinal = fieldOrdinal;
+        }
+
+        public abstract void WriteHash(TextGenerator writer);
+        public abstract void WriteEquals(TextGenerator writer);
+        public abstract void WriteToString(TextGenerator writer);
+
+        public int FieldOrdinal
+        {
+            get { return _fieldOrdinal; }
+        }
+
+        private static bool AllPrintableAscii(string text)
+        {
+            foreach (char c in text)
+            {
+                if (c < 0x20 || c > 0x7e)
+                {
+                    return false;
+                }
+            }
+            return true;
+        }
+
+        /// <summary>
+        /// This returns true if the field has a non-default default value.  For instance this returns 
+        /// false for numerics with a default of zero '0', or booleans with a default of false.
+        /// </summary>
+        protected bool HasDefaultValue
+        {
+            get
+            {
+                switch (Descriptor.FieldType)
+                {
+                    case FieldType.Float:
+                    case FieldType.Double:
+                    case FieldType.Int32:
+                    case FieldType.Int64:
+                    case FieldType.SInt32:
+                    case FieldType.SInt64:
+                    case FieldType.SFixed32:
+                    case FieldType.SFixed64:
+                    case FieldType.UInt32:
+                    case FieldType.UInt64:
+                    case FieldType.Fixed32:
+                    case FieldType.Fixed64:
+                        {
+                            IConvertible value = (IConvertible) Descriptor.DefaultValue;
+                            return value.ToString(CultureInfo.InvariantCulture) != "0";
+                        }
+                    case FieldType.Bool:
+                        return ((bool) Descriptor.DefaultValue) == true;
+                    default:
+                        return true;
+                }
+            }
+        }
+
+        /// <remarks>Copy exists in ExtensionGenerator.cs</remarks>
+        protected string DefaultValue
+        {
+            get
+            {
+                string suffix = "";
+                switch (Descriptor.FieldType)
+                {
+                    case FieldType.Float:
+                        suffix = "F";
+                        break;
+                    case FieldType.Double:
+                        suffix = "D";
+                        break;
+                    case FieldType.Int64:
+                        suffix = "L";
+                        break;
+                    case FieldType.UInt64:
+                        suffix = "UL";
+                        break;
+                }
+                switch (Descriptor.FieldType)
+                {
+                    case FieldType.Float:
+                    case FieldType.Double:
+                    case FieldType.Int32:
+                    case FieldType.Int64:
+                    case FieldType.SInt32:
+                    case FieldType.SInt64:
+                    case FieldType.SFixed32:
+                    case FieldType.SFixed64:
+                    case FieldType.UInt32:
+                    case FieldType.UInt64:
+                    case FieldType.Fixed32:
+                    case FieldType.Fixed64:
+                        {
+                            // The simple Object.ToString converts using the current culture.
+                            // We want to always use the invariant culture so it's predictable.
+                            IConvertible value = (IConvertible) Descriptor.DefaultValue;
+                            //a few things that must be handled explicitly
+                            if (Descriptor.FieldType == FieldType.Double && value is double)
+                            {
+                                if (double.IsNaN((double) value))
+                                {
+                                    return "double.NaN";
+                                }
+                                if (double.IsPositiveInfinity((double) value))
+                                {
+                                    return "double.PositiveInfinity";
+                                }
+                                if (double.IsNegativeInfinity((double) value))
+                                {
+                                    return "double.NegativeInfinity";
+                                }
+                            }
+                            else if (Descriptor.FieldType == FieldType.Float && value is float)
+                            {
+                                if (float.IsNaN((float) value))
+                                {
+                                    return "float.NaN";
+                                }
+                                if (float.IsPositiveInfinity((float) value))
+                                {
+                                    return "float.PositiveInfinity";
+                                }
+                                if (float.IsNegativeInfinity((float) value))
+                                {
+                                    return "float.NegativeInfinity";
+                                }
+                            }
+                            return value.ToString(CultureInfo.InvariantCulture) + suffix;
+                        }
+                    case FieldType.Bool:
+                        return (bool) Descriptor.DefaultValue ? "true" : "false";
+
+                    case FieldType.Bytes:
+                        if (!Descriptor.HasDefaultValue)
+                        {
+                            return "pb::ByteString.Empty";
+                        }
+                        if (UseLiteRuntime && Descriptor.DefaultValue is ByteString)
+                        {
+                            string temp = (((ByteString) Descriptor.DefaultValue).ToBase64());
+                            return String.Format("pb::ByteString.FromBase64(\"{0}\")", temp);
+                        }
+                        return string.Format("(pb::ByteString) {0}.Descriptor.Fields[{1}].DefaultValue",
+                                             GetClassName(Descriptor.ContainingType), Descriptor.Index);
+                    case FieldType.String:
+                        if (AllPrintableAscii(Descriptor.Proto.DefaultValue))
+                        {
+                            // All chars are ASCII and printable.  In this case we only
+                            // need to escape quotes and backslashes.
+                            return "\"" + Descriptor.Proto.DefaultValue
+                                              .Replace("\\", "\\\\")
+                                              .Replace("'", "\\'")
+                                              .Replace("\"", "\\\"")
+                                   + "\"";
+                        }
+                        if (UseLiteRuntime && Descriptor.DefaultValue is String)
+                        {
+                            string temp = Convert.ToBase64String(
+                                    Encoding.UTF8.GetBytes((String) Descriptor.DefaultValue));
+                            return String.Format("pb::ByteString.FromBase64(\"{0}\").ToStringUtf8()", temp);
+                        }
+                        return string.Format("(string) {0}.Descriptor.Fields[{1}].DefaultValue",
+                                             GetClassName(Descriptor.ContainingType), Descriptor.Index);
+                    case FieldType.Enum:
+                        return TypeName + "." + ((EnumValueDescriptor) Descriptor.DefaultValue).Name;
+                    case FieldType.Message:
+                    case FieldType.Group:
+                        return TypeName + ".DefaultInstance";
+                    default:
+                        throw new InvalidOperationException("Invalid field descriptor type");
+                }
+            }
+        }
+
+        protected string PropertyName
+        {
+            get { return Descriptor.CSharpOptions.PropertyName; }
+        }
+
+        protected string Name
+        {
+            get { return NameHelpers.UnderscoresToCamelCase(GetFieldName(Descriptor)); }
+        }
+
+        protected int Number
+        {
+            get { return Descriptor.FieldNumber; }
+        }
+
+        protected void AddNullCheck(TextGenerator writer)
+        {
+            AddNullCheck(writer, "value");
+        }
+
+        protected void AddNullCheck(TextGenerator writer, string name)
+        {
+            if (IsNullableType)
+            {
+                writer.WriteLine("  pb::ThrowHelper.ThrowIfNull({0}, \"{0}\");", name);
+            }
+        }
+
+        protected void AddPublicMemberAttributes(TextGenerator writer)
+        {
+            AddDeprecatedFlag(writer);
+            AddClsComplianceCheck(writer);
+        }
+
+        protected void AddClsComplianceCheck(TextGenerator writer)
+        {
+            if (!Descriptor.IsCLSCompliant && Descriptor.File.CSharpOptions.ClsCompliance)
+            {
+                writer.WriteLine("[global::System.CLSCompliant(false)]");
+            }
+        }
+
+        protected bool IsObsolete { get { return Descriptor.Options.Deprecated; } }
+
+        /// <summary>
+        /// Writes [global::System.ObsoleteAttribute()] if the member is obsolete
+        /// </summary>
+        protected void AddDeprecatedFlag(TextGenerator writer)
+        {
+            if (IsObsolete)
+            {
+                writer.WriteLine("[global::System.ObsoleteAttribute()]");
+            }
+        }
+
+        /// <summary>
+        /// For encodings with fixed sizes, returns that size in bytes.  Otherwise
+        /// returns -1. TODO(jonskeet): Make this less ugly.
+        /// </summary>
+        protected int FixedSize
+        {
+            get
+            {
+                switch (Descriptor.FieldType)
+                {
+                    case FieldType.UInt32:
+                    case FieldType.UInt64:
+                    case FieldType.Int32:
+                    case FieldType.Int64:
+                    case FieldType.SInt32:
+                    case FieldType.SInt64:
+                    case FieldType.Enum:
+                    case FieldType.Bytes:
+                    case FieldType.String:
+                    case FieldType.Message:
+                    case FieldType.Group:
+                        return -1;
+                    case FieldType.Float:
+                        return WireFormat.FloatSize;
+                    case FieldType.SFixed32:
+                        return WireFormat.SFixed32Size;
+                    case FieldType.Fixed32:
+                        return WireFormat.Fixed32Size;
+                    case FieldType.Double:
+                        return WireFormat.DoubleSize;
+                    case FieldType.SFixed64:
+                        return WireFormat.SFixed64Size;
+                    case FieldType.Fixed64:
+                        return WireFormat.Fixed64Size;
+                    case FieldType.Bool:
+                        return WireFormat.BoolSize;
+                    default:
+                        throw new InvalidOperationException("Invalid field descriptor type");
+                }
+            }
+        }
+
+        protected bool IsNullableType
+        {
+            get
+            {
+                switch (Descriptor.FieldType)
+                {
+                    case FieldType.Float:
+                    case FieldType.Double:
+                    case FieldType.Int32:
+                    case FieldType.Int64:
+                    case FieldType.SInt32:
+                    case FieldType.SInt64:
+                    case FieldType.SFixed32:
+                    case FieldType.SFixed64:
+                    case FieldType.UInt32:
+                    case FieldType.UInt64:
+                    case FieldType.Fixed32:
+                    case FieldType.Fixed64:
+                    case FieldType.Bool:
+                    case FieldType.Enum:
+                        return false;
+                    case FieldType.Bytes:
+                    case FieldType.String:
+                    case FieldType.Message:
+                    case FieldType.Group:
+                        return true;
+                    default:
+                        throw new InvalidOperationException("Invalid field descriptor type");
+                }
+            }
+        }
+
+        protected string TypeName
+        {
+            get
+            {
+                switch (Descriptor.FieldType)
+                {
+                    case FieldType.Enum:
+                        return GetClassName(Descriptor.EnumType);
+                    case FieldType.Message:
+                    case FieldType.Group:
+                        return GetClassName(Descriptor.MessageType);
+                    default:
+                        return DescriptorUtil.GetMappedTypeName(Descriptor.MappedType);
+                }
+            }
+        }
+
+        protected string MessageOrGroup
+        {
+            get { return Descriptor.FieldType == FieldType.Group ? "Group" : "Message"; }
+        }
+
+        /// <summary>
+        /// Returns the type name as used in CodedInputStream method names: SFixed32, UInt32 etc.
+        /// </summary>
+        protected string CapitalizedTypeName
+        {
+            get
+            {
+                // Our enum names match perfectly. How serendipitous.
+                return Descriptor.FieldType.ToString();
+            }
+        }
+    }
+}

+ 267 - 0
csharp/src/ProtoGen/Generator.cs

@@ -0,0 +1,267 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using Google.ProtocolBuffers.Collections;
+using Google.ProtocolBuffers.Compiler.PluginProto;
+using Google.ProtocolBuffers.DescriptorProtos;
+using Google.ProtocolBuffers.Descriptors;
+
+namespace Google.ProtocolBuffers.ProtoGen
+{
+    /// <summary>
+    /// Code generator for protocol buffers. Only C# is supported at the moment.
+    /// </summary>
+    public sealed class Generator
+    {
+        private readonly GeneratorOptions options;
+
+        private Generator(GeneratorOptions options)
+        {
+            options.Validate();
+            this.options = options;
+        }
+
+        /// <summary>
+        /// Returns a generator configured with the specified options.
+        /// </summary>
+        public static Generator CreateGenerator(GeneratorOptions options)
+        {
+            return new Generator(options);
+        }
+
+        public void Generate(CodeGeneratorRequest request, CodeGeneratorResponse.Builder response)
+        {
+            IList<FileDescriptor> descriptors = ConvertDescriptors(options.FileOptions, request.ProtoFileList);
+
+            // Combine with options from command line
+            foreach (FileDescriptor descriptor in descriptors)
+            {
+                descriptor.ConfigureWithDefaultOptions(options.FileOptions);
+            }
+
+            bool duplicates = false;
+            Dictionary<string, bool> names = new Dictionary<string, bool>(StringComparer.OrdinalIgnoreCase);
+            foreach (FileDescriptor descriptor in descriptors)
+            {
+                string file = GetOutputFile(descriptor, false);
+                if (names.ContainsKey(file))
+                {
+                    duplicates = true;
+                    break;
+                }
+                names.Add(file, true);
+            }
+
+            //ROK - Changed to dictionary from HashSet to allow 2.0 compile
+            var filesToGenerate = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
+            foreach (var item in request.FileToGenerateList)
+            {
+                filesToGenerate[item] = null;
+            }
+            foreach (FileDescriptor descriptor in descriptors)
+            {
+                // Optionally exclude descriptors in google.protobuf
+                if (descriptor.CSharpOptions.IgnoreGoogleProtobuf && descriptor.Package == "google.protobuf")
+                {
+                    continue;
+                }
+                if (filesToGenerate.ContainsKey(descriptor.Name))
+                {
+                    Generate(descriptor, duplicates, response);
+                }
+            }
+        }
+
+        /// <summary>
+        /// Generates code for a particular file. All dependencies must
+        /// already have been resolved.
+        /// </summary>
+        private void Generate(FileDescriptor descriptor, bool duplicates, CodeGeneratorResponse.Builder response)
+        {
+            var code = new StringBuilder();
+            var ucg = new UmbrellaClassGenerator(descriptor);
+            using (StringWriter textWriter = new StringWriter(code))
+            {
+                TextGenerator writer = new TextGenerator(textWriter, options.LineBreak);
+                ucg.Generate(writer);
+            }
+            response.AddFile(new CodeGeneratorResponse.Types.File.Builder
+            {
+                Name = GetOutputFile(descriptor, duplicates),
+                Content = code.ToString(),
+            }.Build());
+        }
+
+        private string GetOutputFile(FileDescriptor descriptor, bool duplicates)
+        {
+            CSharpFileOptions fileOptions = descriptor.CSharpOptions;
+
+            string filename = descriptor.CSharpOptions.UmbrellaClassname + descriptor.CSharpOptions.FileExtension;
+            if (duplicates)
+            {
+                string namepart;
+                if (String.IsNullOrEmpty(descriptor.Name) || String.IsNullOrEmpty(namepart = Path.GetFileNameWithoutExtension(descriptor.Name)))
+                    throw new ApplicationException("Duplicate UmbrellaClassname options created a file name collision.");
+
+                filename = namepart + descriptor.CSharpOptions.FileExtension;
+            }
+
+            string outputDirectory = descriptor.CSharpOptions.OutputDirectory;
+            if (fileOptions.ExpandNamespaceDirectories)
+            {
+                string package = fileOptions.Namespace;
+                if (!string.IsNullOrEmpty(package))
+                {
+                    string[] bits = package.Split('.');
+                    foreach (string bit in bits)
+                    {
+                        outputDirectory = Path.Combine(outputDirectory, bit);
+                    }
+                }
+            }
+
+            // As the directory can be explicitly specified in options, we need to make sure it exists
+            Directory.CreateDirectory(outputDirectory);
+            return Path.Combine(outputDirectory, filename);
+        }
+
+        /// <summary>
+        /// Resolves any dependencies and converts FileDescriptorProtos into FileDescriptors.
+        /// The list returned is in the same order as the protos are listed in the descriptor set.
+        /// Note: this method is internal rather than private to allow testing.
+        /// </summary>
+        /// <exception cref="DependencyResolutionException">Not all dependencies could be resolved.</exception>
+        public static IList<FileDescriptor> ConvertDescriptors(CSharpFileOptions options,
+                                                               IList<FileDescriptorProto> fileList)
+        {
+            FileDescriptor[] converted = new FileDescriptor[fileList.Count];
+
+            Dictionary<string, FileDescriptor> convertedMap = new Dictionary<string, FileDescriptor>();
+
+            int totalConverted = 0;
+
+            bool madeProgress = true;
+            while (madeProgress && totalConverted < converted.Length)
+            {
+                madeProgress = false;
+                for (int i = 0; i < converted.Length; i++)
+                {
+                    if (converted[i] != null)
+                    {
+                        // Already done this one
+                        continue;
+                    }
+                    FileDescriptorProto candidate = fileList[i];
+                    FileDescriptor[] dependencies = new FileDescriptor[candidate.DependencyList.Count];
+
+
+                    CSharpFileOptions.Builder builder = options.ToBuilder();
+                    if (candidate.Options.HasExtension(CSharpOptions.CSharpFileOptions))
+                    {
+                        builder.MergeFrom(
+                            candidate.Options.GetExtension(CSharpOptions.CSharpFileOptions));
+                    }
+                    CSharpFileOptions localOptions = builder.Build();
+
+                    bool foundAllDependencies = true;
+                    for (int j = 0; j < dependencies.Length; j++)
+                    {
+                        if (!convertedMap.TryGetValue(candidate.DependencyList[j], out dependencies[j]))
+                        {
+                            // We can auto-magically resolve these since we already have their description
+                            // This way if the file is only referencing options it does not need to be built with the
+                            // --include_imports definition.
+                            if (localOptions.IgnoreGoogleProtobuf &&
+                                (candidate.DependencyList[j] == "google/protobuf/csharp_options.proto"))
+                            {
+                                dependencies[j] = CSharpOptions.Descriptor;
+                                continue;
+                            }
+                            if (localOptions.IgnoreGoogleProtobuf &&
+                                (candidate.DependencyList[j] == "google/protobuf/descriptor.proto"))
+                            {
+                                dependencies[j] = DescriptorProtoFile.Descriptor;
+                                continue;
+                            }
+                            foundAllDependencies = false;
+                            break;
+                        }
+                    }
+                    if (!foundAllDependencies)
+                    {
+                        continue;
+                    }
+                    madeProgress = true;
+                    totalConverted++;
+                    converted[i] = FileDescriptor.BuildFrom(candidate, dependencies);
+                    convertedMap[candidate.Name] = converted[i];
+                }
+            }
+            if (!madeProgress)
+            {
+                StringBuilder remaining = new StringBuilder();
+                for (int i = 0; i < converted.Length; i++)
+                {
+                    if (converted[i] == null)
+                    {
+                        if (remaining.Length != 0)
+                        {
+                            remaining.Append(", ");
+                        }
+                        FileDescriptorProto failure = fileList[i];
+                        remaining.Append(failure.Name);
+                        remaining.Append(":");
+                        foreach (string dependency in failure.DependencyList)
+                        {
+                            if (!convertedMap.ContainsKey(dependency))
+                            {
+                                remaining.Append(" ");
+                                remaining.Append(dependency);
+                            }
+                        }
+                        remaining.Append(";");
+                    }
+                }
+                throw new DependencyResolutionException("Unable to resolve all dependencies: " + remaining);
+            }
+            return Lists.AsReadOnly(converted);
+        }
+    }
+}

+ 330 - 0
csharp/src/ProtoGen/GeneratorOptions.cs

@@ -0,0 +1,330 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text.RegularExpressions;
+using Google.ProtocolBuffers.DescriptorProtos;
+using Google.ProtocolBuffers.Descriptors;
+
+namespace Google.ProtocolBuffers.ProtoGen
+{
+    /// <summary>
+    /// All the configuration required for the generator - where to generate
+    /// output files, the location of input files etc. While this isn't immutable
+    /// in practice, the contents shouldn't be changed after being passed to
+    /// the generator.
+    /// </summary>
+    public sealed class GeneratorOptions
+    {
+        private static Dictionary<string, string> LineBreaks =
+            new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase)
+                {
+                    {"Windows", "\r\n"},
+                    {"Unix", "\n"},
+                    {"Default", Environment.NewLine}
+                };
+
+        public IList<string> InputFiles { get; set; }
+
+        public GeneratorOptions()
+        {
+            LineBreak = Environment.NewLine;
+        }
+
+        /// <summary>
+        /// Attempts to validate the options, but doesn't throw an exception if they're invalid.
+        /// Instead, when this method returns false, the output variable will contain a collection
+        /// of reasons for the validation failure.
+        /// </summary>
+        /// <param name="reasons">Variable to receive a list of reasons in case of validation failure.</param>
+        /// <returns>true if the options are valid; false otherwise</returns>
+        public bool TryValidate(out IList<string> reasons)
+        {
+            List<string> tmpReasons = new List<string>();
+
+            ParseArguments(tmpReasons);
+
+            // Output directory validation
+            if (string.IsNullOrEmpty(FileOptions.OutputDirectory))
+            {
+                tmpReasons.Add("No output directory specified");
+            }
+            else
+            {
+                if (!Directory.Exists(FileOptions.OutputDirectory))
+                {
+                    tmpReasons.Add("Specified output directory (" + FileOptions.OutputDirectory + " doesn't exist.");
+                }
+            }
+
+            // Input file validation (just in terms of presence)
+            if (InputFiles == null || InputFiles.Count == 0)
+            {
+                tmpReasons.Add("No input files specified");
+            }
+            else
+            {
+                foreach (string input in InputFiles)
+                {
+                    FileInfo fi = new FileInfo(input);
+                    if (!fi.Exists)
+                    {
+                        tmpReasons.Add("Input file " + input + " doesn't exist.");
+                    }
+                }
+            }
+
+            if (tmpReasons.Count != 0)
+            {
+                reasons = tmpReasons;
+                return false;
+            }
+
+            reasons = null;
+            return true;
+        }
+
+        /// <summary>
+        /// Validates that all the options have been set and are valid,
+        /// throwing an exception if they haven't.
+        /// </summary>
+        /// <exception cref="InvalidOptionsException">The options are invalid.</exception>
+        public void Validate()
+        {
+            IList<string> reasons;
+            if (!TryValidate(out reasons))
+            {
+                throw new InvalidOptionsException(reasons);
+            }
+        }
+
+        // Raw arguments, used to provide defaults for proto file options
+        public IList<string> Arguments { get; set; }
+
+        [Obsolete("Please use GeneratorOptions.FileOptions.OutputDirectory instead")]
+        public string OutputDirectory
+        {
+            get { return FileOptions.OutputDirectory; }
+            set
+            {
+                CSharpFileOptions.Builder bld = FileOptions.ToBuilder();
+                bld.OutputDirectory = value;
+                FileOptions = bld.Build();
+            }
+        }
+
+        private static readonly Regex ArgMatch = new Regex(@"^[-/](?<name>[\w_]+?)[:=](?<value>.*)$");
+        private CSharpFileOptions fileOptions;
+
+        public CSharpFileOptions FileOptions
+        {
+            get { return fileOptions ?? (fileOptions = CSharpFileOptions.DefaultInstance); }
+            set { fileOptions = value; }
+        }
+
+        public string LineBreak { get; set; }
+
+        private void ParseArguments(IList<string> tmpReasons)
+        {
+            bool doHelp = Arguments.Count == 0;
+
+            InputFiles = new List<string>();
+            CSharpFileOptions.Builder builder = FileOptions.ToBuilder();
+            Dictionary<string, FieldDescriptor> fields =
+                new Dictionary<string, FieldDescriptor>(StringComparer.OrdinalIgnoreCase);
+            foreach (FieldDescriptor fld in builder.DescriptorForType.Fields)
+            {
+                fields.Add(fld.Name, fld);
+            }
+
+            foreach (string argument in Arguments)
+            {
+                if (StringComparer.OrdinalIgnoreCase.Equals("-help", argument) ||
+                    StringComparer.OrdinalIgnoreCase.Equals("/help", argument) ||
+                    StringComparer.OrdinalIgnoreCase.Equals("-?", argument) ||
+                    StringComparer.OrdinalIgnoreCase.Equals("/?", argument))
+                {
+                    doHelp = true;
+                    break;
+                }
+
+                Match m = ArgMatch.Match(argument);
+                if (m.Success)
+                {
+                    FieldDescriptor fld;
+                    string name = m.Groups["name"].Value;
+                    string value = m.Groups["value"].Value;
+
+                    if (fields.TryGetValue(name, out fld))
+                    {
+                        object obj;
+                        if (TryCoerceType(value, fld, out obj, tmpReasons))
+                        {
+                            builder[fld] = obj;
+                        }
+                    }
+                    else if (name == "line_break")
+                    {
+                        string tmp;
+                        if (LineBreaks.TryGetValue(value, out tmp))
+                        {
+                            LineBreak = tmp;
+                        }
+                        else
+                        {
+                            tmpReasons.Add("Invalid value for 'line_break': " + value + ".");
+                        }
+                    }
+                    else if (!File.Exists(argument))
+                    {
+                        doHelp = true;
+                        tmpReasons.Add("Unknown argument '" + name + "'.");
+                    }
+                    else
+                    {
+                        InputFiles.Add(argument);
+                    }
+                }
+                else
+                {
+                    InputFiles.Add(argument);
+                }
+            }
+
+            if (doHelp || InputFiles.Count == 0)
+            {
+                tmpReasons.Add("Arguments:");
+                foreach (KeyValuePair<string, FieldDescriptor> field in fields)
+                {
+                    tmpReasons.Add(String.Format("-{0}=[{1}]", field.Key, field.Value.FieldType));
+                }
+                tmpReasons.Add("-line_break=[" + string.Join("|", new List<string>(LineBreaks.Keys).ToArray()) + "]");
+                tmpReasons.Add("followed by one or more file paths.");
+            }
+            else
+            {
+                FileOptions = builder.Build();
+            }
+        }
+
+        private static bool TryCoerceType(string text, FieldDescriptor field, out object value, IList<string> tmpReasons)
+        {
+            value = null;
+
+            switch (field.FieldType)
+            {
+                case FieldType.Int32:
+                case FieldType.SInt32:
+                case FieldType.SFixed32:
+                    value = Int32.Parse(text);
+                    break;
+
+                case FieldType.Int64:
+                case FieldType.SInt64:
+                case FieldType.SFixed64:
+                    value = Int64.Parse(text);
+                    break;
+
+                case FieldType.UInt32:
+                case FieldType.Fixed32:
+                    value = UInt32.Parse(text);
+                    break;
+
+                case FieldType.UInt64:
+                case FieldType.Fixed64:
+                    value = UInt64.Parse(text);
+                    break;
+
+                case FieldType.Float:
+                    value = float.Parse(text);
+                    break;
+
+                case FieldType.Double:
+                    value = Double.Parse(text);
+                    break;
+
+                case FieldType.Bool:
+                    value = Boolean.Parse(text);
+                    break;
+
+                case FieldType.String:
+                    value = text;
+                    break;
+
+                case FieldType.Enum:
+                    {
+                        EnumDescriptor enumType = field.EnumType;
+
+                        int number;
+                        if (int.TryParse(text, out number))
+                        {
+                            value = enumType.FindValueByNumber(number);
+                            if (value == null)
+                            {
+                                tmpReasons.Add(
+                                    "Enum type \"" + enumType.FullName +
+                                    "\" has no value with number " + number + ".");
+                                return false;
+                            }
+                        }
+                        else
+                        {
+                            value = enumType.FindValueByName(text);
+                            if (value == null)
+                            {
+                                tmpReasons.Add(
+                                    "Enum type \"" + enumType.FullName +
+                                    "\" has no value named \"" + text + "\".");
+                                return false;
+                            }
+                        }
+
+                        break;
+                    }
+
+                case FieldType.Bytes:
+                case FieldType.Message:
+                case FieldType.Group:
+                    tmpReasons.Add("Unhandled field type " + field.FieldType.ToString() + ".");
+                    return false;
+            }
+
+            return true;
+        }
+    }
+}

+ 45 - 0
csharp/src/ProtoGen/Helpers.cs

@@ -0,0 +1,45 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#endregion
+
+namespace Google.ProtocolBuffers.ProtoGen
+{
+    /// <summary>
+    /// Helpers to resolve class names etc.
+    /// </summary>
+    internal static class Helpers
+    {
+    }
+}

Some files were not shown because too many files changed in this diff