瀏覽代碼

Generated code changes for previous commit.

Jon Skeet 10 年之前
父節點
當前提交
e6fc9778f5

+ 3 - 3
csharp/src/AddressBook/Addressbook.cs

@@ -155,7 +155,7 @@ namespace Google.ProtocolBuffers.Examples.AddressBook {
     }
 
     public override int GetHashCode() {
-      int hash = 17;
+      int hash = 1;
       if (Name.Length != 0) hash ^= Name.GetHashCode();
       if (Id != 0) hash ^= Id.GetHashCode();
       if (Email.Length != 0) hash ^= Email.GetHashCode();
@@ -330,7 +330,7 @@ namespace Google.ProtocolBuffers.Examples.AddressBook {
         }
 
         public override int GetHashCode() {
-          int hash = 17;
+          int hash = 1;
           if (Number.Length != 0) hash ^= Number.GetHashCode();
           if (Type != global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneType.HOME) hash ^= Type.GetHashCode();
           return hash;
@@ -458,7 +458,7 @@ namespace Google.ProtocolBuffers.Examples.AddressBook {
     }
 
     public override int GetHashCode() {
-      int hash = 17;
+      int hash = 1;
       hash ^= person_.GetHashCode();
       return hash;
     }

+ 6938 - 0
csharp/src/ProtocolBuffers.Test/TestProtos/MapUnittestProto3.cs

@@ -0,0 +1,6938 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: google/protobuf/map_unittest_proto3.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbd = global::Google.Protobuf.Descriptors;
+using scg = global::System.Collections.Generic;
+namespace Google.Protobuf.TestProtos {
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public static partial class MapUnittestProto3 {
+
+    #region Static variables
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestMap__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap> internal__static_protobuf_unittest_TestMap__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestMap_MapInt32Int32Entry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapInt32Int32Entry> internal__static_protobuf_unittest_TestMap_MapInt32Int32Entry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestMap_MapInt64Int64Entry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapInt64Int64Entry> internal__static_protobuf_unittest_TestMap_MapInt64Int64Entry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestMap_MapUint32Uint32Entry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapUint32Uint32Entry> internal__static_protobuf_unittest_TestMap_MapUint32Uint32Entry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestMap_MapUint64Uint64Entry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapUint64Uint64Entry> internal__static_protobuf_unittest_TestMap_MapUint64Uint64Entry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestMap_MapSint32Sint32Entry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapSint32Sint32Entry> internal__static_protobuf_unittest_TestMap_MapSint32Sint32Entry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestMap_MapSint64Sint64Entry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapSint64Sint64Entry> internal__static_protobuf_unittest_TestMap_MapSint64Sint64Entry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestMap_MapFixed32Fixed32Entry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapFixed32Fixed32Entry> internal__static_protobuf_unittest_TestMap_MapFixed32Fixed32Entry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestMap_MapFixed64Fixed64Entry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapFixed64Fixed64Entry> internal__static_protobuf_unittest_TestMap_MapFixed64Fixed64Entry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestMap_MapSfixed32Sfixed32Entry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapSfixed32Sfixed32Entry> internal__static_protobuf_unittest_TestMap_MapSfixed32Sfixed32Entry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestMap_MapSfixed64Sfixed64Entry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapSfixed64Sfixed64Entry> internal__static_protobuf_unittest_TestMap_MapSfixed64Sfixed64Entry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestMap_MapInt32FloatEntry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapInt32FloatEntry> internal__static_protobuf_unittest_TestMap_MapInt32FloatEntry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestMap_MapInt32DoubleEntry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapInt32DoubleEntry> internal__static_protobuf_unittest_TestMap_MapInt32DoubleEntry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestMap_MapBoolBoolEntry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapBoolBoolEntry> internal__static_protobuf_unittest_TestMap_MapBoolBoolEntry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestMap_MapStringStringEntry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapStringStringEntry> internal__static_protobuf_unittest_TestMap_MapStringStringEntry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestMap_MapInt32BytesEntry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapInt32BytesEntry> internal__static_protobuf_unittest_TestMap_MapInt32BytesEntry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestMap_MapInt32EnumEntry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapInt32EnumEntry> internal__static_protobuf_unittest_TestMap_MapInt32EnumEntry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestMap_MapInt32ForeignMessageEntry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapInt32ForeignMessageEntry> internal__static_protobuf_unittest_TestMap_MapInt32ForeignMessageEntry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestMapSubmessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMapSubmessage> internal__static_protobuf_unittest_TestMapSubmessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestMessageMap__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMessageMap> internal__static_protobuf_unittest_TestMessageMap__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestMessageMap_MapInt32MessageEntry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMessageMap.Types.MapInt32MessageEntry> internal__static_protobuf_unittest_TestMessageMap_MapInt32MessageEntry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestSameTypeMap__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestSameTypeMap> internal__static_protobuf_unittest_TestSameTypeMap__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestSameTypeMap_Map1Entry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestSameTypeMap.Types.Map1Entry> internal__static_protobuf_unittest_TestSameTypeMap_Map1Entry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestSameTypeMap_Map2Entry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestSameTypeMap.Types.Map2Entry> internal__static_protobuf_unittest_TestSameTypeMap_Map2Entry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestArenaMap__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap> internal__static_protobuf_unittest_TestArenaMap__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestArenaMap_MapInt32Int32Entry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapInt32Int32Entry> internal__static_protobuf_unittest_TestArenaMap_MapInt32Int32Entry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestArenaMap_MapInt64Int64Entry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapInt64Int64Entry> internal__static_protobuf_unittest_TestArenaMap_MapInt64Int64Entry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestArenaMap_MapUint32Uint32Entry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapUint32Uint32Entry> internal__static_protobuf_unittest_TestArenaMap_MapUint32Uint32Entry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestArenaMap_MapUint64Uint64Entry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapUint64Uint64Entry> internal__static_protobuf_unittest_TestArenaMap_MapUint64Uint64Entry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestArenaMap_MapSint32Sint32Entry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapSint32Sint32Entry> internal__static_protobuf_unittest_TestArenaMap_MapSint32Sint32Entry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestArenaMap_MapSint64Sint64Entry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapSint64Sint64Entry> internal__static_protobuf_unittest_TestArenaMap_MapSint64Sint64Entry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestArenaMap_MapFixed32Fixed32Entry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapFixed32Fixed32Entry> internal__static_protobuf_unittest_TestArenaMap_MapFixed32Fixed32Entry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestArenaMap_MapFixed64Fixed64Entry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapFixed64Fixed64Entry> internal__static_protobuf_unittest_TestArenaMap_MapFixed64Fixed64Entry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestArenaMap_MapSfixed32Sfixed32Entry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapSfixed32Sfixed32Entry> internal__static_protobuf_unittest_TestArenaMap_MapSfixed32Sfixed32Entry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestArenaMap_MapSfixed64Sfixed64Entry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapSfixed64Sfixed64Entry> internal__static_protobuf_unittest_TestArenaMap_MapSfixed64Sfixed64Entry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestArenaMap_MapInt32FloatEntry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapInt32FloatEntry> internal__static_protobuf_unittest_TestArenaMap_MapInt32FloatEntry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestArenaMap_MapInt32DoubleEntry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapInt32DoubleEntry> internal__static_protobuf_unittest_TestArenaMap_MapInt32DoubleEntry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestArenaMap_MapBoolBoolEntry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapBoolBoolEntry> internal__static_protobuf_unittest_TestArenaMap_MapBoolBoolEntry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestArenaMap_MapInt32EnumEntry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapInt32EnumEntry> internal__static_protobuf_unittest_TestArenaMap_MapInt32EnumEntry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_TestArenaMap_MapInt32ForeignMessageEntry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapInt32ForeignMessageEntry> internal__static_protobuf_unittest_TestArenaMap_MapInt32ForeignMessageEntry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_MessageContainingEnumCalledType__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType> internal__static_protobuf_unittest_MessageContainingEnumCalledType__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_MessageContainingEnumCalledType_TypeEntry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType.Types.TypeEntry> internal__static_protobuf_unittest_MessageContainingEnumCalledType_TypeEntry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_MessageContainingMapCalledEntry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.MessageContainingMapCalledEntry> internal__static_protobuf_unittest_MessageContainingMapCalledEntry__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_MessageContainingMapCalledEntry_EntryEntry__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.MessageContainingMapCalledEntry.Types.EntryEntry> internal__static_protobuf_unittest_MessageContainingMapCalledEntry_EntryEntry__FieldAccessorTable;
+    #endregion
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbd::FileDescriptor descriptor;
+
+    static MapUnittestProto3() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "Cilnb29nbGUvcHJvdG9idWYvbWFwX3VuaXR0ZXN0X3Byb3RvMy5wcm90bxIR", 
+            "cHJvdG9idWZfdW5pdHRlc3QaJWdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9w", 
+            "cm90bzMucHJvdG8ilhIKB1Rlc3RNYXASRgoPbWFwX2ludDMyX2ludDMyGAEg", 
+            "AygLMi0ucHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcC5NYXBJbnQzMkludDMy", 
+            "RW50cnkSRgoPbWFwX2ludDY0X2ludDY0GAIgAygLMi0ucHJvdG9idWZfdW5p", 
+            "dHRlc3QuVGVzdE1hcC5NYXBJbnQ2NEludDY0RW50cnkSSgoRbWFwX3VpbnQz", 
+            "Ml91aW50MzIYAyADKAsyLy5wcm90b2J1Zl91bml0dGVzdC5UZXN0TWFwLk1h", 
+            "cFVpbnQzMlVpbnQzMkVudHJ5EkoKEW1hcF91aW50NjRfdWludDY0GAQgAygL", 
+            "Mi8ucHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcC5NYXBVaW50NjRVaW50NjRF", 
+            "bnRyeRJKChFtYXBfc2ludDMyX3NpbnQzMhgFIAMoCzIvLnByb3RvYnVmX3Vu", 
+            "aXR0ZXN0LlRlc3RNYXAuTWFwU2ludDMyU2ludDMyRW50cnkSSgoRbWFwX3Np", 
+            "bnQ2NF9zaW50NjQYBiADKAsyLy5wcm90b2J1Zl91bml0dGVzdC5UZXN0TWFw", 
+            "Lk1hcFNpbnQ2NFNpbnQ2NEVudHJ5Ek4KE21hcF9maXhlZDMyX2ZpeGVkMzIY", 
+            "ByADKAsyMS5wcm90b2J1Zl91bml0dGVzdC5UZXN0TWFwLk1hcEZpeGVkMzJG", 
+            "aXhlZDMyRW50cnkSTgoTbWFwX2ZpeGVkNjRfZml4ZWQ2NBgIIAMoCzIxLnBy", 
+            "b3RvYnVmX3VuaXR0ZXN0LlRlc3RNYXAuTWFwRml4ZWQ2NEZpeGVkNjRFbnRy", 
+            "eRJSChVtYXBfc2ZpeGVkMzJfc2ZpeGVkMzIYCSADKAsyMy5wcm90b2J1Zl91", 
+            "bml0dGVzdC5UZXN0TWFwLk1hcFNmaXhlZDMyU2ZpeGVkMzJFbnRyeRJSChVt", 
+            "YXBfc2ZpeGVkNjRfc2ZpeGVkNjQYCiADKAsyMy5wcm90b2J1Zl91bml0dGVz", 
+            "dC5UZXN0TWFwLk1hcFNmaXhlZDY0U2ZpeGVkNjRFbnRyeRJGCg9tYXBfaW50", 
+            "MzJfZmxvYXQYCyADKAsyLS5wcm90b2J1Zl91bml0dGVzdC5UZXN0TWFwLk1h", 
+            "cEludDMyRmxvYXRFbnRyeRJIChBtYXBfaW50MzJfZG91YmxlGAwgAygLMi4u", 
+            "cHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcC5NYXBJbnQzMkRvdWJsZUVudHJ5", 
+            "EkIKDW1hcF9ib29sX2Jvb2wYDSADKAsyKy5wcm90b2J1Zl91bml0dGVzdC5U", 
+            "ZXN0TWFwLk1hcEJvb2xCb29sRW50cnkSSgoRbWFwX3N0cmluZ19zdHJpbmcY", 
+            "DiADKAsyLy5wcm90b2J1Zl91bml0dGVzdC5UZXN0TWFwLk1hcFN0cmluZ1N0", 
+            "cmluZ0VudHJ5EkYKD21hcF9pbnQzMl9ieXRlcxgPIAMoCzItLnByb3RvYnVm", 
+            "X3VuaXR0ZXN0LlRlc3RNYXAuTWFwSW50MzJCeXRlc0VudHJ5EkQKDm1hcF9p", 
+            "bnQzMl9lbnVtGBAgAygLMiwucHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcC5N", 
+            "YXBJbnQzMkVudW1FbnRyeRJZChltYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdl", 
+            "GBEgAygLMjYucHJvdG9idWZfdW5pdHRlc3QuVGVzdE1hcC5NYXBJbnQzMkZv", 
+            "cmVpZ25NZXNzYWdlRW50cnkaNAoSTWFwSW50MzJJbnQzMkVudHJ5EgsKA2tl", 
+            "eRgBIAEoBRINCgV2YWx1ZRgCIAEoBToCOAEaNAoSTWFwSW50NjRJbnQ2NEVu", 
+            "dHJ5EgsKA2tleRgBIAEoAxINCgV2YWx1ZRgCIAEoAzoCOAEaNgoUTWFwVWlu", 
+            "dDMyVWludDMyRW50cnkSCwoDa2V5GAEgASgNEg0KBXZhbHVlGAIgASgNOgI4", 
+            "ARo2ChRNYXBVaW50NjRVaW50NjRFbnRyeRILCgNrZXkYASABKAQSDQoFdmFs", 
+            "dWUYAiABKAQ6AjgBGjYKFE1hcFNpbnQzMlNpbnQzMkVudHJ5EgsKA2tleRgB", 
+            "IAEoERINCgV2YWx1ZRgCIAEoEToCOAEaNgoUTWFwU2ludDY0U2ludDY0RW50", 
+            "cnkSCwoDa2V5GAEgASgSEg0KBXZhbHVlGAIgASgSOgI4ARo4ChZNYXBGaXhl", 
+            "ZDMyRml4ZWQzMkVudHJ5EgsKA2tleRgBIAEoBxINCgV2YWx1ZRgCIAEoBzoC", 
+            "OAEaOAoWTWFwRml4ZWQ2NEZpeGVkNjRFbnRyeRILCgNrZXkYASABKAYSDQoF", 
+            "dmFsdWUYAiABKAY6AjgBGjoKGE1hcFNmaXhlZDMyU2ZpeGVkMzJFbnRyeRIL", 
+            "CgNrZXkYASABKA8SDQoFdmFsdWUYAiABKA86AjgBGjoKGE1hcFNmaXhlZDY0", 
+            "U2ZpeGVkNjRFbnRyeRILCgNrZXkYASABKBASDQoFdmFsdWUYAiABKBA6AjgB", 
+            "GjQKEk1hcEludDMyRmxvYXRFbnRyeRILCgNrZXkYASABKAUSDQoFdmFsdWUY", 
+            "AiABKAI6AjgBGjUKE01hcEludDMyRG91YmxlRW50cnkSCwoDa2V5GAEgASgF", 
+            "Eg0KBXZhbHVlGAIgASgBOgI4ARoyChBNYXBCb29sQm9vbEVudHJ5EgsKA2tl", 
+            "eRgBIAEoCBINCgV2YWx1ZRgCIAEoCDoCOAEaNgoUTWFwU3RyaW5nU3RyaW5n", 
+            "RW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ARo0ChJNYXBJ", 
+            "bnQzMkJ5dGVzRW50cnkSCwoDa2V5GAEgASgFEg0KBXZhbHVlGAIgASgMOgI4", 
+            "ARpPChFNYXBJbnQzMkVudW1FbnRyeRILCgNrZXkYASABKAUSKQoFdmFsdWUY", 
+            "AiABKA4yGi5wcm90b2J1Zl91bml0dGVzdC5NYXBFbnVtOgI4ARpgChtNYXBJ", 
+            "bnQzMkZvcmVpZ25NZXNzYWdlRW50cnkSCwoDa2V5GAEgASgFEjAKBXZhbHVl", 
+            "GAIgASgLMiEucHJvdG9idWZfdW5pdHRlc3QuRm9yZWlnbk1lc3NhZ2U6AjgB", 
+            "IkEKEVRlc3RNYXBTdWJtZXNzYWdlEiwKCHRlc3RfbWFwGAEgASgLMhoucHJv", 
+            "dG9idWZfdW5pdHRlc3QuVGVzdE1hcCK8AQoOVGVzdE1lc3NhZ2VNYXASUQoR", 
+            "bWFwX2ludDMyX21lc3NhZ2UYASADKAsyNi5wcm90b2J1Zl91bml0dGVzdC5U", 
+            "ZXN0TWVzc2FnZU1hcC5NYXBJbnQzMk1lc3NhZ2VFbnRyeRpXChRNYXBJbnQz", 
+            "Mk1lc3NhZ2VFbnRyeRILCgNrZXkYASABKAUSLgoFdmFsdWUYAiABKAsyHy5w", 
+            "cm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXM6AjgBIuMBCg9UZXN0U2Ft", 
+            "ZVR5cGVNYXASOgoEbWFwMRgBIAMoCzIsLnByb3RvYnVmX3VuaXR0ZXN0LlRl", 
+            "c3RTYW1lVHlwZU1hcC5NYXAxRW50cnkSOgoEbWFwMhgCIAMoCzIsLnByb3Rv", 
+            "YnVmX3VuaXR0ZXN0LlRlc3RTYW1lVHlwZU1hcC5NYXAyRW50cnkaKwoJTWFw", 
+            "MUVudHJ5EgsKA2tleRgBIAEoBRINCgV2YWx1ZRgCIAEoBToCOAEaKwoJTWFw", 
+            "MkVudHJ5EgsKA2tleRgBIAEoBRINCgV2YWx1ZRgCIAEoBToCOAEi5BAKDFRl", 
+            "c3RBcmVuYU1hcBJLCg9tYXBfaW50MzJfaW50MzIYASADKAsyMi5wcm90b2J1", 
+            "Zl91bml0dGVzdC5UZXN0QXJlbmFNYXAuTWFwSW50MzJJbnQzMkVudHJ5EksK", 
+            "D21hcF9pbnQ2NF9pbnQ2NBgCIAMoCzIyLnByb3RvYnVmX3VuaXR0ZXN0LlRl", 
+            "c3RBcmVuYU1hcC5NYXBJbnQ2NEludDY0RW50cnkSTwoRbWFwX3VpbnQzMl91", 
+            "aW50MzIYAyADKAsyNC5wcm90b2J1Zl91bml0dGVzdC5UZXN0QXJlbmFNYXAu", 
+            "TWFwVWludDMyVWludDMyRW50cnkSTwoRbWFwX3VpbnQ2NF91aW50NjQYBCAD", 
+            "KAsyNC5wcm90b2J1Zl91bml0dGVzdC5UZXN0QXJlbmFNYXAuTWFwVWludDY0", 
+            "VWludDY0RW50cnkSTwoRbWFwX3NpbnQzMl9zaW50MzIYBSADKAsyNC5wcm90", 
+            "b2J1Zl91bml0dGVzdC5UZXN0QXJlbmFNYXAuTWFwU2ludDMyU2ludDMyRW50", 
+            "cnkSTwoRbWFwX3NpbnQ2NF9zaW50NjQYBiADKAsyNC5wcm90b2J1Zl91bml0", 
+            "dGVzdC5UZXN0QXJlbmFNYXAuTWFwU2ludDY0U2ludDY0RW50cnkSUwoTbWFw", 
+            "X2ZpeGVkMzJfZml4ZWQzMhgHIAMoCzI2LnByb3RvYnVmX3VuaXR0ZXN0LlRl", 
+            "c3RBcmVuYU1hcC5NYXBGaXhlZDMyRml4ZWQzMkVudHJ5ElMKE21hcF9maXhl", 
+            "ZDY0X2ZpeGVkNjQYCCADKAsyNi5wcm90b2J1Zl91bml0dGVzdC5UZXN0QXJl", 
+            "bmFNYXAuTWFwRml4ZWQ2NEZpeGVkNjRFbnRyeRJXChVtYXBfc2ZpeGVkMzJf", 
+            "c2ZpeGVkMzIYCSADKAsyOC5wcm90b2J1Zl91bml0dGVzdC5UZXN0QXJlbmFN", 
+            "YXAuTWFwU2ZpeGVkMzJTZml4ZWQzMkVudHJ5ElcKFW1hcF9zZml4ZWQ2NF9z", 
+            "Zml4ZWQ2NBgKIAMoCzI4LnByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBcmVuYU1h", 
+            "cC5NYXBTZml4ZWQ2NFNmaXhlZDY0RW50cnkSSwoPbWFwX2ludDMyX2Zsb2F0", 
+            "GAsgAygLMjIucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFyZW5hTWFwLk1hcElu", 
+            "dDMyRmxvYXRFbnRyeRJNChBtYXBfaW50MzJfZG91YmxlGAwgAygLMjMucHJv", 
+            "dG9idWZfdW5pdHRlc3QuVGVzdEFyZW5hTWFwLk1hcEludDMyRG91YmxlRW50", 
+            "cnkSRwoNbWFwX2Jvb2xfYm9vbBgNIAMoCzIwLnByb3RvYnVmX3VuaXR0ZXN0", 
+            "LlRlc3RBcmVuYU1hcC5NYXBCb29sQm9vbEVudHJ5EkkKDm1hcF9pbnQzMl9l", 
+            "bnVtGA4gAygLMjEucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFyZW5hTWFwLk1h", 
+            "cEludDMyRW51bUVudHJ5El4KGW1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UY", 
+            "DyADKAsyOy5wcm90b2J1Zl91bml0dGVzdC5UZXN0QXJlbmFNYXAuTWFwSW50", 
+            "MzJGb3JlaWduTWVzc2FnZUVudHJ5GjQKEk1hcEludDMySW50MzJFbnRyeRIL", 
+            "CgNrZXkYASABKAUSDQoFdmFsdWUYAiABKAU6AjgBGjQKEk1hcEludDY0SW50", 
+            "NjRFbnRyeRILCgNrZXkYASABKAMSDQoFdmFsdWUYAiABKAM6AjgBGjYKFE1h", 
+            "cFVpbnQzMlVpbnQzMkVudHJ5EgsKA2tleRgBIAEoDRINCgV2YWx1ZRgCIAEo", 
+            "DToCOAEaNgoUTWFwVWludDY0VWludDY0RW50cnkSCwoDa2V5GAEgASgEEg0K", 
+            "BXZhbHVlGAIgASgEOgI4ARo2ChRNYXBTaW50MzJTaW50MzJFbnRyeRILCgNr", 
+            "ZXkYASABKBESDQoFdmFsdWUYAiABKBE6AjgBGjYKFE1hcFNpbnQ2NFNpbnQ2", 
+            "NEVudHJ5EgsKA2tleRgBIAEoEhINCgV2YWx1ZRgCIAEoEjoCOAEaOAoWTWFw", 
+            "Rml4ZWQzMkZpeGVkMzJFbnRyeRILCgNrZXkYASABKAcSDQoFdmFsdWUYAiAB", 
+            "KAc6AjgBGjgKFk1hcEZpeGVkNjRGaXhlZDY0RW50cnkSCwoDa2V5GAEgASgG", 
+            "Eg0KBXZhbHVlGAIgASgGOgI4ARo6ChhNYXBTZml4ZWQzMlNmaXhlZDMyRW50", 
+            "cnkSCwoDa2V5GAEgASgPEg0KBXZhbHVlGAIgASgPOgI4ARo6ChhNYXBTZml4", 
+            "ZWQ2NFNmaXhlZDY0RW50cnkSCwoDa2V5GAEgASgQEg0KBXZhbHVlGAIgASgQ", 
+            "OgI4ARo0ChJNYXBJbnQzMkZsb2F0RW50cnkSCwoDa2V5GAEgASgFEg0KBXZh", 
+            "bHVlGAIgASgCOgI4ARo1ChNNYXBJbnQzMkRvdWJsZUVudHJ5EgsKA2tleRgB", 
+            "IAEoBRINCgV2YWx1ZRgCIAEoAToCOAEaMgoQTWFwQm9vbEJvb2xFbnRyeRIL", 
+            "CgNrZXkYASABKAgSDQoFdmFsdWUYAiABKAg6AjgBGk8KEU1hcEludDMyRW51", 
+            "bUVudHJ5EgsKA2tleRgBIAEoBRIpCgV2YWx1ZRgCIAEoDjIaLnByb3RvYnVm", 
+            "X3VuaXR0ZXN0Lk1hcEVudW06AjgBGmAKG01hcEludDMyRm9yZWlnbk1lc3Nh", 
+            "Z2VFbnRyeRILCgNrZXkYASABKAUSMAoFdmFsdWUYAiABKAsyIS5wcm90b2J1", 
+            "Zl91bml0dGVzdC5Gb3JlaWduTWVzc2FnZToCOAEi5AEKH01lc3NhZ2VDb250", 
+            "YWluaW5nRW51bUNhbGxlZFR5cGUSSgoEdHlwZRgBIAMoCzI8LnByb3RvYnVm", 
+            "X3VuaXR0ZXN0Lk1lc3NhZ2VDb250YWluaW5nRW51bUNhbGxlZFR5cGUuVHlw", 
+            "ZUVudHJ5Gl8KCVR5cGVFbnRyeRILCgNrZXkYASABKAUSQQoFdmFsdWUYAiAB", 
+            "KAsyMi5wcm90b2J1Zl91bml0dGVzdC5NZXNzYWdlQ29udGFpbmluZ0VudW1D", 
+            "YWxsZWRUeXBlOgI4ASIUCgRUeXBlEgwKCFRZUEVfRk9PEAAinQEKH01lc3Nh", 
+            "Z2VDb250YWluaW5nTWFwQ2FsbGVkRW50cnkSTAoFZW50cnkYASADKAsyPS5w", 
+            "cm90b2J1Zl91bml0dGVzdC5NZXNzYWdlQ29udGFpbmluZ01hcENhbGxlZEVu", 
+            "dHJ5LkVudHJ5RW50cnkaLAoKRW50cnlFbnRyeRILCgNrZXkYASABKAUSDQoF", 
+            "dmFsdWUYAiABKAU6AjgBKj8KB01hcEVudW0SEAoMTUFQX0VOVU1fRk9PEAAS", 
+            "EAoMTUFQX0VOVU1fQkFSEAESEAoMTUFQX0VOVU1fQkFaEAJCIPgBAaoCGkdv", 
+          "b2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zYgZwcm90bzM="));
+      pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) {
+        descriptor = root;
+        internal__static_protobuf_unittest_TestMap__Descriptor = Descriptor.MessageTypes[0];
+        internal__static_protobuf_unittest_TestMap__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap>(internal__static_protobuf_unittest_TestMap__Descriptor,
+                new string[] { "MapInt32Int32", "MapInt64Int64", "MapUint32Uint32", "MapUint64Uint64", "MapSint32Sint32", "MapSint64Sint64", "MapFixed32Fixed32", "MapFixed64Fixed64", "MapSfixed32Sfixed32", "MapSfixed64Sfixed64", "MapInt32Float", "MapInt32Double", "MapBoolBool", "MapStringString", "MapInt32Bytes", "MapInt32Enum", "MapInt32ForeignMessage", });
+        internal__static_protobuf_unittest_TestMap_MapInt32Int32Entry__Descriptor = internal__static_protobuf_unittest_TestMap__Descriptor.NestedTypes[0];
+        internal__static_protobuf_unittest_TestMap_MapInt32Int32Entry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapInt32Int32Entry>(internal__static_protobuf_unittest_TestMap_MapInt32Int32Entry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestMap_MapInt64Int64Entry__Descriptor = internal__static_protobuf_unittest_TestMap__Descriptor.NestedTypes[1];
+        internal__static_protobuf_unittest_TestMap_MapInt64Int64Entry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapInt64Int64Entry>(internal__static_protobuf_unittest_TestMap_MapInt64Int64Entry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestMap_MapUint32Uint32Entry__Descriptor = internal__static_protobuf_unittest_TestMap__Descriptor.NestedTypes[2];
+        internal__static_protobuf_unittest_TestMap_MapUint32Uint32Entry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapUint32Uint32Entry>(internal__static_protobuf_unittest_TestMap_MapUint32Uint32Entry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestMap_MapUint64Uint64Entry__Descriptor = internal__static_protobuf_unittest_TestMap__Descriptor.NestedTypes[3];
+        internal__static_protobuf_unittest_TestMap_MapUint64Uint64Entry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapUint64Uint64Entry>(internal__static_protobuf_unittest_TestMap_MapUint64Uint64Entry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestMap_MapSint32Sint32Entry__Descriptor = internal__static_protobuf_unittest_TestMap__Descriptor.NestedTypes[4];
+        internal__static_protobuf_unittest_TestMap_MapSint32Sint32Entry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapSint32Sint32Entry>(internal__static_protobuf_unittest_TestMap_MapSint32Sint32Entry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestMap_MapSint64Sint64Entry__Descriptor = internal__static_protobuf_unittest_TestMap__Descriptor.NestedTypes[5];
+        internal__static_protobuf_unittest_TestMap_MapSint64Sint64Entry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapSint64Sint64Entry>(internal__static_protobuf_unittest_TestMap_MapSint64Sint64Entry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestMap_MapFixed32Fixed32Entry__Descriptor = internal__static_protobuf_unittest_TestMap__Descriptor.NestedTypes[6];
+        internal__static_protobuf_unittest_TestMap_MapFixed32Fixed32Entry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapFixed32Fixed32Entry>(internal__static_protobuf_unittest_TestMap_MapFixed32Fixed32Entry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestMap_MapFixed64Fixed64Entry__Descriptor = internal__static_protobuf_unittest_TestMap__Descriptor.NestedTypes[7];
+        internal__static_protobuf_unittest_TestMap_MapFixed64Fixed64Entry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapFixed64Fixed64Entry>(internal__static_protobuf_unittest_TestMap_MapFixed64Fixed64Entry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestMap_MapSfixed32Sfixed32Entry__Descriptor = internal__static_protobuf_unittest_TestMap__Descriptor.NestedTypes[8];
+        internal__static_protobuf_unittest_TestMap_MapSfixed32Sfixed32Entry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapSfixed32Sfixed32Entry>(internal__static_protobuf_unittest_TestMap_MapSfixed32Sfixed32Entry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestMap_MapSfixed64Sfixed64Entry__Descriptor = internal__static_protobuf_unittest_TestMap__Descriptor.NestedTypes[9];
+        internal__static_protobuf_unittest_TestMap_MapSfixed64Sfixed64Entry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapSfixed64Sfixed64Entry>(internal__static_protobuf_unittest_TestMap_MapSfixed64Sfixed64Entry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestMap_MapInt32FloatEntry__Descriptor = internal__static_protobuf_unittest_TestMap__Descriptor.NestedTypes[10];
+        internal__static_protobuf_unittest_TestMap_MapInt32FloatEntry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapInt32FloatEntry>(internal__static_protobuf_unittest_TestMap_MapInt32FloatEntry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestMap_MapInt32DoubleEntry__Descriptor = internal__static_protobuf_unittest_TestMap__Descriptor.NestedTypes[11];
+        internal__static_protobuf_unittest_TestMap_MapInt32DoubleEntry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapInt32DoubleEntry>(internal__static_protobuf_unittest_TestMap_MapInt32DoubleEntry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestMap_MapBoolBoolEntry__Descriptor = internal__static_protobuf_unittest_TestMap__Descriptor.NestedTypes[12];
+        internal__static_protobuf_unittest_TestMap_MapBoolBoolEntry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapBoolBoolEntry>(internal__static_protobuf_unittest_TestMap_MapBoolBoolEntry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestMap_MapStringStringEntry__Descriptor = internal__static_protobuf_unittest_TestMap__Descriptor.NestedTypes[13];
+        internal__static_protobuf_unittest_TestMap_MapStringStringEntry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapStringStringEntry>(internal__static_protobuf_unittest_TestMap_MapStringStringEntry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestMap_MapInt32BytesEntry__Descriptor = internal__static_protobuf_unittest_TestMap__Descriptor.NestedTypes[14];
+        internal__static_protobuf_unittest_TestMap_MapInt32BytesEntry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapInt32BytesEntry>(internal__static_protobuf_unittest_TestMap_MapInt32BytesEntry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestMap_MapInt32EnumEntry__Descriptor = internal__static_protobuf_unittest_TestMap__Descriptor.NestedTypes[15];
+        internal__static_protobuf_unittest_TestMap_MapInt32EnumEntry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapInt32EnumEntry>(internal__static_protobuf_unittest_TestMap_MapInt32EnumEntry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestMap_MapInt32ForeignMessageEntry__Descriptor = internal__static_protobuf_unittest_TestMap__Descriptor.NestedTypes[16];
+        internal__static_protobuf_unittest_TestMap_MapInt32ForeignMessageEntry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMap.Types.MapInt32ForeignMessageEntry>(internal__static_protobuf_unittest_TestMap_MapInt32ForeignMessageEntry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestMapSubmessage__Descriptor = Descriptor.MessageTypes[1];
+        internal__static_protobuf_unittest_TestMapSubmessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMapSubmessage>(internal__static_protobuf_unittest_TestMapSubmessage__Descriptor,
+                new string[] { "TestMap", });
+        internal__static_protobuf_unittest_TestMessageMap__Descriptor = Descriptor.MessageTypes[2];
+        internal__static_protobuf_unittest_TestMessageMap__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMessageMap>(internal__static_protobuf_unittest_TestMessageMap__Descriptor,
+                new string[] { "MapInt32Message", });
+        internal__static_protobuf_unittest_TestMessageMap_MapInt32MessageEntry__Descriptor = internal__static_protobuf_unittest_TestMessageMap__Descriptor.NestedTypes[0];
+        internal__static_protobuf_unittest_TestMessageMap_MapInt32MessageEntry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestMessageMap.Types.MapInt32MessageEntry>(internal__static_protobuf_unittest_TestMessageMap_MapInt32MessageEntry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestSameTypeMap__Descriptor = Descriptor.MessageTypes[3];
+        internal__static_protobuf_unittest_TestSameTypeMap__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestSameTypeMap>(internal__static_protobuf_unittest_TestSameTypeMap__Descriptor,
+                new string[] { "Map1", "Map2", });
+        internal__static_protobuf_unittest_TestSameTypeMap_Map1Entry__Descriptor = internal__static_protobuf_unittest_TestSameTypeMap__Descriptor.NestedTypes[0];
+        internal__static_protobuf_unittest_TestSameTypeMap_Map1Entry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestSameTypeMap.Types.Map1Entry>(internal__static_protobuf_unittest_TestSameTypeMap_Map1Entry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestSameTypeMap_Map2Entry__Descriptor = internal__static_protobuf_unittest_TestSameTypeMap__Descriptor.NestedTypes[1];
+        internal__static_protobuf_unittest_TestSameTypeMap_Map2Entry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestSameTypeMap.Types.Map2Entry>(internal__static_protobuf_unittest_TestSameTypeMap_Map2Entry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestArenaMap__Descriptor = Descriptor.MessageTypes[4];
+        internal__static_protobuf_unittest_TestArenaMap__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap>(internal__static_protobuf_unittest_TestArenaMap__Descriptor,
+                new string[] { "MapInt32Int32", "MapInt64Int64", "MapUint32Uint32", "MapUint64Uint64", "MapSint32Sint32", "MapSint64Sint64", "MapFixed32Fixed32", "MapFixed64Fixed64", "MapSfixed32Sfixed32", "MapSfixed64Sfixed64", "MapInt32Float", "MapInt32Double", "MapBoolBool", "MapInt32Enum", "MapInt32ForeignMessage", });
+        internal__static_protobuf_unittest_TestArenaMap_MapInt32Int32Entry__Descriptor = internal__static_protobuf_unittest_TestArenaMap__Descriptor.NestedTypes[0];
+        internal__static_protobuf_unittest_TestArenaMap_MapInt32Int32Entry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapInt32Int32Entry>(internal__static_protobuf_unittest_TestArenaMap_MapInt32Int32Entry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestArenaMap_MapInt64Int64Entry__Descriptor = internal__static_protobuf_unittest_TestArenaMap__Descriptor.NestedTypes[1];
+        internal__static_protobuf_unittest_TestArenaMap_MapInt64Int64Entry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapInt64Int64Entry>(internal__static_protobuf_unittest_TestArenaMap_MapInt64Int64Entry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestArenaMap_MapUint32Uint32Entry__Descriptor = internal__static_protobuf_unittest_TestArenaMap__Descriptor.NestedTypes[2];
+        internal__static_protobuf_unittest_TestArenaMap_MapUint32Uint32Entry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapUint32Uint32Entry>(internal__static_protobuf_unittest_TestArenaMap_MapUint32Uint32Entry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestArenaMap_MapUint64Uint64Entry__Descriptor = internal__static_protobuf_unittest_TestArenaMap__Descriptor.NestedTypes[3];
+        internal__static_protobuf_unittest_TestArenaMap_MapUint64Uint64Entry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapUint64Uint64Entry>(internal__static_protobuf_unittest_TestArenaMap_MapUint64Uint64Entry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestArenaMap_MapSint32Sint32Entry__Descriptor = internal__static_protobuf_unittest_TestArenaMap__Descriptor.NestedTypes[4];
+        internal__static_protobuf_unittest_TestArenaMap_MapSint32Sint32Entry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapSint32Sint32Entry>(internal__static_protobuf_unittest_TestArenaMap_MapSint32Sint32Entry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestArenaMap_MapSint64Sint64Entry__Descriptor = internal__static_protobuf_unittest_TestArenaMap__Descriptor.NestedTypes[5];
+        internal__static_protobuf_unittest_TestArenaMap_MapSint64Sint64Entry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapSint64Sint64Entry>(internal__static_protobuf_unittest_TestArenaMap_MapSint64Sint64Entry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestArenaMap_MapFixed32Fixed32Entry__Descriptor = internal__static_protobuf_unittest_TestArenaMap__Descriptor.NestedTypes[6];
+        internal__static_protobuf_unittest_TestArenaMap_MapFixed32Fixed32Entry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapFixed32Fixed32Entry>(internal__static_protobuf_unittest_TestArenaMap_MapFixed32Fixed32Entry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestArenaMap_MapFixed64Fixed64Entry__Descriptor = internal__static_protobuf_unittest_TestArenaMap__Descriptor.NestedTypes[7];
+        internal__static_protobuf_unittest_TestArenaMap_MapFixed64Fixed64Entry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapFixed64Fixed64Entry>(internal__static_protobuf_unittest_TestArenaMap_MapFixed64Fixed64Entry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestArenaMap_MapSfixed32Sfixed32Entry__Descriptor = internal__static_protobuf_unittest_TestArenaMap__Descriptor.NestedTypes[8];
+        internal__static_protobuf_unittest_TestArenaMap_MapSfixed32Sfixed32Entry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapSfixed32Sfixed32Entry>(internal__static_protobuf_unittest_TestArenaMap_MapSfixed32Sfixed32Entry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestArenaMap_MapSfixed64Sfixed64Entry__Descriptor = internal__static_protobuf_unittest_TestArenaMap__Descriptor.NestedTypes[9];
+        internal__static_protobuf_unittest_TestArenaMap_MapSfixed64Sfixed64Entry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapSfixed64Sfixed64Entry>(internal__static_protobuf_unittest_TestArenaMap_MapSfixed64Sfixed64Entry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestArenaMap_MapInt32FloatEntry__Descriptor = internal__static_protobuf_unittest_TestArenaMap__Descriptor.NestedTypes[10];
+        internal__static_protobuf_unittest_TestArenaMap_MapInt32FloatEntry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapInt32FloatEntry>(internal__static_protobuf_unittest_TestArenaMap_MapInt32FloatEntry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestArenaMap_MapInt32DoubleEntry__Descriptor = internal__static_protobuf_unittest_TestArenaMap__Descriptor.NestedTypes[11];
+        internal__static_protobuf_unittest_TestArenaMap_MapInt32DoubleEntry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapInt32DoubleEntry>(internal__static_protobuf_unittest_TestArenaMap_MapInt32DoubleEntry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestArenaMap_MapBoolBoolEntry__Descriptor = internal__static_protobuf_unittest_TestArenaMap__Descriptor.NestedTypes[12];
+        internal__static_protobuf_unittest_TestArenaMap_MapBoolBoolEntry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapBoolBoolEntry>(internal__static_protobuf_unittest_TestArenaMap_MapBoolBoolEntry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestArenaMap_MapInt32EnumEntry__Descriptor = internal__static_protobuf_unittest_TestArenaMap__Descriptor.NestedTypes[13];
+        internal__static_protobuf_unittest_TestArenaMap_MapInt32EnumEntry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapInt32EnumEntry>(internal__static_protobuf_unittest_TestArenaMap_MapInt32EnumEntry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_TestArenaMap_MapInt32ForeignMessageEntry__Descriptor = internal__static_protobuf_unittest_TestArenaMap__Descriptor.NestedTypes[14];
+        internal__static_protobuf_unittest_TestArenaMap_MapInt32ForeignMessageEntry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.TestArenaMap.Types.MapInt32ForeignMessageEntry>(internal__static_protobuf_unittest_TestArenaMap_MapInt32ForeignMessageEntry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_MessageContainingEnumCalledType__Descriptor = Descriptor.MessageTypes[5];
+        internal__static_protobuf_unittest_MessageContainingEnumCalledType__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType>(internal__static_protobuf_unittest_MessageContainingEnumCalledType__Descriptor,
+                new string[] { "Type", });
+        internal__static_protobuf_unittest_MessageContainingEnumCalledType_TypeEntry__Descriptor = internal__static_protobuf_unittest_MessageContainingEnumCalledType__Descriptor.NestedTypes[0];
+        internal__static_protobuf_unittest_MessageContainingEnumCalledType_TypeEntry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType.Types.TypeEntry>(internal__static_protobuf_unittest_MessageContainingEnumCalledType_TypeEntry__Descriptor,
+                new string[] { "Key", "Value", });
+        internal__static_protobuf_unittest_MessageContainingMapCalledEntry__Descriptor = Descriptor.MessageTypes[6];
+        internal__static_protobuf_unittest_MessageContainingMapCalledEntry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.MessageContainingMapCalledEntry>(internal__static_protobuf_unittest_MessageContainingMapCalledEntry__Descriptor,
+                new string[] { "Entry", });
+        internal__static_protobuf_unittest_MessageContainingMapCalledEntry_EntryEntry__Descriptor = internal__static_protobuf_unittest_MessageContainingMapCalledEntry__Descriptor.NestedTypes[0];
+        internal__static_protobuf_unittest_MessageContainingMapCalledEntry_EntryEntry__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.Protobuf.TestProtos.MessageContainingMapCalledEntry.Types.EntryEntry>(internal__static_protobuf_unittest_MessageContainingMapCalledEntry_EntryEntry__Descriptor,
+                new string[] { "Key", "Value", });
+      };
+      pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,
+          new pbd::FileDescriptor[] {
+          global::Google.Protobuf.TestProtos.UnittestProto3.Descriptor, 
+          }, assigner);
+    }
+    #endregion
+
+  }
+  #region Enums
+  public enum MapEnum {
+    MAP_ENUM_FOO = 0,
+    MAP_ENUM_BAR = 1,
+    MAP_ENUM_BAZ = 2,
+  }
+
+  #endregion
+
+  #region Messages
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestMap : pb::IMessage<TestMap> {
+    private static readonly pb::MessageParser<TestMap> _parser = new pb::MessageParser<TestMap>(() => new TestMap());
+    public static pb::MessageParser<TestMap> Parser { get { return _parser; } }
+
+    private static readonly string[] _fieldNames = new string[] { "map_bool_bool", "map_fixed32_fixed32", "map_fixed64_fixed64", "map_int32_bytes", "map_int32_double", "map_int32_enum", "map_int32_float", "map_int32_foreign_message", "map_int32_int32", "map_int64_int64", "map_sfixed32_sfixed32", "map_sfixed64_sfixed64", "map_sint32_sint32", "map_sint64_sint64", "map_string_string", "map_uint32_uint32", "map_uint64_uint64" };
+    private static readonly uint[] _fieldTags = new uint[] { 106, 58, 66, 122, 98, 130, 90, 138, 10, 18, 74, 82, 42, 50, 114, 26, 34 };
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap__Descriptor; }
+    }
+
+    public pb::FieldAccess.FieldAccessorTable<TestMap> Fields {
+      get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap__FieldAccessorTable; }
+    }
+
+    private bool _frozen = false;
+    public bool IsFrozen { get { return _frozen; } }
+
+    public TestMap() { }
+
+    public TestMap(TestMap other) {
+      mapInt32Int32_ = other.mapInt32Int32_.Clone();
+      mapInt64Int64_ = other.mapInt64Int64_.Clone();
+      mapUint32Uint32_ = other.mapUint32Uint32_.Clone();
+      mapUint64Uint64_ = other.mapUint64Uint64_.Clone();
+      mapSint32Sint32_ = other.mapSint32Sint32_.Clone();
+      mapSint64Sint64_ = other.mapSint64Sint64_.Clone();
+      mapFixed32Fixed32_ = other.mapFixed32Fixed32_.Clone();
+      mapFixed64Fixed64_ = other.mapFixed64Fixed64_.Clone();
+      mapSfixed32Sfixed32_ = other.mapSfixed32Sfixed32_.Clone();
+      mapSfixed64Sfixed64_ = other.mapSfixed64Sfixed64_.Clone();
+      mapInt32Float_ = other.mapInt32Float_.Clone();
+      mapInt32Double_ = other.mapInt32Double_.Clone();
+      mapBoolBool_ = other.mapBoolBool_.Clone();
+      mapStringString_ = other.mapStringString_.Clone();
+      mapInt32Bytes_ = other.mapInt32Bytes_.Clone();
+      mapInt32Enum_ = other.mapInt32Enum_.Clone();
+      mapInt32ForeignMessage_ = other.mapInt32ForeignMessage_.Clone();
+    }
+
+    public TestMap Clone() {
+      return new TestMap(this);
+    }
+
+    public void Freeze() {
+      if (IsFrozen) {
+        return;
+      }
+      _frozen = true;
+      mapInt32Int32_.Freeze();
+      mapInt64Int64_.Freeze();
+      mapUint32Uint32_.Freeze();
+      mapUint64Uint64_.Freeze();
+      mapSint32Sint32_.Freeze();
+      mapSint64Sint64_.Freeze();
+      mapFixed32Fixed32_.Freeze();
+      mapFixed64Fixed64_.Freeze();
+      mapSfixed32Sfixed32_.Freeze();
+      mapSfixed64Sfixed64_.Freeze();
+      mapInt32Float_.Freeze();
+      mapInt32Double_.Freeze();
+      mapBoolBool_.Freeze();
+      mapStringString_.Freeze();
+      mapInt32Bytes_.Freeze();
+      mapInt32Enum_.Freeze();
+      mapInt32ForeignMessage_.Freeze();
+    }
+
+    public const int MapInt32Int32FieldNumber = 1;
+    private static readonly pbc::MapField<int, int>.Codec _map_mapInt32Int32_codec
+        = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForInt32(16), 10);
+    private readonly pbc::MapField<int, int> mapInt32Int32_ = new pbc::MapField<int, int>();
+    public pbc::MapField<int, int> MapInt32Int32 {
+      get { return mapInt32Int32_; }
+    }
+
+    public const int MapInt64Int64FieldNumber = 2;
+    private static readonly pbc::MapField<long, long>.Codec _map_mapInt64Int64_codec
+        = new pbc::MapField<long, long>.Codec(pb::FieldCodec.ForInt64(8), pb::FieldCodec.ForInt64(16), 18);
+    private readonly pbc::MapField<long, long> mapInt64Int64_ = new pbc::MapField<long, long>();
+    public pbc::MapField<long, long> MapInt64Int64 {
+      get { return mapInt64Int64_; }
+    }
+
+    public const int MapUint32Uint32FieldNumber = 3;
+    private static readonly pbc::MapField<uint, uint>.Codec _map_mapUint32Uint32_codec
+        = new pbc::MapField<uint, uint>.Codec(pb::FieldCodec.ForUInt32(8), pb::FieldCodec.ForUInt32(16), 26);
+    private readonly pbc::MapField<uint, uint> mapUint32Uint32_ = new pbc::MapField<uint, uint>();
+    public pbc::MapField<uint, uint> MapUint32Uint32 {
+      get { return mapUint32Uint32_; }
+    }
+
+    public const int MapUint64Uint64FieldNumber = 4;
+    private static readonly pbc::MapField<ulong, ulong>.Codec _map_mapUint64Uint64_codec
+        = new pbc::MapField<ulong, ulong>.Codec(pb::FieldCodec.ForUInt64(8), pb::FieldCodec.ForUInt64(16), 34);
+    private readonly pbc::MapField<ulong, ulong> mapUint64Uint64_ = new pbc::MapField<ulong, ulong>();
+    public pbc::MapField<ulong, ulong> MapUint64Uint64 {
+      get { return mapUint64Uint64_; }
+    }
+
+    public const int MapSint32Sint32FieldNumber = 5;
+    private static readonly pbc::MapField<int, int>.Codec _map_mapSint32Sint32_codec
+        = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForSInt32(8), pb::FieldCodec.ForSInt32(16), 42);
+    private readonly pbc::MapField<int, int> mapSint32Sint32_ = new pbc::MapField<int, int>();
+    public pbc::MapField<int, int> MapSint32Sint32 {
+      get { return mapSint32Sint32_; }
+    }
+
+    public const int MapSint64Sint64FieldNumber = 6;
+    private static readonly pbc::MapField<long, long>.Codec _map_mapSint64Sint64_codec
+        = new pbc::MapField<long, long>.Codec(pb::FieldCodec.ForSInt64(8), pb::FieldCodec.ForSInt64(16), 50);
+    private readonly pbc::MapField<long, long> mapSint64Sint64_ = new pbc::MapField<long, long>();
+    public pbc::MapField<long, long> MapSint64Sint64 {
+      get { return mapSint64Sint64_; }
+    }
+
+    public const int MapFixed32Fixed32FieldNumber = 7;
+    private static readonly pbc::MapField<uint, uint>.Codec _map_mapFixed32Fixed32_codec
+        = new pbc::MapField<uint, uint>.Codec(pb::FieldCodec.ForFixed32(13), pb::FieldCodec.ForFixed32(21), 58);
+    private readonly pbc::MapField<uint, uint> mapFixed32Fixed32_ = new pbc::MapField<uint, uint>();
+    public pbc::MapField<uint, uint> MapFixed32Fixed32 {
+      get { return mapFixed32Fixed32_; }
+    }
+
+    public const int MapFixed64Fixed64FieldNumber = 8;
+    private static readonly pbc::MapField<ulong, ulong>.Codec _map_mapFixed64Fixed64_codec
+        = new pbc::MapField<ulong, ulong>.Codec(pb::FieldCodec.ForFixed64(9), pb::FieldCodec.ForFixed64(17), 66);
+    private readonly pbc::MapField<ulong, ulong> mapFixed64Fixed64_ = new pbc::MapField<ulong, ulong>();
+    public pbc::MapField<ulong, ulong> MapFixed64Fixed64 {
+      get { return mapFixed64Fixed64_; }
+    }
+
+    public const int MapSfixed32Sfixed32FieldNumber = 9;
+    private static readonly pbc::MapField<int, int>.Codec _map_mapSfixed32Sfixed32_codec
+        = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForSFixed32(13), pb::FieldCodec.ForSFixed32(21), 74);
+    private readonly pbc::MapField<int, int> mapSfixed32Sfixed32_ = new pbc::MapField<int, int>();
+    public pbc::MapField<int, int> MapSfixed32Sfixed32 {
+      get { return mapSfixed32Sfixed32_; }
+    }
+
+    public const int MapSfixed64Sfixed64FieldNumber = 10;
+    private static readonly pbc::MapField<long, long>.Codec _map_mapSfixed64Sfixed64_codec
+        = new pbc::MapField<long, long>.Codec(pb::FieldCodec.ForSFixed64(9), pb::FieldCodec.ForSFixed64(17), 82);
+    private readonly pbc::MapField<long, long> mapSfixed64Sfixed64_ = new pbc::MapField<long, long>();
+    public pbc::MapField<long, long> MapSfixed64Sfixed64 {
+      get { return mapSfixed64Sfixed64_; }
+    }
+
+    public const int MapInt32FloatFieldNumber = 11;
+    private static readonly pbc::MapField<int, float>.Codec _map_mapInt32Float_codec
+        = new pbc::MapField<int, float>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForFloat(21), 90);
+    private readonly pbc::MapField<int, float> mapInt32Float_ = new pbc::MapField<int, float>();
+    public pbc::MapField<int, float> MapInt32Float {
+      get { return mapInt32Float_; }
+    }
+
+    public const int MapInt32DoubleFieldNumber = 12;
+    private static readonly pbc::MapField<int, double>.Codec _map_mapInt32Double_codec
+        = new pbc::MapField<int, double>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForDouble(17), 98);
+    private readonly pbc::MapField<int, double> mapInt32Double_ = new pbc::MapField<int, double>();
+    public pbc::MapField<int, double> MapInt32Double {
+      get { return mapInt32Double_; }
+    }
+
+    public const int MapBoolBoolFieldNumber = 13;
+    private static readonly pbc::MapField<bool, bool>.Codec _map_mapBoolBool_codec
+        = new pbc::MapField<bool, bool>.Codec(pb::FieldCodec.ForBool(8), pb::FieldCodec.ForBool(16), 106);
+    private readonly pbc::MapField<bool, bool> mapBoolBool_ = new pbc::MapField<bool, bool>();
+    public pbc::MapField<bool, bool> MapBoolBool {
+      get { return mapBoolBool_; }
+    }
+
+    public const int MapStringStringFieldNumber = 14;
+    private static readonly pbc::MapField<string, string>.Codec _map_mapStringString_codec
+        = new pbc::MapField<string, string>.Codec(pb::FieldCodec.ForString(10), pb::FieldCodec.ForString(18), 114);
+    private readonly pbc::MapField<string, string> mapStringString_ = new pbc::MapField<string, string>();
+    public pbc::MapField<string, string> MapStringString {
+      get { return mapStringString_; }
+    }
+
+    public const int MapInt32BytesFieldNumber = 15;
+    private static readonly pbc::MapField<int, pb::ByteString>.Codec _map_mapInt32Bytes_codec
+        = new pbc::MapField<int, pb::ByteString>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForBytes(18), 122);
+    private readonly pbc::MapField<int, pb::ByteString> mapInt32Bytes_ = new pbc::MapField<int, pb::ByteString>();
+    public pbc::MapField<int, pb::ByteString> MapInt32Bytes {
+      get { return mapInt32Bytes_; }
+    }
+
+    public const int MapInt32EnumFieldNumber = 16;
+    private static readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.MapEnum>.Codec _map_mapInt32Enum_codec
+        = new pbc::MapField<int, global::Google.Protobuf.TestProtos.MapEnum>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForEnum(16, x => (int) x, x => (global::Google.Protobuf.TestProtos.MapEnum) x), 130);
+    private readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.MapEnum> mapInt32Enum_ = new pbc::MapField<int, global::Google.Protobuf.TestProtos.MapEnum>();
+    public pbc::MapField<int, global::Google.Protobuf.TestProtos.MapEnum> MapInt32Enum {
+      get { return mapInt32Enum_; }
+    }
+
+    public const int MapInt32ForeignMessageFieldNumber = 17;
+    private static readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.ForeignMessage>.Codec _map_mapInt32ForeignMessage_codec
+        = new pbc::MapField<int, global::Google.Protobuf.TestProtos.ForeignMessage>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.TestProtos.ForeignMessage.Parser), 138);
+    private readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.ForeignMessage> mapInt32ForeignMessage_ = new pbc::MapField<int, global::Google.Protobuf.TestProtos.ForeignMessage>();
+    public pbc::MapField<int, global::Google.Protobuf.TestProtos.ForeignMessage> MapInt32ForeignMessage {
+      get { return mapInt32ForeignMessage_; }
+    }
+
+    public override bool Equals(object other) {
+      return Equals(other as TestMap);
+    }
+
+    public bool Equals(TestMap other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!MapInt32Int32.Equals(other.MapInt32Int32)) return false;
+      if (!MapInt64Int64.Equals(other.MapInt64Int64)) return false;
+      if (!MapUint32Uint32.Equals(other.MapUint32Uint32)) return false;
+      if (!MapUint64Uint64.Equals(other.MapUint64Uint64)) return false;
+      if (!MapSint32Sint32.Equals(other.MapSint32Sint32)) return false;
+      if (!MapSint64Sint64.Equals(other.MapSint64Sint64)) return false;
+      if (!MapFixed32Fixed32.Equals(other.MapFixed32Fixed32)) return false;
+      if (!MapFixed64Fixed64.Equals(other.MapFixed64Fixed64)) return false;
+      if (!MapSfixed32Sfixed32.Equals(other.MapSfixed32Sfixed32)) return false;
+      if (!MapSfixed64Sfixed64.Equals(other.MapSfixed64Sfixed64)) return false;
+      if (!MapInt32Float.Equals(other.MapInt32Float)) return false;
+      if (!MapInt32Double.Equals(other.MapInt32Double)) return false;
+      if (!MapBoolBool.Equals(other.MapBoolBool)) return false;
+      if (!MapStringString.Equals(other.MapStringString)) return false;
+      if (!MapInt32Bytes.Equals(other.MapInt32Bytes)) return false;
+      if (!MapInt32Enum.Equals(other.MapInt32Enum)) return false;
+      if (!MapInt32ForeignMessage.Equals(other.MapInt32ForeignMessage)) return false;
+      return true;
+    }
+
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= MapInt32Int32.GetHashCode();
+      hash ^= MapInt64Int64.GetHashCode();
+      hash ^= MapUint32Uint32.GetHashCode();
+      hash ^= MapUint64Uint64.GetHashCode();
+      hash ^= MapSint32Sint32.GetHashCode();
+      hash ^= MapSint64Sint64.GetHashCode();
+      hash ^= MapFixed32Fixed32.GetHashCode();
+      hash ^= MapFixed64Fixed64.GetHashCode();
+      hash ^= MapSfixed32Sfixed32.GetHashCode();
+      hash ^= MapSfixed64Sfixed64.GetHashCode();
+      hash ^= MapInt32Float.GetHashCode();
+      hash ^= MapInt32Double.GetHashCode();
+      hash ^= MapBoolBool.GetHashCode();
+      hash ^= MapStringString.GetHashCode();
+      hash ^= MapInt32Bytes.GetHashCode();
+      hash ^= MapInt32Enum.GetHashCode();
+      hash ^= MapInt32ForeignMessage.GetHashCode();
+      return hash;
+    }
+
+    public void WriteTo(pb::CodedOutputStream output) {
+      mapInt32Int32_.WriteTo(output, _map_mapInt32Int32_codec);
+      mapInt64Int64_.WriteTo(output, _map_mapInt64Int64_codec);
+      mapUint32Uint32_.WriteTo(output, _map_mapUint32Uint32_codec);
+      mapUint64Uint64_.WriteTo(output, _map_mapUint64Uint64_codec);
+      mapSint32Sint32_.WriteTo(output, _map_mapSint32Sint32_codec);
+      mapSint64Sint64_.WriteTo(output, _map_mapSint64Sint64_codec);
+      mapFixed32Fixed32_.WriteTo(output, _map_mapFixed32Fixed32_codec);
+      mapFixed64Fixed64_.WriteTo(output, _map_mapFixed64Fixed64_codec);
+      mapSfixed32Sfixed32_.WriteTo(output, _map_mapSfixed32Sfixed32_codec);
+      mapSfixed64Sfixed64_.WriteTo(output, _map_mapSfixed64Sfixed64_codec);
+      mapInt32Float_.WriteTo(output, _map_mapInt32Float_codec);
+      mapInt32Double_.WriteTo(output, _map_mapInt32Double_codec);
+      mapBoolBool_.WriteTo(output, _map_mapBoolBool_codec);
+      mapStringString_.WriteTo(output, _map_mapStringString_codec);
+      mapInt32Bytes_.WriteTo(output, _map_mapInt32Bytes_codec);
+      mapInt32Enum_.WriteTo(output, _map_mapInt32Enum_codec);
+      mapInt32ForeignMessage_.WriteTo(output, _map_mapInt32ForeignMessage_codec);
+    }
+
+    public int CalculateSize() {
+      int size = 0;
+      size += mapInt32Int32_.CalculateSize(_map_mapInt32Int32_codec);
+      size += mapInt64Int64_.CalculateSize(_map_mapInt64Int64_codec);
+      size += mapUint32Uint32_.CalculateSize(_map_mapUint32Uint32_codec);
+      size += mapUint64Uint64_.CalculateSize(_map_mapUint64Uint64_codec);
+      size += mapSint32Sint32_.CalculateSize(_map_mapSint32Sint32_codec);
+      size += mapSint64Sint64_.CalculateSize(_map_mapSint64Sint64_codec);
+      size += mapFixed32Fixed32_.CalculateSize(_map_mapFixed32Fixed32_codec);
+      size += mapFixed64Fixed64_.CalculateSize(_map_mapFixed64Fixed64_codec);
+      size += mapSfixed32Sfixed32_.CalculateSize(_map_mapSfixed32Sfixed32_codec);
+      size += mapSfixed64Sfixed64_.CalculateSize(_map_mapSfixed64Sfixed64_codec);
+      size += mapInt32Float_.CalculateSize(_map_mapInt32Float_codec);
+      size += mapInt32Double_.CalculateSize(_map_mapInt32Double_codec);
+      size += mapBoolBool_.CalculateSize(_map_mapBoolBool_codec);
+      size += mapStringString_.CalculateSize(_map_mapStringString_codec);
+      size += mapInt32Bytes_.CalculateSize(_map_mapInt32Bytes_codec);
+      size += mapInt32Enum_.CalculateSize(_map_mapInt32Enum_codec);
+      size += mapInt32ForeignMessage_.CalculateSize(_map_mapInt32ForeignMessage_codec);
+      return size;
+    }
+
+    public void MergeFrom(TestMap other) {
+      if (other == null) {
+        return;
+      }
+      mapInt32Int32_.Add(other.mapInt32Int32_);
+      mapInt64Int64_.Add(other.mapInt64Int64_);
+      mapUint32Uint32_.Add(other.mapUint32Uint32_);
+      mapUint64Uint64_.Add(other.mapUint64Uint64_);
+      mapSint32Sint32_.Add(other.mapSint32Sint32_);
+      mapSint64Sint64_.Add(other.mapSint64Sint64_);
+      mapFixed32Fixed32_.Add(other.mapFixed32Fixed32_);
+      mapFixed64Fixed64_.Add(other.mapFixed64Fixed64_);
+      mapSfixed32Sfixed32_.Add(other.mapSfixed32Sfixed32_);
+      mapSfixed64Sfixed64_.Add(other.mapSfixed64Sfixed64_);
+      mapInt32Float_.Add(other.mapInt32Float_);
+      mapInt32Double_.Add(other.mapInt32Double_);
+      mapBoolBool_.Add(other.mapBoolBool_);
+      mapStringString_.Add(other.mapStringString_);
+      mapInt32Bytes_.Add(other.mapInt32Bytes_);
+      mapInt32Enum_.Add(other.mapInt32Enum_);
+      mapInt32ForeignMessage_.Add(other.mapInt32ForeignMessage_);
+    }
+
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while (input.ReadTag(out tag)) {
+        switch(tag) {
+          case 0:
+            throw pb::InvalidProtocolBufferException.InvalidTag();
+          default:
+            if (pb::WireFormat.IsEndGroupTag(tag)) {
+              return;
+            }
+            break;
+          case 10: {
+            mapInt32Int32_.AddEntriesFrom(input, _map_mapInt32Int32_codec);
+            break;
+          }
+          case 18: {
+            mapInt64Int64_.AddEntriesFrom(input, _map_mapInt64Int64_codec);
+            break;
+          }
+          case 26: {
+            mapUint32Uint32_.AddEntriesFrom(input, _map_mapUint32Uint32_codec);
+            break;
+          }
+          case 34: {
+            mapUint64Uint64_.AddEntriesFrom(input, _map_mapUint64Uint64_codec);
+            break;
+          }
+          case 42: {
+            mapSint32Sint32_.AddEntriesFrom(input, _map_mapSint32Sint32_codec);
+            break;
+          }
+          case 50: {
+            mapSint64Sint64_.AddEntriesFrom(input, _map_mapSint64Sint64_codec);
+            break;
+          }
+          case 58: {
+            mapFixed32Fixed32_.AddEntriesFrom(input, _map_mapFixed32Fixed32_codec);
+            break;
+          }
+          case 66: {
+            mapFixed64Fixed64_.AddEntriesFrom(input, _map_mapFixed64Fixed64_codec);
+            break;
+          }
+          case 74: {
+            mapSfixed32Sfixed32_.AddEntriesFrom(input, _map_mapSfixed32Sfixed32_codec);
+            break;
+          }
+          case 82: {
+            mapSfixed64Sfixed64_.AddEntriesFrom(input, _map_mapSfixed64Sfixed64_codec);
+            break;
+          }
+          case 90: {
+            mapInt32Float_.AddEntriesFrom(input, _map_mapInt32Float_codec);
+            break;
+          }
+          case 98: {
+            mapInt32Double_.AddEntriesFrom(input, _map_mapInt32Double_codec);
+            break;
+          }
+          case 106: {
+            mapBoolBool_.AddEntriesFrom(input, _map_mapBoolBool_codec);
+            break;
+          }
+          case 114: {
+            mapStringString_.AddEntriesFrom(input, _map_mapStringString_codec);
+            break;
+          }
+          case 122: {
+            mapInt32Bytes_.AddEntriesFrom(input, _map_mapInt32Bytes_codec);
+            break;
+          }
+          case 130: {
+            mapInt32Enum_.AddEntriesFrom(input, _map_mapInt32Enum_codec);
+            break;
+          }
+          case 138: {
+            mapInt32ForeignMessage_.AddEntriesFrom(input, _map_mapInt32ForeignMessage_codec);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public static partial class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapInt32Int32Entry : pb::IMessage<MapInt32Int32Entry> {
+        private static readonly pb::MessageParser<MapInt32Int32Entry> _parser = new pb::MessageParser<MapInt32Int32Entry>(() => new MapInt32Int32Entry());
+        public static pb::MessageParser<MapInt32Int32Entry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapInt32Int32Entry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapInt32Int32Entry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapInt32Int32Entry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapInt32Int32Entry() { }
+
+        public MapInt32Int32Entry(MapInt32Int32Entry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public MapInt32Int32Entry Clone() {
+          return new MapInt32Int32Entry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private int key_;
+        public int Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private int value_;
+        public int Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapInt32Int32Entry);
+        }
+
+        public bool Equals(MapInt32Int32Entry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0) hash ^= Key.GetHashCode();
+          if (Value != 0) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0) {
+            output.WriteRawTag(8);
+            output.WriteInt32(Key);
+          }
+          if (Value != 0) {
+            output.WriteRawTag(16);
+            output.WriteInt32(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
+          }
+          if (Value != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Value);
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapInt32Int32Entry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0) {
+            Key = other.Key;
+          }
+          if (other.Value != 0) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 8: {
+                Key = input.ReadInt32();
+                break;
+              }
+              case 16: {
+                Value = input.ReadInt32();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapInt64Int64Entry : pb::IMessage<MapInt64Int64Entry> {
+        private static readonly pb::MessageParser<MapInt64Int64Entry> _parser = new pb::MessageParser<MapInt64Int64Entry>(() => new MapInt64Int64Entry());
+        public static pb::MessageParser<MapInt64Int64Entry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapInt64Int64Entry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapInt64Int64Entry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapInt64Int64Entry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapInt64Int64Entry() { }
+
+        public MapInt64Int64Entry(MapInt64Int64Entry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public MapInt64Int64Entry Clone() {
+          return new MapInt64Int64Entry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private long key_;
+        public long Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private long value_;
+        public long Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapInt64Int64Entry);
+        }
+
+        public bool Equals(MapInt64Int64Entry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0L) hash ^= Key.GetHashCode();
+          if (Value != 0L) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0L) {
+            output.WriteRawTag(8);
+            output.WriteInt64(Key);
+          }
+          if (Value != 0L) {
+            output.WriteRawTag(16);
+            output.WriteInt64(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0L) {
+            size += 1 + pb::CodedOutputStream.ComputeInt64Size(Key);
+          }
+          if (Value != 0L) {
+            size += 1 + pb::CodedOutputStream.ComputeInt64Size(Value);
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapInt64Int64Entry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0L) {
+            Key = other.Key;
+          }
+          if (other.Value != 0L) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 8: {
+                Key = input.ReadInt64();
+                break;
+              }
+              case 16: {
+                Value = input.ReadInt64();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapUint32Uint32Entry : pb::IMessage<MapUint32Uint32Entry> {
+        private static readonly pb::MessageParser<MapUint32Uint32Entry> _parser = new pb::MessageParser<MapUint32Uint32Entry>(() => new MapUint32Uint32Entry());
+        public static pb::MessageParser<MapUint32Uint32Entry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapUint32Uint32Entry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapUint32Uint32Entry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapUint32Uint32Entry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapUint32Uint32Entry() { }
+
+        public MapUint32Uint32Entry(MapUint32Uint32Entry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public MapUint32Uint32Entry Clone() {
+          return new MapUint32Uint32Entry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private uint key_;
+        public uint Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private uint value_;
+        public uint Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapUint32Uint32Entry);
+        }
+
+        public bool Equals(MapUint32Uint32Entry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0) hash ^= Key.GetHashCode();
+          if (Value != 0) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0) {
+            output.WriteRawTag(8);
+            output.WriteUInt32(Key);
+          }
+          if (Value != 0) {
+            output.WriteRawTag(16);
+            output.WriteUInt32(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeUInt32Size(Key);
+          }
+          if (Value != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeUInt32Size(Value);
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapUint32Uint32Entry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0) {
+            Key = other.Key;
+          }
+          if (other.Value != 0) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 8: {
+                Key = input.ReadUInt32();
+                break;
+              }
+              case 16: {
+                Value = input.ReadUInt32();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapUint64Uint64Entry : pb::IMessage<MapUint64Uint64Entry> {
+        private static readonly pb::MessageParser<MapUint64Uint64Entry> _parser = new pb::MessageParser<MapUint64Uint64Entry>(() => new MapUint64Uint64Entry());
+        public static pb::MessageParser<MapUint64Uint64Entry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapUint64Uint64Entry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapUint64Uint64Entry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapUint64Uint64Entry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapUint64Uint64Entry() { }
+
+        public MapUint64Uint64Entry(MapUint64Uint64Entry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public MapUint64Uint64Entry Clone() {
+          return new MapUint64Uint64Entry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private ulong key_;
+        public ulong Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private ulong value_;
+        public ulong Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapUint64Uint64Entry);
+        }
+
+        public bool Equals(MapUint64Uint64Entry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0UL) hash ^= Key.GetHashCode();
+          if (Value != 0UL) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0UL) {
+            output.WriteRawTag(8);
+            output.WriteUInt64(Key);
+          }
+          if (Value != 0UL) {
+            output.WriteRawTag(16);
+            output.WriteUInt64(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0UL) {
+            size += 1 + pb::CodedOutputStream.ComputeUInt64Size(Key);
+          }
+          if (Value != 0UL) {
+            size += 1 + pb::CodedOutputStream.ComputeUInt64Size(Value);
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapUint64Uint64Entry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0UL) {
+            Key = other.Key;
+          }
+          if (other.Value != 0UL) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 8: {
+                Key = input.ReadUInt64();
+                break;
+              }
+              case 16: {
+                Value = input.ReadUInt64();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapSint32Sint32Entry : pb::IMessage<MapSint32Sint32Entry> {
+        private static readonly pb::MessageParser<MapSint32Sint32Entry> _parser = new pb::MessageParser<MapSint32Sint32Entry>(() => new MapSint32Sint32Entry());
+        public static pb::MessageParser<MapSint32Sint32Entry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapSint32Sint32Entry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapSint32Sint32Entry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapSint32Sint32Entry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapSint32Sint32Entry() { }
+
+        public MapSint32Sint32Entry(MapSint32Sint32Entry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public MapSint32Sint32Entry Clone() {
+          return new MapSint32Sint32Entry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private int key_;
+        public int Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private int value_;
+        public int Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapSint32Sint32Entry);
+        }
+
+        public bool Equals(MapSint32Sint32Entry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0) hash ^= Key.GetHashCode();
+          if (Value != 0) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0) {
+            output.WriteRawTag(8);
+            output.WriteSInt32(Key);
+          }
+          if (Value != 0) {
+            output.WriteRawTag(16);
+            output.WriteSInt32(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeSInt32Size(Key);
+          }
+          if (Value != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeSInt32Size(Value);
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapSint32Sint32Entry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0) {
+            Key = other.Key;
+          }
+          if (other.Value != 0) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 8: {
+                Key = input.ReadSInt32();
+                break;
+              }
+              case 16: {
+                Value = input.ReadSInt32();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapSint64Sint64Entry : pb::IMessage<MapSint64Sint64Entry> {
+        private static readonly pb::MessageParser<MapSint64Sint64Entry> _parser = new pb::MessageParser<MapSint64Sint64Entry>(() => new MapSint64Sint64Entry());
+        public static pb::MessageParser<MapSint64Sint64Entry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapSint64Sint64Entry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapSint64Sint64Entry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapSint64Sint64Entry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapSint64Sint64Entry() { }
+
+        public MapSint64Sint64Entry(MapSint64Sint64Entry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public MapSint64Sint64Entry Clone() {
+          return new MapSint64Sint64Entry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private long key_;
+        public long Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private long value_;
+        public long Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapSint64Sint64Entry);
+        }
+
+        public bool Equals(MapSint64Sint64Entry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0L) hash ^= Key.GetHashCode();
+          if (Value != 0L) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0L) {
+            output.WriteRawTag(8);
+            output.WriteSInt64(Key);
+          }
+          if (Value != 0L) {
+            output.WriteRawTag(16);
+            output.WriteSInt64(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0L) {
+            size += 1 + pb::CodedOutputStream.ComputeSInt64Size(Key);
+          }
+          if (Value != 0L) {
+            size += 1 + pb::CodedOutputStream.ComputeSInt64Size(Value);
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapSint64Sint64Entry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0L) {
+            Key = other.Key;
+          }
+          if (other.Value != 0L) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 8: {
+                Key = input.ReadSInt64();
+                break;
+              }
+              case 16: {
+                Value = input.ReadSInt64();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapFixed32Fixed32Entry : pb::IMessage<MapFixed32Fixed32Entry> {
+        private static readonly pb::MessageParser<MapFixed32Fixed32Entry> _parser = new pb::MessageParser<MapFixed32Fixed32Entry>(() => new MapFixed32Fixed32Entry());
+        public static pb::MessageParser<MapFixed32Fixed32Entry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 13, 21 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapFixed32Fixed32Entry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapFixed32Fixed32Entry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapFixed32Fixed32Entry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapFixed32Fixed32Entry() { }
+
+        public MapFixed32Fixed32Entry(MapFixed32Fixed32Entry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public MapFixed32Fixed32Entry Clone() {
+          return new MapFixed32Fixed32Entry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private uint key_;
+        public uint Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private uint value_;
+        public uint Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapFixed32Fixed32Entry);
+        }
+
+        public bool Equals(MapFixed32Fixed32Entry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0) hash ^= Key.GetHashCode();
+          if (Value != 0) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0) {
+            output.WriteRawTag(13);
+            output.WriteFixed32(Key);
+          }
+          if (Value != 0) {
+            output.WriteRawTag(21);
+            output.WriteFixed32(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0) {
+            size += 1 + 4;
+          }
+          if (Value != 0) {
+            size += 1 + 4;
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapFixed32Fixed32Entry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0) {
+            Key = other.Key;
+          }
+          if (other.Value != 0) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 13: {
+                Key = input.ReadFixed32();
+                break;
+              }
+              case 21: {
+                Value = input.ReadFixed32();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapFixed64Fixed64Entry : pb::IMessage<MapFixed64Fixed64Entry> {
+        private static readonly pb::MessageParser<MapFixed64Fixed64Entry> _parser = new pb::MessageParser<MapFixed64Fixed64Entry>(() => new MapFixed64Fixed64Entry());
+        public static pb::MessageParser<MapFixed64Fixed64Entry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 9, 17 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapFixed64Fixed64Entry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapFixed64Fixed64Entry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapFixed64Fixed64Entry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapFixed64Fixed64Entry() { }
+
+        public MapFixed64Fixed64Entry(MapFixed64Fixed64Entry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public MapFixed64Fixed64Entry Clone() {
+          return new MapFixed64Fixed64Entry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private ulong key_;
+        public ulong Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private ulong value_;
+        public ulong Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapFixed64Fixed64Entry);
+        }
+
+        public bool Equals(MapFixed64Fixed64Entry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0UL) hash ^= Key.GetHashCode();
+          if (Value != 0UL) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0UL) {
+            output.WriteRawTag(9);
+            output.WriteFixed64(Key);
+          }
+          if (Value != 0UL) {
+            output.WriteRawTag(17);
+            output.WriteFixed64(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0UL) {
+            size += 1 + 8;
+          }
+          if (Value != 0UL) {
+            size += 1 + 8;
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapFixed64Fixed64Entry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0UL) {
+            Key = other.Key;
+          }
+          if (other.Value != 0UL) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 9: {
+                Key = input.ReadFixed64();
+                break;
+              }
+              case 17: {
+                Value = input.ReadFixed64();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapSfixed32Sfixed32Entry : pb::IMessage<MapSfixed32Sfixed32Entry> {
+        private static readonly pb::MessageParser<MapSfixed32Sfixed32Entry> _parser = new pb::MessageParser<MapSfixed32Sfixed32Entry>(() => new MapSfixed32Sfixed32Entry());
+        public static pb::MessageParser<MapSfixed32Sfixed32Entry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 13, 21 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapSfixed32Sfixed32Entry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapSfixed32Sfixed32Entry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapSfixed32Sfixed32Entry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapSfixed32Sfixed32Entry() { }
+
+        public MapSfixed32Sfixed32Entry(MapSfixed32Sfixed32Entry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public MapSfixed32Sfixed32Entry Clone() {
+          return new MapSfixed32Sfixed32Entry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private int key_;
+        public int Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private int value_;
+        public int Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapSfixed32Sfixed32Entry);
+        }
+
+        public bool Equals(MapSfixed32Sfixed32Entry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0) hash ^= Key.GetHashCode();
+          if (Value != 0) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0) {
+            output.WriteRawTag(13);
+            output.WriteSFixed32(Key);
+          }
+          if (Value != 0) {
+            output.WriteRawTag(21);
+            output.WriteSFixed32(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0) {
+            size += 1 + 4;
+          }
+          if (Value != 0) {
+            size += 1 + 4;
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapSfixed32Sfixed32Entry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0) {
+            Key = other.Key;
+          }
+          if (other.Value != 0) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 13: {
+                Key = input.ReadSFixed32();
+                break;
+              }
+              case 21: {
+                Value = input.ReadSFixed32();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapSfixed64Sfixed64Entry : pb::IMessage<MapSfixed64Sfixed64Entry> {
+        private static readonly pb::MessageParser<MapSfixed64Sfixed64Entry> _parser = new pb::MessageParser<MapSfixed64Sfixed64Entry>(() => new MapSfixed64Sfixed64Entry());
+        public static pb::MessageParser<MapSfixed64Sfixed64Entry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 9, 17 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapSfixed64Sfixed64Entry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapSfixed64Sfixed64Entry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapSfixed64Sfixed64Entry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapSfixed64Sfixed64Entry() { }
+
+        public MapSfixed64Sfixed64Entry(MapSfixed64Sfixed64Entry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public MapSfixed64Sfixed64Entry Clone() {
+          return new MapSfixed64Sfixed64Entry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private long key_;
+        public long Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private long value_;
+        public long Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapSfixed64Sfixed64Entry);
+        }
+
+        public bool Equals(MapSfixed64Sfixed64Entry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0L) hash ^= Key.GetHashCode();
+          if (Value != 0L) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0L) {
+            output.WriteRawTag(9);
+            output.WriteSFixed64(Key);
+          }
+          if (Value != 0L) {
+            output.WriteRawTag(17);
+            output.WriteSFixed64(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0L) {
+            size += 1 + 8;
+          }
+          if (Value != 0L) {
+            size += 1 + 8;
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapSfixed64Sfixed64Entry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0L) {
+            Key = other.Key;
+          }
+          if (other.Value != 0L) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 9: {
+                Key = input.ReadSFixed64();
+                break;
+              }
+              case 17: {
+                Value = input.ReadSFixed64();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapInt32FloatEntry : pb::IMessage<MapInt32FloatEntry> {
+        private static readonly pb::MessageParser<MapInt32FloatEntry> _parser = new pb::MessageParser<MapInt32FloatEntry>(() => new MapInt32FloatEntry());
+        public static pb::MessageParser<MapInt32FloatEntry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 8, 21 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapInt32FloatEntry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapInt32FloatEntry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapInt32FloatEntry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapInt32FloatEntry() { }
+
+        public MapInt32FloatEntry(MapInt32FloatEntry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public MapInt32FloatEntry Clone() {
+          return new MapInt32FloatEntry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private int key_;
+        public int Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private float value_;
+        public float Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapInt32FloatEntry);
+        }
+
+        public bool Equals(MapInt32FloatEntry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0) hash ^= Key.GetHashCode();
+          if (Value != 0F) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0) {
+            output.WriteRawTag(8);
+            output.WriteInt32(Key);
+          }
+          if (Value != 0F) {
+            output.WriteRawTag(21);
+            output.WriteFloat(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
+          }
+          if (Value != 0F) {
+            size += 1 + 4;
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapInt32FloatEntry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0) {
+            Key = other.Key;
+          }
+          if (other.Value != 0F) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 8: {
+                Key = input.ReadInt32();
+                break;
+              }
+              case 21: {
+                Value = input.ReadFloat();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapInt32DoubleEntry : pb::IMessage<MapInt32DoubleEntry> {
+        private static readonly pb::MessageParser<MapInt32DoubleEntry> _parser = new pb::MessageParser<MapInt32DoubleEntry>(() => new MapInt32DoubleEntry());
+        public static pb::MessageParser<MapInt32DoubleEntry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 8, 17 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapInt32DoubleEntry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapInt32DoubleEntry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapInt32DoubleEntry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapInt32DoubleEntry() { }
+
+        public MapInt32DoubleEntry(MapInt32DoubleEntry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public MapInt32DoubleEntry Clone() {
+          return new MapInt32DoubleEntry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private int key_;
+        public int Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private double value_;
+        public double Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapInt32DoubleEntry);
+        }
+
+        public bool Equals(MapInt32DoubleEntry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0) hash ^= Key.GetHashCode();
+          if (Value != 0D) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0) {
+            output.WriteRawTag(8);
+            output.WriteInt32(Key);
+          }
+          if (Value != 0D) {
+            output.WriteRawTag(17);
+            output.WriteDouble(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
+          }
+          if (Value != 0D) {
+            size += 1 + 8;
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapInt32DoubleEntry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0) {
+            Key = other.Key;
+          }
+          if (other.Value != 0D) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 8: {
+                Key = input.ReadInt32();
+                break;
+              }
+              case 17: {
+                Value = input.ReadDouble();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapBoolBoolEntry : pb::IMessage<MapBoolBoolEntry> {
+        private static readonly pb::MessageParser<MapBoolBoolEntry> _parser = new pb::MessageParser<MapBoolBoolEntry>(() => new MapBoolBoolEntry());
+        public static pb::MessageParser<MapBoolBoolEntry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapBoolBoolEntry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapBoolBoolEntry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapBoolBoolEntry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapBoolBoolEntry() { }
+
+        public MapBoolBoolEntry(MapBoolBoolEntry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public MapBoolBoolEntry Clone() {
+          return new MapBoolBoolEntry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private bool key_;
+        public bool Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private bool value_;
+        public bool Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapBoolBoolEntry);
+        }
+
+        public bool Equals(MapBoolBoolEntry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != false) hash ^= Key.GetHashCode();
+          if (Value != false) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != false) {
+            output.WriteRawTag(8);
+            output.WriteBool(Key);
+          }
+          if (Value != false) {
+            output.WriteRawTag(16);
+            output.WriteBool(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != false) {
+            size += 1 + 1;
+          }
+          if (Value != false) {
+            size += 1 + 1;
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapBoolBoolEntry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != false) {
+            Key = other.Key;
+          }
+          if (other.Value != false) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 8: {
+                Key = input.ReadBool();
+                break;
+              }
+              case 16: {
+                Value = input.ReadBool();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapStringStringEntry : pb::IMessage<MapStringStringEntry> {
+        private static readonly pb::MessageParser<MapStringStringEntry> _parser = new pb::MessageParser<MapStringStringEntry>(() => new MapStringStringEntry());
+        public static pb::MessageParser<MapStringStringEntry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 10, 18 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapStringStringEntry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapStringStringEntry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapStringStringEntry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapStringStringEntry() { }
+
+        public MapStringStringEntry(MapStringStringEntry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public MapStringStringEntry Clone() {
+          return new MapStringStringEntry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private string key_ = "";
+        public string Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value ?? "";
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private string value_ = "";
+        public string Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value ?? "";
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapStringStringEntry);
+        }
+
+        public bool Equals(MapStringStringEntry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key.Length != 0) hash ^= Key.GetHashCode();
+          if (Value.Length != 0) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key.Length != 0) {
+            output.WriteRawTag(10);
+            output.WriteString(Key);
+          }
+          if (Value.Length != 0) {
+            output.WriteRawTag(18);
+            output.WriteString(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeStringSize(Key);
+          }
+          if (Value.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeStringSize(Value);
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapStringStringEntry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key.Length != 0) {
+            Key = other.Key;
+          }
+          if (other.Value.Length != 0) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 10: {
+                Key = input.ReadString();
+                break;
+              }
+              case 18: {
+                Value = input.ReadString();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapInt32BytesEntry : pb::IMessage<MapInt32BytesEntry> {
+        private static readonly pb::MessageParser<MapInt32BytesEntry> _parser = new pb::MessageParser<MapInt32BytesEntry>(() => new MapInt32BytesEntry());
+        public static pb::MessageParser<MapInt32BytesEntry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 8, 18 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapInt32BytesEntry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapInt32BytesEntry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapInt32BytesEntry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapInt32BytesEntry() { }
+
+        public MapInt32BytesEntry(MapInt32BytesEntry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public MapInt32BytesEntry Clone() {
+          return new MapInt32BytesEntry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private int key_;
+        public int Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private pb::ByteString value_ = pb::ByteString.Empty;
+        public pb::ByteString Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value ?? pb::ByteString.Empty;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapInt32BytesEntry);
+        }
+
+        public bool Equals(MapInt32BytesEntry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0) hash ^= Key.GetHashCode();
+          if (Value.Length != 0) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0) {
+            output.WriteRawTag(8);
+            output.WriteInt32(Key);
+          }
+          if (Value.Length != 0) {
+            output.WriteRawTag(18);
+            output.WriteBytes(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
+          }
+          if (Value.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeBytesSize(Value);
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapInt32BytesEntry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0) {
+            Key = other.Key;
+          }
+          if (other.Value.Length != 0) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 8: {
+                Key = input.ReadInt32();
+                break;
+              }
+              case 18: {
+                Value = input.ReadBytes();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapInt32EnumEntry : pb::IMessage<MapInt32EnumEntry> {
+        private static readonly pb::MessageParser<MapInt32EnumEntry> _parser = new pb::MessageParser<MapInt32EnumEntry>(() => new MapInt32EnumEntry());
+        public static pb::MessageParser<MapInt32EnumEntry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapInt32EnumEntry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapInt32EnumEntry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapInt32EnumEntry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapInt32EnumEntry() { }
+
+        public MapInt32EnumEntry(MapInt32EnumEntry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public MapInt32EnumEntry Clone() {
+          return new MapInt32EnumEntry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private int key_;
+        public int Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private global::Google.Protobuf.TestProtos.MapEnum value_ = global::Google.Protobuf.TestProtos.MapEnum.MAP_ENUM_FOO;
+        public global::Google.Protobuf.TestProtos.MapEnum Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapInt32EnumEntry);
+        }
+
+        public bool Equals(MapInt32EnumEntry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0) hash ^= Key.GetHashCode();
+          if (Value != global::Google.Protobuf.TestProtos.MapEnum.MAP_ENUM_FOO) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0) {
+            output.WriteRawTag(8);
+            output.WriteInt32(Key);
+          }
+          if (Value != global::Google.Protobuf.TestProtos.MapEnum.MAP_ENUM_FOO) {
+            output.WriteRawTag(16);
+            output.WriteEnum((int) Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
+          }
+          if (Value != global::Google.Protobuf.TestProtos.MapEnum.MAP_ENUM_FOO) {
+            size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Value);
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapInt32EnumEntry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0) {
+            Key = other.Key;
+          }
+          if (other.Value != global::Google.Protobuf.TestProtos.MapEnum.MAP_ENUM_FOO) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 8: {
+                Key = input.ReadInt32();
+                break;
+              }
+              case 16: {
+                value_ = (global::Google.Protobuf.TestProtos.MapEnum) input.ReadEnum();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapInt32ForeignMessageEntry : pb::IMessage<MapInt32ForeignMessageEntry> {
+        private static readonly pb::MessageParser<MapInt32ForeignMessageEntry> _parser = new pb::MessageParser<MapInt32ForeignMessageEntry>(() => new MapInt32ForeignMessageEntry());
+        public static pb::MessageParser<MapInt32ForeignMessageEntry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 8, 18 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapInt32ForeignMessageEntry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapInt32ForeignMessageEntry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMap_MapInt32ForeignMessageEntry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapInt32ForeignMessageEntry() { }
+
+        public MapInt32ForeignMessageEntry(MapInt32ForeignMessageEntry other) {
+          key_ = other.key_;
+          Value = other.value_ != null ? other.Value.Clone() : null;
+        }
+
+        public MapInt32ForeignMessageEntry Clone() {
+          return new MapInt32ForeignMessageEntry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+          if (value_ != null) Value.Freeze();
+        }
+
+        public const int KeyFieldNumber = 1;
+        private int key_;
+        public int Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private global::Google.Protobuf.TestProtos.ForeignMessage value_;
+        public global::Google.Protobuf.TestProtos.ForeignMessage Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapInt32ForeignMessageEntry);
+        }
+
+        public bool Equals(MapInt32ForeignMessageEntry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (!object.Equals(Value, other.Value)) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0) hash ^= Key.GetHashCode();
+          if (value_ != null) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0) {
+            output.WriteRawTag(8);
+            output.WriteInt32(Key);
+          }
+          if (value_ != null) {
+            output.WriteRawTag(18);
+            output.WriteMessage(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
+          }
+          if (value_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(Value);
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapInt32ForeignMessageEntry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0) {
+            Key = other.Key;
+          }
+          if (other.value_ != null) {
+            if (value_ == null) {
+              value_ = new global::Google.Protobuf.TestProtos.ForeignMessage();
+            }
+            Value.MergeFrom(other.Value);
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 8: {
+                Key = input.ReadInt32();
+                break;
+              }
+              case 18: {
+                if (value_ == null) {
+                  value_ = new global::Google.Protobuf.TestProtos.ForeignMessage();
+                }
+                input.ReadMessage(value_);
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+    }
+    #endregion
+
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestMapSubmessage : pb::IMessage<TestMapSubmessage> {
+    private static readonly pb::MessageParser<TestMapSubmessage> _parser = new pb::MessageParser<TestMapSubmessage>(() => new TestMapSubmessage());
+    public static pb::MessageParser<TestMapSubmessage> Parser { get { return _parser; } }
+
+    private static readonly string[] _fieldNames = new string[] { "test_map" };
+    private static readonly uint[] _fieldTags = new uint[] { 10 };
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMapSubmessage__Descriptor; }
+    }
+
+    public pb::FieldAccess.FieldAccessorTable<TestMapSubmessage> Fields {
+      get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMapSubmessage__FieldAccessorTable; }
+    }
+
+    private bool _frozen = false;
+    public bool IsFrozen { get { return _frozen; } }
+
+    public TestMapSubmessage() { }
+
+    public TestMapSubmessage(TestMapSubmessage other) {
+      TestMap = other.testMap_ != null ? other.TestMap.Clone() : null;
+    }
+
+    public TestMapSubmessage Clone() {
+      return new TestMapSubmessage(this);
+    }
+
+    public void Freeze() {
+      if (IsFrozen) {
+        return;
+      }
+      _frozen = true;
+      if (testMap_ != null) TestMap.Freeze();
+    }
+
+    public const int TestMapFieldNumber = 1;
+    private global::Google.Protobuf.TestProtos.TestMap testMap_;
+    public global::Google.Protobuf.TestProtos.TestMap TestMap {
+      get { return testMap_; }
+      set {
+        pb::Freezable.CheckMutable(this);
+        testMap_ = value;
+      }
+    }
+
+    public override bool Equals(object other) {
+      return Equals(other as TestMapSubmessage);
+    }
+
+    public bool Equals(TestMapSubmessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!object.Equals(TestMap, other.TestMap)) return false;
+      return true;
+    }
+
+    public override int GetHashCode() {
+      int hash = 1;
+      if (testMap_ != null) hash ^= TestMap.GetHashCode();
+      return hash;
+    }
+
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (testMap_ != null) {
+        output.WriteRawTag(10);
+        output.WriteMessage(TestMap);
+      }
+    }
+
+    public int CalculateSize() {
+      int size = 0;
+      if (testMap_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(TestMap);
+      }
+      return size;
+    }
+
+    public void MergeFrom(TestMapSubmessage other) {
+      if (other == null) {
+        return;
+      }
+      if (other.testMap_ != null) {
+        if (testMap_ == null) {
+          testMap_ = new global::Google.Protobuf.TestProtos.TestMap();
+        }
+        TestMap.MergeFrom(other.TestMap);
+      }
+    }
+
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while (input.ReadTag(out tag)) {
+        switch(tag) {
+          case 0:
+            throw pb::InvalidProtocolBufferException.InvalidTag();
+          default:
+            if (pb::WireFormat.IsEndGroupTag(tag)) {
+              return;
+            }
+            break;
+          case 10: {
+            if (testMap_ == null) {
+              testMap_ = new global::Google.Protobuf.TestProtos.TestMap();
+            }
+            input.ReadMessage(testMap_);
+            break;
+          }
+        }
+      }
+    }
+
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestMessageMap : pb::IMessage<TestMessageMap> {
+    private static readonly pb::MessageParser<TestMessageMap> _parser = new pb::MessageParser<TestMessageMap>(() => new TestMessageMap());
+    public static pb::MessageParser<TestMessageMap> Parser { get { return _parser; } }
+
+    private static readonly string[] _fieldNames = new string[] { "map_int32_message" };
+    private static readonly uint[] _fieldTags = new uint[] { 10 };
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMessageMap__Descriptor; }
+    }
+
+    public pb::FieldAccess.FieldAccessorTable<TestMessageMap> Fields {
+      get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMessageMap__FieldAccessorTable; }
+    }
+
+    private bool _frozen = false;
+    public bool IsFrozen { get { return _frozen; } }
+
+    public TestMessageMap() { }
+
+    public TestMessageMap(TestMessageMap other) {
+      mapInt32Message_ = other.mapInt32Message_.Clone();
+    }
+
+    public TestMessageMap Clone() {
+      return new TestMessageMap(this);
+    }
+
+    public void Freeze() {
+      if (IsFrozen) {
+        return;
+      }
+      _frozen = true;
+      mapInt32Message_.Freeze();
+    }
+
+    public const int MapInt32MessageFieldNumber = 1;
+    private static readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.TestAllTypes>.Codec _map_mapInt32Message_codec
+        = new pbc::MapField<int, global::Google.Protobuf.TestProtos.TestAllTypes>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.TestProtos.TestAllTypes.Parser), 10);
+    private readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.TestAllTypes> mapInt32Message_ = new pbc::MapField<int, global::Google.Protobuf.TestProtos.TestAllTypes>();
+    public pbc::MapField<int, global::Google.Protobuf.TestProtos.TestAllTypes> MapInt32Message {
+      get { return mapInt32Message_; }
+    }
+
+    public override bool Equals(object other) {
+      return Equals(other as TestMessageMap);
+    }
+
+    public bool Equals(TestMessageMap other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!MapInt32Message.Equals(other.MapInt32Message)) return false;
+      return true;
+    }
+
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= MapInt32Message.GetHashCode();
+      return hash;
+    }
+
+    public void WriteTo(pb::CodedOutputStream output) {
+      mapInt32Message_.WriteTo(output, _map_mapInt32Message_codec);
+    }
+
+    public int CalculateSize() {
+      int size = 0;
+      size += mapInt32Message_.CalculateSize(_map_mapInt32Message_codec);
+      return size;
+    }
+
+    public void MergeFrom(TestMessageMap other) {
+      if (other == null) {
+        return;
+      }
+      mapInt32Message_.Add(other.mapInt32Message_);
+    }
+
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while (input.ReadTag(out tag)) {
+        switch(tag) {
+          case 0:
+            throw pb::InvalidProtocolBufferException.InvalidTag();
+          default:
+            if (pb::WireFormat.IsEndGroupTag(tag)) {
+              return;
+            }
+            break;
+          case 10: {
+            mapInt32Message_.AddEntriesFrom(input, _map_mapInt32Message_codec);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public static partial class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapInt32MessageEntry : pb::IMessage<MapInt32MessageEntry> {
+        private static readonly pb::MessageParser<MapInt32MessageEntry> _parser = new pb::MessageParser<MapInt32MessageEntry>(() => new MapInt32MessageEntry());
+        public static pb::MessageParser<MapInt32MessageEntry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 8, 18 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMessageMap_MapInt32MessageEntry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapInt32MessageEntry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestMessageMap_MapInt32MessageEntry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapInt32MessageEntry() { }
+
+        public MapInt32MessageEntry(MapInt32MessageEntry other) {
+          key_ = other.key_;
+          Value = other.value_ != null ? other.Value.Clone() : null;
+        }
+
+        public MapInt32MessageEntry Clone() {
+          return new MapInt32MessageEntry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+          if (value_ != null) Value.Freeze();
+        }
+
+        public const int KeyFieldNumber = 1;
+        private int key_;
+        public int Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private global::Google.Protobuf.TestProtos.TestAllTypes value_;
+        public global::Google.Protobuf.TestProtos.TestAllTypes Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapInt32MessageEntry);
+        }
+
+        public bool Equals(MapInt32MessageEntry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (!object.Equals(Value, other.Value)) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0) hash ^= Key.GetHashCode();
+          if (value_ != null) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0) {
+            output.WriteRawTag(8);
+            output.WriteInt32(Key);
+          }
+          if (value_ != null) {
+            output.WriteRawTag(18);
+            output.WriteMessage(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
+          }
+          if (value_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(Value);
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapInt32MessageEntry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0) {
+            Key = other.Key;
+          }
+          if (other.value_ != null) {
+            if (value_ == null) {
+              value_ = new global::Google.Protobuf.TestProtos.TestAllTypes();
+            }
+            Value.MergeFrom(other.Value);
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 8: {
+                Key = input.ReadInt32();
+                break;
+              }
+              case 18: {
+                if (value_ == null) {
+                  value_ = new global::Google.Protobuf.TestProtos.TestAllTypes();
+                }
+                input.ReadMessage(value_);
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+    }
+    #endregion
+
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestSameTypeMap : pb::IMessage<TestSameTypeMap> {
+    private static readonly pb::MessageParser<TestSameTypeMap> _parser = new pb::MessageParser<TestSameTypeMap>(() => new TestSameTypeMap());
+    public static pb::MessageParser<TestSameTypeMap> Parser { get { return _parser; } }
+
+    private static readonly string[] _fieldNames = new string[] { "map1", "map2" };
+    private static readonly uint[] _fieldTags = new uint[] { 10, 18 };
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestSameTypeMap__Descriptor; }
+    }
+
+    public pb::FieldAccess.FieldAccessorTable<TestSameTypeMap> Fields {
+      get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestSameTypeMap__FieldAccessorTable; }
+    }
+
+    private bool _frozen = false;
+    public bool IsFrozen { get { return _frozen; } }
+
+    public TestSameTypeMap() { }
+
+    public TestSameTypeMap(TestSameTypeMap other) {
+      map1_ = other.map1_.Clone();
+      map2_ = other.map2_.Clone();
+    }
+
+    public TestSameTypeMap Clone() {
+      return new TestSameTypeMap(this);
+    }
+
+    public void Freeze() {
+      if (IsFrozen) {
+        return;
+      }
+      _frozen = true;
+      map1_.Freeze();
+      map2_.Freeze();
+    }
+
+    public const int Map1FieldNumber = 1;
+    private static readonly pbc::MapField<int, int>.Codec _map_map1_codec
+        = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForInt32(16), 10);
+    private readonly pbc::MapField<int, int> map1_ = new pbc::MapField<int, int>();
+    public pbc::MapField<int, int> Map1 {
+      get { return map1_; }
+    }
+
+    public const int Map2FieldNumber = 2;
+    private static readonly pbc::MapField<int, int>.Codec _map_map2_codec
+        = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForInt32(16), 18);
+    private readonly pbc::MapField<int, int> map2_ = new pbc::MapField<int, int>();
+    public pbc::MapField<int, int> Map2 {
+      get { return map2_; }
+    }
+
+    public override bool Equals(object other) {
+      return Equals(other as TestSameTypeMap);
+    }
+
+    public bool Equals(TestSameTypeMap other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!Map1.Equals(other.Map1)) return false;
+      if (!Map2.Equals(other.Map2)) return false;
+      return true;
+    }
+
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= Map1.GetHashCode();
+      hash ^= Map2.GetHashCode();
+      return hash;
+    }
+
+    public void WriteTo(pb::CodedOutputStream output) {
+      map1_.WriteTo(output, _map_map1_codec);
+      map2_.WriteTo(output, _map_map2_codec);
+    }
+
+    public int CalculateSize() {
+      int size = 0;
+      size += map1_.CalculateSize(_map_map1_codec);
+      size += map2_.CalculateSize(_map_map2_codec);
+      return size;
+    }
+
+    public void MergeFrom(TestSameTypeMap other) {
+      if (other == null) {
+        return;
+      }
+      map1_.Add(other.map1_);
+      map2_.Add(other.map2_);
+    }
+
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while (input.ReadTag(out tag)) {
+        switch(tag) {
+          case 0:
+            throw pb::InvalidProtocolBufferException.InvalidTag();
+          default:
+            if (pb::WireFormat.IsEndGroupTag(tag)) {
+              return;
+            }
+            break;
+          case 10: {
+            map1_.AddEntriesFrom(input, _map_map1_codec);
+            break;
+          }
+          case 18: {
+            map2_.AddEntriesFrom(input, _map_map2_codec);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public static partial class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class Map1Entry : pb::IMessage<Map1Entry> {
+        private static readonly pb::MessageParser<Map1Entry> _parser = new pb::MessageParser<Map1Entry>(() => new Map1Entry());
+        public static pb::MessageParser<Map1Entry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestSameTypeMap_Map1Entry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<Map1Entry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestSameTypeMap_Map1Entry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public Map1Entry() { }
+
+        public Map1Entry(Map1Entry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public Map1Entry Clone() {
+          return new Map1Entry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private int key_;
+        public int Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private int value_;
+        public int Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as Map1Entry);
+        }
+
+        public bool Equals(Map1Entry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0) hash ^= Key.GetHashCode();
+          if (Value != 0) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0) {
+            output.WriteRawTag(8);
+            output.WriteInt32(Key);
+          }
+          if (Value != 0) {
+            output.WriteRawTag(16);
+            output.WriteInt32(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
+          }
+          if (Value != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Value);
+          }
+          return size;
+        }
+
+        public void MergeFrom(Map1Entry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0) {
+            Key = other.Key;
+          }
+          if (other.Value != 0) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 8: {
+                Key = input.ReadInt32();
+                break;
+              }
+              case 16: {
+                Value = input.ReadInt32();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class Map2Entry : pb::IMessage<Map2Entry> {
+        private static readonly pb::MessageParser<Map2Entry> _parser = new pb::MessageParser<Map2Entry>(() => new Map2Entry());
+        public static pb::MessageParser<Map2Entry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestSameTypeMap_Map2Entry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<Map2Entry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestSameTypeMap_Map2Entry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public Map2Entry() { }
+
+        public Map2Entry(Map2Entry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public Map2Entry Clone() {
+          return new Map2Entry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private int key_;
+        public int Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private int value_;
+        public int Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as Map2Entry);
+        }
+
+        public bool Equals(Map2Entry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0) hash ^= Key.GetHashCode();
+          if (Value != 0) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0) {
+            output.WriteRawTag(8);
+            output.WriteInt32(Key);
+          }
+          if (Value != 0) {
+            output.WriteRawTag(16);
+            output.WriteInt32(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
+          }
+          if (Value != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Value);
+          }
+          return size;
+        }
+
+        public void MergeFrom(Map2Entry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0) {
+            Key = other.Key;
+          }
+          if (other.Value != 0) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 8: {
+                Key = input.ReadInt32();
+                break;
+              }
+              case 16: {
+                Value = input.ReadInt32();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+    }
+    #endregion
+
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class TestArenaMap : pb::IMessage<TestArenaMap> {
+    private static readonly pb::MessageParser<TestArenaMap> _parser = new pb::MessageParser<TestArenaMap>(() => new TestArenaMap());
+    public static pb::MessageParser<TestArenaMap> Parser { get { return _parser; } }
+
+    private static readonly string[] _fieldNames = new string[] { "map_bool_bool", "map_fixed32_fixed32", "map_fixed64_fixed64", "map_int32_double", "map_int32_enum", "map_int32_float", "map_int32_foreign_message", "map_int32_int32", "map_int64_int64", "map_sfixed32_sfixed32", "map_sfixed64_sfixed64", "map_sint32_sint32", "map_sint64_sint64", "map_uint32_uint32", "map_uint64_uint64" };
+    private static readonly uint[] _fieldTags = new uint[] { 106, 58, 66, 98, 114, 90, 122, 10, 18, 74, 82, 42, 50, 26, 34 };
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap__Descriptor; }
+    }
+
+    public pb::FieldAccess.FieldAccessorTable<TestArenaMap> Fields {
+      get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap__FieldAccessorTable; }
+    }
+
+    private bool _frozen = false;
+    public bool IsFrozen { get { return _frozen; } }
+
+    public TestArenaMap() { }
+
+    public TestArenaMap(TestArenaMap other) {
+      mapInt32Int32_ = other.mapInt32Int32_.Clone();
+      mapInt64Int64_ = other.mapInt64Int64_.Clone();
+      mapUint32Uint32_ = other.mapUint32Uint32_.Clone();
+      mapUint64Uint64_ = other.mapUint64Uint64_.Clone();
+      mapSint32Sint32_ = other.mapSint32Sint32_.Clone();
+      mapSint64Sint64_ = other.mapSint64Sint64_.Clone();
+      mapFixed32Fixed32_ = other.mapFixed32Fixed32_.Clone();
+      mapFixed64Fixed64_ = other.mapFixed64Fixed64_.Clone();
+      mapSfixed32Sfixed32_ = other.mapSfixed32Sfixed32_.Clone();
+      mapSfixed64Sfixed64_ = other.mapSfixed64Sfixed64_.Clone();
+      mapInt32Float_ = other.mapInt32Float_.Clone();
+      mapInt32Double_ = other.mapInt32Double_.Clone();
+      mapBoolBool_ = other.mapBoolBool_.Clone();
+      mapInt32Enum_ = other.mapInt32Enum_.Clone();
+      mapInt32ForeignMessage_ = other.mapInt32ForeignMessage_.Clone();
+    }
+
+    public TestArenaMap Clone() {
+      return new TestArenaMap(this);
+    }
+
+    public void Freeze() {
+      if (IsFrozen) {
+        return;
+      }
+      _frozen = true;
+      mapInt32Int32_.Freeze();
+      mapInt64Int64_.Freeze();
+      mapUint32Uint32_.Freeze();
+      mapUint64Uint64_.Freeze();
+      mapSint32Sint32_.Freeze();
+      mapSint64Sint64_.Freeze();
+      mapFixed32Fixed32_.Freeze();
+      mapFixed64Fixed64_.Freeze();
+      mapSfixed32Sfixed32_.Freeze();
+      mapSfixed64Sfixed64_.Freeze();
+      mapInt32Float_.Freeze();
+      mapInt32Double_.Freeze();
+      mapBoolBool_.Freeze();
+      mapInt32Enum_.Freeze();
+      mapInt32ForeignMessage_.Freeze();
+    }
+
+    public const int MapInt32Int32FieldNumber = 1;
+    private static readonly pbc::MapField<int, int>.Codec _map_mapInt32Int32_codec
+        = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForInt32(16), 10);
+    private readonly pbc::MapField<int, int> mapInt32Int32_ = new pbc::MapField<int, int>();
+    public pbc::MapField<int, int> MapInt32Int32 {
+      get { return mapInt32Int32_; }
+    }
+
+    public const int MapInt64Int64FieldNumber = 2;
+    private static readonly pbc::MapField<long, long>.Codec _map_mapInt64Int64_codec
+        = new pbc::MapField<long, long>.Codec(pb::FieldCodec.ForInt64(8), pb::FieldCodec.ForInt64(16), 18);
+    private readonly pbc::MapField<long, long> mapInt64Int64_ = new pbc::MapField<long, long>();
+    public pbc::MapField<long, long> MapInt64Int64 {
+      get { return mapInt64Int64_; }
+    }
+
+    public const int MapUint32Uint32FieldNumber = 3;
+    private static readonly pbc::MapField<uint, uint>.Codec _map_mapUint32Uint32_codec
+        = new pbc::MapField<uint, uint>.Codec(pb::FieldCodec.ForUInt32(8), pb::FieldCodec.ForUInt32(16), 26);
+    private readonly pbc::MapField<uint, uint> mapUint32Uint32_ = new pbc::MapField<uint, uint>();
+    public pbc::MapField<uint, uint> MapUint32Uint32 {
+      get { return mapUint32Uint32_; }
+    }
+
+    public const int MapUint64Uint64FieldNumber = 4;
+    private static readonly pbc::MapField<ulong, ulong>.Codec _map_mapUint64Uint64_codec
+        = new pbc::MapField<ulong, ulong>.Codec(pb::FieldCodec.ForUInt64(8), pb::FieldCodec.ForUInt64(16), 34);
+    private readonly pbc::MapField<ulong, ulong> mapUint64Uint64_ = new pbc::MapField<ulong, ulong>();
+    public pbc::MapField<ulong, ulong> MapUint64Uint64 {
+      get { return mapUint64Uint64_; }
+    }
+
+    public const int MapSint32Sint32FieldNumber = 5;
+    private static readonly pbc::MapField<int, int>.Codec _map_mapSint32Sint32_codec
+        = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForSInt32(8), pb::FieldCodec.ForSInt32(16), 42);
+    private readonly pbc::MapField<int, int> mapSint32Sint32_ = new pbc::MapField<int, int>();
+    public pbc::MapField<int, int> MapSint32Sint32 {
+      get { return mapSint32Sint32_; }
+    }
+
+    public const int MapSint64Sint64FieldNumber = 6;
+    private static readonly pbc::MapField<long, long>.Codec _map_mapSint64Sint64_codec
+        = new pbc::MapField<long, long>.Codec(pb::FieldCodec.ForSInt64(8), pb::FieldCodec.ForSInt64(16), 50);
+    private readonly pbc::MapField<long, long> mapSint64Sint64_ = new pbc::MapField<long, long>();
+    public pbc::MapField<long, long> MapSint64Sint64 {
+      get { return mapSint64Sint64_; }
+    }
+
+    public const int MapFixed32Fixed32FieldNumber = 7;
+    private static readonly pbc::MapField<uint, uint>.Codec _map_mapFixed32Fixed32_codec
+        = new pbc::MapField<uint, uint>.Codec(pb::FieldCodec.ForFixed32(13), pb::FieldCodec.ForFixed32(21), 58);
+    private readonly pbc::MapField<uint, uint> mapFixed32Fixed32_ = new pbc::MapField<uint, uint>();
+    public pbc::MapField<uint, uint> MapFixed32Fixed32 {
+      get { return mapFixed32Fixed32_; }
+    }
+
+    public const int MapFixed64Fixed64FieldNumber = 8;
+    private static readonly pbc::MapField<ulong, ulong>.Codec _map_mapFixed64Fixed64_codec
+        = new pbc::MapField<ulong, ulong>.Codec(pb::FieldCodec.ForFixed64(9), pb::FieldCodec.ForFixed64(17), 66);
+    private readonly pbc::MapField<ulong, ulong> mapFixed64Fixed64_ = new pbc::MapField<ulong, ulong>();
+    public pbc::MapField<ulong, ulong> MapFixed64Fixed64 {
+      get { return mapFixed64Fixed64_; }
+    }
+
+    public const int MapSfixed32Sfixed32FieldNumber = 9;
+    private static readonly pbc::MapField<int, int>.Codec _map_mapSfixed32Sfixed32_codec
+        = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForSFixed32(13), pb::FieldCodec.ForSFixed32(21), 74);
+    private readonly pbc::MapField<int, int> mapSfixed32Sfixed32_ = new pbc::MapField<int, int>();
+    public pbc::MapField<int, int> MapSfixed32Sfixed32 {
+      get { return mapSfixed32Sfixed32_; }
+    }
+
+    public const int MapSfixed64Sfixed64FieldNumber = 10;
+    private static readonly pbc::MapField<long, long>.Codec _map_mapSfixed64Sfixed64_codec
+        = new pbc::MapField<long, long>.Codec(pb::FieldCodec.ForSFixed64(9), pb::FieldCodec.ForSFixed64(17), 82);
+    private readonly pbc::MapField<long, long> mapSfixed64Sfixed64_ = new pbc::MapField<long, long>();
+    public pbc::MapField<long, long> MapSfixed64Sfixed64 {
+      get { return mapSfixed64Sfixed64_; }
+    }
+
+    public const int MapInt32FloatFieldNumber = 11;
+    private static readonly pbc::MapField<int, float>.Codec _map_mapInt32Float_codec
+        = new pbc::MapField<int, float>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForFloat(21), 90);
+    private readonly pbc::MapField<int, float> mapInt32Float_ = new pbc::MapField<int, float>();
+    public pbc::MapField<int, float> MapInt32Float {
+      get { return mapInt32Float_; }
+    }
+
+    public const int MapInt32DoubleFieldNumber = 12;
+    private static readonly pbc::MapField<int, double>.Codec _map_mapInt32Double_codec
+        = new pbc::MapField<int, double>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForDouble(17), 98);
+    private readonly pbc::MapField<int, double> mapInt32Double_ = new pbc::MapField<int, double>();
+    public pbc::MapField<int, double> MapInt32Double {
+      get { return mapInt32Double_; }
+    }
+
+    public const int MapBoolBoolFieldNumber = 13;
+    private static readonly pbc::MapField<bool, bool>.Codec _map_mapBoolBool_codec
+        = new pbc::MapField<bool, bool>.Codec(pb::FieldCodec.ForBool(8), pb::FieldCodec.ForBool(16), 106);
+    private readonly pbc::MapField<bool, bool> mapBoolBool_ = new pbc::MapField<bool, bool>();
+    public pbc::MapField<bool, bool> MapBoolBool {
+      get { return mapBoolBool_; }
+    }
+
+    public const int MapInt32EnumFieldNumber = 14;
+    private static readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.MapEnum>.Codec _map_mapInt32Enum_codec
+        = new pbc::MapField<int, global::Google.Protobuf.TestProtos.MapEnum>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForEnum(16, x => (int) x, x => (global::Google.Protobuf.TestProtos.MapEnum) x), 114);
+    private readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.MapEnum> mapInt32Enum_ = new pbc::MapField<int, global::Google.Protobuf.TestProtos.MapEnum>();
+    public pbc::MapField<int, global::Google.Protobuf.TestProtos.MapEnum> MapInt32Enum {
+      get { return mapInt32Enum_; }
+    }
+
+    public const int MapInt32ForeignMessageFieldNumber = 15;
+    private static readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.ForeignMessage>.Codec _map_mapInt32ForeignMessage_codec
+        = new pbc::MapField<int, global::Google.Protobuf.TestProtos.ForeignMessage>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.TestProtos.ForeignMessage.Parser), 122);
+    private readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.ForeignMessage> mapInt32ForeignMessage_ = new pbc::MapField<int, global::Google.Protobuf.TestProtos.ForeignMessage>();
+    public pbc::MapField<int, global::Google.Protobuf.TestProtos.ForeignMessage> MapInt32ForeignMessage {
+      get { return mapInt32ForeignMessage_; }
+    }
+
+    public override bool Equals(object other) {
+      return Equals(other as TestArenaMap);
+    }
+
+    public bool Equals(TestArenaMap other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!MapInt32Int32.Equals(other.MapInt32Int32)) return false;
+      if (!MapInt64Int64.Equals(other.MapInt64Int64)) return false;
+      if (!MapUint32Uint32.Equals(other.MapUint32Uint32)) return false;
+      if (!MapUint64Uint64.Equals(other.MapUint64Uint64)) return false;
+      if (!MapSint32Sint32.Equals(other.MapSint32Sint32)) return false;
+      if (!MapSint64Sint64.Equals(other.MapSint64Sint64)) return false;
+      if (!MapFixed32Fixed32.Equals(other.MapFixed32Fixed32)) return false;
+      if (!MapFixed64Fixed64.Equals(other.MapFixed64Fixed64)) return false;
+      if (!MapSfixed32Sfixed32.Equals(other.MapSfixed32Sfixed32)) return false;
+      if (!MapSfixed64Sfixed64.Equals(other.MapSfixed64Sfixed64)) return false;
+      if (!MapInt32Float.Equals(other.MapInt32Float)) return false;
+      if (!MapInt32Double.Equals(other.MapInt32Double)) return false;
+      if (!MapBoolBool.Equals(other.MapBoolBool)) return false;
+      if (!MapInt32Enum.Equals(other.MapInt32Enum)) return false;
+      if (!MapInt32ForeignMessage.Equals(other.MapInt32ForeignMessage)) return false;
+      return true;
+    }
+
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= MapInt32Int32.GetHashCode();
+      hash ^= MapInt64Int64.GetHashCode();
+      hash ^= MapUint32Uint32.GetHashCode();
+      hash ^= MapUint64Uint64.GetHashCode();
+      hash ^= MapSint32Sint32.GetHashCode();
+      hash ^= MapSint64Sint64.GetHashCode();
+      hash ^= MapFixed32Fixed32.GetHashCode();
+      hash ^= MapFixed64Fixed64.GetHashCode();
+      hash ^= MapSfixed32Sfixed32.GetHashCode();
+      hash ^= MapSfixed64Sfixed64.GetHashCode();
+      hash ^= MapInt32Float.GetHashCode();
+      hash ^= MapInt32Double.GetHashCode();
+      hash ^= MapBoolBool.GetHashCode();
+      hash ^= MapInt32Enum.GetHashCode();
+      hash ^= MapInt32ForeignMessage.GetHashCode();
+      return hash;
+    }
+
+    public void WriteTo(pb::CodedOutputStream output) {
+      mapInt32Int32_.WriteTo(output, _map_mapInt32Int32_codec);
+      mapInt64Int64_.WriteTo(output, _map_mapInt64Int64_codec);
+      mapUint32Uint32_.WriteTo(output, _map_mapUint32Uint32_codec);
+      mapUint64Uint64_.WriteTo(output, _map_mapUint64Uint64_codec);
+      mapSint32Sint32_.WriteTo(output, _map_mapSint32Sint32_codec);
+      mapSint64Sint64_.WriteTo(output, _map_mapSint64Sint64_codec);
+      mapFixed32Fixed32_.WriteTo(output, _map_mapFixed32Fixed32_codec);
+      mapFixed64Fixed64_.WriteTo(output, _map_mapFixed64Fixed64_codec);
+      mapSfixed32Sfixed32_.WriteTo(output, _map_mapSfixed32Sfixed32_codec);
+      mapSfixed64Sfixed64_.WriteTo(output, _map_mapSfixed64Sfixed64_codec);
+      mapInt32Float_.WriteTo(output, _map_mapInt32Float_codec);
+      mapInt32Double_.WriteTo(output, _map_mapInt32Double_codec);
+      mapBoolBool_.WriteTo(output, _map_mapBoolBool_codec);
+      mapInt32Enum_.WriteTo(output, _map_mapInt32Enum_codec);
+      mapInt32ForeignMessage_.WriteTo(output, _map_mapInt32ForeignMessage_codec);
+    }
+
+    public int CalculateSize() {
+      int size = 0;
+      size += mapInt32Int32_.CalculateSize(_map_mapInt32Int32_codec);
+      size += mapInt64Int64_.CalculateSize(_map_mapInt64Int64_codec);
+      size += mapUint32Uint32_.CalculateSize(_map_mapUint32Uint32_codec);
+      size += mapUint64Uint64_.CalculateSize(_map_mapUint64Uint64_codec);
+      size += mapSint32Sint32_.CalculateSize(_map_mapSint32Sint32_codec);
+      size += mapSint64Sint64_.CalculateSize(_map_mapSint64Sint64_codec);
+      size += mapFixed32Fixed32_.CalculateSize(_map_mapFixed32Fixed32_codec);
+      size += mapFixed64Fixed64_.CalculateSize(_map_mapFixed64Fixed64_codec);
+      size += mapSfixed32Sfixed32_.CalculateSize(_map_mapSfixed32Sfixed32_codec);
+      size += mapSfixed64Sfixed64_.CalculateSize(_map_mapSfixed64Sfixed64_codec);
+      size += mapInt32Float_.CalculateSize(_map_mapInt32Float_codec);
+      size += mapInt32Double_.CalculateSize(_map_mapInt32Double_codec);
+      size += mapBoolBool_.CalculateSize(_map_mapBoolBool_codec);
+      size += mapInt32Enum_.CalculateSize(_map_mapInt32Enum_codec);
+      size += mapInt32ForeignMessage_.CalculateSize(_map_mapInt32ForeignMessage_codec);
+      return size;
+    }
+
+    public void MergeFrom(TestArenaMap other) {
+      if (other == null) {
+        return;
+      }
+      mapInt32Int32_.Add(other.mapInt32Int32_);
+      mapInt64Int64_.Add(other.mapInt64Int64_);
+      mapUint32Uint32_.Add(other.mapUint32Uint32_);
+      mapUint64Uint64_.Add(other.mapUint64Uint64_);
+      mapSint32Sint32_.Add(other.mapSint32Sint32_);
+      mapSint64Sint64_.Add(other.mapSint64Sint64_);
+      mapFixed32Fixed32_.Add(other.mapFixed32Fixed32_);
+      mapFixed64Fixed64_.Add(other.mapFixed64Fixed64_);
+      mapSfixed32Sfixed32_.Add(other.mapSfixed32Sfixed32_);
+      mapSfixed64Sfixed64_.Add(other.mapSfixed64Sfixed64_);
+      mapInt32Float_.Add(other.mapInt32Float_);
+      mapInt32Double_.Add(other.mapInt32Double_);
+      mapBoolBool_.Add(other.mapBoolBool_);
+      mapInt32Enum_.Add(other.mapInt32Enum_);
+      mapInt32ForeignMessage_.Add(other.mapInt32ForeignMessage_);
+    }
+
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while (input.ReadTag(out tag)) {
+        switch(tag) {
+          case 0:
+            throw pb::InvalidProtocolBufferException.InvalidTag();
+          default:
+            if (pb::WireFormat.IsEndGroupTag(tag)) {
+              return;
+            }
+            break;
+          case 10: {
+            mapInt32Int32_.AddEntriesFrom(input, _map_mapInt32Int32_codec);
+            break;
+          }
+          case 18: {
+            mapInt64Int64_.AddEntriesFrom(input, _map_mapInt64Int64_codec);
+            break;
+          }
+          case 26: {
+            mapUint32Uint32_.AddEntriesFrom(input, _map_mapUint32Uint32_codec);
+            break;
+          }
+          case 34: {
+            mapUint64Uint64_.AddEntriesFrom(input, _map_mapUint64Uint64_codec);
+            break;
+          }
+          case 42: {
+            mapSint32Sint32_.AddEntriesFrom(input, _map_mapSint32Sint32_codec);
+            break;
+          }
+          case 50: {
+            mapSint64Sint64_.AddEntriesFrom(input, _map_mapSint64Sint64_codec);
+            break;
+          }
+          case 58: {
+            mapFixed32Fixed32_.AddEntriesFrom(input, _map_mapFixed32Fixed32_codec);
+            break;
+          }
+          case 66: {
+            mapFixed64Fixed64_.AddEntriesFrom(input, _map_mapFixed64Fixed64_codec);
+            break;
+          }
+          case 74: {
+            mapSfixed32Sfixed32_.AddEntriesFrom(input, _map_mapSfixed32Sfixed32_codec);
+            break;
+          }
+          case 82: {
+            mapSfixed64Sfixed64_.AddEntriesFrom(input, _map_mapSfixed64Sfixed64_codec);
+            break;
+          }
+          case 90: {
+            mapInt32Float_.AddEntriesFrom(input, _map_mapInt32Float_codec);
+            break;
+          }
+          case 98: {
+            mapInt32Double_.AddEntriesFrom(input, _map_mapInt32Double_codec);
+            break;
+          }
+          case 106: {
+            mapBoolBool_.AddEntriesFrom(input, _map_mapBoolBool_codec);
+            break;
+          }
+          case 114: {
+            mapInt32Enum_.AddEntriesFrom(input, _map_mapInt32Enum_codec);
+            break;
+          }
+          case 122: {
+            mapInt32ForeignMessage_.AddEntriesFrom(input, _map_mapInt32ForeignMessage_codec);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public static partial class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapInt32Int32Entry : pb::IMessage<MapInt32Int32Entry> {
+        private static readonly pb::MessageParser<MapInt32Int32Entry> _parser = new pb::MessageParser<MapInt32Int32Entry>(() => new MapInt32Int32Entry());
+        public static pb::MessageParser<MapInt32Int32Entry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapInt32Int32Entry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapInt32Int32Entry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapInt32Int32Entry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapInt32Int32Entry() { }
+
+        public MapInt32Int32Entry(MapInt32Int32Entry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public MapInt32Int32Entry Clone() {
+          return new MapInt32Int32Entry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private int key_;
+        public int Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private int value_;
+        public int Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapInt32Int32Entry);
+        }
+
+        public bool Equals(MapInt32Int32Entry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0) hash ^= Key.GetHashCode();
+          if (Value != 0) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0) {
+            output.WriteRawTag(8);
+            output.WriteInt32(Key);
+          }
+          if (Value != 0) {
+            output.WriteRawTag(16);
+            output.WriteInt32(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
+          }
+          if (Value != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Value);
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapInt32Int32Entry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0) {
+            Key = other.Key;
+          }
+          if (other.Value != 0) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 8: {
+                Key = input.ReadInt32();
+                break;
+              }
+              case 16: {
+                Value = input.ReadInt32();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapInt64Int64Entry : pb::IMessage<MapInt64Int64Entry> {
+        private static readonly pb::MessageParser<MapInt64Int64Entry> _parser = new pb::MessageParser<MapInt64Int64Entry>(() => new MapInt64Int64Entry());
+        public static pb::MessageParser<MapInt64Int64Entry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapInt64Int64Entry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapInt64Int64Entry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapInt64Int64Entry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapInt64Int64Entry() { }
+
+        public MapInt64Int64Entry(MapInt64Int64Entry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public MapInt64Int64Entry Clone() {
+          return new MapInt64Int64Entry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private long key_;
+        public long Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private long value_;
+        public long Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapInt64Int64Entry);
+        }
+
+        public bool Equals(MapInt64Int64Entry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0L) hash ^= Key.GetHashCode();
+          if (Value != 0L) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0L) {
+            output.WriteRawTag(8);
+            output.WriteInt64(Key);
+          }
+          if (Value != 0L) {
+            output.WriteRawTag(16);
+            output.WriteInt64(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0L) {
+            size += 1 + pb::CodedOutputStream.ComputeInt64Size(Key);
+          }
+          if (Value != 0L) {
+            size += 1 + pb::CodedOutputStream.ComputeInt64Size(Value);
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapInt64Int64Entry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0L) {
+            Key = other.Key;
+          }
+          if (other.Value != 0L) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 8: {
+                Key = input.ReadInt64();
+                break;
+              }
+              case 16: {
+                Value = input.ReadInt64();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapUint32Uint32Entry : pb::IMessage<MapUint32Uint32Entry> {
+        private static readonly pb::MessageParser<MapUint32Uint32Entry> _parser = new pb::MessageParser<MapUint32Uint32Entry>(() => new MapUint32Uint32Entry());
+        public static pb::MessageParser<MapUint32Uint32Entry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapUint32Uint32Entry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapUint32Uint32Entry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapUint32Uint32Entry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapUint32Uint32Entry() { }
+
+        public MapUint32Uint32Entry(MapUint32Uint32Entry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public MapUint32Uint32Entry Clone() {
+          return new MapUint32Uint32Entry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private uint key_;
+        public uint Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private uint value_;
+        public uint Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapUint32Uint32Entry);
+        }
+
+        public bool Equals(MapUint32Uint32Entry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0) hash ^= Key.GetHashCode();
+          if (Value != 0) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0) {
+            output.WriteRawTag(8);
+            output.WriteUInt32(Key);
+          }
+          if (Value != 0) {
+            output.WriteRawTag(16);
+            output.WriteUInt32(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeUInt32Size(Key);
+          }
+          if (Value != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeUInt32Size(Value);
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapUint32Uint32Entry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0) {
+            Key = other.Key;
+          }
+          if (other.Value != 0) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 8: {
+                Key = input.ReadUInt32();
+                break;
+              }
+              case 16: {
+                Value = input.ReadUInt32();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapUint64Uint64Entry : pb::IMessage<MapUint64Uint64Entry> {
+        private static readonly pb::MessageParser<MapUint64Uint64Entry> _parser = new pb::MessageParser<MapUint64Uint64Entry>(() => new MapUint64Uint64Entry());
+        public static pb::MessageParser<MapUint64Uint64Entry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapUint64Uint64Entry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapUint64Uint64Entry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapUint64Uint64Entry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapUint64Uint64Entry() { }
+
+        public MapUint64Uint64Entry(MapUint64Uint64Entry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public MapUint64Uint64Entry Clone() {
+          return new MapUint64Uint64Entry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private ulong key_;
+        public ulong Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private ulong value_;
+        public ulong Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapUint64Uint64Entry);
+        }
+
+        public bool Equals(MapUint64Uint64Entry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0UL) hash ^= Key.GetHashCode();
+          if (Value != 0UL) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0UL) {
+            output.WriteRawTag(8);
+            output.WriteUInt64(Key);
+          }
+          if (Value != 0UL) {
+            output.WriteRawTag(16);
+            output.WriteUInt64(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0UL) {
+            size += 1 + pb::CodedOutputStream.ComputeUInt64Size(Key);
+          }
+          if (Value != 0UL) {
+            size += 1 + pb::CodedOutputStream.ComputeUInt64Size(Value);
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapUint64Uint64Entry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0UL) {
+            Key = other.Key;
+          }
+          if (other.Value != 0UL) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 8: {
+                Key = input.ReadUInt64();
+                break;
+              }
+              case 16: {
+                Value = input.ReadUInt64();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapSint32Sint32Entry : pb::IMessage<MapSint32Sint32Entry> {
+        private static readonly pb::MessageParser<MapSint32Sint32Entry> _parser = new pb::MessageParser<MapSint32Sint32Entry>(() => new MapSint32Sint32Entry());
+        public static pb::MessageParser<MapSint32Sint32Entry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapSint32Sint32Entry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapSint32Sint32Entry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapSint32Sint32Entry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapSint32Sint32Entry() { }
+
+        public MapSint32Sint32Entry(MapSint32Sint32Entry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public MapSint32Sint32Entry Clone() {
+          return new MapSint32Sint32Entry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private int key_;
+        public int Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private int value_;
+        public int Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapSint32Sint32Entry);
+        }
+
+        public bool Equals(MapSint32Sint32Entry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0) hash ^= Key.GetHashCode();
+          if (Value != 0) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0) {
+            output.WriteRawTag(8);
+            output.WriteSInt32(Key);
+          }
+          if (Value != 0) {
+            output.WriteRawTag(16);
+            output.WriteSInt32(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeSInt32Size(Key);
+          }
+          if (Value != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeSInt32Size(Value);
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapSint32Sint32Entry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0) {
+            Key = other.Key;
+          }
+          if (other.Value != 0) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 8: {
+                Key = input.ReadSInt32();
+                break;
+              }
+              case 16: {
+                Value = input.ReadSInt32();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapSint64Sint64Entry : pb::IMessage<MapSint64Sint64Entry> {
+        private static readonly pb::MessageParser<MapSint64Sint64Entry> _parser = new pb::MessageParser<MapSint64Sint64Entry>(() => new MapSint64Sint64Entry());
+        public static pb::MessageParser<MapSint64Sint64Entry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapSint64Sint64Entry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapSint64Sint64Entry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapSint64Sint64Entry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapSint64Sint64Entry() { }
+
+        public MapSint64Sint64Entry(MapSint64Sint64Entry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public MapSint64Sint64Entry Clone() {
+          return new MapSint64Sint64Entry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private long key_;
+        public long Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private long value_;
+        public long Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapSint64Sint64Entry);
+        }
+
+        public bool Equals(MapSint64Sint64Entry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0L) hash ^= Key.GetHashCode();
+          if (Value != 0L) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0L) {
+            output.WriteRawTag(8);
+            output.WriteSInt64(Key);
+          }
+          if (Value != 0L) {
+            output.WriteRawTag(16);
+            output.WriteSInt64(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0L) {
+            size += 1 + pb::CodedOutputStream.ComputeSInt64Size(Key);
+          }
+          if (Value != 0L) {
+            size += 1 + pb::CodedOutputStream.ComputeSInt64Size(Value);
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapSint64Sint64Entry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0L) {
+            Key = other.Key;
+          }
+          if (other.Value != 0L) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 8: {
+                Key = input.ReadSInt64();
+                break;
+              }
+              case 16: {
+                Value = input.ReadSInt64();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapFixed32Fixed32Entry : pb::IMessage<MapFixed32Fixed32Entry> {
+        private static readonly pb::MessageParser<MapFixed32Fixed32Entry> _parser = new pb::MessageParser<MapFixed32Fixed32Entry>(() => new MapFixed32Fixed32Entry());
+        public static pb::MessageParser<MapFixed32Fixed32Entry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 13, 21 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapFixed32Fixed32Entry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapFixed32Fixed32Entry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapFixed32Fixed32Entry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapFixed32Fixed32Entry() { }
+
+        public MapFixed32Fixed32Entry(MapFixed32Fixed32Entry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public MapFixed32Fixed32Entry Clone() {
+          return new MapFixed32Fixed32Entry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private uint key_;
+        public uint Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private uint value_;
+        public uint Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapFixed32Fixed32Entry);
+        }
+
+        public bool Equals(MapFixed32Fixed32Entry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0) hash ^= Key.GetHashCode();
+          if (Value != 0) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0) {
+            output.WriteRawTag(13);
+            output.WriteFixed32(Key);
+          }
+          if (Value != 0) {
+            output.WriteRawTag(21);
+            output.WriteFixed32(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0) {
+            size += 1 + 4;
+          }
+          if (Value != 0) {
+            size += 1 + 4;
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapFixed32Fixed32Entry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0) {
+            Key = other.Key;
+          }
+          if (other.Value != 0) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 13: {
+                Key = input.ReadFixed32();
+                break;
+              }
+              case 21: {
+                Value = input.ReadFixed32();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapFixed64Fixed64Entry : pb::IMessage<MapFixed64Fixed64Entry> {
+        private static readonly pb::MessageParser<MapFixed64Fixed64Entry> _parser = new pb::MessageParser<MapFixed64Fixed64Entry>(() => new MapFixed64Fixed64Entry());
+        public static pb::MessageParser<MapFixed64Fixed64Entry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 9, 17 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapFixed64Fixed64Entry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapFixed64Fixed64Entry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapFixed64Fixed64Entry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapFixed64Fixed64Entry() { }
+
+        public MapFixed64Fixed64Entry(MapFixed64Fixed64Entry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public MapFixed64Fixed64Entry Clone() {
+          return new MapFixed64Fixed64Entry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private ulong key_;
+        public ulong Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private ulong value_;
+        public ulong Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapFixed64Fixed64Entry);
+        }
+
+        public bool Equals(MapFixed64Fixed64Entry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0UL) hash ^= Key.GetHashCode();
+          if (Value != 0UL) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0UL) {
+            output.WriteRawTag(9);
+            output.WriteFixed64(Key);
+          }
+          if (Value != 0UL) {
+            output.WriteRawTag(17);
+            output.WriteFixed64(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0UL) {
+            size += 1 + 8;
+          }
+          if (Value != 0UL) {
+            size += 1 + 8;
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapFixed64Fixed64Entry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0UL) {
+            Key = other.Key;
+          }
+          if (other.Value != 0UL) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 9: {
+                Key = input.ReadFixed64();
+                break;
+              }
+              case 17: {
+                Value = input.ReadFixed64();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapSfixed32Sfixed32Entry : pb::IMessage<MapSfixed32Sfixed32Entry> {
+        private static readonly pb::MessageParser<MapSfixed32Sfixed32Entry> _parser = new pb::MessageParser<MapSfixed32Sfixed32Entry>(() => new MapSfixed32Sfixed32Entry());
+        public static pb::MessageParser<MapSfixed32Sfixed32Entry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 13, 21 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapSfixed32Sfixed32Entry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapSfixed32Sfixed32Entry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapSfixed32Sfixed32Entry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapSfixed32Sfixed32Entry() { }
+
+        public MapSfixed32Sfixed32Entry(MapSfixed32Sfixed32Entry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public MapSfixed32Sfixed32Entry Clone() {
+          return new MapSfixed32Sfixed32Entry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private int key_;
+        public int Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private int value_;
+        public int Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapSfixed32Sfixed32Entry);
+        }
+
+        public bool Equals(MapSfixed32Sfixed32Entry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0) hash ^= Key.GetHashCode();
+          if (Value != 0) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0) {
+            output.WriteRawTag(13);
+            output.WriteSFixed32(Key);
+          }
+          if (Value != 0) {
+            output.WriteRawTag(21);
+            output.WriteSFixed32(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0) {
+            size += 1 + 4;
+          }
+          if (Value != 0) {
+            size += 1 + 4;
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapSfixed32Sfixed32Entry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0) {
+            Key = other.Key;
+          }
+          if (other.Value != 0) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 13: {
+                Key = input.ReadSFixed32();
+                break;
+              }
+              case 21: {
+                Value = input.ReadSFixed32();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapSfixed64Sfixed64Entry : pb::IMessage<MapSfixed64Sfixed64Entry> {
+        private static readonly pb::MessageParser<MapSfixed64Sfixed64Entry> _parser = new pb::MessageParser<MapSfixed64Sfixed64Entry>(() => new MapSfixed64Sfixed64Entry());
+        public static pb::MessageParser<MapSfixed64Sfixed64Entry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 9, 17 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapSfixed64Sfixed64Entry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapSfixed64Sfixed64Entry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapSfixed64Sfixed64Entry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapSfixed64Sfixed64Entry() { }
+
+        public MapSfixed64Sfixed64Entry(MapSfixed64Sfixed64Entry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public MapSfixed64Sfixed64Entry Clone() {
+          return new MapSfixed64Sfixed64Entry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private long key_;
+        public long Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private long value_;
+        public long Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapSfixed64Sfixed64Entry);
+        }
+
+        public bool Equals(MapSfixed64Sfixed64Entry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0L) hash ^= Key.GetHashCode();
+          if (Value != 0L) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0L) {
+            output.WriteRawTag(9);
+            output.WriteSFixed64(Key);
+          }
+          if (Value != 0L) {
+            output.WriteRawTag(17);
+            output.WriteSFixed64(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0L) {
+            size += 1 + 8;
+          }
+          if (Value != 0L) {
+            size += 1 + 8;
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapSfixed64Sfixed64Entry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0L) {
+            Key = other.Key;
+          }
+          if (other.Value != 0L) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 9: {
+                Key = input.ReadSFixed64();
+                break;
+              }
+              case 17: {
+                Value = input.ReadSFixed64();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapInt32FloatEntry : pb::IMessage<MapInt32FloatEntry> {
+        private static readonly pb::MessageParser<MapInt32FloatEntry> _parser = new pb::MessageParser<MapInt32FloatEntry>(() => new MapInt32FloatEntry());
+        public static pb::MessageParser<MapInt32FloatEntry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 8, 21 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapInt32FloatEntry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapInt32FloatEntry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapInt32FloatEntry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapInt32FloatEntry() { }
+
+        public MapInt32FloatEntry(MapInt32FloatEntry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public MapInt32FloatEntry Clone() {
+          return new MapInt32FloatEntry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private int key_;
+        public int Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private float value_;
+        public float Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapInt32FloatEntry);
+        }
+
+        public bool Equals(MapInt32FloatEntry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0) hash ^= Key.GetHashCode();
+          if (Value != 0F) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0) {
+            output.WriteRawTag(8);
+            output.WriteInt32(Key);
+          }
+          if (Value != 0F) {
+            output.WriteRawTag(21);
+            output.WriteFloat(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
+          }
+          if (Value != 0F) {
+            size += 1 + 4;
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapInt32FloatEntry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0) {
+            Key = other.Key;
+          }
+          if (other.Value != 0F) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 8: {
+                Key = input.ReadInt32();
+                break;
+              }
+              case 21: {
+                Value = input.ReadFloat();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapInt32DoubleEntry : pb::IMessage<MapInt32DoubleEntry> {
+        private static readonly pb::MessageParser<MapInt32DoubleEntry> _parser = new pb::MessageParser<MapInt32DoubleEntry>(() => new MapInt32DoubleEntry());
+        public static pb::MessageParser<MapInt32DoubleEntry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 8, 17 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapInt32DoubleEntry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapInt32DoubleEntry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapInt32DoubleEntry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapInt32DoubleEntry() { }
+
+        public MapInt32DoubleEntry(MapInt32DoubleEntry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public MapInt32DoubleEntry Clone() {
+          return new MapInt32DoubleEntry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private int key_;
+        public int Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private double value_;
+        public double Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapInt32DoubleEntry);
+        }
+
+        public bool Equals(MapInt32DoubleEntry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0) hash ^= Key.GetHashCode();
+          if (Value != 0D) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0) {
+            output.WriteRawTag(8);
+            output.WriteInt32(Key);
+          }
+          if (Value != 0D) {
+            output.WriteRawTag(17);
+            output.WriteDouble(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
+          }
+          if (Value != 0D) {
+            size += 1 + 8;
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapInt32DoubleEntry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0) {
+            Key = other.Key;
+          }
+          if (other.Value != 0D) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 8: {
+                Key = input.ReadInt32();
+                break;
+              }
+              case 17: {
+                Value = input.ReadDouble();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapBoolBoolEntry : pb::IMessage<MapBoolBoolEntry> {
+        private static readonly pb::MessageParser<MapBoolBoolEntry> _parser = new pb::MessageParser<MapBoolBoolEntry>(() => new MapBoolBoolEntry());
+        public static pb::MessageParser<MapBoolBoolEntry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapBoolBoolEntry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapBoolBoolEntry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapBoolBoolEntry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapBoolBoolEntry() { }
+
+        public MapBoolBoolEntry(MapBoolBoolEntry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public MapBoolBoolEntry Clone() {
+          return new MapBoolBoolEntry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private bool key_;
+        public bool Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private bool value_;
+        public bool Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapBoolBoolEntry);
+        }
+
+        public bool Equals(MapBoolBoolEntry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != false) hash ^= Key.GetHashCode();
+          if (Value != false) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != false) {
+            output.WriteRawTag(8);
+            output.WriteBool(Key);
+          }
+          if (Value != false) {
+            output.WriteRawTag(16);
+            output.WriteBool(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != false) {
+            size += 1 + 1;
+          }
+          if (Value != false) {
+            size += 1 + 1;
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapBoolBoolEntry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != false) {
+            Key = other.Key;
+          }
+          if (other.Value != false) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 8: {
+                Key = input.ReadBool();
+                break;
+              }
+              case 16: {
+                Value = input.ReadBool();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapInt32EnumEntry : pb::IMessage<MapInt32EnumEntry> {
+        private static readonly pb::MessageParser<MapInt32EnumEntry> _parser = new pb::MessageParser<MapInt32EnumEntry>(() => new MapInt32EnumEntry());
+        public static pb::MessageParser<MapInt32EnumEntry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapInt32EnumEntry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapInt32EnumEntry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapInt32EnumEntry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapInt32EnumEntry() { }
+
+        public MapInt32EnumEntry(MapInt32EnumEntry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public MapInt32EnumEntry Clone() {
+          return new MapInt32EnumEntry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private int key_;
+        public int Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private global::Google.Protobuf.TestProtos.MapEnum value_ = global::Google.Protobuf.TestProtos.MapEnum.MAP_ENUM_FOO;
+        public global::Google.Protobuf.TestProtos.MapEnum Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapInt32EnumEntry);
+        }
+
+        public bool Equals(MapInt32EnumEntry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0) hash ^= Key.GetHashCode();
+          if (Value != global::Google.Protobuf.TestProtos.MapEnum.MAP_ENUM_FOO) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0) {
+            output.WriteRawTag(8);
+            output.WriteInt32(Key);
+          }
+          if (Value != global::Google.Protobuf.TestProtos.MapEnum.MAP_ENUM_FOO) {
+            output.WriteRawTag(16);
+            output.WriteEnum((int) Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
+          }
+          if (Value != global::Google.Protobuf.TestProtos.MapEnum.MAP_ENUM_FOO) {
+            size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Value);
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapInt32EnumEntry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0) {
+            Key = other.Key;
+          }
+          if (other.Value != global::Google.Protobuf.TestProtos.MapEnum.MAP_ENUM_FOO) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 8: {
+                Key = input.ReadInt32();
+                break;
+              }
+              case 16: {
+                value_ = (global::Google.Protobuf.TestProtos.MapEnum) input.ReadEnum();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class MapInt32ForeignMessageEntry : pb::IMessage<MapInt32ForeignMessageEntry> {
+        private static readonly pb::MessageParser<MapInt32ForeignMessageEntry> _parser = new pb::MessageParser<MapInt32ForeignMessageEntry>(() => new MapInt32ForeignMessageEntry());
+        public static pb::MessageParser<MapInt32ForeignMessageEntry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 8, 18 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapInt32ForeignMessageEntry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<MapInt32ForeignMessageEntry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_TestArenaMap_MapInt32ForeignMessageEntry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public MapInt32ForeignMessageEntry() { }
+
+        public MapInt32ForeignMessageEntry(MapInt32ForeignMessageEntry other) {
+          key_ = other.key_;
+          Value = other.value_ != null ? other.Value.Clone() : null;
+        }
+
+        public MapInt32ForeignMessageEntry Clone() {
+          return new MapInt32ForeignMessageEntry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+          if (value_ != null) Value.Freeze();
+        }
+
+        public const int KeyFieldNumber = 1;
+        private int key_;
+        public int Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private global::Google.Protobuf.TestProtos.ForeignMessage value_;
+        public global::Google.Protobuf.TestProtos.ForeignMessage Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as MapInt32ForeignMessageEntry);
+        }
+
+        public bool Equals(MapInt32ForeignMessageEntry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (!object.Equals(Value, other.Value)) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0) hash ^= Key.GetHashCode();
+          if (value_ != null) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0) {
+            output.WriteRawTag(8);
+            output.WriteInt32(Key);
+          }
+          if (value_ != null) {
+            output.WriteRawTag(18);
+            output.WriteMessage(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
+          }
+          if (value_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(Value);
+          }
+          return size;
+        }
+
+        public void MergeFrom(MapInt32ForeignMessageEntry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0) {
+            Key = other.Key;
+          }
+          if (other.value_ != null) {
+            if (value_ == null) {
+              value_ = new global::Google.Protobuf.TestProtos.ForeignMessage();
+            }
+            Value.MergeFrom(other.Value);
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 8: {
+                Key = input.ReadInt32();
+                break;
+              }
+              case 18: {
+                if (value_ == null) {
+                  value_ = new global::Google.Protobuf.TestProtos.ForeignMessage();
+                }
+                input.ReadMessage(value_);
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+    }
+    #endregion
+
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class MessageContainingEnumCalledType : pb::IMessage<MessageContainingEnumCalledType> {
+    private static readonly pb::MessageParser<MessageContainingEnumCalledType> _parser = new pb::MessageParser<MessageContainingEnumCalledType>(() => new MessageContainingEnumCalledType());
+    public static pb::MessageParser<MessageContainingEnumCalledType> Parser { get { return _parser; } }
+
+    private static readonly string[] _fieldNames = new string[] { "type" };
+    private static readonly uint[] _fieldTags = new uint[] { 10 };
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_MessageContainingEnumCalledType__Descriptor; }
+    }
+
+    public pb::FieldAccess.FieldAccessorTable<MessageContainingEnumCalledType> Fields {
+      get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_MessageContainingEnumCalledType__FieldAccessorTable; }
+    }
+
+    private bool _frozen = false;
+    public bool IsFrozen { get { return _frozen; } }
+
+    public MessageContainingEnumCalledType() { }
+
+    public MessageContainingEnumCalledType(MessageContainingEnumCalledType other) {
+      type_ = other.type_.Clone();
+    }
+
+    public MessageContainingEnumCalledType Clone() {
+      return new MessageContainingEnumCalledType(this);
+    }
+
+    public void Freeze() {
+      if (IsFrozen) {
+        return;
+      }
+      _frozen = true;
+      type_.Freeze();
+    }
+
+    public const int TypeFieldNumber = 1;
+    private static readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType>.Codec _map_type_codec
+        = new pbc::MapField<int, global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForMessage(18, global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType.Parser), 10);
+    private readonly pbc::MapField<int, global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType> type_ = new pbc::MapField<int, global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType>();
+    public pbc::MapField<int, global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType> Type {
+      get { return type_; }
+    }
+
+    public override bool Equals(object other) {
+      return Equals(other as MessageContainingEnumCalledType);
+    }
+
+    public bool Equals(MessageContainingEnumCalledType other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!Type.Equals(other.Type)) return false;
+      return true;
+    }
+
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= Type.GetHashCode();
+      return hash;
+    }
+
+    public void WriteTo(pb::CodedOutputStream output) {
+      type_.WriteTo(output, _map_type_codec);
+    }
+
+    public int CalculateSize() {
+      int size = 0;
+      size += type_.CalculateSize(_map_type_codec);
+      return size;
+    }
+
+    public void MergeFrom(MessageContainingEnumCalledType other) {
+      if (other == null) {
+        return;
+      }
+      type_.Add(other.type_);
+    }
+
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while (input.ReadTag(out tag)) {
+        switch(tag) {
+          case 0:
+            throw pb::InvalidProtocolBufferException.InvalidTag();
+          default:
+            if (pb::WireFormat.IsEndGroupTag(tag)) {
+              return;
+            }
+            break;
+          case 10: {
+            type_.AddEntriesFrom(input, _map_type_codec);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public static partial class Types {
+      public enum Type {
+        TYPE_FOO = 0,
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class TypeEntry : pb::IMessage<TypeEntry> {
+        private static readonly pb::MessageParser<TypeEntry> _parser = new pb::MessageParser<TypeEntry>(() => new TypeEntry());
+        public static pb::MessageParser<TypeEntry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 8, 18 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_MessageContainingEnumCalledType_TypeEntry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<TypeEntry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_MessageContainingEnumCalledType_TypeEntry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public TypeEntry() { }
+
+        public TypeEntry(TypeEntry other) {
+          key_ = other.key_;
+          Value = other.value_ != null ? other.Value.Clone() : null;
+        }
+
+        public TypeEntry Clone() {
+          return new TypeEntry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+          if (value_ != null) Value.Freeze();
+        }
+
+        public const int KeyFieldNumber = 1;
+        private int key_;
+        public int Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType value_;
+        public global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as TypeEntry);
+        }
+
+        public bool Equals(TypeEntry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (!object.Equals(Value, other.Value)) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0) hash ^= Key.GetHashCode();
+          if (value_ != null) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0) {
+            output.WriteRawTag(8);
+            output.WriteInt32(Key);
+          }
+          if (value_ != null) {
+            output.WriteRawTag(18);
+            output.WriteMessage(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
+          }
+          if (value_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(Value);
+          }
+          return size;
+        }
+
+        public void MergeFrom(TypeEntry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0) {
+            Key = other.Key;
+          }
+          if (other.value_ != null) {
+            if (value_ == null) {
+              value_ = new global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType();
+            }
+            Value.MergeFrom(other.Value);
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 8: {
+                Key = input.ReadInt32();
+                break;
+              }
+              case 18: {
+                if (value_ == null) {
+                  value_ = new global::Google.Protobuf.TestProtos.MessageContainingEnumCalledType();
+                }
+                input.ReadMessage(value_);
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+    }
+    #endregion
+
+  }
+
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class MessageContainingMapCalledEntry : pb::IMessage<MessageContainingMapCalledEntry> {
+    private static readonly pb::MessageParser<MessageContainingMapCalledEntry> _parser = new pb::MessageParser<MessageContainingMapCalledEntry>(() => new MessageContainingMapCalledEntry());
+    public static pb::MessageParser<MessageContainingMapCalledEntry> Parser { get { return _parser; } }
+
+    private static readonly string[] _fieldNames = new string[] { "entry" };
+    private static readonly uint[] _fieldTags = new uint[] { 10 };
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_MessageContainingMapCalledEntry__Descriptor; }
+    }
+
+    public pb::FieldAccess.FieldAccessorTable<MessageContainingMapCalledEntry> Fields {
+      get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_MessageContainingMapCalledEntry__FieldAccessorTable; }
+    }
+
+    private bool _frozen = false;
+    public bool IsFrozen { get { return _frozen; } }
+
+    public MessageContainingMapCalledEntry() { }
+
+    public MessageContainingMapCalledEntry(MessageContainingMapCalledEntry other) {
+      entry_ = other.entry_.Clone();
+    }
+
+    public MessageContainingMapCalledEntry Clone() {
+      return new MessageContainingMapCalledEntry(this);
+    }
+
+    public void Freeze() {
+      if (IsFrozen) {
+        return;
+      }
+      _frozen = true;
+      entry_.Freeze();
+    }
+
+    public const int EntryFieldNumber = 1;
+    private static readonly pbc::MapField<int, int>.Codec _map_entry_codec
+        = new pbc::MapField<int, int>.Codec(pb::FieldCodec.ForInt32(8), pb::FieldCodec.ForInt32(16), 10);
+    private readonly pbc::MapField<int, int> entry_ = new pbc::MapField<int, int>();
+    public pbc::MapField<int, int> Entry {
+      get { return entry_; }
+    }
+
+    public override bool Equals(object other) {
+      return Equals(other as MessageContainingMapCalledEntry);
+    }
+
+    public bool Equals(MessageContainingMapCalledEntry other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!Entry.Equals(other.Entry)) return false;
+      return true;
+    }
+
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= Entry.GetHashCode();
+      return hash;
+    }
+
+    public void WriteTo(pb::CodedOutputStream output) {
+      entry_.WriteTo(output, _map_entry_codec);
+    }
+
+    public int CalculateSize() {
+      int size = 0;
+      size += entry_.CalculateSize(_map_entry_codec);
+      return size;
+    }
+
+    public void MergeFrom(MessageContainingMapCalledEntry other) {
+      if (other == null) {
+        return;
+      }
+      entry_.Add(other.entry_);
+    }
+
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while (input.ReadTag(out tag)) {
+        switch(tag) {
+          case 0:
+            throw pb::InvalidProtocolBufferException.InvalidTag();
+          default:
+            if (pb::WireFormat.IsEndGroupTag(tag)) {
+              return;
+            }
+            break;
+          case 10: {
+            entry_.AddEntriesFrom(input, _map_entry_codec);
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public static partial class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class EntryEntry : pb::IMessage<EntryEntry> {
+        private static readonly pb::MessageParser<EntryEntry> _parser = new pb::MessageParser<EntryEntry>(() => new EntryEntry());
+        public static pb::MessageParser<EntryEntry> Parser { get { return _parser; } }
+
+        private static readonly string[] _fieldNames = new string[] { "key", "value" };
+        private static readonly uint[] _fieldTags = new uint[] { 8, 16 };
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_MessageContainingMapCalledEntry_EntryEntry__Descriptor; }
+        }
+
+        public pb::FieldAccess.FieldAccessorTable<EntryEntry> Fields {
+          get { return global::Google.Protobuf.TestProtos.MapUnittestProto3.internal__static_protobuf_unittest_MessageContainingMapCalledEntry_EntryEntry__FieldAccessorTable; }
+        }
+
+        private bool _frozen = false;
+        public bool IsFrozen { get { return _frozen; } }
+
+        public EntryEntry() { }
+
+        public EntryEntry(EntryEntry other) {
+          key_ = other.key_;
+          value_ = other.value_;
+        }
+
+        public EntryEntry Clone() {
+          return new EntryEntry(this);
+        }
+
+        public void Freeze() {
+          if (IsFrozen) {
+            return;
+          }
+          _frozen = true;
+        }
+
+        public const int KeyFieldNumber = 1;
+        private int key_;
+        public int Key {
+          get { return key_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            key_ = value;
+          }
+        }
+
+        public const int ValueFieldNumber = 2;
+        private int value_;
+        public int Value {
+          get { return value_; }
+          set {
+            pb::Freezable.CheckMutable(this);
+            value_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as EntryEntry);
+        }
+
+        public bool Equals(EntryEntry other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Key != other.Key) return false;
+          if (Value != other.Value) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Key != 0) hash ^= Key.GetHashCode();
+          if (Value != 0) hash ^= Value.GetHashCode();
+          return hash;
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Key != 0) {
+            output.WriteRawTag(8);
+            output.WriteInt32(Key);
+          }
+          if (Value != 0) {
+            output.WriteRawTag(16);
+            output.WriteInt32(Value);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Key != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Key);
+          }
+          if (Value != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Value);
+          }
+          return size;
+        }
+
+        public void MergeFrom(EntryEntry other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Key != 0) {
+            Key = other.Key;
+          }
+          if (other.Value != 0) {
+            Value = other.Value;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while (input.ReadTag(out tag)) {
+            switch(tag) {
+              case 0:
+                throw pb::InvalidProtocolBufferException.InvalidTag();
+              default:
+                if (pb::WireFormat.IsEndGroupTag(tag)) {
+                  return;
+                }
+                break;
+              case 8: {
+                Key = input.ReadInt32();
+                break;
+              }
+              case 16: {
+                Value = input.ReadInt32();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code

+ 1 - 1
csharp/src/ProtocolBuffers.Test/TestProtos/UnittestImportProto3.cs

@@ -120,7 +120,7 @@ namespace Google.Protobuf.TestProtos {
     }
 
     public override int GetHashCode() {
-      int hash = 17;
+      int hash = 1;
       if (D != 0) hash ^= D.GetHashCode();
       return hash;
     }

+ 1 - 1
csharp/src/ProtocolBuffers.Test/TestProtos/UnittestImportPublicProto3.cs

@@ -105,7 +105,7 @@ namespace Google.Protobuf.TestProtos {
     }
 
     public override int GetHashCode() {
-      int hash = 17;
+      int hash = 1;
       if (E != 0) hash ^= E.GetHashCode();
       return hash;
     }

+ 4 - 4
csharp/src/ProtocolBuffers.Test/TestProtos/UnittestIssues.cs

@@ -168,7 +168,7 @@ namespace UnitTest.Issues.TestProtos {
     }
 
     public override int GetHashCode() {
-      int hash = 17;
+      int hash = 1;
       if (Value != global::UnitTest.Issues.TestProtos.NegativeEnum.NEGATIVE_ENUM_ZERO) hash ^= Value.GetHashCode();
       hash ^= values_.GetHashCode();
       hash ^= packedValues_.GetHashCode();
@@ -304,7 +304,7 @@ namespace UnitTest.Issues.TestProtos {
     }
 
     public override int GetHashCode() {
-      int hash = 17;
+      int hash = 1;
       return hash;
     }
 
@@ -458,7 +458,7 @@ namespace UnitTest.Issues.TestProtos {
     }
 
     public override int GetHashCode() {
-      int hash = 17;
+      int hash = 1;
       if (PrimitiveValue != 0) hash ^= PrimitiveValue.GetHashCode();
       hash ^= primitiveArray_.GetHashCode();
       if (messageValue_ != null) hash ^= MessageValue.GetHashCode();
@@ -658,7 +658,7 @@ namespace UnitTest.Issues.TestProtos {
     }
 
     public override int GetHashCode() {
-      int hash = 17;
+      int hash = 1;
       if (Item != 0) hash ^= Item.GetHashCode();
       return hash;
     }

File diff suppressed because it is too large
+ 111 - 619
csharp/src/ProtocolBuffers.Test/TestProtos/UnittestProto3.cs


+ 22 - 22
csharp/src/ProtocolBuffers/DescriptorProtos/DescriptorProtoFile.cs

@@ -335,7 +335,7 @@ namespace Google.Protobuf.DescriptorProtos {
     }
 
     public override int GetHashCode() {
-      int hash = 17;
+      int hash = 1;
       hash ^= file_.GetHashCode();
       return hash;
     }
@@ -559,7 +559,7 @@ namespace Google.Protobuf.DescriptorProtos {
     }
 
     public override int GetHashCode() {
-      int hash = 17;
+      int hash = 1;
       if (Name.Length != 0) hash ^= Name.GetHashCode();
       if (Package.Length != 0) hash ^= Package.GetHashCode();
       hash ^= dependency_.GetHashCode();
@@ -940,7 +940,7 @@ namespace Google.Protobuf.DescriptorProtos {
     }
 
     public override int GetHashCode() {
-      int hash = 17;
+      int hash = 1;
       if (Name.Length != 0) hash ^= Name.GetHashCode();
       hash ^= field_.GetHashCode();
       hash ^= extension_.GetHashCode();
@@ -1207,7 +1207,7 @@ namespace Google.Protobuf.DescriptorProtos {
         }
 
         public override int GetHashCode() {
-          int hash = 17;
+          int hash = 1;
           if (Start != 0) hash ^= Start.GetHashCode();
           if (End != 0) hash ^= End.GetHashCode();
           return hash;
@@ -1345,7 +1345,7 @@ namespace Google.Protobuf.DescriptorProtos {
         }
 
         public override int GetHashCode() {
-          int hash = 17;
+          int hash = 1;
           if (Start != 0) hash ^= Start.GetHashCode();
           if (End != 0) hash ^= End.GetHashCode();
           return hash;
@@ -1573,7 +1573,7 @@ namespace Google.Protobuf.DescriptorProtos {
     }
 
     public override int GetHashCode() {
-      int hash = 17;
+      int hash = 1;
       if (Name.Length != 0) hash ^= Name.GetHashCode();
       if (Number != 0) hash ^= Number.GetHashCode();
       if (Label != global::Google.Protobuf.DescriptorProtos.FieldDescriptorProto.Types.Label.LABEL_OPTIONAL) hash ^= Label.GetHashCode();
@@ -1843,7 +1843,7 @@ namespace Google.Protobuf.DescriptorProtos {
     }
 
     public override int GetHashCode() {
-      int hash = 17;
+      int hash = 1;
       if (Name.Length != 0) hash ^= Name.GetHashCode();
       return hash;
     }
@@ -1976,7 +1976,7 @@ namespace Google.Protobuf.DescriptorProtos {
     }
 
     public override int GetHashCode() {
-      int hash = 17;
+      int hash = 1;
       if (Name.Length != 0) hash ^= Name.GetHashCode();
       hash ^= value_.GetHashCode();
       if (options_ != null) hash ^= Options.GetHashCode();
@@ -2148,7 +2148,7 @@ namespace Google.Protobuf.DescriptorProtos {
     }
 
     public override int GetHashCode() {
-      int hash = 17;
+      int hash = 1;
       if (Name.Length != 0) hash ^= Name.GetHashCode();
       if (Number != 0) hash ^= Number.GetHashCode();
       if (options_ != null) hash ^= Options.GetHashCode();
@@ -2317,7 +2317,7 @@ namespace Google.Protobuf.DescriptorProtos {
     }
 
     public override int GetHashCode() {
-      int hash = 17;
+      int hash = 1;
       if (Name.Length != 0) hash ^= Name.GetHashCode();
       hash ^= method_.GetHashCode();
       if (options_ != null) hash ^= Options.GetHashCode();
@@ -2525,7 +2525,7 @@ namespace Google.Protobuf.DescriptorProtos {
     }
 
     public override int GetHashCode() {
-      int hash = 17;
+      int hash = 1;
       if (Name.Length != 0) hash ^= Name.GetHashCode();
       if (InputType.Length != 0) hash ^= InputType.GetHashCode();
       if (OutputType.Length != 0) hash ^= OutputType.GetHashCode();
@@ -2882,7 +2882,7 @@ namespace Google.Protobuf.DescriptorProtos {
     }
 
     public override int GetHashCode() {
-      int hash = 17;
+      int hash = 1;
       if (JavaPackage.Length != 0) hash ^= JavaPackage.GetHashCode();
       if (JavaOuterClassname.Length != 0) hash ^= JavaOuterClassname.GetHashCode();
       if (JavaMultipleFiles != false) hash ^= JavaMultipleFiles.GetHashCode();
@@ -3260,7 +3260,7 @@ namespace Google.Protobuf.DescriptorProtos {
     }
 
     public override int GetHashCode() {
-      int hash = 17;
+      int hash = 1;
       if (MessageSetWireFormat != false) hash ^= MessageSetWireFormat.GetHashCode();
       if (NoStandardDescriptorAccessor != false) hash ^= NoStandardDescriptorAccessor.GetHashCode();
       if (Deprecated != false) hash ^= Deprecated.GetHashCode();
@@ -3500,7 +3500,7 @@ namespace Google.Protobuf.DescriptorProtos {
     }
 
     public override int GetHashCode() {
-      int hash = 17;
+      int hash = 1;
       if (Ctype != global::Google.Protobuf.DescriptorProtos.FieldOptions.Types.CType.STRING) hash ^= Ctype.GetHashCode();
       if (Packed != false) hash ^= Packed.GetHashCode();
       if (Jstype != global::Google.Protobuf.DescriptorProtos.FieldOptions.Types.JSType.JS_NORMAL) hash ^= Jstype.GetHashCode();
@@ -3740,7 +3740,7 @@ namespace Google.Protobuf.DescriptorProtos {
     }
 
     public override int GetHashCode() {
-      int hash = 17;
+      int hash = 1;
       if (AllowAlias != false) hash ^= AllowAlias.GetHashCode();
       if (Deprecated != false) hash ^= Deprecated.GetHashCode();
       hash ^= uninterpretedOption_.GetHashCode();
@@ -3890,7 +3890,7 @@ namespace Google.Protobuf.DescriptorProtos {
     }
 
     public override int GetHashCode() {
-      int hash = 17;
+      int hash = 1;
       if (Deprecated != false) hash ^= Deprecated.GetHashCode();
       hash ^= uninterpretedOption_.GetHashCode();
       return hash;
@@ -4025,7 +4025,7 @@ namespace Google.Protobuf.DescriptorProtos {
     }
 
     public override int GetHashCode() {
-      int hash = 17;
+      int hash = 1;
       if (Deprecated != false) hash ^= Deprecated.GetHashCode();
       hash ^= uninterpretedOption_.GetHashCode();
       return hash;
@@ -4160,7 +4160,7 @@ namespace Google.Protobuf.DescriptorProtos {
     }
 
     public override int GetHashCode() {
-      int hash = 17;
+      int hash = 1;
       if (Deprecated != false) hash ^= Deprecated.GetHashCode();
       hash ^= uninterpretedOption_.GetHashCode();
       return hash;
@@ -4355,7 +4355,7 @@ namespace Google.Protobuf.DescriptorProtos {
     }
 
     public override int GetHashCode() {
-      int hash = 17;
+      int hash = 1;
       hash ^= name_.GetHashCode();
       if (IdentifierValue.Length != 0) hash ^= IdentifierValue.GetHashCode();
       if (PositiveIntValue != 0UL) hash ^= PositiveIntValue.GetHashCode();
@@ -4569,7 +4569,7 @@ namespace Google.Protobuf.DescriptorProtos {
         }
 
         public override int GetHashCode() {
-          int hash = 17;
+          int hash = 1;
           if (NamePart_.Length != 0) hash ^= NamePart_.GetHashCode();
           if (IsExtension != false) hash ^= IsExtension.GetHashCode();
           return hash;
@@ -4697,7 +4697,7 @@ namespace Google.Protobuf.DescriptorProtos {
     }
 
     public override int GetHashCode() {
-      int hash = 17;
+      int hash = 1;
       hash ^= location_.GetHashCode();
       return hash;
     }
@@ -4848,7 +4848,7 @@ namespace Google.Protobuf.DescriptorProtos {
         }
 
         public override int GetHashCode() {
-          int hash = 17;
+          int hash = 1;
           hash ^= path_.GetHashCode();
           hash ^= span_.GetHashCode();
           if (LeadingComments.Length != 0) hash ^= LeadingComments.GetHashCode();

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