Add server settings request

FeroxRev [2016-07-16 06:19:52]
Add server settings request
Filename
PokemonGo/RocketAPI/Client.cs
PokemonGo/RocketAPI/Console/Program.cs
PokemonGo/RocketAPI/GeneratedCode/SettingsResponse.cs
PokemonGo/RocketAPI/PokemonGo.RocketAPI.csproj
PokemonGo/RocketAPI/Proto/ProfileResponse.proto
PokemonGo/RocketAPI/Proto/SettingsResponse.proto
README.md
diff --git a/PokemonGo/RocketAPI/Client.cs b/PokemonGo/RocketAPI/Client.cs
index ed290d5..4e24ed0 100644
--- a/PokemonGo/RocketAPI/Client.cs
+++ b/PokemonGo/RocketAPI/Client.cs
@@ -93,5 +93,9 @@ namespace PokemonGo.RocketAPI
         {
             return await _httpClient.PostProto<Request, ProfileResponse>($"https://{apiUrl}/rpc", profileRequest);
         }
+        public async Task<SettingsResponse> GetSettings(string apiUrl, Request settingsRequest)
+        {
+            return await _httpClient.PostProto<Request, SettingsResponse>($"https://{apiUrl}/rpc", settingsRequest);
+        }
     }
 }
diff --git a/PokemonGo/RocketAPI/Console/Program.cs b/PokemonGo/RocketAPI/Console/Program.cs
index a93f1ae..e2f7d59 100644
--- a/PokemonGo/RocketAPI/Console/Program.cs
+++ b/PokemonGo/RocketAPI/Console/Program.cs
@@ -22,10 +22,12 @@ namespace PokemonGo.RocketAPI.Console

             var accessToken = await client.GetGoogleAccessToken(Settings.DeviceId, Settings.ClientSig, Settings.Email, Settings.LongDurationToken);
             var profileRequest = RequestBuilder.GetRequest(RequestType.Profile, accessToken, Settings.DefaultLatitude, Settings.DefaultLongitude, 30);
+            var serverSettingsRequest = RequestBuilder.GetRequest(RequestType.Settings, accessToken, Settings.DefaultLatitude, Settings.DefaultLongitude, 30);

             var serverResponse = await client.GetServer(profileRequest);
             var profile = await client.GetProfile(serverResponse.ApiUrl, profileRequest);

+            var serverSettings = await client.GetSettings(serverResponse.ApiUrl, serverSettingsRequest);
         }
     }
 }
diff --git a/PokemonGo/RocketAPI/GeneratedCode/SettingsResponse.cs b/PokemonGo/RocketAPI/GeneratedCode/SettingsResponse.cs
new file mode 100644
index 0000000..160159d
--- /dev/null
+++ b/PokemonGo/RocketAPI/GeneratedCode/SettingsResponse.cs
@@ -0,0 +1,1993 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: SettingsResponse.proto
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace PokemonGo.RocketAPI.GeneratedCode {
+
+  /// <summary>Holder for reflection information generated from SettingsResponse.proto</summary>
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public static partial class SettingsResponseReflection {
+
+    #region Descriptor
+    /// <summary>File descriptor for SettingsResponse.proto</summary>
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static SettingsResponseReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "ChZTZXR0aW5nc1Jlc3BvbnNlLnByb3RvEiFQb2tlbW9uR28uUm9ja2V0QVBJ",
+            "LkdlbmVyYXRlZENvZGUipg4KEFNldHRpbmdzUmVzcG9uc2USEAoIdW5rbm93",
+            "bjEYASABKAUSEAoIdW5rbm93bjIYAiABKAMSDwoHYXBpX3VybBgDIAEoCRJO",
+            "Cgh1bmtub3duNhgGIAEoCzI8LlBva2Vtb25Hby5Sb2NrZXRBUEkuR2VuZXJh",
+            "dGVkQ29kZS5TZXR0aW5nc1Jlc3BvbnNlLlVua25vd242Ek4KCHVua25vd243",
+            "GAcgASgLMjwuUG9rZW1vbkdvLlJvY2tldEFQSS5HZW5lcmF0ZWRDb2RlLlNl",
+            "dHRpbmdzUmVzcG9uc2UuVW5rbm93bjcSTAoHcGF5bG9hZBhkIAMoCzI7LlBv",
+            "a2Vtb25Hby5Sb2NrZXRBUEkuR2VuZXJhdGVkQ29kZS5TZXR0aW5nc1Jlc3Bv",
+            "bnNlLlBheWxvYWQSFAoMZXJyb3JNZXNzYWdlGGUgASgJGpMBCghVbmtub3du",
+            "NhIQCgh1bmtub3duMRgBIAEoBRJXCgh1bmtub3duMhgCIAEoCzJFLlBva2Vt",
+            "b25Hby5Sb2NrZXRBUEkuR2VuZXJhdGVkQ29kZS5TZXR0aW5nc1Jlc3BvbnNl",
+            "LlVua25vd242LlVua25vd24yGhwKCFVua25vd24yEhAKCHVua25vd24xGAEg",
+            "ASgMGkMKCFVua25vd243EhEKCXVua25vd243MRgBIAEoDBIRCgl1bmtub3du",
+            "NzIYAiABKAMSEQoJdW5rbm93bjczGAMgASgMGv0JCgdQYXlsb2FkEgwKBGd1",
+            "aWQYAiABKAkSYQoIc2V0dGluZ3MYAyABKAsyTy5Qb2tlbW9uR28uUm9ja2V0",
+            "QVBJLkdlbmVyYXRlZENvZGUuU2V0dGluZ3NSZXNwb25zZS5QYXlsb2FkLkds",
+            "b2JhbFNldHRpbmdzUHJvdG8a0QMKE0dsb2JhbFNldHRpbmdzUHJvdG8SYwoM",
+            "Rm9ydFNldHRpbmdzGAIgASgLMk0uUG9rZW1vbkdvLlJvY2tldEFQSS5HZW5l",
+            "cmF0ZWRDb2RlLlNldHRpbmdzUmVzcG9uc2UuUGF5bG9hZC5Gb3J0U2V0dGlu",
+            "Z3NQcm90bxJhCgtNYXBTZXR0aW5ncxgDIAEoCzJMLlBva2Vtb25Hby5Sb2Nr",
+            "ZXRBUEkuR2VuZXJhdGVkQ29kZS5TZXR0aW5nc1Jlc3BvbnNlLlBheWxvYWQu",
+            "TWFwU2V0dGluZ3NQcm90bxJlCg1MZXZlbFNldHRpbmdzGAQgASgLMk4uUG9r",
+            "ZW1vbkdvLlJvY2tldEFQSS5HZW5lcmF0ZWRDb2RlLlNldHRpbmdzUmVzcG9u",
+            "c2UuUGF5bG9hZC5MZXZlbFNldHRpbmdzUHJvdG8SbQoRSW52ZW50b3J5U2V0",
+            "dGluZ3MYBSABKAsyUi5Qb2tlbW9uR28uUm9ja2V0QVBJLkdlbmVyYXRlZENv",
+            "ZGUuU2V0dGluZ3NSZXNwb25zZS5QYXlsb2FkLkludmVudG9yeVNldHRpbmdz",
+            "UHJvdG8SHAoUTWluaW11bUNsaWVudFZlcnNpb24YBiABKAka2gEKEUZvcnRT",
+            "ZXR0aW5nc1Byb3RvEh4KFkludGVyYWN0aW9uUmFuZ2VNZXRlcnMYASABKAES",
+            "HwoXTWF4VG90YWxEZXBsb3llZFBva2Vtb24YAiABKAUSIAoYTWF4UGxheWVy",
+            "RGVwbG95ZWRQb2tlbW9uGAMgASgFEh8KF0RlcGxveVN0YW1pbmFNdWx0aXBs",
+            "aWVyGAQgASgBEh4KFkRlcGxveUF0dGFja011bHRpcGxpZXIYBSABKAESIQoZ",
+            "RmFySW50ZXJhY3Rpb25SYW5nZU1ldGVycxgGIAEoARr7AQoQTWFwU2V0dGlu",
+            "Z3NQcm90bxIbChNQb2tlbW9uVmlzaWJsZVJhbmdlGAEgASgBEhoKElBva2VO",
+            "YXZSYW5nZU1ldGVycxgCIAEoARIcChRFbmNvdW50ZXJSYW5nZU1ldGVycxgD",
+            "IAEoARImCh5HZXRNYXBPYmplY3RzTWluUmVmcmVzaFNlY29uZHMYBCABKAIS",
+            "JgoeR2V0TWFwT2JqZWN0c01heFJlZnJlc2hTZWNvbmRzGAUgASgCEiYKHkdl",
+            "dE1hcE9iamVjdHNNaW5EaXN0YW5jZU1ldGVycxgGIAEoAhIYChBHb29nbGVN",
+            "YXBzQXBpS2V5GAcgASgJGlIKEkxldmVsU2V0dGluZ3NQcm90bxIZChFUcmFp",
+            "bmVyQ3BNb2RpZmllchgCIAEoARIhChlUcmFpbmVyRGlmZmljdWx0eU1vZGlm",
+            "aWVyGAMgASgBGn4KFkludmVudG9yeVNldHRpbmdzUHJvdG8SEgoKTWF4UG9r",
+            "ZW1vbhgBIAEoBRITCgtNYXhCYWdJdGVtcxgCIAEoBRITCgtCYXNlUG9rZW1v",
+            "bhgDIAEoBRIUCgxCYXNlQmFnSXRlbXMYBCABKAUSEAoIQmFzZUVnZ3MYBSAB",
+            "KAViBnByb3RvMw=="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse), global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Parser, new[]{ "Unknown1", "Unknown2", "ApiUrl", "Unknown6", "Unknown7", "Payload", "ErrorMessage" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Unknown6), global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Unknown6.Parser, new[]{ "Unknown1", "Unknown2" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Unknown6.Types.Unknown2), global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Unknown6.Types.Unknown2.Parser, new[]{ "Unknown1" }, null, null, null)}),
+            new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Unknown7), global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Unknown7.Parser, new[]{ "Unknown71", "Unknown72", "Unknown73" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload), global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Parser, new[]{ "Guid", "Settings" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Types.GlobalSettingsProto), global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Types.GlobalSettingsProto.Parser, new[]{ "FortSettings", "MapSettings", "LevelSettings", "InventorySettings", "MinimumClientVersion" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Types.FortSettingsProto), global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Types.FortSettingsProto.Parser, new[]{ "InteractionRangeMeters", "MaxTotalDeployedPokemon", "MaxPlayerDeployedPokemon", "DeployStaminaMultiplier", "DeployAttackMultiplier", "FarInteractionRangeMeters" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Types.MapSettingsProto), global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Types.MapSettingsProto.Parser, new[]{ "PokemonVisibleRange", "PokeNavRangeMeters", "EncounterRangeMeters", "GetMapObjectsMinRefreshSeconds", "GetMapObjectsMaxRefreshSeconds", "GetMapObjectsMinDistanceMeters", "GoogleMapsApiKey" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Types.LevelSettingsProto), global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Types.LevelSettingsProto.Parser, new[]{ "TrainerCpModifier", "TrainerDifficultyModifier" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Types.InventorySettingsProto), global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Types.InventorySettingsProto.Parser, new[]{ "MaxPokemon", "MaxBagItems", "BasePokemon", "BaseBagItems", "BaseEggs" }, null, null, null)})})
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  public sealed partial class SettingsResponse : pb::IMessage<SettingsResponse> {
+    private static readonly pb::MessageParser<SettingsResponse> _parser = new pb::MessageParser<SettingsResponse>(() => new SettingsResponse());
+    public static pb::MessageParser<SettingsResponse> Parser { get { return _parser; } }
+
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponseReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    public SettingsResponse() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    public SettingsResponse(SettingsResponse other) : this() {
+      unknown1_ = other.unknown1_;
+      unknown2_ = other.unknown2_;
+      apiUrl_ = other.apiUrl_;
+      Unknown6 = other.unknown6_ != null ? other.Unknown6.Clone() : null;
+      Unknown7 = other.unknown7_ != null ? other.Unknown7.Clone() : null;
+      payload_ = other.payload_.Clone();
+      errorMessage_ = other.errorMessage_;
+    }
+
+    public SettingsResponse Clone() {
+      return new SettingsResponse(this);
+    }
+
+    /// <summary>Field number for the "unknown1" field.</summary>
+    public const int Unknown1FieldNumber = 1;
+    private int unknown1_;
+    public int Unknown1 {
+      get { return unknown1_; }
+      set {
+        unknown1_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "unknown2" field.</summary>
+    public const int Unknown2FieldNumber = 2;
+    private long unknown2_;
+    public long Unknown2 {
+      get { return unknown2_; }
+      set {
+        unknown2_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "api_url" field.</summary>
+    public const int ApiUrlFieldNumber = 3;
+    private string apiUrl_ = "";
+    public string ApiUrl {
+      get { return apiUrl_; }
+      set {
+        apiUrl_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// <summary>Field number for the "unknown6" field.</summary>
+    public const int Unknown6FieldNumber = 6;
+    private global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Unknown6 unknown6_;
+    public global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Unknown6 Unknown6 {
+      get { return unknown6_; }
+      set {
+        unknown6_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "unknown7" field.</summary>
+    public const int Unknown7FieldNumber = 7;
+    private global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Unknown7 unknown7_;
+    public global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Unknown7 Unknown7 {
+      get { return unknown7_; }
+      set {
+        unknown7_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "payload" field.</summary>
+    public const int PayloadFieldNumber = 100;
+    private static readonly pb::FieldCodec<global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload> _repeated_payload_codec
+        = pb::FieldCodec.ForMessage(802, global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Parser);
+    private readonly pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload> payload_ = new pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload>();
+    public pbc::RepeatedField<global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload> Payload {
+      get { return payload_; }
+    }
+
+    /// <summary>Field number for the "errorMessage" field.</summary>
+    public const int ErrorMessageFieldNumber = 101;
+    private string errorMessage_ = "";
+    /// <summary>
+    /// Should be moved to an error-proto file if error is always 101 field
+    /// </summary>
+    public string ErrorMessage {
+      get { return errorMessage_; }
+      set {
+        errorMessage_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    public override bool Equals(object other) {
+      return Equals(other as SettingsResponse);
+    }
+
+    public bool Equals(SettingsResponse other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Unknown1 != other.Unknown1) return false;
+      if (Unknown2 != other.Unknown2) return false;
+      if (ApiUrl != other.ApiUrl) return false;
+      if (!object.Equals(Unknown6, other.Unknown6)) return false;
+      if (!object.Equals(Unknown7, other.Unknown7)) return false;
+      if(!payload_.Equals(other.payload_)) return false;
+      if (ErrorMessage != other.ErrorMessage) return false;
+      return true;
+    }
+
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Unknown1 != 0) hash ^= Unknown1.GetHashCode();
+      if (Unknown2 != 0L) hash ^= Unknown2.GetHashCode();
+      if (ApiUrl.Length != 0) hash ^= ApiUrl.GetHashCode();
+      if (unknown6_ != null) hash ^= Unknown6.GetHashCode();
+      if (unknown7_ != null) hash ^= Unknown7.GetHashCode();
+      hash ^= payload_.GetHashCode();
+      if (ErrorMessage.Length != 0) hash ^= ErrorMessage.GetHashCode();
+      return hash;
+    }
+
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    public void WriteTo(pb::CodedOutputStream output) {
+      if (Unknown1 != 0) {
+        output.WriteRawTag(8);
+        output.WriteInt32(Unknown1);
+      }
+      if (Unknown2 != 0L) {
+        output.WriteRawTag(16);
+        output.WriteInt64(Unknown2);
+      }
+      if (ApiUrl.Length != 0) {
+        output.WriteRawTag(26);
+        output.WriteString(ApiUrl);
+      }
+      if (unknown6_ != null) {
+        output.WriteRawTag(50);
+        output.WriteMessage(Unknown6);
+      }
+      if (unknown7_ != null) {
+        output.WriteRawTag(58);
+        output.WriteMessage(Unknown7);
+      }
+      payload_.WriteTo(output, _repeated_payload_codec);
+      if (ErrorMessage.Length != 0) {
+        output.WriteRawTag(170, 6);
+        output.WriteString(ErrorMessage);
+      }
+    }
+
+    public int CalculateSize() {
+      int size = 0;
+      if (Unknown1 != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Unknown1);
+      }
+      if (Unknown2 != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(Unknown2);
+      }
+      if (ApiUrl.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(ApiUrl);
+      }
+      if (unknown6_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Unknown6);
+      }
+      if (unknown7_ != null) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(Unknown7);
+      }
+      size += payload_.CalculateSize(_repeated_payload_codec);
+      if (ErrorMessage.Length != 0) {
+        size += 2 + pb::CodedOutputStream.ComputeStringSize(ErrorMessage);
+      }
+      return size;
+    }
+
+    public void MergeFrom(SettingsResponse other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Unknown1 != 0) {
+        Unknown1 = other.Unknown1;
+      }
+      if (other.Unknown2 != 0L) {
+        Unknown2 = other.Unknown2;
+      }
+      if (other.ApiUrl.Length != 0) {
+        ApiUrl = other.ApiUrl;
+      }
+      if (other.unknown6_ != null) {
+        if (unknown6_ == null) {
+          unknown6_ = new global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Unknown6();
+        }
+        Unknown6.MergeFrom(other.Unknown6);
+      }
+      if (other.unknown7_ != null) {
+        if (unknown7_ == null) {
+          unknown7_ = new global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Unknown7();
+        }
+        Unknown7.MergeFrom(other.Unknown7);
+      }
+      payload_.Add(other.payload_);
+      if (other.ErrorMessage.Length != 0) {
+        ErrorMessage = other.ErrorMessage;
+      }
+    }
+
+    public void MergeFrom(pb::CodedInputStream input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            input.SkipLastField();
+            break;
+          case 8: {
+            Unknown1 = input.ReadInt32();
+            break;
+          }
+          case 16: {
+            Unknown2 = input.ReadInt64();
+            break;
+          }
+          case 26: {
+            ApiUrl = input.ReadString();
+            break;
+          }
+          case 50: {
+            if (unknown6_ == null) {
+              unknown6_ = new global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Unknown6();
+            }
+            input.ReadMessage(unknown6_);
+            break;
+          }
+          case 58: {
+            if (unknown7_ == null) {
+              unknown7_ = new global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Unknown7();
+            }
+            input.ReadMessage(unknown7_);
+            break;
+          }
+          case 802: {
+            payload_.AddEntriesFrom(input, _repeated_payload_codec);
+            break;
+          }
+          case 810: {
+            ErrorMessage = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+
+    #region Nested types
+    /// <summary>Container for nested types declared in the SettingsResponse message type.</summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    public static partial class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class Unknown6 : pb::IMessage<Unknown6> {
+        private static readonly pb::MessageParser<Unknown6> _parser = new pb::MessageParser<Unknown6>(() => new Unknown6());
+        public static pb::MessageParser<Unknown6> Parser { get { return _parser; } }
+
+        public static pbr::MessageDescriptor Descriptor {
+          get { return global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Descriptor.NestedTypes[0]; }
+        }
+
+        pbr::MessageDescriptor pb::IMessage.Descriptor {
+          get { return Descriptor; }
+        }
+
+        public Unknown6() {
+          OnConstruction();
+        }
+
+        partial void OnConstruction();
+
+        public Unknown6(Unknown6 other) : this() {
+          unknown1_ = other.unknown1_;
+          Unknown2 = other.unknown2_ != null ? other.Unknown2.Clone() : null;
+        }
+
+        public Unknown6 Clone() {
+          return new Unknown6(this);
+        }
+
+        /// <summary>Field number for the "unknown1" field.</summary>
+        public const int Unknown1FieldNumber = 1;
+        private int unknown1_;
+        public int Unknown1 {
+          get { return unknown1_; }
+          set {
+            unknown1_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "unknown2" field.</summary>
+        public const int Unknown2FieldNumber = 2;
+        private global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Unknown6.Types.Unknown2 unknown2_;
+        public global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Unknown6.Types.Unknown2 Unknown2 {
+          get { return unknown2_; }
+          set {
+            unknown2_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as Unknown6);
+        }
+
+        public bool Equals(Unknown6 other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Unknown1 != other.Unknown1) return false;
+          if (!object.Equals(Unknown2, other.Unknown2)) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Unknown1 != 0) hash ^= Unknown1.GetHashCode();
+          if (unknown2_ != null) hash ^= Unknown2.GetHashCode();
+          return hash;
+        }
+
+        public override string ToString() {
+          return pb::JsonFormatter.ToDiagnosticString(this);
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Unknown1 != 0) {
+            output.WriteRawTag(8);
+            output.WriteInt32(Unknown1);
+          }
+          if (unknown2_ != null) {
+            output.WriteRawTag(18);
+            output.WriteMessage(Unknown2);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Unknown1 != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32Size(Unknown1);
+          }
+          if (unknown2_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(Unknown2);
+          }
+          return size;
+        }
+
+        public void MergeFrom(Unknown6 other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Unknown1 != 0) {
+            Unknown1 = other.Unknown1;
+          }
+          if (other.unknown2_ != null) {
+            if (unknown2_ == null) {
+              unknown2_ = new global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Unknown6.Types.Unknown2();
+            }
+            Unknown2.MergeFrom(other.Unknown2);
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while ((tag = input.ReadTag()) != 0) {
+            switch(tag) {
+              default:
+                input.SkipLastField();
+                break;
+              case 8: {
+                Unknown1 = input.ReadInt32();
+                break;
+              }
+              case 18: {
+                if (unknown2_ == null) {
+                  unknown2_ = new global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Unknown6.Types.Unknown2();
+                }
+                input.ReadMessage(unknown2_);
+                break;
+              }
+            }
+          }
+        }
+
+        #region Nested types
+        /// <summary>Container for nested types declared in the Unknown6 message type.</summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public static partial class Types {
+          [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+          public sealed partial class Unknown2 : pb::IMessage<Unknown2> {
+            private static readonly pb::MessageParser<Unknown2> _parser = new pb::MessageParser<Unknown2>(() => new Unknown2());
+            public static pb::MessageParser<Unknown2> Parser { get { return _parser; } }
+
+            public static pbr::MessageDescriptor Descriptor {
+              get { return global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Unknown6.Descriptor.NestedTypes[0]; }
+            }
+
+            pbr::MessageDescriptor pb::IMessage.Descriptor {
+              get { return Descriptor; }
+            }
+
+            public Unknown2() {
+              OnConstruction();
+            }
+
+            partial void OnConstruction();
+
+            public Unknown2(Unknown2 other) : this() {
+              unknown1_ = other.unknown1_;
+            }
+
+            public Unknown2 Clone() {
+              return new Unknown2(this);
+            }
+
+            /// <summary>Field number for the "unknown1" field.</summary>
+            public const int Unknown1FieldNumber = 1;
+            private pb::ByteString unknown1_ = pb::ByteString.Empty;
+            public pb::ByteString Unknown1 {
+              get { return unknown1_; }
+              set {
+                unknown1_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+              }
+            }
+
+            public override bool Equals(object other) {
+              return Equals(other as Unknown2);
+            }
+
+            public bool Equals(Unknown2 other) {
+              if (ReferenceEquals(other, null)) {
+                return false;
+              }
+              if (ReferenceEquals(other, this)) {
+                return true;
+              }
+              if (Unknown1 != other.Unknown1) return false;
+              return true;
+            }
+
+            public override int GetHashCode() {
+              int hash = 1;
+              if (Unknown1.Length != 0) hash ^= Unknown1.GetHashCode();
+              return hash;
+            }
+
+            public override string ToString() {
+              return pb::JsonFormatter.ToDiagnosticString(this);
+            }
+
+            public void WriteTo(pb::CodedOutputStream output) {
+              if (Unknown1.Length != 0) {
+                output.WriteRawTag(10);
+                output.WriteBytes(Unknown1);
+              }
+            }
+
+            public int CalculateSize() {
+              int size = 0;
+              if (Unknown1.Length != 0) {
+                size += 1 + pb::CodedOutputStream.ComputeBytesSize(Unknown1);
+              }
+              return size;
+            }
+
+            public void MergeFrom(Unknown2 other) {
+              if (other == null) {
+                return;
+              }
+              if (other.Unknown1.Length != 0) {
+                Unknown1 = other.Unknown1;
+              }
+            }
+
+            public void MergeFrom(pb::CodedInputStream input) {
+              uint tag;
+              while ((tag = input.ReadTag()) != 0) {
+                switch(tag) {
+                  default:
+                    input.SkipLastField();
+                    break;
+                  case 10: {
+                    Unknown1 = input.ReadBytes();
+                    break;
+                  }
+                }
+              }
+            }
+
+          }
+
+        }
+        #endregion
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class Unknown7 : pb::IMessage<Unknown7> {
+        private static readonly pb::MessageParser<Unknown7> _parser = new pb::MessageParser<Unknown7>(() => new Unknown7());
+        public static pb::MessageParser<Unknown7> Parser { get { return _parser; } }
+
+        public static pbr::MessageDescriptor Descriptor {
+          get { return global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Descriptor.NestedTypes[1]; }
+        }
+
+        pbr::MessageDescriptor pb::IMessage.Descriptor {
+          get { return Descriptor; }
+        }
+
+        public Unknown7() {
+          OnConstruction();
+        }
+
+        partial void OnConstruction();
+
+        public Unknown7(Unknown7 other) : this() {
+          unknown71_ = other.unknown71_;
+          unknown72_ = other.unknown72_;
+          unknown73_ = other.unknown73_;
+        }
+
+        public Unknown7 Clone() {
+          return new Unknown7(this);
+        }
+
+        /// <summary>Field number for the "unknown71" field.</summary>
+        public const int Unknown71FieldNumber = 1;
+        private pb::ByteString unknown71_ = pb::ByteString.Empty;
+        public pb::ByteString Unknown71 {
+          get { return unknown71_; }
+          set {
+            unknown71_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        /// <summary>Field number for the "unknown72" field.</summary>
+        public const int Unknown72FieldNumber = 2;
+        private long unknown72_;
+        public long Unknown72 {
+          get { return unknown72_; }
+          set {
+            unknown72_ = value;
+          }
+        }
+
+        /// <summary>Field number for the "unknown73" field.</summary>
+        public const int Unknown73FieldNumber = 3;
+        private pb::ByteString unknown73_ = pb::ByteString.Empty;
+        public pb::ByteString Unknown73 {
+          get { return unknown73_; }
+          set {
+            unknown73_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as Unknown7);
+        }
+
+        public bool Equals(Unknown7 other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Unknown71 != other.Unknown71) return false;
+          if (Unknown72 != other.Unknown72) return false;
+          if (Unknown73 != other.Unknown73) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Unknown71.Length != 0) hash ^= Unknown71.GetHashCode();
+          if (Unknown72 != 0L) hash ^= Unknown72.GetHashCode();
+          if (Unknown73.Length != 0) hash ^= Unknown73.GetHashCode();
+          return hash;
+        }
+
+        public override string ToString() {
+          return pb::JsonFormatter.ToDiagnosticString(this);
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Unknown71.Length != 0) {
+            output.WriteRawTag(10);
+            output.WriteBytes(Unknown71);
+          }
+          if (Unknown72 != 0L) {
+            output.WriteRawTag(16);
+            output.WriteInt64(Unknown72);
+          }
+          if (Unknown73.Length != 0) {
+            output.WriteRawTag(26);
+            output.WriteBytes(Unknown73);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Unknown71.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeBytesSize(Unknown71);
+          }
+          if (Unknown72 != 0L) {
+            size += 1 + pb::CodedOutputStream.ComputeInt64Size(Unknown72);
+          }
+          if (Unknown73.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeBytesSize(Unknown73);
+          }
+          return size;
+        }
+
+        public void MergeFrom(Unknown7 other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Unknown71.Length != 0) {
+            Unknown71 = other.Unknown71;
+          }
+          if (other.Unknown72 != 0L) {
+            Unknown72 = other.Unknown72;
+          }
+          if (other.Unknown73.Length != 0) {
+            Unknown73 = other.Unknown73;
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while ((tag = input.ReadTag()) != 0) {
+            switch(tag) {
+              default:
+                input.SkipLastField();
+                break;
+              case 10: {
+                Unknown71 = input.ReadBytes();
+                break;
+              }
+              case 16: {
+                Unknown72 = input.ReadInt64();
+                break;
+              }
+              case 26: {
+                Unknown73 = input.ReadBytes();
+                break;
+              }
+            }
+          }
+        }
+
+      }
+
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      public sealed partial class Payload : pb::IMessage<Payload> {
+        private static readonly pb::MessageParser<Payload> _parser = new pb::MessageParser<Payload>(() => new Payload());
+        public static pb::MessageParser<Payload> Parser { get { return _parser; } }
+
+        public static pbr::MessageDescriptor Descriptor {
+          get { return global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Descriptor.NestedTypes[2]; }
+        }
+
+        pbr::MessageDescriptor pb::IMessage.Descriptor {
+          get { return Descriptor; }
+        }
+
+        public Payload() {
+          OnConstruction();
+        }
+
+        partial void OnConstruction();
+
+        public Payload(Payload other) : this() {
+          guid_ = other.guid_;
+          Settings = other.settings_ != null ? other.Settings.Clone() : null;
+        }
+
+        public Payload Clone() {
+          return new Payload(this);
+        }
+
+        /// <summary>Field number for the "guid" field.</summary>
+        public const int GuidFieldNumber = 2;
+        private string guid_ = "";
+        public string Guid {
+          get { return guid_; }
+          set {
+            guid_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+          }
+        }
+
+        /// <summary>Field number for the "settings" field.</summary>
+        public const int SettingsFieldNumber = 3;
+        private global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Types.GlobalSettingsProto settings_;
+        public global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Types.GlobalSettingsProto Settings {
+          get { return settings_; }
+          set {
+            settings_ = value;
+          }
+        }
+
+        public override bool Equals(object other) {
+          return Equals(other as Payload);
+        }
+
+        public bool Equals(Payload other) {
+          if (ReferenceEquals(other, null)) {
+            return false;
+          }
+          if (ReferenceEquals(other, this)) {
+            return true;
+          }
+          if (Guid != other.Guid) return false;
+          if (!object.Equals(Settings, other.Settings)) return false;
+          return true;
+        }
+
+        public override int GetHashCode() {
+          int hash = 1;
+          if (Guid.Length != 0) hash ^= Guid.GetHashCode();
+          if (settings_ != null) hash ^= Settings.GetHashCode();
+          return hash;
+        }
+
+        public override string ToString() {
+          return pb::JsonFormatter.ToDiagnosticString(this);
+        }
+
+        public void WriteTo(pb::CodedOutputStream output) {
+          if (Guid.Length != 0) {
+            output.WriteRawTag(18);
+            output.WriteString(Guid);
+          }
+          if (settings_ != null) {
+            output.WriteRawTag(26);
+            output.WriteMessage(Settings);
+          }
+        }
+
+        public int CalculateSize() {
+          int size = 0;
+          if (Guid.Length != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeStringSize(Guid);
+          }
+          if (settings_ != null) {
+            size += 1 + pb::CodedOutputStream.ComputeMessageSize(Settings);
+          }
+          return size;
+        }
+
+        public void MergeFrom(Payload other) {
+          if (other == null) {
+            return;
+          }
+          if (other.Guid.Length != 0) {
+            Guid = other.Guid;
+          }
+          if (other.settings_ != null) {
+            if (settings_ == null) {
+              settings_ = new global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Types.GlobalSettingsProto();
+            }
+            Settings.MergeFrom(other.Settings);
+          }
+        }
+
+        public void MergeFrom(pb::CodedInputStream input) {
+          uint tag;
+          while ((tag = input.ReadTag()) != 0) {
+            switch(tag) {
+              default:
+                input.SkipLastField();
+                break;
+              case 18: {
+                Guid = input.ReadString();
+                break;
+              }
+              case 26: {
+                if (settings_ == null) {
+                  settings_ = new global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Types.GlobalSettingsProto();
+                }
+                input.ReadMessage(settings_);
+                break;
+              }
+            }
+          }
+        }
+
+        #region Nested types
+        /// <summary>Container for nested types declared in the Payload message type.</summary>
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        public static partial class Types {
+          [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+          public sealed partial class GlobalSettingsProto : pb::IMessage<GlobalSettingsProto> {
+            private static readonly pb::MessageParser<GlobalSettingsProto> _parser = new pb::MessageParser<GlobalSettingsProto>(() => new GlobalSettingsProto());
+            public static pb::MessageParser<GlobalSettingsProto> Parser { get { return _parser; } }
+
+            public static pbr::MessageDescriptor Descriptor {
+              get { return global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Descriptor.NestedTypes[0]; }
+            }
+
+            pbr::MessageDescriptor pb::IMessage.Descriptor {
+              get { return Descriptor; }
+            }
+
+            public GlobalSettingsProto() {
+              OnConstruction();
+            }
+
+            partial void OnConstruction();
+
+            public GlobalSettingsProto(GlobalSettingsProto other) : this() {
+              FortSettings = other.fortSettings_ != null ? other.FortSettings.Clone() : null;
+              MapSettings = other.mapSettings_ != null ? other.MapSettings.Clone() : null;
+              LevelSettings = other.levelSettings_ != null ? other.LevelSettings.Clone() : null;
+              InventorySettings = other.inventorySettings_ != null ? other.InventorySettings.Clone() : null;
+              minimumClientVersion_ = other.minimumClientVersion_;
+            }
+
+            public GlobalSettingsProto Clone() {
+              return new GlobalSettingsProto(this);
+            }
+
+            /// <summary>Field number for the "FortSettings" field.</summary>
+            public const int FortSettingsFieldNumber = 2;
+            private global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Types.FortSettingsProto fortSettings_;
+            public global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Types.FortSettingsProto FortSettings {
+              get { return fortSettings_; }
+              set {
+                fortSettings_ = value;
+              }
+            }
+
+            /// <summary>Field number for the "MapSettings" field.</summary>
+            public const int MapSettingsFieldNumber = 3;
+            private global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Types.MapSettingsProto mapSettings_;
+            public global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Types.MapSettingsProto MapSettings {
+              get { return mapSettings_; }
+              set {
+                mapSettings_ = value;
+              }
+            }
+
+            /// <summary>Field number for the "LevelSettings" field.</summary>
+            public const int LevelSettingsFieldNumber = 4;
+            private global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Types.LevelSettingsProto levelSettings_;
+            public global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Types.LevelSettingsProto LevelSettings {
+              get { return levelSettings_; }
+              set {
+                levelSettings_ = value;
+              }
+            }
+
+            /// <summary>Field number for the "InventorySettings" field.</summary>
+            public const int InventorySettingsFieldNumber = 5;
+            private global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Types.InventorySettingsProto inventorySettings_;
+            public global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Types.InventorySettingsProto InventorySettings {
+              get { return inventorySettings_; }
+              set {
+                inventorySettings_ = value;
+              }
+            }
+
+            /// <summary>Field number for the "MinimumClientVersion" field.</summary>
+            public const int MinimumClientVersionFieldNumber = 6;
+            private string minimumClientVersion_ = "";
+            public string MinimumClientVersion {
+              get { return minimumClientVersion_; }
+              set {
+                minimumClientVersion_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+              }
+            }
+
+            public override bool Equals(object other) {
+              return Equals(other as GlobalSettingsProto);
+            }
+
+            public bool Equals(GlobalSettingsProto other) {
+              if (ReferenceEquals(other, null)) {
+                return false;
+              }
+              if (ReferenceEquals(other, this)) {
+                return true;
+              }
+              if (!object.Equals(FortSettings, other.FortSettings)) return false;
+              if (!object.Equals(MapSettings, other.MapSettings)) return false;
+              if (!object.Equals(LevelSettings, other.LevelSettings)) return false;
+              if (!object.Equals(InventorySettings, other.InventorySettings)) return false;
+              if (MinimumClientVersion != other.MinimumClientVersion) return false;
+              return true;
+            }
+
+            public override int GetHashCode() {
+              int hash = 1;
+              if (fortSettings_ != null) hash ^= FortSettings.GetHashCode();
+              if (mapSettings_ != null) hash ^= MapSettings.GetHashCode();
+              if (levelSettings_ != null) hash ^= LevelSettings.GetHashCode();
+              if (inventorySettings_ != null) hash ^= InventorySettings.GetHashCode();
+              if (MinimumClientVersion.Length != 0) hash ^= MinimumClientVersion.GetHashCode();
+              return hash;
+            }
+
+            public override string ToString() {
+              return pb::JsonFormatter.ToDiagnosticString(this);
+            }
+
+            public void WriteTo(pb::CodedOutputStream output) {
+              if (fortSettings_ != null) {
+                output.WriteRawTag(18);
+                output.WriteMessage(FortSettings);
+              }
+              if (mapSettings_ != null) {
+                output.WriteRawTag(26);
+                output.WriteMessage(MapSettings);
+              }
+              if (levelSettings_ != null) {
+                output.WriteRawTag(34);
+                output.WriteMessage(LevelSettings);
+              }
+              if (inventorySettings_ != null) {
+                output.WriteRawTag(42);
+                output.WriteMessage(InventorySettings);
+              }
+              if (MinimumClientVersion.Length != 0) {
+                output.WriteRawTag(50);
+                output.WriteString(MinimumClientVersion);
+              }
+            }
+
+            public int CalculateSize() {
+              int size = 0;
+              if (fortSettings_ != null) {
+                size += 1 + pb::CodedOutputStream.ComputeMessageSize(FortSettings);
+              }
+              if (mapSettings_ != null) {
+                size += 1 + pb::CodedOutputStream.ComputeMessageSize(MapSettings);
+              }
+              if (levelSettings_ != null) {
+                size += 1 + pb::CodedOutputStream.ComputeMessageSize(LevelSettings);
+              }
+              if (inventorySettings_ != null) {
+                size += 1 + pb::CodedOutputStream.ComputeMessageSize(InventorySettings);
+              }
+              if (MinimumClientVersion.Length != 0) {
+                size += 1 + pb::CodedOutputStream.ComputeStringSize(MinimumClientVersion);
+              }
+              return size;
+            }
+
+            public void MergeFrom(GlobalSettingsProto other) {
+              if (other == null) {
+                return;
+              }
+              if (other.fortSettings_ != null) {
+                if (fortSettings_ == null) {
+                  fortSettings_ = new global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Types.FortSettingsProto();
+                }
+                FortSettings.MergeFrom(other.FortSettings);
+              }
+              if (other.mapSettings_ != null) {
+                if (mapSettings_ == null) {
+                  mapSettings_ = new global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Types.MapSettingsProto();
+                }
+                MapSettings.MergeFrom(other.MapSettings);
+              }
+              if (other.levelSettings_ != null) {
+                if (levelSettings_ == null) {
+                  levelSettings_ = new global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Types.LevelSettingsProto();
+                }
+                LevelSettings.MergeFrom(other.LevelSettings);
+              }
+              if (other.inventorySettings_ != null) {
+                if (inventorySettings_ == null) {
+                  inventorySettings_ = new global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Types.InventorySettingsProto();
+                }
+                InventorySettings.MergeFrom(other.InventorySettings);
+              }
+              if (other.MinimumClientVersion.Length != 0) {
+                MinimumClientVersion = other.MinimumClientVersion;
+              }
+            }
+
+            public void MergeFrom(pb::CodedInputStream input) {
+              uint tag;
+              while ((tag = input.ReadTag()) != 0) {
+                switch(tag) {
+                  default:
+                    input.SkipLastField();
+                    break;
+                  case 18: {
+                    if (fortSettings_ == null) {
+                      fortSettings_ = new global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Types.FortSettingsProto();
+                    }
+                    input.ReadMessage(fortSettings_);
+                    break;
+                  }
+                  case 26: {
+                    if (mapSettings_ == null) {
+                      mapSettings_ = new global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Types.MapSettingsProto();
+                    }
+                    input.ReadMessage(mapSettings_);
+                    break;
+                  }
+                  case 34: {
+                    if (levelSettings_ == null) {
+                      levelSettings_ = new global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Types.LevelSettingsProto();
+                    }
+                    input.ReadMessage(levelSettings_);
+                    break;
+                  }
+                  case 42: {
+                    if (inventorySettings_ == null) {
+                      inventorySettings_ = new global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Types.InventorySettingsProto();
+                    }
+                    input.ReadMessage(inventorySettings_);
+                    break;
+                  }
+                  case 50: {
+                    MinimumClientVersion = input.ReadString();
+                    break;
+                  }
+                }
+              }
+            }
+
+          }
+
+          [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+          public sealed partial class FortSettingsProto : pb::IMessage<FortSettingsProto> {
+            private static readonly pb::MessageParser<FortSettingsProto> _parser = new pb::MessageParser<FortSettingsProto>(() => new FortSettingsProto());
+            public static pb::MessageParser<FortSettingsProto> Parser { get { return _parser; } }
+
+            public static pbr::MessageDescriptor Descriptor {
+              get { return global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Descriptor.NestedTypes[1]; }
+            }
+
+            pbr::MessageDescriptor pb::IMessage.Descriptor {
+              get { return Descriptor; }
+            }
+
+            public FortSettingsProto() {
+              OnConstruction();
+            }
+
+            partial void OnConstruction();
+
+            public FortSettingsProto(FortSettingsProto other) : this() {
+              interactionRangeMeters_ = other.interactionRangeMeters_;
+              maxTotalDeployedPokemon_ = other.maxTotalDeployedPokemon_;
+              maxPlayerDeployedPokemon_ = other.maxPlayerDeployedPokemon_;
+              deployStaminaMultiplier_ = other.deployStaminaMultiplier_;
+              deployAttackMultiplier_ = other.deployAttackMultiplier_;
+              farInteractionRangeMeters_ = other.farInteractionRangeMeters_;
+            }
+
+            public FortSettingsProto Clone() {
+              return new FortSettingsProto(this);
+            }
+
+            /// <summary>Field number for the "InteractionRangeMeters" field.</summary>
+            public const int InteractionRangeMetersFieldNumber = 1;
+            private double interactionRangeMeters_;
+            public double InteractionRangeMeters {
+              get { return interactionRangeMeters_; }
+              set {
+                interactionRangeMeters_ = value;
+              }
+            }
+
+            /// <summary>Field number for the "MaxTotalDeployedPokemon" field.</summary>
+            public const int MaxTotalDeployedPokemonFieldNumber = 2;
+            private int maxTotalDeployedPokemon_;
+            public int MaxTotalDeployedPokemon {
+              get { return maxTotalDeployedPokemon_; }
+              set {
+                maxTotalDeployedPokemon_ = value;
+              }
+            }
+
+            /// <summary>Field number for the "MaxPlayerDeployedPokemon" field.</summary>
+            public const int MaxPlayerDeployedPokemonFieldNumber = 3;
+            private int maxPlayerDeployedPokemon_;
+            public int MaxPlayerDeployedPokemon {
+              get { return maxPlayerDeployedPokemon_; }
+              set {
+                maxPlayerDeployedPokemon_ = value;
+              }
+            }
+
+            /// <summary>Field number for the "DeployStaminaMultiplier" field.</summary>
+            public const int DeployStaminaMultiplierFieldNumber = 4;
+            private double deployStaminaMultiplier_;
+            public double DeployStaminaMultiplier {
+              get { return deployStaminaMultiplier_; }
+              set {
+                deployStaminaMultiplier_ = value;
+              }
+            }
+
+            /// <summary>Field number for the "DeployAttackMultiplier" field.</summary>
+            public const int DeployAttackMultiplierFieldNumber = 5;
+            private double deployAttackMultiplier_;
+            public double DeployAttackMultiplier {
+              get { return deployAttackMultiplier_; }
+              set {
+                deployAttackMultiplier_ = value;
+              }
+            }
+
+            /// <summary>Field number for the "FarInteractionRangeMeters" field.</summary>
+            public const int FarInteractionRangeMetersFieldNumber = 6;
+            private double farInteractionRangeMeters_;
+            public double FarInteractionRangeMeters {
+              get { return farInteractionRangeMeters_; }
+              set {
+                farInteractionRangeMeters_ = value;
+              }
+            }
+
+            public override bool Equals(object other) {
+              return Equals(other as FortSettingsProto);
+            }
+
+            public bool Equals(FortSettingsProto other) {
+              if (ReferenceEquals(other, null)) {
+                return false;
+              }
+              if (ReferenceEquals(other, this)) {
+                return true;
+              }
+              if (InteractionRangeMeters != other.InteractionRangeMeters) return false;
+              if (MaxTotalDeployedPokemon != other.MaxTotalDeployedPokemon) return false;
+              if (MaxPlayerDeployedPokemon != other.MaxPlayerDeployedPokemon) return false;
+              if (DeployStaminaMultiplier != other.DeployStaminaMultiplier) return false;
+              if (DeployAttackMultiplier != other.DeployAttackMultiplier) return false;
+              if (FarInteractionRangeMeters != other.FarInteractionRangeMeters) return false;
+              return true;
+            }
+
+            public override int GetHashCode() {
+              int hash = 1;
+              if (InteractionRangeMeters != 0D) hash ^= InteractionRangeMeters.GetHashCode();
+              if (MaxTotalDeployedPokemon != 0) hash ^= MaxTotalDeployedPokemon.GetHashCode();
+              if (MaxPlayerDeployedPokemon != 0) hash ^= MaxPlayerDeployedPokemon.GetHashCode();
+              if (DeployStaminaMultiplier != 0D) hash ^= DeployStaminaMultiplier.GetHashCode();
+              if (DeployAttackMultiplier != 0D) hash ^= DeployAttackMultiplier.GetHashCode();
+              if (FarInteractionRangeMeters != 0D) hash ^= FarInteractionRangeMeters.GetHashCode();
+              return hash;
+            }
+
+            public override string ToString() {
+              return pb::JsonFormatter.ToDiagnosticString(this);
+            }
+
+            public void WriteTo(pb::CodedOutputStream output) {
+              if (InteractionRangeMeters != 0D) {
+                output.WriteRawTag(9);
+                output.WriteDouble(InteractionRangeMeters);
+              }
+              if (MaxTotalDeployedPokemon != 0) {
+                output.WriteRawTag(16);
+                output.WriteInt32(MaxTotalDeployedPokemon);
+              }
+              if (MaxPlayerDeployedPokemon != 0) {
+                output.WriteRawTag(24);
+                output.WriteInt32(MaxPlayerDeployedPokemon);
+              }
+              if (DeployStaminaMultiplier != 0D) {
+                output.WriteRawTag(33);
+                output.WriteDouble(DeployStaminaMultiplier);
+              }
+              if (DeployAttackMultiplier != 0D) {
+                output.WriteRawTag(41);
+                output.WriteDouble(DeployAttackMultiplier);
+              }
+              if (FarInteractionRangeMeters != 0D) {
+                output.WriteRawTag(49);
+                output.WriteDouble(FarInteractionRangeMeters);
+              }
+            }
+
+            public int CalculateSize() {
+              int size = 0;
+              if (InteractionRangeMeters != 0D) {
+                size += 1 + 8;
+              }
+              if (MaxTotalDeployedPokemon != 0) {
+                size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaxTotalDeployedPokemon);
+              }
+              if (MaxPlayerDeployedPokemon != 0) {
+                size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaxPlayerDeployedPokemon);
+              }
+              if (DeployStaminaMultiplier != 0D) {
+                size += 1 + 8;
+              }
+              if (DeployAttackMultiplier != 0D) {
+                size += 1 + 8;
+              }
+              if (FarInteractionRangeMeters != 0D) {
+                size += 1 + 8;
+              }
+              return size;
+            }
+
+            public void MergeFrom(FortSettingsProto other) {
+              if (other == null) {
+                return;
+              }
+              if (other.InteractionRangeMeters != 0D) {
+                InteractionRangeMeters = other.InteractionRangeMeters;
+              }
+              if (other.MaxTotalDeployedPokemon != 0) {
+                MaxTotalDeployedPokemon = other.MaxTotalDeployedPokemon;
+              }
+              if (other.MaxPlayerDeployedPokemon != 0) {
+                MaxPlayerDeployedPokemon = other.MaxPlayerDeployedPokemon;
+              }
+              if (other.DeployStaminaMultiplier != 0D) {
+                DeployStaminaMultiplier = other.DeployStaminaMultiplier;
+              }
+              if (other.DeployAttackMultiplier != 0D) {
+                DeployAttackMultiplier = other.DeployAttackMultiplier;
+              }
+              if (other.FarInteractionRangeMeters != 0D) {
+                FarInteractionRangeMeters = other.FarInteractionRangeMeters;
+              }
+            }
+
+            public void MergeFrom(pb::CodedInputStream input) {
+              uint tag;
+              while ((tag = input.ReadTag()) != 0) {
+                switch(tag) {
+                  default:
+                    input.SkipLastField();
+                    break;
+                  case 9: {
+                    InteractionRangeMeters = input.ReadDouble();
+                    break;
+                  }
+                  case 16: {
+                    MaxTotalDeployedPokemon = input.ReadInt32();
+                    break;
+                  }
+                  case 24: {
+                    MaxPlayerDeployedPokemon = input.ReadInt32();
+                    break;
+                  }
+                  case 33: {
+                    DeployStaminaMultiplier = input.ReadDouble();
+                    break;
+                  }
+                  case 41: {
+                    DeployAttackMultiplier = input.ReadDouble();
+                    break;
+                  }
+                  case 49: {
+                    FarInteractionRangeMeters = input.ReadDouble();
+                    break;
+                  }
+                }
+              }
+            }
+
+          }
+
+          [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+          public sealed partial class MapSettingsProto : pb::IMessage<MapSettingsProto> {
+            private static readonly pb::MessageParser<MapSettingsProto> _parser = new pb::MessageParser<MapSettingsProto>(() => new MapSettingsProto());
+            public static pb::MessageParser<MapSettingsProto> Parser { get { return _parser; } }
+
+            public static pbr::MessageDescriptor Descriptor {
+              get { return global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Descriptor.NestedTypes[2]; }
+            }
+
+            pbr::MessageDescriptor pb::IMessage.Descriptor {
+              get { return Descriptor; }
+            }
+
+            public MapSettingsProto() {
+              OnConstruction();
+            }
+
+            partial void OnConstruction();
+
+            public MapSettingsProto(MapSettingsProto other) : this() {
+              pokemonVisibleRange_ = other.pokemonVisibleRange_;
+              pokeNavRangeMeters_ = other.pokeNavRangeMeters_;
+              encounterRangeMeters_ = other.encounterRangeMeters_;
+              getMapObjectsMinRefreshSeconds_ = other.getMapObjectsMinRefreshSeconds_;
+              getMapObjectsMaxRefreshSeconds_ = other.getMapObjectsMaxRefreshSeconds_;
+              getMapObjectsMinDistanceMeters_ = other.getMapObjectsMinDistanceMeters_;
+              googleMapsApiKey_ = other.googleMapsApiKey_;
+            }
+
+            public MapSettingsProto Clone() {
+              return new MapSettingsProto(this);
+            }
+
+            /// <summary>Field number for the "PokemonVisibleRange" field.</summary>
+            public const int PokemonVisibleRangeFieldNumber = 1;
+            private double pokemonVisibleRange_;
+            public double PokemonVisibleRange {
+              get { return pokemonVisibleRange_; }
+              set {
+                pokemonVisibleRange_ = value;
+              }
+            }
+
+            /// <summary>Field number for the "PokeNavRangeMeters" field.</summary>
+            public const int PokeNavRangeMetersFieldNumber = 2;
+            private double pokeNavRangeMeters_;
+            public double PokeNavRangeMeters {
+              get { return pokeNavRangeMeters_; }
+              set {
+                pokeNavRangeMeters_ = value;
+              }
+            }
+
+            /// <summary>Field number for the "EncounterRangeMeters" field.</summary>
+            public const int EncounterRangeMetersFieldNumber = 3;
+            private double encounterRangeMeters_;
+            public double EncounterRangeMeters {
+              get { return encounterRangeMeters_; }
+              set {
+                encounterRangeMeters_ = value;
+              }
+            }
+
+            /// <summary>Field number for the "GetMapObjectsMinRefreshSeconds" field.</summary>
+            public const int GetMapObjectsMinRefreshSecondsFieldNumber = 4;
+            private float getMapObjectsMinRefreshSeconds_;
+            public float GetMapObjectsMinRefreshSeconds {
+              get { return getMapObjectsMinRefreshSeconds_; }
+              set {
+                getMapObjectsMinRefreshSeconds_ = value;
+              }
+            }
+
+            /// <summary>Field number for the "GetMapObjectsMaxRefreshSeconds" field.</summary>
+            public const int GetMapObjectsMaxRefreshSecondsFieldNumber = 5;
+            private float getMapObjectsMaxRefreshSeconds_;
+            public float GetMapObjectsMaxRefreshSeconds {
+              get { return getMapObjectsMaxRefreshSeconds_; }
+              set {
+                getMapObjectsMaxRefreshSeconds_ = value;
+              }
+            }
+
+            /// <summary>Field number for the "GetMapObjectsMinDistanceMeters" field.</summary>
+            public const int GetMapObjectsMinDistanceMetersFieldNumber = 6;
+            private float getMapObjectsMinDistanceMeters_;
+            public float GetMapObjectsMinDistanceMeters {
+              get { return getMapObjectsMinDistanceMeters_; }
+              set {
+                getMapObjectsMinDistanceMeters_ = value;
+              }
+            }
+
+            /// <summary>Field number for the "GoogleMapsApiKey" field.</summary>
+            public const int GoogleMapsApiKeyFieldNumber = 7;
+            private string googleMapsApiKey_ = "";
+            public string GoogleMapsApiKey {
+              get { return googleMapsApiKey_; }
+              set {
+                googleMapsApiKey_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+              }
+            }
+
+            public override bool Equals(object other) {
+              return Equals(other as MapSettingsProto);
+            }
+
+            public bool Equals(MapSettingsProto other) {
+              if (ReferenceEquals(other, null)) {
+                return false;
+              }
+              if (ReferenceEquals(other, this)) {
+                return true;
+              }
+              if (PokemonVisibleRange != other.PokemonVisibleRange) return false;
+              if (PokeNavRangeMeters != other.PokeNavRangeMeters) return false;
+              if (EncounterRangeMeters != other.EncounterRangeMeters) return false;
+              if (GetMapObjectsMinRefreshSeconds != other.GetMapObjectsMinRefreshSeconds) return false;
+              if (GetMapObjectsMaxRefreshSeconds != other.GetMapObjectsMaxRefreshSeconds) return false;
+              if (GetMapObjectsMinDistanceMeters != other.GetMapObjectsMinDistanceMeters) return false;
+              if (GoogleMapsApiKey != other.GoogleMapsApiKey) return false;
+              return true;
+            }
+
+            public override int GetHashCode() {
+              int hash = 1;
+              if (PokemonVisibleRange != 0D) hash ^= PokemonVisibleRange.GetHashCode();
+              if (PokeNavRangeMeters != 0D) hash ^= PokeNavRangeMeters.GetHashCode();
+              if (EncounterRangeMeters != 0D) hash ^= EncounterRangeMeters.GetHashCode();
+              if (GetMapObjectsMinRefreshSeconds != 0F) hash ^= GetMapObjectsMinRefreshSeconds.GetHashCode();
+              if (GetMapObjectsMaxRefreshSeconds != 0F) hash ^= GetMapObjectsMaxRefreshSeconds.GetHashCode();
+              if (GetMapObjectsMinDistanceMeters != 0F) hash ^= GetMapObjectsMinDistanceMeters.GetHashCode();
+              if (GoogleMapsApiKey.Length != 0) hash ^= GoogleMapsApiKey.GetHashCode();
+              return hash;
+            }
+
+            public override string ToString() {
+              return pb::JsonFormatter.ToDiagnosticString(this);
+            }
+
+            public void WriteTo(pb::CodedOutputStream output) {
+              if (PokemonVisibleRange != 0D) {
+                output.WriteRawTag(9);
+                output.WriteDouble(PokemonVisibleRange);
+              }
+              if (PokeNavRangeMeters != 0D) {
+                output.WriteRawTag(17);
+                output.WriteDouble(PokeNavRangeMeters);
+              }
+              if (EncounterRangeMeters != 0D) {
+                output.WriteRawTag(25);
+                output.WriteDouble(EncounterRangeMeters);
+              }
+              if (GetMapObjectsMinRefreshSeconds != 0F) {
+                output.WriteRawTag(37);
+                output.WriteFloat(GetMapObjectsMinRefreshSeconds);
+              }
+              if (GetMapObjectsMaxRefreshSeconds != 0F) {
+                output.WriteRawTag(45);
+                output.WriteFloat(GetMapObjectsMaxRefreshSeconds);
+              }
+              if (GetMapObjectsMinDistanceMeters != 0F) {
+                output.WriteRawTag(53);
+                output.WriteFloat(GetMapObjectsMinDistanceMeters);
+              }
+              if (GoogleMapsApiKey.Length != 0) {
+                output.WriteRawTag(58);
+                output.WriteString(GoogleMapsApiKey);
+              }
+            }
+
+            public int CalculateSize() {
+              int size = 0;
+              if (PokemonVisibleRange != 0D) {
+                size += 1 + 8;
+              }
+              if (PokeNavRangeMeters != 0D) {
+                size += 1 + 8;
+              }
+              if (EncounterRangeMeters != 0D) {
+                size += 1 + 8;
+              }
+              if (GetMapObjectsMinRefreshSeconds != 0F) {
+                size += 1 + 4;
+              }
+              if (GetMapObjectsMaxRefreshSeconds != 0F) {
+                size += 1 + 4;
+              }
+              if (GetMapObjectsMinDistanceMeters != 0F) {
+                size += 1 + 4;
+              }
+              if (GoogleMapsApiKey.Length != 0) {
+                size += 1 + pb::CodedOutputStream.ComputeStringSize(GoogleMapsApiKey);
+              }
+              return size;
+            }
+
+            public void MergeFrom(MapSettingsProto other) {
+              if (other == null) {
+                return;
+              }
+              if (other.PokemonVisibleRange != 0D) {
+                PokemonVisibleRange = other.PokemonVisibleRange;
+              }
+              if (other.PokeNavRangeMeters != 0D) {
+                PokeNavRangeMeters = other.PokeNavRangeMeters;
+              }
+              if (other.EncounterRangeMeters != 0D) {
+                EncounterRangeMeters = other.EncounterRangeMeters;
+              }
+              if (other.GetMapObjectsMinRefreshSeconds != 0F) {
+                GetMapObjectsMinRefreshSeconds = other.GetMapObjectsMinRefreshSeconds;
+              }
+              if (other.GetMapObjectsMaxRefreshSeconds != 0F) {
+                GetMapObjectsMaxRefreshSeconds = other.GetMapObjectsMaxRefreshSeconds;
+              }
+              if (other.GetMapObjectsMinDistanceMeters != 0F) {
+                GetMapObjectsMinDistanceMeters = other.GetMapObjectsMinDistanceMeters;
+              }
+              if (other.GoogleMapsApiKey.Length != 0) {
+                GoogleMapsApiKey = other.GoogleMapsApiKey;
+              }
+            }
+
+            public void MergeFrom(pb::CodedInputStream input) {
+              uint tag;
+              while ((tag = input.ReadTag()) != 0) {
+                switch(tag) {
+                  default:
+                    input.SkipLastField();
+                    break;
+                  case 9: {
+                    PokemonVisibleRange = input.ReadDouble();
+                    break;
+                  }
+                  case 17: {
+                    PokeNavRangeMeters = input.ReadDouble();
+                    break;
+                  }
+                  case 25: {
+                    EncounterRangeMeters = input.ReadDouble();
+                    break;
+                  }
+                  case 37: {
+                    GetMapObjectsMinRefreshSeconds = input.ReadFloat();
+                    break;
+                  }
+                  case 45: {
+                    GetMapObjectsMaxRefreshSeconds = input.ReadFloat();
+                    break;
+                  }
+                  case 53: {
+                    GetMapObjectsMinDistanceMeters = input.ReadFloat();
+                    break;
+                  }
+                  case 58: {
+                    GoogleMapsApiKey = input.ReadString();
+                    break;
+                  }
+                }
+              }
+            }
+
+          }
+
+          [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+          public sealed partial class LevelSettingsProto : pb::IMessage<LevelSettingsProto> {
+            private static readonly pb::MessageParser<LevelSettingsProto> _parser = new pb::MessageParser<LevelSettingsProto>(() => new LevelSettingsProto());
+            public static pb::MessageParser<LevelSettingsProto> Parser { get { return _parser; } }
+
+            public static pbr::MessageDescriptor Descriptor {
+              get { return global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Descriptor.NestedTypes[3]; }
+            }
+
+            pbr::MessageDescriptor pb::IMessage.Descriptor {
+              get { return Descriptor; }
+            }
+
+            public LevelSettingsProto() {
+              OnConstruction();
+            }
+
+            partial void OnConstruction();
+
+            public LevelSettingsProto(LevelSettingsProto other) : this() {
+              trainerCpModifier_ = other.trainerCpModifier_;
+              trainerDifficultyModifier_ = other.trainerDifficultyModifier_;
+            }
+
+            public LevelSettingsProto Clone() {
+              return new LevelSettingsProto(this);
+            }
+
+            /// <summary>Field number for the "TrainerCpModifier" field.</summary>
+            public const int TrainerCpModifierFieldNumber = 2;
+            private double trainerCpModifier_;
+            public double TrainerCpModifier {
+              get { return trainerCpModifier_; }
+              set {
+                trainerCpModifier_ = value;
+              }
+            }
+
+            /// <summary>Field number for the "TrainerDifficultyModifier" field.</summary>
+            public const int TrainerDifficultyModifierFieldNumber = 3;
+            private double trainerDifficultyModifier_;
+            public double TrainerDifficultyModifier {
+              get { return trainerDifficultyModifier_; }
+              set {
+                trainerDifficultyModifier_ = value;
+              }
+            }
+
+            public override bool Equals(object other) {
+              return Equals(other as LevelSettingsProto);
+            }
+
+            public bool Equals(LevelSettingsProto other) {
+              if (ReferenceEquals(other, null)) {
+                return false;
+              }
+              if (ReferenceEquals(other, this)) {
+                return true;
+              }
+              if (TrainerCpModifier != other.TrainerCpModifier) return false;
+              if (TrainerDifficultyModifier != other.TrainerDifficultyModifier) return false;
+              return true;
+            }
+
+            public override int GetHashCode() {
+              int hash = 1;
+              if (TrainerCpModifier != 0D) hash ^= TrainerCpModifier.GetHashCode();
+              if (TrainerDifficultyModifier != 0D) hash ^= TrainerDifficultyModifier.GetHashCode();
+              return hash;
+            }
+
+            public override string ToString() {
+              return pb::JsonFormatter.ToDiagnosticString(this);
+            }
+
+            public void WriteTo(pb::CodedOutputStream output) {
+              if (TrainerCpModifier != 0D) {
+                output.WriteRawTag(17);
+                output.WriteDouble(TrainerCpModifier);
+              }
+              if (TrainerDifficultyModifier != 0D) {
+                output.WriteRawTag(25);
+                output.WriteDouble(TrainerDifficultyModifier);
+              }
+            }
+
+            public int CalculateSize() {
+              int size = 0;
+              if (TrainerCpModifier != 0D) {
+                size += 1 + 8;
+              }
+              if (TrainerDifficultyModifier != 0D) {
+                size += 1 + 8;
+              }
+              return size;
+            }
+
+            public void MergeFrom(LevelSettingsProto other) {
+              if (other == null) {
+                return;
+              }
+              if (other.TrainerCpModifier != 0D) {
+                TrainerCpModifier = other.TrainerCpModifier;
+              }
+              if (other.TrainerDifficultyModifier != 0D) {
+                TrainerDifficultyModifier = other.TrainerDifficultyModifier;
+              }
+            }
+
+            public void MergeFrom(pb::CodedInputStream input) {
+              uint tag;
+              while ((tag = input.ReadTag()) != 0) {
+                switch(tag) {
+                  default:
+                    input.SkipLastField();
+                    break;
+                  case 17: {
+                    TrainerCpModifier = input.ReadDouble();
+                    break;
+                  }
+                  case 25: {
+                    TrainerDifficultyModifier = input.ReadDouble();
+                    break;
+                  }
+                }
+              }
+            }
+
+          }
+
+          [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+          public sealed partial class InventorySettingsProto : pb::IMessage<InventorySettingsProto> {
+            private static readonly pb::MessageParser<InventorySettingsProto> _parser = new pb::MessageParser<InventorySettingsProto>(() => new InventorySettingsProto());
+            public static pb::MessageParser<InventorySettingsProto> Parser { get { return _parser; } }
+
+            public static pbr::MessageDescriptor Descriptor {
+              get { return global::PokemonGo.RocketAPI.GeneratedCode.SettingsResponse.Types.Payload.Descriptor.NestedTypes[4]; }
+            }
+
+            pbr::MessageDescriptor pb::IMessage.Descriptor {
+              get { return Descriptor; }
+            }
+
+            public InventorySettingsProto() {
+              OnConstruction();
+            }
+
+            partial void OnConstruction();
+
+            public InventorySettingsProto(InventorySettingsProto other) : this() {
+              maxPokemon_ = other.maxPokemon_;
+              maxBagItems_ = other.maxBagItems_;
+              basePokemon_ = other.basePokemon_;
+              baseBagItems_ = other.baseBagItems_;
+              baseEggs_ = other.baseEggs_;
+            }
+
+            public InventorySettingsProto Clone() {
+              return new InventorySettingsProto(this);
+            }
+
+            /// <summary>Field number for the "MaxPokemon" field.</summary>
+            public const int MaxPokemonFieldNumber = 1;
+            private int maxPokemon_;
+            public int MaxPokemon {
+              get { return maxPokemon_; }
+              set {
+                maxPokemon_ = value;
+              }
+            }
+
+            /// <summary>Field number for the "MaxBagItems" field.</summary>
+            public const int MaxBagItemsFieldNumber = 2;
+            private int maxBagItems_;
+            public int MaxBagItems {
+              get { return maxBagItems_; }
+              set {
+                maxBagItems_ = value;
+              }
+            }
+
+            /// <summary>Field number for the "BasePokemon" field.</summary>
+            public const int BasePokemonFieldNumber = 3;
+            private int basePokemon_;
+            public int BasePokemon {
+              get { return basePokemon_; }
+              set {
+                basePokemon_ = value;
+              }
+            }
+
+            /// <summary>Field number for the "BaseBagItems" field.</summary>
+            public const int BaseBagItemsFieldNumber = 4;
+            private int baseBagItems_;
+            public int BaseBagItems {
+              get { return baseBagItems_; }
+              set {
+                baseBagItems_ = value;
+              }
+            }
+
+            /// <summary>Field number for the "BaseEggs" field.</summary>
+            public const int BaseEggsFieldNumber = 5;
+            private int baseEggs_;
+            public int BaseEggs {
+              get { return baseEggs_; }
+              set {
+                baseEggs_ = value;
+              }
+            }
+
+            public override bool Equals(object other) {
+              return Equals(other as InventorySettingsProto);
+            }
+
+            public bool Equals(InventorySettingsProto other) {
+              if (ReferenceEquals(other, null)) {
+                return false;
+              }
+              if (ReferenceEquals(other, this)) {
+                return true;
+              }
+              if (MaxPokemon != other.MaxPokemon) return false;
+              if (MaxBagItems != other.MaxBagItems) return false;
+              if (BasePokemon != other.BasePokemon) return false;
+              if (BaseBagItems != other.BaseBagItems) return false;
+              if (BaseEggs != other.BaseEggs) return false;
+              return true;
+            }
+
+            public override int GetHashCode() {
+              int hash = 1;
+              if (MaxPokemon != 0) hash ^= MaxPokemon.GetHashCode();
+              if (MaxBagItems != 0) hash ^= MaxBagItems.GetHashCode();
+              if (BasePokemon != 0) hash ^= BasePokemon.GetHashCode();
+              if (BaseBagItems != 0) hash ^= BaseBagItems.GetHashCode();
+              if (BaseEggs != 0) hash ^= BaseEggs.GetHashCode();
+              return hash;
+            }
+
+            public override string ToString() {
+              return pb::JsonFormatter.ToDiagnosticString(this);
+            }
+
+            public void WriteTo(pb::CodedOutputStream output) {
+              if (MaxPokemon != 0) {
+                output.WriteRawTag(8);
+                output.WriteInt32(MaxPokemon);
+              }
+              if (MaxBagItems != 0) {
+                output.WriteRawTag(16);
+                output.WriteInt32(MaxBagItems);
+              }
+              if (BasePokemon != 0) {
+                output.WriteRawTag(24);
+                output.WriteInt32(BasePokemon);
+              }
+              if (BaseBagItems != 0) {
+                output.WriteRawTag(32);
+                output.WriteInt32(BaseBagItems);
+              }
+              if (BaseEggs != 0) {
+                output.WriteRawTag(40);
+                output.WriteInt32(BaseEggs);
+              }
+            }
+
+            public int CalculateSize() {
+              int size = 0;
+              if (MaxPokemon != 0) {
+                size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaxPokemon);
+              }
+              if (MaxBagItems != 0) {
+                size += 1 + pb::CodedOutputStream.ComputeInt32Size(MaxBagItems);
+              }
+              if (BasePokemon != 0) {
+                size += 1 + pb::CodedOutputStream.ComputeInt32Size(BasePokemon);
+              }
+              if (BaseBagItems != 0) {
+                size += 1 + pb::CodedOutputStream.ComputeInt32Size(BaseBagItems);
+              }
+              if (BaseEggs != 0) {
+                size += 1 + pb::CodedOutputStream.ComputeInt32Size(BaseEggs);
+              }
+              return size;
+            }
+
+            public void MergeFrom(InventorySettingsProto other) {
+              if (other == null) {
+                return;
+              }
+              if (other.MaxPokemon != 0) {
+                MaxPokemon = other.MaxPokemon;
+              }
+              if (other.MaxBagItems != 0) {
+                MaxBagItems = other.MaxBagItems;
+              }
+              if (other.BasePokemon != 0) {
+                BasePokemon = other.BasePokemon;
+              }
+              if (other.BaseBagItems != 0) {
+                BaseBagItems = other.BaseBagItems;
+              }
+              if (other.BaseEggs != 0) {
+                BaseEggs = other.BaseEggs;
+              }
+            }
+
+            public void MergeFrom(pb::CodedInputStream input) {
+              uint tag;
+              while ((tag = input.ReadTag()) != 0) {
+                switch(tag) {
+                  default:
+                    input.SkipLastField();
+                    break;
+                  case 8: {
+                    MaxPokemon = input.ReadInt32();
+                    break;
+                  }
+                  case 16: {
+                    MaxBagItems = input.ReadInt32();
+                    break;
+                  }
+                  case 24: {
+                    BasePokemon = input.ReadInt32();
+                    break;
+                  }
+                  case 32: {
+                    BaseBagItems = input.ReadInt32();
+                    break;
+                  }
+                  case 40: {
+                    BaseEggs = input.ReadInt32();
+                    break;
+                  }
+                }
+              }
+            }
+
+          }
+
+        }
+        #endregion
+
+      }
+
+    }
+    #endregion
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/PokemonGo/RocketAPI/PokemonGo.RocketAPI.csproj b/PokemonGo/RocketAPI/PokemonGo.RocketAPI.csproj
index 6dcd628..2cc2931 100644
--- a/PokemonGo/RocketAPI/PokemonGo.RocketAPI.csproj
+++ b/PokemonGo/RocketAPI/PokemonGo.RocketAPI.csproj
@@ -65,6 +65,7 @@
   <ItemGroup>
     <Compile Include="Enums\RequestType.cs" />
     <Compile Include="GeneratedCode\Request.cs" />
+    <Compile Include="GeneratedCode\SettingsResponse.cs" />
     <Compile Include="Settings.cs" />
     <None Include="app.config" />
     <Compile Include="Client.cs" />
@@ -77,6 +78,7 @@
   </ItemGroup>
   <ItemGroup>
     <None Include="packages.config" />
+    <None Include="Proto\SettingsResponse.proto" />
     <None Include="Proto\Request.proto" />
   </ItemGroup>
   <ItemGroup>
diff --git a/PokemonGo/RocketAPI/Proto/ProfileResponse.proto b/PokemonGo/RocketAPI/Proto/ProfileResponse.proto
index 6e4dd93..55120a4 100644
--- a/PokemonGo/RocketAPI/Proto/ProfileResponse.proto
+++ b/PokemonGo/RocketAPI/Proto/ProfileResponse.proto
@@ -62,42 +62,6 @@ message ProfileResponse {
       string type = 1;
       int32 amount = 2;
     }
-  }
-
-	  message GlobalSettingsProto {
-		FortSettingsProto FortSettings = 2;
-		MapSettingsProto MapSettings = 3;
-		LevelSettingsProto LevelSettings = 4;
-		InventorySettingsProto InventorySettings = 5;
-		string MinimumClientVersion = 6;
-	 }
-	 message FortSettingsProto {
-		double InteractionRangeMeters = 1;
-		int32 MaxTotalDeployedPokemon = 2;
-		int32 MaxPlayerDeployedPokemon = 3;
-		double DeployStaminaMultiplier = 4;
-		double DeployAttackMultiplier = 5;
-		double FarInteractionRangeMeters = 6;
-	 }
-	 message MapSettingsProto {
-		double PokemonVisibleRange = 1;
-		double PokeNavRangeMeters = 2;
-		double EncounterRangeMeters = 3;
-		float GetMapObjectsMinRefreshSeconds = 4;
-		float GetMapObjectsMaxRefreshSeconds = 5;
-		float GetMapObjectsMinDistanceMeters = 6;
-		string GoogleMapsApiKey = 7;
-	 }
-	 message LevelSettingsProto {
-		double TrainerCpModifier = 2;
-		double TrainerDifficultyModifier = 3;
-	 }
-	 message InventorySettingsProto {
-		int32 MaxPokemon = 1;
-		int32 MaxBagItems = 2;
-		int32 BasePokemon = 3;
-		int32 BaseBagItems = 4;
-		int32 BaseEggs = 5;
-	 }
-	}
+}
+}
 }
\ No newline at end of file
diff --git a/PokemonGo/RocketAPI/Proto/SettingsResponse.proto b/PokemonGo/RocketAPI/Proto/SettingsResponse.proto
new file mode 100644
index 0000000..da188ec
--- /dev/null
+++ b/PokemonGo/RocketAPI/Proto/SettingsResponse.proto
@@ -0,0 +1,70 @@
+syntax = "proto3";
+
+package PokemonGo.RocketAPI.GeneratedCode;
+
+message SettingsResponse {
+  int32 unknown1 = 1;
+  int64 unknown2 = 2;
+  string api_url = 3;
+  Unknown6 unknown6 = 6;
+  Unknown7 unknown7 = 7;
+  repeated Payload payload = 100;
+  string errorMessage = 101; //Should be moved to an error-proto file if error is always 101 field
+
+  message Unknown6 {
+    int32 unknown1 = 1;
+    Unknown2 unknown2 = 2;
+
+    message Unknown2 {
+      bytes unknown1 = 1;
+    }
+
+  }
+
+  message Unknown7 {
+    bytes unknown71 = 1;
+    int64 unknown72 = 2;
+    bytes unknown73 = 3;
+  }
+
+  message Payload {
+    string guid = 2;
+	GlobalSettingsProto settings = 3;
+
+	  message GlobalSettingsProto {
+		FortSettingsProto FortSettings = 2;
+		MapSettingsProto MapSettings = 3;
+		LevelSettingsProto LevelSettings = 4;
+		InventorySettingsProto InventorySettings = 5;
+		string MinimumClientVersion = 6;
+	 }
+	 message FortSettingsProto {
+		double InteractionRangeMeters = 1;
+		int32 MaxTotalDeployedPokemon = 2;
+		int32 MaxPlayerDeployedPokemon = 3;
+		double DeployStaminaMultiplier = 4;
+		double DeployAttackMultiplier = 5;
+		double FarInteractionRangeMeters = 6;
+	 }
+	 message MapSettingsProto {
+		double PokemonVisibleRange = 1;
+		double PokeNavRangeMeters = 2;
+		double EncounterRangeMeters = 3;
+		float GetMapObjectsMinRefreshSeconds = 4;
+		float GetMapObjectsMaxRefreshSeconds = 5;
+		float GetMapObjectsMinDistanceMeters = 6;
+		string GoogleMapsApiKey = 7;
+	 }
+	 message LevelSettingsProto {
+		double TrainerCpModifier = 2;
+		double TrainerDifficultyModifier = 3;
+	 }
+	 message InventorySettingsProto {
+		int32 MaxPokemon = 1;
+		int32 MaxBagItems = 2;
+		int32 BasePokemon = 3;
+		int32 BaseBagItems = 4;
+		int32 BaseEggs = 5;
+	 }
+	}
+}
\ No newline at end of file
diff --git a/README.md b/README.md
index a55f633..cb48285 100644
--- a/README.md
+++ b/README.md
@@ -6,8 +6,11 @@ Working:

 -Retrieve Profile:

-```{{ "unknown1": 1, "profile": { "creationTime": "1467979220161", "username": "FeroxRev", "team": 1, "tutorial": "AAEDBAc=", "avatar": { "unknown3": 1, "unknown9": 4 }, "pokeStorage": 250, "itemStorage": 350, "dailyBonus": { }, "currency": [ { "type": "POKECOIN" }, { "type": "STARDUST", "amount": 5300 } ] } }}```
+```{{ "unknown1": 1, "profile": { "creationTime": "1467979220181", "username": "SEKRET", "team": 1, "tutorial": "AAEDBAc=", "avatar": { "unknown3": 1, "unknown9": 4 }, "pokeStorage": 250, "itemStorage": 350, "dailyBonus": { }, "currency": [ { "type": "POKECOIN" }, { "type": "STARDUST", "amount": 5300 } ] } }}```

+-Retrieve Server Settings
+
+```{{ "fortSettings": { "interactionRangeMeters": 40, "maxTotalDeployedPokemon": 10, "maxPlayerDeployedPokemon": 1, "deployStaminaMultiplier": 2, "farInteractionRangeMeters": 1000 }, "mapSettings": { "pokemonVisibleRange": 100, "pokeNavRangeMeters": 201, "encounterRangeMeters": 50, "getMapObjectsMinRefreshSeconds": 5, "getMapObjectsMaxRefreshSeconds": 30, "getMapObjectsMinDistanceMeters": 10, "googleMapsApiKey": "AIzaSyDF9rksdsdsgVFzjnNo13WtmJIM" }, "inventorySettings": { "maxPokemon": 1000, "maxBagItems": 1000, "basePokemon": 250, "baseBagItems": 350, "baseEggs": 9 }, "minimumClientVersion": "0.29.0" }}```

 Todo:
You may download the files in Public Git.