Index: trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service.Host/ExternalEvaluation.Service.Host.csproj
===================================================================
--- trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service.Host/ExternalEvaluation.Service.Host.csproj	(revision 15014)
+++ trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service.Host/ExternalEvaluation.Service.Host.csproj	(revision 15014)
@@ -0,0 +1,133 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{C08BC223-0B50-40DB-A646-2AE083FFA189}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>ExternalEvaluation.Service.Host</RootNamespace>
+    <AssemblyName>ExternalEvaluation.Service.Host</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+    <FileAlignment>512</FileAlignment>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <PlatformTarget>x86</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+    <RunCodeAnalysis>false</RunCodeAnalysis>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <PlatformTarget>x86</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+    <RunCodeAnalysis>false</RunCodeAnalysis>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\ExternalEvaluation.Service.Host.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+    <RunCodeAnalysis>false</RunCodeAnalysis>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\ExternalEvaluation.Service.Host.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+    <RunCodeAnalysis>false</RunCodeAnalysis>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Google.ProtocolBuffers-2.4.1.473">
+      <HintPath>..\Google.ProtocolBuffers-2.4.1.473.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\ExternalEvaluation.Service\ExternalEvaluation.Service.csproj">
+      <Project>{79C76C35-4D81-4E8F-BC0A-15A1C435A112}</Project>
+      <Name>ExternalEvaluation.Service</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="app.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service.Host/Program.cs
===================================================================
--- trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service.Host/Program.cs	(revision 15014)
+++ trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service.Host/Program.cs	(revision 15014)
@@ -0,0 +1,24 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Problems.ExternalEvaluation.Service;
+using Google.ProtocolBuffers;
+
+namespace ExternalEvaluation.Service.Host {
+  class Program {
+    static void Main(string[] args) {
+      ServerSocketListenerFactory socket = new ServerSocketListenerFactory(9991);
+      PollService service = new PollService(socket);
+      service.Start();
+      while (true) {
+        Console.WriteLine("Waiting for message...");
+        var solution = service.GetSolution();
+        if (solution == null) break;
+        Console.WriteLine("Received: " + solution.SolutionId);
+        service.SendQuality(solution, 1);
+        Console.WriteLine("Replied!");
+      }
+    }
+  }
+}
Index: trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service.Host/Properties/AssemblyInfo.cs
===================================================================
--- trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service.Host/Properties/AssemblyInfo.cs	(revision 15014)
+++ trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service.Host/Properties/AssemblyInfo.cs	(revision 15014)
@@ -0,0 +1,36 @@
+﻿using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("ExternalEvaluation.Service.Host")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("ExternalEvaluation.Service.Host")]
+[assembly: AssemblyCopyright("Copyright © Microsoft 2010")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("d4052345-eb94-4972-b371-4b0cfe323350")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
Index: trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service.Host/app.config
===================================================================
--- trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service.Host/app.config	(revision 15014)
+++ trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service.Host/app.config	(revision 15014)
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<configuration>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/></startup></configuration>
Index: trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/BlockingQueue.cs
===================================================================
--- trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/BlockingQueue.cs	(revision 15014)
+++ trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/BlockingQueue.cs	(revision 15014)
@@ -0,0 +1,98 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.Service {
+  internal class BlockingQueue<T> {
+    private readonly Queue<T> queue = new Queue<T>();
+    private readonly int maxSize;
+    private bool closing;
+    public BlockingQueue(int maxSize) { this.maxSize = maxSize; }
+    
+    public void Enqueue(T item) {
+      lock (queue) {
+        while (queue.Count >= maxSize) {
+          Monitor.Wait(queue);
+        }
+        if (closing) throw new QueueClosedException();
+        queue.Enqueue(item);
+        if (queue.Count == 1) {
+          // wake up any blocked dequeue
+          Monitor.PulseAll(queue);
+        }
+      }
+    }
+    public T Dequeue() {
+      lock (queue) {
+        while (queue.Count == 0) {
+          Monitor.Wait(queue);
+        }
+        if (closing) throw new QueueClosedException();
+        T item = queue.Dequeue();
+        if (queue.Count == maxSize - 1) {
+          // wake up any blocked enqueue
+          Monitor.PulseAll(queue);
+        }
+        return item;
+      }
+    }
+    public void Close() {
+      lock (queue) {
+        closing = true;
+        Monitor.PulseAll(queue);
+      }
+    }
+    public bool TryDequeue(out T value) {
+      lock (queue) {
+        while (queue.Count == 0) {
+          if (closing) {
+            value = default(T);
+            return false;
+          }
+          Monitor.Wait(queue);
+        }
+        value = queue.Dequeue();
+        if (queue.Count == maxSize - 1) {
+          // wake up any blocked enqueue
+          Monitor.PulseAll(queue);
+        }
+        return true;
+      }
+    }
+
+    public void Clear() {
+      lock (queue) {
+        queue.Clear();
+      }
+    }
+  }
+
+  internal class QueueClosedException : Exception {
+    public QueueClosedException() : base() { }
+    public QueueClosedException(string message) : base(message) { }
+    public QueueClosedException(string message, Exception innerException) : base(message, innerException) { }
+  }
+}
Index: trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/Channel.cs
===================================================================
--- trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/Channel.cs	(revision 15014)
+++ trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/Channel.cs	(revision 15014)
@@ -0,0 +1,51 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Google.ProtocolBuffers;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.Service {
+  public abstract class Channel : IChannel {
+    protected bool initialized;
+
+    protected Channel() {
+    }
+
+    public bool IsInitialized {
+      get { return initialized; }
+    }
+
+    public virtual void Open() {
+      initialized = true;
+    }
+
+    public abstract void Send(IMessage msg);
+
+    public abstract IMessage Receive(IBuilder builder);
+
+    public virtual void Close() {
+      initialized = false;
+    }
+  }
+}
Index: trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/ClassDiagram1.cd
===================================================================
--- trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/ClassDiagram1.cd	(revision 15014)
+++ trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/ClassDiagram1.cd	(revision 15014)
@@ -0,0 +1,134 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<ClassDiagram MajorVersion="1" MinorVersion="1">
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.Service.BlockingQueue&lt;T&gt;" Collapsed="true">
+    <Position X="9" Y="3.75" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AABAAAABAAAAAAAAAABEAAAAAAACBAAAAAAAAADAAAA=</HashCode>
+      <FileName>BlockingQueue.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.Service.QueueClosedException" Collapsed="true">
+    <Position X="10.75" Y="1.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
+      <FileName>BlockingQueue.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.Service.Channel" Collapsed="true">
+    <Position X="0.5" Y="0.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAABAAIAAAAEAAAAAAAAAAAAAQAAAABACAAAA=</HashCode>
+      <FileName>Channel.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.Service.EventArgs&lt;T&gt;" Collapsed="true">
+    <Position X="10.75" Y="0.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAgAAAAAAA=</HashCode>
+      <FileName>EventArgs.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.Service.PollService">
+    <Position X="5.5" Y="1.75" Width="2" />
+    <TypeIdentifier>
+      <HashCode>IAAAAAAAAAgAEAAAAAAAAAAAAAAAQAAAIAAAAAAAEAA=</HashCode>
+      <FileName>PollService.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.Service.ServerSocketListener" BaseTypeListCollapsed="true">
+    <Position X="2.75" Y="1.75" Width="2" />
+    <TypeIdentifier>
+      <HashCode>AAAgAAABAQAAAEIAAAAAAAAAAAAAQAgAIAAAAAAAAAI=</HashCode>
+      <FileName>ServerSocketListener.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" Collapsed="true" />
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.Service.ServerSocketListenerFactory" Collapsed="true" BaseTypeListCollapsed="true">
+    <Position X="9.5" Y="4.75" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAIAAAAAAAAAAAAAAAAgAAAAAAAAAIAA=</HashCode>
+      <FileName>ServerSocketListenerFactory.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" Collapsed="true" />
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.Service.Service" Collapsed="true">
+    <Position X="5.75" Y="0.5" Width="1.5" />
+    <NestedTypes>
+      <Class Name="HeuristicLab.Problems.ExternalEvaluation.Service.Service.SolutionProducer" Collapsed="true">
+        <TypeIdentifier>
+          <NewMemberFileName>Service.cs</NewMemberFileName>
+        </TypeIdentifier>
+      </Class>
+    </NestedTypes>
+    <TypeIdentifier>
+      <HashCode>AAIABAAAACAAAAAAAEAAAAAAAJAAQAAAKAAQAAAAAAA=</HashCode>
+      <FileName>Service.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.Service.StreamChannel">
+    <Position X="0.5" Y="1.75" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAIAAAAMAAQAAACAAAABAQAAAAAACAAAA=</HashCode>
+      <FileName>StreamChannel.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages" Collapsed="true">
+    <Position X="9" Y="2.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>iIIAACAAAEAFCSBAAAECQgAAACBAgAAQAAABAAQAIIA=</HashCode>
+      <FileName>ExternalEvaluationMessages.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.SolutionMessage" Collapsed="true">
+    <Position X="10.75" Y="2.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>XGEAApEgkUOSJEQREEkgQAFBQRQHASKyAQ0CDCQAoAA=</HashCode>
+      <FileName>ExternalEvaluationMessages.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.QualityMessage" Collapsed="true">
+    <Position X="9" Y="1.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>VGAAgAAgAMEAIABAAAggAAEAAIABAgIwAAgADAAAgAA=</HashCode>
+      <FileName>ExternalEvaluationMessages.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.EvaluationService" Collapsed="true" BaseTypeListCollapsed="true">
+    <Position X="9" Y="0.5" Width="1.5" />
+    <NestedTypes>
+      <Class Name="HeuristicLab.Problems.ExternalEvaluation.EvaluationService.Stub" Collapsed="true">
+        <TypeIdentifier>
+          <NewMemberFileName>ExternalEvaluationMessages.cs</NewMemberFileName>
+        </TypeIdentifier>
+      </Class>
+    </NestedTypes>
+    <TypeIdentifier>
+      <HashCode>AAAAAAAgAEAAAAAAAAIAAgAAAAAAAAAAAAAAAAEAgIA=</HashCode>
+      <FileName>ExternalEvaluationMessages.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" Collapsed="true" />
+  </Class>
+  <Interface Name="HeuristicLab.Problems.ExternalEvaluation.Service.IChannel" Collapsed="true">
+    <Position X="2.25" Y="0.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAIAAAAEAAAAAAAAAAAAAQAAAABACAAAA=</HashCode>
+      <FileName>Interfaces\IChannel.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Problems.ExternalEvaluation.Service.IListener" Collapsed="true">
+    <Position X="4" Y="0.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAABAAAAAEAAAAAAAAAAAAAAAAAAIAAAAAAAAAA=</HashCode>
+      <FileName>Interfaces\IListener.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Problems.ExternalEvaluation.Service.IListenerFactory" Collapsed="true">
+    <Position X="10.75" Y="3.75" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAA=</HashCode>
+      <FileName>Interfaces\IListenerFactory.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Font Name="Segoe UI" Size="9" />
+</ClassDiagram>
Index: trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/EventArgs.cs
===================================================================
--- trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/EventArgs.cs	(revision 15014)
+++ trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/EventArgs.cs	(revision 15014)
@@ -0,0 +1,38 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.Service {
+  public class EventArgs<T> : EventArgs {
+    private T myValue;
+    public T Value {
+      get { return myValue; }
+    }
+
+    public EventArgs(T value) {
+      myValue = value;
+    }
+  }
+}
Index: trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/ExternalEvaluation.Service.csproj
===================================================================
--- trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/ExternalEvaluation.Service.csproj	(revision 15014)
+++ trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/ExternalEvaluation.Service.csproj	(revision 15014)
@@ -0,0 +1,124 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{79C76C35-4D81-4E8F-BC0A-15A1C435A112}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.ExternalEvaluation.Service</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.ExternalEvaluation.Service-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\HL3ExternalEvaluation.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>bin\x86\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\HL3ExternalEvaluation.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Google.ProtocolBuffers-2.4.1.473">
+      <HintPath>..\Google.ProtocolBuffers-2.4.1.473.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="BlockingQueue.cs" />
+    <Compile Include="Channel.cs" />
+    <Compile Include="EventArgs.cs" />
+    <Compile Include="ExternalEvaluationMessages.cs" />
+    <Compile Include="Interfaces\IListenerFactory.cs" />
+    <Compile Include="Interfaces\IChannel.cs" />
+    <Compile Include="Interfaces\IListener.cs" />
+    <Compile Include="ServerSocketListener.cs" />
+    <Compile Include="PollService.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="ServerSocketListenerFactory.cs" />
+    <Compile Include="Service.cs" />
+    <Compile Include="StreamChannel.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="ClassDiagram1.cd" />
+    <None Include="ExternalEvaluationMessages.proto" />
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+"$(SolutionDir)ProtoGen.exe" --proto_path="$(SolutionDir)" "$(ProjectDir)ExternalEvaluationMessages.proto" --include_imports -output_directory="$(ProjectDir)"
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/ExternalEvaluationMessages.cs
===================================================================
--- trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/ExternalEvaluationMessages.cs	(revision 15014)
+++ trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/ExternalEvaluationMessages.cs	(revision 15014)
@@ -0,0 +1,4541 @@
+// Generated by ProtoGen, Version=2.4.1.473, Culture=neutral, PublicKeyToken=17b3b1f090c3ea48.  DO NOT EDIT!
+#pragma warning disable 1591, 0612
+#region Designer generated code
+
+using pb = global::Google.ProtocolBuffers;
+using pbc = global::Google.ProtocolBuffers.Collections;
+using pbd = global::Google.ProtocolBuffers.Descriptors;
+using scg = global::System.Collections.Generic;
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+  public static partial class ExternalEvaluationMessages {
+  
+    #region Extension registration
+    public static void RegisterAllExtensions(pb::ExtensionRegistry registry) {
+    }
+    #endregion
+    #region Static variables
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerVariable__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerVariable__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerArrayVariable__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerArrayVariable__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleVariable__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleVariable__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleArrayVariable__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleArrayVariable__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolVariable__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolVariable__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolArrayVariable__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolArrayVariable__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringVariable__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringVariable__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringArrayVariable__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringArrayVariable__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_RawVariable__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_RawVariable__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_QualityMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.QualityMessage, global::HeuristicLab.Problems.ExternalEvaluation.QualityMessage.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_QualityMessage__FieldAccessorTable;
+    #endregion
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbd::FileDescriptor descriptor;
+    
+    static ExternalEvaluationMessages() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          "CjtFeHRlcm5hbEV2YWx1YXRpb24uU2VydmljZS9FeHRlcm5hbEV2YWx1YXRp" + 
+          "b25NZXNzYWdlcy5wcm90bxIoSGV1cmlzdGljTGFiLlByb2JsZW1zLkV4dGVy" + 
+          "bmFsRXZhbHVhdGlvbiL+CgoPU29sdXRpb25NZXNzYWdlEhIKCnNvbHV0aW9u" + 
+          "SWQYASACKAUSXgoLaW50ZWdlclZhcnMYAiADKAsySS5IZXVyaXN0aWNMYWIu" + 
+          "UHJvYmxlbXMuRXh0ZXJuYWxFdmFsdWF0aW9uLlNvbHV0aW9uTWVzc2FnZS5J" + 
+          "bnRlZ2VyVmFyaWFibGUSaAoQaW50ZWdlckFycmF5VmFycxgDIAMoCzJOLkhl" + 
+          "dXJpc3RpY0xhYi5Qcm9ibGVtcy5FeHRlcm5hbEV2YWx1YXRpb24uU29sdXRp" + 
+          "b25NZXNzYWdlLkludGVnZXJBcnJheVZhcmlhYmxlElwKCmRvdWJsZVZhcnMY" + 
+          "BCADKAsySC5IZXVyaXN0aWNMYWIuUHJvYmxlbXMuRXh0ZXJuYWxFdmFsdWF0" + 
+          "aW9uLlNvbHV0aW9uTWVzc2FnZS5Eb3VibGVWYXJpYWJsZRJmCg9kb3VibGVB" + 
+          "cnJheVZhcnMYBSADKAsyTS5IZXVyaXN0aWNMYWIuUHJvYmxlbXMuRXh0ZXJu" + 
+          "YWxFdmFsdWF0aW9uLlNvbHV0aW9uTWVzc2FnZS5Eb3VibGVBcnJheVZhcmlh" + 
+          "YmxlElgKCGJvb2xWYXJzGAYgAygLMkYuSGV1cmlzdGljTGFiLlByb2JsZW1z" + 
+          "LkV4dGVybmFsRXZhbHVhdGlvbi5Tb2x1dGlvbk1lc3NhZ2UuQm9vbFZhcmlh" + 
+          "YmxlEmIKDWJvb2xBcnJheVZhcnMYByADKAsySy5IZXVyaXN0aWNMYWIuUHJv" + 
+          "YmxlbXMuRXh0ZXJuYWxFdmFsdWF0aW9uLlNvbHV0aW9uTWVzc2FnZS5Cb29s" + 
+          "QXJyYXlWYXJpYWJsZRJcCgpzdHJpbmdWYXJzGAggAygLMkguSGV1cmlzdGlj" + 
+          "TGFiLlByb2JsZW1zLkV4dGVybmFsRXZhbHVhdGlvbi5Tb2x1dGlvbk1lc3Nh" + 
+          "Z2UuU3RyaW5nVmFyaWFibGUSZgoPc3RyaW5nQXJyYXlWYXJzGAkgAygLMk0u" + 
+          "SGV1cmlzdGljTGFiLlByb2JsZW1zLkV4dGVybmFsRXZhbHVhdGlvbi5Tb2x1" + 
+          "dGlvbk1lc3NhZ2UuU3RyaW5nQXJyYXlWYXJpYWJsZRJWCgdyYXdWYXJzGAog" + 
+          "AygLMkUuSGV1cmlzdGljTGFiLlByb2JsZW1zLkV4dGVybmFsRXZhbHVhdGlv" + 
+          "bi5Tb2x1dGlvbk1lc3NhZ2UuUmF3VmFyaWFibGUaLQoPSW50ZWdlclZhcmlh" + 
+          "YmxlEgwKBG5hbWUYASACKAkSDAoEZGF0YRgCIAEoBRpCChRJbnRlZ2VyQXJy" + 
+          "YXlWYXJpYWJsZRIMCgRuYW1lGAEgAigJEgwKBGRhdGEYAiADKAUSDgoGbGVu" + 
+          "Z3RoGAMgASgFGiwKDkRvdWJsZVZhcmlhYmxlEgwKBG5hbWUYASACKAkSDAoE" + 
+          "ZGF0YRgCIAEoARpBChNEb3VibGVBcnJheVZhcmlhYmxlEgwKBG5hbWUYASAC" + 
+          "KAkSDAoEZGF0YRgCIAMoARIOCgZsZW5ndGgYAyABKAUaKgoMQm9vbFZhcmlh" + 
+          "YmxlEgwKBG5hbWUYASACKAkSDAoEZGF0YRgCIAEoCBo/ChFCb29sQXJyYXlW" + 
+          "YXJpYWJsZRIMCgRuYW1lGAEgAigJEgwKBGRhdGEYAiADKAgSDgoGbGVuZ3Ro" + 
+          "GAMgASgFGiwKDlN0cmluZ1ZhcmlhYmxlEgwKBG5hbWUYASACKAkSDAoEZGF0" + 
+          "YRgCIAEoCRpBChNTdHJpbmdBcnJheVZhcmlhYmxlEgwKBG5hbWUYASACKAkS" + 
+          "DAoEZGF0YRgCIAMoCRIOCgZsZW5ndGgYAyABKAUaKQoLUmF3VmFyaWFibGUS" + 
+          "DAoEbmFtZRgBIAIoCRIMCgRkYXRhGAIgASgMIkAKDlF1YWxpdHlNZXNzYWdl" + 
+          "EhIKCnNvbHV0aW9uSWQYASACKAUSDwoHcXVhbGl0eRgCIAIoASoJCOgHEICA" + 
+          "gIACMpQBChFFdmFsdWF0aW9uU2VydmljZRJ/CghFdmFsdWF0ZRI5LkhldXJp" + 
+          "c3RpY0xhYi5Qcm9ibGVtcy5FeHRlcm5hbEV2YWx1YXRpb24uU29sdXRpb25N" + 
+          "ZXNzYWdlGjguSGV1cmlzdGljTGFiLlByb2JsZW1zLkV4dGVybmFsRXZhbHVh" + 
+          "dGlvbi5RdWFsaXR5TWVzc2FnZUIuCixjb20uaGV1cmlzdGljbGFiLnByb2Js" + 
+          "ZW1zLmV4dGVybmFsZXZhbHVhdGlvbg==");
+      pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) {
+        descriptor = root;
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor = Descriptor.MessageTypes[0];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor,
+                new string[] { "SolutionId", "IntegerVars", "IntegerArrayVars", "DoubleVars", "DoubleArrayVars", "BoolVars", "BoolArrayVars", "StringVars", "StringArrayVars", "RawVars", });
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerVariable__Descriptor = internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor.NestedTypes[0];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerVariable__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerVariable__Descriptor,
+                new string[] { "Name", "Data", });
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerArrayVariable__Descriptor = internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor.NestedTypes[1];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerArrayVariable__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerArrayVariable__Descriptor,
+                new string[] { "Name", "Data", "Length", });
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleVariable__Descriptor = internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor.NestedTypes[2];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleVariable__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleVariable__Descriptor,
+                new string[] { "Name", "Data", });
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleArrayVariable__Descriptor = internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor.NestedTypes[3];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleArrayVariable__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleArrayVariable__Descriptor,
+                new string[] { "Name", "Data", "Length", });
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolVariable__Descriptor = internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor.NestedTypes[4];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolVariable__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolVariable__Descriptor,
+                new string[] { "Name", "Data", });
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolArrayVariable__Descriptor = internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor.NestedTypes[5];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolArrayVariable__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolArrayVariable__Descriptor,
+                new string[] { "Name", "Data", "Length", });
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringVariable__Descriptor = internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor.NestedTypes[6];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringVariable__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringVariable__Descriptor,
+                new string[] { "Name", "Data", });
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringArrayVariable__Descriptor = internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor.NestedTypes[7];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringArrayVariable__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringArrayVariable__Descriptor,
+                new string[] { "Name", "Data", "Length", });
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_RawVariable__Descriptor = internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor.NestedTypes[8];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_RawVariable__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_RawVariable__Descriptor,
+                new string[] { "Name", "Data", });
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_QualityMessage__Descriptor = Descriptor.MessageTypes[1];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_QualityMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.QualityMessage, global::HeuristicLab.Problems.ExternalEvaluation.QualityMessage.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_QualityMessage__Descriptor,
+                new string[] { "SolutionId", "Quality", });
+        return null;
+      };
+      pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,
+          new pbd::FileDescriptor[] {
+          }, assigner);
+    }
+    #endregion
+    
+  }
+  #region Messages
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+  public sealed partial class SolutionMessage : pb::GeneratedMessage<SolutionMessage, SolutionMessage.Builder> {
+    private SolutionMessage() { }
+    private static readonly SolutionMessage defaultInstance = new SolutionMessage().MakeReadOnly();
+    private static readonly string[] _solutionMessageFieldNames = new string[] { "boolArrayVars", "boolVars", "doubleArrayVars", "doubleVars", "integerArrayVars", "integerVars", "rawVars", "solutionId", "stringArrayVars", "stringVars" };
+    private static readonly uint[] _solutionMessageFieldTags = new uint[] { 58, 50, 42, 34, 26, 18, 82, 8, 74, 66 };
+    public static SolutionMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override SolutionMessage DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override SolutionMessage ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<SolutionMessage, SolutionMessage.Builder> InternalFieldAccessors {
+      get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__FieldAccessorTable; }
+    }
+    
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+    public static class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+      [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+      public sealed partial class IntegerVariable : pb::GeneratedMessage<IntegerVariable, IntegerVariable.Builder> {
+        private IntegerVariable() { }
+        private static readonly IntegerVariable defaultInstance = new IntegerVariable().MakeReadOnly();
+        private static readonly string[] _integerVariableFieldNames = new string[] { "data", "name" };
+        private static readonly uint[] _integerVariableFieldTags = new uint[] { 16, 10 };
+        public static IntegerVariable DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override IntegerVariable DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+        
+        protected override IntegerVariable ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerVariable__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<IntegerVariable, IntegerVariable.Builder> InternalFieldAccessors {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerVariable__FieldAccessorTable; }
+        }
+        
+        public const int NameFieldNumber = 1;
+        private bool hasName;
+        private string name_ = "";
+        public bool HasName {
+          get { return hasName; }
+        }
+        public string Name {
+          get { return name_; }
+        }
+        
+        public const int DataFieldNumber = 2;
+        private bool hasData;
+        private int data_;
+        public bool HasData {
+          get { return hasData; }
+        }
+        public int Data {
+          get { return data_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasName) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          int size = SerializedSize;
+          string[] field_names = _integerVariableFieldNames;
+          if (hasName) {
+            output.WriteString(1, field_names[1], Name);
+          }
+          if (hasData) {
+            output.WriteInt32(2, field_names[0], Data);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (hasName) {
+              size += pb::CodedOutputStream.ComputeStringSize(1, Name);
+            }
+            if (hasData) {
+              size += pb::CodedOutputStream.ComputeInt32Size(2, Data);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static IntegerVariable ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static IntegerVariable ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static IntegerVariable ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static IntegerVariable ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static IntegerVariable ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static IntegerVariable ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static IntegerVariable ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static IntegerVariable ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static IntegerVariable ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static IntegerVariable ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private IntegerVariable MakeReadOnly() {
+          return this;
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(IntegerVariable prototype) {
+          return new Builder(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+        public sealed partial class Builder : pb::GeneratedBuilder<IntegerVariable, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(IntegerVariable cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+          
+          private bool resultIsReadOnly;
+          private IntegerVariable result;
+          
+          private IntegerVariable PrepareBuilder() {
+            if (resultIsReadOnly) {
+              IntegerVariable original = result;
+              result = new IntegerVariable();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+          
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+          
+          protected override IntegerVariable MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+          
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+          
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable.Descriptor; }
+          }
+          
+          public override IntegerVariable DefaultInstanceForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable.DefaultInstance; }
+          }
+          
+          public override IntegerVariable BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is IntegerVariable) {
+              return MergeFrom((IntegerVariable) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(IntegerVariable other) {
+            if (other == global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasName) {
+              Name = other.Name;
+            }
+            if (other.HasData) {
+              Data = other.Data;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_integerVariableFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _integerVariableFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 10: {
+                  result.hasName = input.ReadString(ref result.name_);
+                  break;
+                }
+                case 16: {
+                  result.hasData = input.ReadInt32(ref result.data_);
+                  break;
+                }
+              }
+            }
+            
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+          
+          
+          public bool HasName {
+            get { return result.hasName; }
+          }
+          public string Name {
+            get { return result.Name; }
+            set { SetName(value); }
+          }
+          public Builder SetName(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasName = true;
+            result.name_ = value;
+            return this;
+          }
+          public Builder ClearName() {
+            PrepareBuilder();
+            result.hasName = false;
+            result.name_ = "";
+            return this;
+          }
+          
+          public bool HasData {
+            get { return result.hasData; }
+          }
+          public int Data {
+            get { return result.Data; }
+            set { SetData(value); }
+          }
+          public Builder SetData(int value) {
+            PrepareBuilder();
+            result.hasData = true;
+            result.data_ = value;
+            return this;
+          }
+          public Builder ClearData() {
+            PrepareBuilder();
+            result.hasData = false;
+            result.data_ = 0;
+            return this;
+          }
+        }
+        static IntegerVariable() {
+          object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+        }
+      }
+      
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+      [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+      public sealed partial class IntegerArrayVariable : pb::GeneratedMessage<IntegerArrayVariable, IntegerArrayVariable.Builder> {
+        private IntegerArrayVariable() { }
+        private static readonly IntegerArrayVariable defaultInstance = new IntegerArrayVariable().MakeReadOnly();
+        private static readonly string[] _integerArrayVariableFieldNames = new string[] { "data", "length", "name" };
+        private static readonly uint[] _integerArrayVariableFieldTags = new uint[] { 16, 24, 10 };
+        public static IntegerArrayVariable DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override IntegerArrayVariable DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+        
+        protected override IntegerArrayVariable ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerArrayVariable__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<IntegerArrayVariable, IntegerArrayVariable.Builder> InternalFieldAccessors {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerArrayVariable__FieldAccessorTable; }
+        }
+        
+        public const int NameFieldNumber = 1;
+        private bool hasName;
+        private string name_ = "";
+        public bool HasName {
+          get { return hasName; }
+        }
+        public string Name {
+          get { return name_; }
+        }
+        
+        public const int DataFieldNumber = 2;
+        private pbc::PopsicleList<int> data_ = new pbc::PopsicleList<int>();
+        public scg::IList<int> DataList {
+          get { return pbc::Lists.AsReadOnly(data_); }
+        }
+        public int DataCount {
+          get { return data_.Count; }
+        }
+        public int GetData(int index) {
+          return data_[index];
+        }
+        
+        public const int LengthFieldNumber = 3;
+        private bool hasLength;
+        private int length_;
+        public bool HasLength {
+          get { return hasLength; }
+        }
+        public int Length {
+          get { return length_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasName) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          int size = SerializedSize;
+          string[] field_names = _integerArrayVariableFieldNames;
+          if (hasName) {
+            output.WriteString(1, field_names[2], Name);
+          }
+          if (data_.Count > 0) {
+            output.WriteInt32Array(2, field_names[0], data_);
+          }
+          if (hasLength) {
+            output.WriteInt32(3, field_names[1], Length);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (hasName) {
+              size += pb::CodedOutputStream.ComputeStringSize(1, Name);
+            }
+            {
+              int dataSize = 0;
+              foreach (int element in DataList) {
+                dataSize += pb::CodedOutputStream.ComputeInt32SizeNoTag(element);
+              }
+              size += dataSize;
+              size += 1 * data_.Count;
+            }
+            if (hasLength) {
+              size += pb::CodedOutputStream.ComputeInt32Size(3, Length);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static IntegerArrayVariable ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static IntegerArrayVariable ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static IntegerArrayVariable ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static IntegerArrayVariable ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static IntegerArrayVariable ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static IntegerArrayVariable ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static IntegerArrayVariable ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static IntegerArrayVariable ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static IntegerArrayVariable ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static IntegerArrayVariable ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private IntegerArrayVariable MakeReadOnly() {
+          data_.MakeReadOnly();
+          return this;
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(IntegerArrayVariable prototype) {
+          return new Builder(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+        public sealed partial class Builder : pb::GeneratedBuilder<IntegerArrayVariable, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(IntegerArrayVariable cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+          
+          private bool resultIsReadOnly;
+          private IntegerArrayVariable result;
+          
+          private IntegerArrayVariable PrepareBuilder() {
+            if (resultIsReadOnly) {
+              IntegerArrayVariable original = result;
+              result = new IntegerArrayVariable();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+          
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+          
+          protected override IntegerArrayVariable MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+          
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+          
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable.Descriptor; }
+          }
+          
+          public override IntegerArrayVariable DefaultInstanceForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable.DefaultInstance; }
+          }
+          
+          public override IntegerArrayVariable BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is IntegerArrayVariable) {
+              return MergeFrom((IntegerArrayVariable) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(IntegerArrayVariable other) {
+            if (other == global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasName) {
+              Name = other.Name;
+            }
+            if (other.data_.Count != 0) {
+              result.data_.Add(other.data_);
+            }
+            if (other.HasLength) {
+              Length = other.Length;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_integerArrayVariableFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _integerArrayVariableFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 10: {
+                  result.hasName = input.ReadString(ref result.name_);
+                  break;
+                }
+                case 18:
+                case 16: {
+                  input.ReadInt32Array(tag, field_name, result.data_);
+                  break;
+                }
+                case 24: {
+                  result.hasLength = input.ReadInt32(ref result.length_);
+                  break;
+                }
+              }
+            }
+            
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+          
+          
+          public bool HasName {
+            get { return result.hasName; }
+          }
+          public string Name {
+            get { return result.Name; }
+            set { SetName(value); }
+          }
+          public Builder SetName(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasName = true;
+            result.name_ = value;
+            return this;
+          }
+          public Builder ClearName() {
+            PrepareBuilder();
+            result.hasName = false;
+            result.name_ = "";
+            return this;
+          }
+          
+          public pbc::IPopsicleList<int> DataList {
+            get { return PrepareBuilder().data_; }
+          }
+          public int DataCount {
+            get { return result.DataCount; }
+          }
+          public int GetData(int index) {
+            return result.GetData(index);
+          }
+          public Builder SetData(int index, int value) {
+            PrepareBuilder();
+            result.data_[index] = value;
+            return this;
+          }
+          public Builder AddData(int value) {
+            PrepareBuilder();
+            result.data_.Add(value);
+            return this;
+          }
+          public Builder AddRangeData(scg::IEnumerable<int> values) {
+            PrepareBuilder();
+            result.data_.Add(values);
+            return this;
+          }
+          public Builder ClearData() {
+            PrepareBuilder();
+            result.data_.Clear();
+            return this;
+          }
+          
+          public bool HasLength {
+            get { return result.hasLength; }
+          }
+          public int Length {
+            get { return result.Length; }
+            set { SetLength(value); }
+          }
+          public Builder SetLength(int value) {
+            PrepareBuilder();
+            result.hasLength = true;
+            result.length_ = value;
+            return this;
+          }
+          public Builder ClearLength() {
+            PrepareBuilder();
+            result.hasLength = false;
+            result.length_ = 0;
+            return this;
+          }
+        }
+        static IntegerArrayVariable() {
+          object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+        }
+      }
+      
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+      [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+      public sealed partial class DoubleVariable : pb::GeneratedMessage<DoubleVariable, DoubleVariable.Builder> {
+        private DoubleVariable() { }
+        private static readonly DoubleVariable defaultInstance = new DoubleVariable().MakeReadOnly();
+        private static readonly string[] _doubleVariableFieldNames = new string[] { "data", "name" };
+        private static readonly uint[] _doubleVariableFieldTags = new uint[] { 17, 10 };
+        public static DoubleVariable DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override DoubleVariable DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+        
+        protected override DoubleVariable ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleVariable__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<DoubleVariable, DoubleVariable.Builder> InternalFieldAccessors {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleVariable__FieldAccessorTable; }
+        }
+        
+        public const int NameFieldNumber = 1;
+        private bool hasName;
+        private string name_ = "";
+        public bool HasName {
+          get { return hasName; }
+        }
+        public string Name {
+          get { return name_; }
+        }
+        
+        public const int DataFieldNumber = 2;
+        private bool hasData;
+        private double data_;
+        public bool HasData {
+          get { return hasData; }
+        }
+        public double Data {
+          get { return data_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasName) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          int size = SerializedSize;
+          string[] field_names = _doubleVariableFieldNames;
+          if (hasName) {
+            output.WriteString(1, field_names[1], Name);
+          }
+          if (hasData) {
+            output.WriteDouble(2, field_names[0], Data);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (hasName) {
+              size += pb::CodedOutputStream.ComputeStringSize(1, Name);
+            }
+            if (hasData) {
+              size += pb::CodedOutputStream.ComputeDoubleSize(2, Data);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static DoubleVariable ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static DoubleVariable ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static DoubleVariable ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static DoubleVariable ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static DoubleVariable ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static DoubleVariable ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static DoubleVariable ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static DoubleVariable ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static DoubleVariable ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static DoubleVariable ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private DoubleVariable MakeReadOnly() {
+          return this;
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(DoubleVariable prototype) {
+          return new Builder(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+        public sealed partial class Builder : pb::GeneratedBuilder<DoubleVariable, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(DoubleVariable cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+          
+          private bool resultIsReadOnly;
+          private DoubleVariable result;
+          
+          private DoubleVariable PrepareBuilder() {
+            if (resultIsReadOnly) {
+              DoubleVariable original = result;
+              result = new DoubleVariable();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+          
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+          
+          protected override DoubleVariable MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+          
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+          
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable.Descriptor; }
+          }
+          
+          public override DoubleVariable DefaultInstanceForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable.DefaultInstance; }
+          }
+          
+          public override DoubleVariable BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is DoubleVariable) {
+              return MergeFrom((DoubleVariable) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(DoubleVariable other) {
+            if (other == global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasName) {
+              Name = other.Name;
+            }
+            if (other.HasData) {
+              Data = other.Data;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_doubleVariableFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _doubleVariableFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 10: {
+                  result.hasName = input.ReadString(ref result.name_);
+                  break;
+                }
+                case 17: {
+                  result.hasData = input.ReadDouble(ref result.data_);
+                  break;
+                }
+              }
+            }
+            
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+          
+          
+          public bool HasName {
+            get { return result.hasName; }
+          }
+          public string Name {
+            get { return result.Name; }
+            set { SetName(value); }
+          }
+          public Builder SetName(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasName = true;
+            result.name_ = value;
+            return this;
+          }
+          public Builder ClearName() {
+            PrepareBuilder();
+            result.hasName = false;
+            result.name_ = "";
+            return this;
+          }
+          
+          public bool HasData {
+            get { return result.hasData; }
+          }
+          public double Data {
+            get { return result.Data; }
+            set { SetData(value); }
+          }
+          public Builder SetData(double value) {
+            PrepareBuilder();
+            result.hasData = true;
+            result.data_ = value;
+            return this;
+          }
+          public Builder ClearData() {
+            PrepareBuilder();
+            result.hasData = false;
+            result.data_ = 0D;
+            return this;
+          }
+        }
+        static DoubleVariable() {
+          object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+        }
+      }
+      
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+      [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+      public sealed partial class DoubleArrayVariable : pb::GeneratedMessage<DoubleArrayVariable, DoubleArrayVariable.Builder> {
+        private DoubleArrayVariable() { }
+        private static readonly DoubleArrayVariable defaultInstance = new DoubleArrayVariable().MakeReadOnly();
+        private static readonly string[] _doubleArrayVariableFieldNames = new string[] { "data", "length", "name" };
+        private static readonly uint[] _doubleArrayVariableFieldTags = new uint[] { 17, 24, 10 };
+        public static DoubleArrayVariable DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override DoubleArrayVariable DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+        
+        protected override DoubleArrayVariable ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleArrayVariable__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<DoubleArrayVariable, DoubleArrayVariable.Builder> InternalFieldAccessors {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleArrayVariable__FieldAccessorTable; }
+        }
+        
+        public const int NameFieldNumber = 1;
+        private bool hasName;
+        private string name_ = "";
+        public bool HasName {
+          get { return hasName; }
+        }
+        public string Name {
+          get { return name_; }
+        }
+        
+        public const int DataFieldNumber = 2;
+        private pbc::PopsicleList<double> data_ = new pbc::PopsicleList<double>();
+        public scg::IList<double> DataList {
+          get { return pbc::Lists.AsReadOnly(data_); }
+        }
+        public int DataCount {
+          get { return data_.Count; }
+        }
+        public double GetData(int index) {
+          return data_[index];
+        }
+        
+        public const int LengthFieldNumber = 3;
+        private bool hasLength;
+        private int length_;
+        public bool HasLength {
+          get { return hasLength; }
+        }
+        public int Length {
+          get { return length_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasName) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          int size = SerializedSize;
+          string[] field_names = _doubleArrayVariableFieldNames;
+          if (hasName) {
+            output.WriteString(1, field_names[2], Name);
+          }
+          if (data_.Count > 0) {
+            output.WriteDoubleArray(2, field_names[0], data_);
+          }
+          if (hasLength) {
+            output.WriteInt32(3, field_names[1], Length);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (hasName) {
+              size += pb::CodedOutputStream.ComputeStringSize(1, Name);
+            }
+            {
+              int dataSize = 0;
+              dataSize = 8 * data_.Count;
+              size += dataSize;
+              size += 1 * data_.Count;
+            }
+            if (hasLength) {
+              size += pb::CodedOutputStream.ComputeInt32Size(3, Length);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static DoubleArrayVariable ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static DoubleArrayVariable ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static DoubleArrayVariable ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static DoubleArrayVariable ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static DoubleArrayVariable ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static DoubleArrayVariable ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static DoubleArrayVariable ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static DoubleArrayVariable ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static DoubleArrayVariable ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static DoubleArrayVariable ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private DoubleArrayVariable MakeReadOnly() {
+          data_.MakeReadOnly();
+          return this;
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(DoubleArrayVariable prototype) {
+          return new Builder(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+        public sealed partial class Builder : pb::GeneratedBuilder<DoubleArrayVariable, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(DoubleArrayVariable cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+          
+          private bool resultIsReadOnly;
+          private DoubleArrayVariable result;
+          
+          private DoubleArrayVariable PrepareBuilder() {
+            if (resultIsReadOnly) {
+              DoubleArrayVariable original = result;
+              result = new DoubleArrayVariable();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+          
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+          
+          protected override DoubleArrayVariable MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+          
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+          
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable.Descriptor; }
+          }
+          
+          public override DoubleArrayVariable DefaultInstanceForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable.DefaultInstance; }
+          }
+          
+          public override DoubleArrayVariable BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is DoubleArrayVariable) {
+              return MergeFrom((DoubleArrayVariable) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(DoubleArrayVariable other) {
+            if (other == global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasName) {
+              Name = other.Name;
+            }
+            if (other.data_.Count != 0) {
+              result.data_.Add(other.data_);
+            }
+            if (other.HasLength) {
+              Length = other.Length;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_doubleArrayVariableFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _doubleArrayVariableFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 10: {
+                  result.hasName = input.ReadString(ref result.name_);
+                  break;
+                }
+                case 18:
+                case 17: {
+                  input.ReadDoubleArray(tag, field_name, result.data_);
+                  break;
+                }
+                case 24: {
+                  result.hasLength = input.ReadInt32(ref result.length_);
+                  break;
+                }
+              }
+            }
+            
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+          
+          
+          public bool HasName {
+            get { return result.hasName; }
+          }
+          public string Name {
+            get { return result.Name; }
+            set { SetName(value); }
+          }
+          public Builder SetName(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasName = true;
+            result.name_ = value;
+            return this;
+          }
+          public Builder ClearName() {
+            PrepareBuilder();
+            result.hasName = false;
+            result.name_ = "";
+            return this;
+          }
+          
+          public pbc::IPopsicleList<double> DataList {
+            get { return PrepareBuilder().data_; }
+          }
+          public int DataCount {
+            get { return result.DataCount; }
+          }
+          public double GetData(int index) {
+            return result.GetData(index);
+          }
+          public Builder SetData(int index, double value) {
+            PrepareBuilder();
+            result.data_[index] = value;
+            return this;
+          }
+          public Builder AddData(double value) {
+            PrepareBuilder();
+            result.data_.Add(value);
+            return this;
+          }
+          public Builder AddRangeData(scg::IEnumerable<double> values) {
+            PrepareBuilder();
+            result.data_.Add(values);
+            return this;
+          }
+          public Builder ClearData() {
+            PrepareBuilder();
+            result.data_.Clear();
+            return this;
+          }
+          
+          public bool HasLength {
+            get { return result.hasLength; }
+          }
+          public int Length {
+            get { return result.Length; }
+            set { SetLength(value); }
+          }
+          public Builder SetLength(int value) {
+            PrepareBuilder();
+            result.hasLength = true;
+            result.length_ = value;
+            return this;
+          }
+          public Builder ClearLength() {
+            PrepareBuilder();
+            result.hasLength = false;
+            result.length_ = 0;
+            return this;
+          }
+        }
+        static DoubleArrayVariable() {
+          object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+        }
+      }
+      
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+      [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+      public sealed partial class BoolVariable : pb::GeneratedMessage<BoolVariable, BoolVariable.Builder> {
+        private BoolVariable() { }
+        private static readonly BoolVariable defaultInstance = new BoolVariable().MakeReadOnly();
+        private static readonly string[] _boolVariableFieldNames = new string[] { "data", "name" };
+        private static readonly uint[] _boolVariableFieldTags = new uint[] { 16, 10 };
+        public static BoolVariable DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override BoolVariable DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+        
+        protected override BoolVariable ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolVariable__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<BoolVariable, BoolVariable.Builder> InternalFieldAccessors {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolVariable__FieldAccessorTable; }
+        }
+        
+        public const int NameFieldNumber = 1;
+        private bool hasName;
+        private string name_ = "";
+        public bool HasName {
+          get { return hasName; }
+        }
+        public string Name {
+          get { return name_; }
+        }
+        
+        public const int DataFieldNumber = 2;
+        private bool hasData;
+        private bool data_;
+        public bool HasData {
+          get { return hasData; }
+        }
+        public bool Data {
+          get { return data_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasName) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          int size = SerializedSize;
+          string[] field_names = _boolVariableFieldNames;
+          if (hasName) {
+            output.WriteString(1, field_names[1], Name);
+          }
+          if (hasData) {
+            output.WriteBool(2, field_names[0], Data);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (hasName) {
+              size += pb::CodedOutputStream.ComputeStringSize(1, Name);
+            }
+            if (hasData) {
+              size += pb::CodedOutputStream.ComputeBoolSize(2, Data);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static BoolVariable ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static BoolVariable ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static BoolVariable ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static BoolVariable ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static BoolVariable ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static BoolVariable ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static BoolVariable ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static BoolVariable ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static BoolVariable ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static BoolVariable ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private BoolVariable MakeReadOnly() {
+          return this;
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(BoolVariable prototype) {
+          return new Builder(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+        public sealed partial class Builder : pb::GeneratedBuilder<BoolVariable, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(BoolVariable cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+          
+          private bool resultIsReadOnly;
+          private BoolVariable result;
+          
+          private BoolVariable PrepareBuilder() {
+            if (resultIsReadOnly) {
+              BoolVariable original = result;
+              result = new BoolVariable();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+          
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+          
+          protected override BoolVariable MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+          
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+          
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable.Descriptor; }
+          }
+          
+          public override BoolVariable DefaultInstanceForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable.DefaultInstance; }
+          }
+          
+          public override BoolVariable BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is BoolVariable) {
+              return MergeFrom((BoolVariable) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(BoolVariable other) {
+            if (other == global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasName) {
+              Name = other.Name;
+            }
+            if (other.HasData) {
+              Data = other.Data;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_boolVariableFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _boolVariableFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 10: {
+                  result.hasName = input.ReadString(ref result.name_);
+                  break;
+                }
+                case 16: {
+                  result.hasData = input.ReadBool(ref result.data_);
+                  break;
+                }
+              }
+            }
+            
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+          
+          
+          public bool HasName {
+            get { return result.hasName; }
+          }
+          public string Name {
+            get { return result.Name; }
+            set { SetName(value); }
+          }
+          public Builder SetName(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasName = true;
+            result.name_ = value;
+            return this;
+          }
+          public Builder ClearName() {
+            PrepareBuilder();
+            result.hasName = false;
+            result.name_ = "";
+            return this;
+          }
+          
+          public bool HasData {
+            get { return result.hasData; }
+          }
+          public bool Data {
+            get { return result.Data; }
+            set { SetData(value); }
+          }
+          public Builder SetData(bool value) {
+            PrepareBuilder();
+            result.hasData = true;
+            result.data_ = value;
+            return this;
+          }
+          public Builder ClearData() {
+            PrepareBuilder();
+            result.hasData = false;
+            result.data_ = false;
+            return this;
+          }
+        }
+        static BoolVariable() {
+          object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+        }
+      }
+      
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+      [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+      public sealed partial class BoolArrayVariable : pb::GeneratedMessage<BoolArrayVariable, BoolArrayVariable.Builder> {
+        private BoolArrayVariable() { }
+        private static readonly BoolArrayVariable defaultInstance = new BoolArrayVariable().MakeReadOnly();
+        private static readonly string[] _boolArrayVariableFieldNames = new string[] { "data", "length", "name" };
+        private static readonly uint[] _boolArrayVariableFieldTags = new uint[] { 16, 24, 10 };
+        public static BoolArrayVariable DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override BoolArrayVariable DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+        
+        protected override BoolArrayVariable ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolArrayVariable__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<BoolArrayVariable, BoolArrayVariable.Builder> InternalFieldAccessors {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolArrayVariable__FieldAccessorTable; }
+        }
+        
+        public const int NameFieldNumber = 1;
+        private bool hasName;
+        private string name_ = "";
+        public bool HasName {
+          get { return hasName; }
+        }
+        public string Name {
+          get { return name_; }
+        }
+        
+        public const int DataFieldNumber = 2;
+        private pbc::PopsicleList<bool> data_ = new pbc::PopsicleList<bool>();
+        public scg::IList<bool> DataList {
+          get { return pbc::Lists.AsReadOnly(data_); }
+        }
+        public int DataCount {
+          get { return data_.Count; }
+        }
+        public bool GetData(int index) {
+          return data_[index];
+        }
+        
+        public const int LengthFieldNumber = 3;
+        private bool hasLength;
+        private int length_;
+        public bool HasLength {
+          get { return hasLength; }
+        }
+        public int Length {
+          get { return length_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasName) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          int size = SerializedSize;
+          string[] field_names = _boolArrayVariableFieldNames;
+          if (hasName) {
+            output.WriteString(1, field_names[2], Name);
+          }
+          if (data_.Count > 0) {
+            output.WriteBoolArray(2, field_names[0], data_);
+          }
+          if (hasLength) {
+            output.WriteInt32(3, field_names[1], Length);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (hasName) {
+              size += pb::CodedOutputStream.ComputeStringSize(1, Name);
+            }
+            {
+              int dataSize = 0;
+              dataSize = 1 * data_.Count;
+              size += dataSize;
+              size += 1 * data_.Count;
+            }
+            if (hasLength) {
+              size += pb::CodedOutputStream.ComputeInt32Size(3, Length);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static BoolArrayVariable ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static BoolArrayVariable ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static BoolArrayVariable ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static BoolArrayVariable ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static BoolArrayVariable ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static BoolArrayVariable ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static BoolArrayVariable ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static BoolArrayVariable ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static BoolArrayVariable ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static BoolArrayVariable ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private BoolArrayVariable MakeReadOnly() {
+          data_.MakeReadOnly();
+          return this;
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(BoolArrayVariable prototype) {
+          return new Builder(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+        public sealed partial class Builder : pb::GeneratedBuilder<BoolArrayVariable, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(BoolArrayVariable cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+          
+          private bool resultIsReadOnly;
+          private BoolArrayVariable result;
+          
+          private BoolArrayVariable PrepareBuilder() {
+            if (resultIsReadOnly) {
+              BoolArrayVariable original = result;
+              result = new BoolArrayVariable();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+          
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+          
+          protected override BoolArrayVariable MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+          
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+          
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable.Descriptor; }
+          }
+          
+          public override BoolArrayVariable DefaultInstanceForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable.DefaultInstance; }
+          }
+          
+          public override BoolArrayVariable BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is BoolArrayVariable) {
+              return MergeFrom((BoolArrayVariable) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(BoolArrayVariable other) {
+            if (other == global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasName) {
+              Name = other.Name;
+            }
+            if (other.data_.Count != 0) {
+              result.data_.Add(other.data_);
+            }
+            if (other.HasLength) {
+              Length = other.Length;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_boolArrayVariableFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _boolArrayVariableFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 10: {
+                  result.hasName = input.ReadString(ref result.name_);
+                  break;
+                }
+                case 18:
+                case 16: {
+                  input.ReadBoolArray(tag, field_name, result.data_);
+                  break;
+                }
+                case 24: {
+                  result.hasLength = input.ReadInt32(ref result.length_);
+                  break;
+                }
+              }
+            }
+            
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+          
+          
+          public bool HasName {
+            get { return result.hasName; }
+          }
+          public string Name {
+            get { return result.Name; }
+            set { SetName(value); }
+          }
+          public Builder SetName(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasName = true;
+            result.name_ = value;
+            return this;
+          }
+          public Builder ClearName() {
+            PrepareBuilder();
+            result.hasName = false;
+            result.name_ = "";
+            return this;
+          }
+          
+          public pbc::IPopsicleList<bool> DataList {
+            get { return PrepareBuilder().data_; }
+          }
+          public int DataCount {
+            get { return result.DataCount; }
+          }
+          public bool GetData(int index) {
+            return result.GetData(index);
+          }
+          public Builder SetData(int index, bool value) {
+            PrepareBuilder();
+            result.data_[index] = value;
+            return this;
+          }
+          public Builder AddData(bool value) {
+            PrepareBuilder();
+            result.data_.Add(value);
+            return this;
+          }
+          public Builder AddRangeData(scg::IEnumerable<bool> values) {
+            PrepareBuilder();
+            result.data_.Add(values);
+            return this;
+          }
+          public Builder ClearData() {
+            PrepareBuilder();
+            result.data_.Clear();
+            return this;
+          }
+          
+          public bool HasLength {
+            get { return result.hasLength; }
+          }
+          public int Length {
+            get { return result.Length; }
+            set { SetLength(value); }
+          }
+          public Builder SetLength(int value) {
+            PrepareBuilder();
+            result.hasLength = true;
+            result.length_ = value;
+            return this;
+          }
+          public Builder ClearLength() {
+            PrepareBuilder();
+            result.hasLength = false;
+            result.length_ = 0;
+            return this;
+          }
+        }
+        static BoolArrayVariable() {
+          object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+        }
+      }
+      
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+      [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+      public sealed partial class StringVariable : pb::GeneratedMessage<StringVariable, StringVariable.Builder> {
+        private StringVariable() { }
+        private static readonly StringVariable defaultInstance = new StringVariable().MakeReadOnly();
+        private static readonly string[] _stringVariableFieldNames = new string[] { "data", "name" };
+        private static readonly uint[] _stringVariableFieldTags = new uint[] { 18, 10 };
+        public static StringVariable DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override StringVariable DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+        
+        protected override StringVariable ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringVariable__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<StringVariable, StringVariable.Builder> InternalFieldAccessors {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringVariable__FieldAccessorTable; }
+        }
+        
+        public const int NameFieldNumber = 1;
+        private bool hasName;
+        private string name_ = "";
+        public bool HasName {
+          get { return hasName; }
+        }
+        public string Name {
+          get { return name_; }
+        }
+        
+        public const int DataFieldNumber = 2;
+        private bool hasData;
+        private string data_ = "";
+        public bool HasData {
+          get { return hasData; }
+        }
+        public string Data {
+          get { return data_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasName) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          int size = SerializedSize;
+          string[] field_names = _stringVariableFieldNames;
+          if (hasName) {
+            output.WriteString(1, field_names[1], Name);
+          }
+          if (hasData) {
+            output.WriteString(2, field_names[0], Data);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (hasName) {
+              size += pb::CodedOutputStream.ComputeStringSize(1, Name);
+            }
+            if (hasData) {
+              size += pb::CodedOutputStream.ComputeStringSize(2, Data);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static StringVariable ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static StringVariable ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static StringVariable ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static StringVariable ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static StringVariable ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static StringVariable ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static StringVariable ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static StringVariable ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static StringVariable ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static StringVariable ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private StringVariable MakeReadOnly() {
+          return this;
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(StringVariable prototype) {
+          return new Builder(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+        public sealed partial class Builder : pb::GeneratedBuilder<StringVariable, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(StringVariable cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+          
+          private bool resultIsReadOnly;
+          private StringVariable result;
+          
+          private StringVariable PrepareBuilder() {
+            if (resultIsReadOnly) {
+              StringVariable original = result;
+              result = new StringVariable();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+          
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+          
+          protected override StringVariable MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+          
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+          
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable.Descriptor; }
+          }
+          
+          public override StringVariable DefaultInstanceForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable.DefaultInstance; }
+          }
+          
+          public override StringVariable BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is StringVariable) {
+              return MergeFrom((StringVariable) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(StringVariable other) {
+            if (other == global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasName) {
+              Name = other.Name;
+            }
+            if (other.HasData) {
+              Data = other.Data;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_stringVariableFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _stringVariableFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 10: {
+                  result.hasName = input.ReadString(ref result.name_);
+                  break;
+                }
+                case 18: {
+                  result.hasData = input.ReadString(ref result.data_);
+                  break;
+                }
+              }
+            }
+            
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+          
+          
+          public bool HasName {
+            get { return result.hasName; }
+          }
+          public string Name {
+            get { return result.Name; }
+            set { SetName(value); }
+          }
+          public Builder SetName(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasName = true;
+            result.name_ = value;
+            return this;
+          }
+          public Builder ClearName() {
+            PrepareBuilder();
+            result.hasName = false;
+            result.name_ = "";
+            return this;
+          }
+          
+          public bool HasData {
+            get { return result.hasData; }
+          }
+          public string Data {
+            get { return result.Data; }
+            set { SetData(value); }
+          }
+          public Builder SetData(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasData = true;
+            result.data_ = value;
+            return this;
+          }
+          public Builder ClearData() {
+            PrepareBuilder();
+            result.hasData = false;
+            result.data_ = "";
+            return this;
+          }
+        }
+        static StringVariable() {
+          object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+        }
+      }
+      
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+      [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+      public sealed partial class StringArrayVariable : pb::GeneratedMessage<StringArrayVariable, StringArrayVariable.Builder> {
+        private StringArrayVariable() { }
+        private static readonly StringArrayVariable defaultInstance = new StringArrayVariable().MakeReadOnly();
+        private static readonly string[] _stringArrayVariableFieldNames = new string[] { "data", "length", "name" };
+        private static readonly uint[] _stringArrayVariableFieldTags = new uint[] { 18, 24, 10 };
+        public static StringArrayVariable DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override StringArrayVariable DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+        
+        protected override StringArrayVariable ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringArrayVariable__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<StringArrayVariable, StringArrayVariable.Builder> InternalFieldAccessors {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringArrayVariable__FieldAccessorTable; }
+        }
+        
+        public const int NameFieldNumber = 1;
+        private bool hasName;
+        private string name_ = "";
+        public bool HasName {
+          get { return hasName; }
+        }
+        public string Name {
+          get { return name_; }
+        }
+        
+        public const int DataFieldNumber = 2;
+        private pbc::PopsicleList<string> data_ = new pbc::PopsicleList<string>();
+        public scg::IList<string> DataList {
+          get { return pbc::Lists.AsReadOnly(data_); }
+        }
+        public int DataCount {
+          get { return data_.Count; }
+        }
+        public string GetData(int index) {
+          return data_[index];
+        }
+        
+        public const int LengthFieldNumber = 3;
+        private bool hasLength;
+        private int length_;
+        public bool HasLength {
+          get { return hasLength; }
+        }
+        public int Length {
+          get { return length_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasName) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          int size = SerializedSize;
+          string[] field_names = _stringArrayVariableFieldNames;
+          if (hasName) {
+            output.WriteString(1, field_names[2], Name);
+          }
+          if (data_.Count > 0) {
+            output.WriteStringArray(2, field_names[0], data_);
+          }
+          if (hasLength) {
+            output.WriteInt32(3, field_names[1], Length);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (hasName) {
+              size += pb::CodedOutputStream.ComputeStringSize(1, Name);
+            }
+            {
+              int dataSize = 0;
+              foreach (string element in DataList) {
+                dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+              }
+              size += dataSize;
+              size += 1 * data_.Count;
+            }
+            if (hasLength) {
+              size += pb::CodedOutputStream.ComputeInt32Size(3, Length);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static StringArrayVariable ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static StringArrayVariable ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static StringArrayVariable ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static StringArrayVariable ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static StringArrayVariable ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static StringArrayVariable ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static StringArrayVariable ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static StringArrayVariable ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static StringArrayVariable ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static StringArrayVariable ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private StringArrayVariable MakeReadOnly() {
+          data_.MakeReadOnly();
+          return this;
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(StringArrayVariable prototype) {
+          return new Builder(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+        public sealed partial class Builder : pb::GeneratedBuilder<StringArrayVariable, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(StringArrayVariable cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+          
+          private bool resultIsReadOnly;
+          private StringArrayVariable result;
+          
+          private StringArrayVariable PrepareBuilder() {
+            if (resultIsReadOnly) {
+              StringArrayVariable original = result;
+              result = new StringArrayVariable();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+          
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+          
+          protected override StringArrayVariable MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+          
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+          
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable.Descriptor; }
+          }
+          
+          public override StringArrayVariable DefaultInstanceForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable.DefaultInstance; }
+          }
+          
+          public override StringArrayVariable BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is StringArrayVariable) {
+              return MergeFrom((StringArrayVariable) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(StringArrayVariable other) {
+            if (other == global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasName) {
+              Name = other.Name;
+            }
+            if (other.data_.Count != 0) {
+              result.data_.Add(other.data_);
+            }
+            if (other.HasLength) {
+              Length = other.Length;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_stringArrayVariableFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _stringArrayVariableFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 10: {
+                  result.hasName = input.ReadString(ref result.name_);
+                  break;
+                }
+                case 18: {
+                  input.ReadStringArray(tag, field_name, result.data_);
+                  break;
+                }
+                case 24: {
+                  result.hasLength = input.ReadInt32(ref result.length_);
+                  break;
+                }
+              }
+            }
+            
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+          
+          
+          public bool HasName {
+            get { return result.hasName; }
+          }
+          public string Name {
+            get { return result.Name; }
+            set { SetName(value); }
+          }
+          public Builder SetName(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasName = true;
+            result.name_ = value;
+            return this;
+          }
+          public Builder ClearName() {
+            PrepareBuilder();
+            result.hasName = false;
+            result.name_ = "";
+            return this;
+          }
+          
+          public pbc::IPopsicleList<string> DataList {
+            get { return PrepareBuilder().data_; }
+          }
+          public int DataCount {
+            get { return result.DataCount; }
+          }
+          public string GetData(int index) {
+            return result.GetData(index);
+          }
+          public Builder SetData(int index, string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.data_[index] = value;
+            return this;
+          }
+          public Builder AddData(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.data_.Add(value);
+            return this;
+          }
+          public Builder AddRangeData(scg::IEnumerable<string> values) {
+            PrepareBuilder();
+            result.data_.Add(values);
+            return this;
+          }
+          public Builder ClearData() {
+            PrepareBuilder();
+            result.data_.Clear();
+            return this;
+          }
+          
+          public bool HasLength {
+            get { return result.hasLength; }
+          }
+          public int Length {
+            get { return result.Length; }
+            set { SetLength(value); }
+          }
+          public Builder SetLength(int value) {
+            PrepareBuilder();
+            result.hasLength = true;
+            result.length_ = value;
+            return this;
+          }
+          public Builder ClearLength() {
+            PrepareBuilder();
+            result.hasLength = false;
+            result.length_ = 0;
+            return this;
+          }
+        }
+        static StringArrayVariable() {
+          object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+        }
+      }
+      
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+      [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+      public sealed partial class RawVariable : pb::GeneratedMessage<RawVariable, RawVariable.Builder> {
+        private RawVariable() { }
+        private static readonly RawVariable defaultInstance = new RawVariable().MakeReadOnly();
+        private static readonly string[] _rawVariableFieldNames = new string[] { "data", "name" };
+        private static readonly uint[] _rawVariableFieldTags = new uint[] { 18, 10 };
+        public static RawVariable DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override RawVariable DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+        
+        protected override RawVariable ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_RawVariable__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<RawVariable, RawVariable.Builder> InternalFieldAccessors {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_RawVariable__FieldAccessorTable; }
+        }
+        
+        public const int NameFieldNumber = 1;
+        private bool hasName;
+        private string name_ = "";
+        public bool HasName {
+          get { return hasName; }
+        }
+        public string Name {
+          get { return name_; }
+        }
+        
+        public const int DataFieldNumber = 2;
+        private bool hasData;
+        private pb::ByteString data_ = pb::ByteString.Empty;
+        public bool HasData {
+          get { return hasData; }
+        }
+        public pb::ByteString Data {
+          get { return data_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasName) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          int size = SerializedSize;
+          string[] field_names = _rawVariableFieldNames;
+          if (hasName) {
+            output.WriteString(1, field_names[1], Name);
+          }
+          if (hasData) {
+            output.WriteBytes(2, field_names[0], Data);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (hasName) {
+              size += pb::CodedOutputStream.ComputeStringSize(1, Name);
+            }
+            if (hasData) {
+              size += pb::CodedOutputStream.ComputeBytesSize(2, Data);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static RawVariable ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static RawVariable ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static RawVariable ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static RawVariable ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static RawVariable ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static RawVariable ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static RawVariable ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static RawVariable ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static RawVariable ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static RawVariable ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private RawVariable MakeReadOnly() {
+          return this;
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(RawVariable prototype) {
+          return new Builder(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+        public sealed partial class Builder : pb::GeneratedBuilder<RawVariable, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(RawVariable cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+          
+          private bool resultIsReadOnly;
+          private RawVariable result;
+          
+          private RawVariable PrepareBuilder() {
+            if (resultIsReadOnly) {
+              RawVariable original = result;
+              result = new RawVariable();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+          
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+          
+          protected override RawVariable MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+          
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+          
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable.Descriptor; }
+          }
+          
+          public override RawVariable DefaultInstanceForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable.DefaultInstance; }
+          }
+          
+          public override RawVariable BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is RawVariable) {
+              return MergeFrom((RawVariable) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(RawVariable other) {
+            if (other == global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasName) {
+              Name = other.Name;
+            }
+            if (other.HasData) {
+              Data = other.Data;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_rawVariableFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _rawVariableFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 10: {
+                  result.hasName = input.ReadString(ref result.name_);
+                  break;
+                }
+                case 18: {
+                  result.hasData = input.ReadBytes(ref result.data_);
+                  break;
+                }
+              }
+            }
+            
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+          
+          
+          public bool HasName {
+            get { return result.hasName; }
+          }
+          public string Name {
+            get { return result.Name; }
+            set { SetName(value); }
+          }
+          public Builder SetName(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasName = true;
+            result.name_ = value;
+            return this;
+          }
+          public Builder ClearName() {
+            PrepareBuilder();
+            result.hasName = false;
+            result.name_ = "";
+            return this;
+          }
+          
+          public bool HasData {
+            get { return result.hasData; }
+          }
+          public pb::ByteString Data {
+            get { return result.Data; }
+            set { SetData(value); }
+          }
+          public Builder SetData(pb::ByteString value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasData = true;
+            result.data_ = value;
+            return this;
+          }
+          public Builder ClearData() {
+            PrepareBuilder();
+            result.hasData = false;
+            result.data_ = pb::ByteString.Empty;
+            return this;
+          }
+        }
+        static RawVariable() {
+          object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+        }
+      }
+      
+    }
+    #endregion
+    
+    public const int SolutionIdFieldNumber = 1;
+    private bool hasSolutionId;
+    private int solutionId_;
+    public bool HasSolutionId {
+      get { return hasSolutionId; }
+    }
+    public int SolutionId {
+      get { return solutionId_; }
+    }
+    
+    public const int IntegerVarsFieldNumber = 2;
+    private pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable> integerVars_ = new pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable>();
+    public scg::IList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable> IntegerVarsList {
+      get { return integerVars_; }
+    }
+    public int IntegerVarsCount {
+      get { return integerVars_.Count; }
+    }
+    public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable GetIntegerVars(int index) {
+      return integerVars_[index];
+    }
+    
+    public const int IntegerArrayVarsFieldNumber = 3;
+    private pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable> integerArrayVars_ = new pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable>();
+    public scg::IList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable> IntegerArrayVarsList {
+      get { return integerArrayVars_; }
+    }
+    public int IntegerArrayVarsCount {
+      get { return integerArrayVars_.Count; }
+    }
+    public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable GetIntegerArrayVars(int index) {
+      return integerArrayVars_[index];
+    }
+    
+    public const int DoubleVarsFieldNumber = 4;
+    private pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable> doubleVars_ = new pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable>();
+    public scg::IList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable> DoubleVarsList {
+      get { return doubleVars_; }
+    }
+    public int DoubleVarsCount {
+      get { return doubleVars_.Count; }
+    }
+    public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable GetDoubleVars(int index) {
+      return doubleVars_[index];
+    }
+    
+    public const int DoubleArrayVarsFieldNumber = 5;
+    private pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable> doubleArrayVars_ = new pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable>();
+    public scg::IList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable> DoubleArrayVarsList {
+      get { return doubleArrayVars_; }
+    }
+    public int DoubleArrayVarsCount {
+      get { return doubleArrayVars_.Count; }
+    }
+    public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable GetDoubleArrayVars(int index) {
+      return doubleArrayVars_[index];
+    }
+    
+    public const int BoolVarsFieldNumber = 6;
+    private pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable> boolVars_ = new pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable>();
+    public scg::IList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable> BoolVarsList {
+      get { return boolVars_; }
+    }
+    public int BoolVarsCount {
+      get { return boolVars_.Count; }
+    }
+    public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable GetBoolVars(int index) {
+      return boolVars_[index];
+    }
+    
+    public const int BoolArrayVarsFieldNumber = 7;
+    private pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable> boolArrayVars_ = new pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable>();
+    public scg::IList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable> BoolArrayVarsList {
+      get { return boolArrayVars_; }
+    }
+    public int BoolArrayVarsCount {
+      get { return boolArrayVars_.Count; }
+    }
+    public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable GetBoolArrayVars(int index) {
+      return boolArrayVars_[index];
+    }
+    
+    public const int StringVarsFieldNumber = 8;
+    private pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable> stringVars_ = new pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable>();
+    public scg::IList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable> StringVarsList {
+      get { return stringVars_; }
+    }
+    public int StringVarsCount {
+      get { return stringVars_.Count; }
+    }
+    public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable GetStringVars(int index) {
+      return stringVars_[index];
+    }
+    
+    public const int StringArrayVarsFieldNumber = 9;
+    private pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable> stringArrayVars_ = new pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable>();
+    public scg::IList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable> StringArrayVarsList {
+      get { return stringArrayVars_; }
+    }
+    public int StringArrayVarsCount {
+      get { return stringArrayVars_.Count; }
+    }
+    public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable GetStringArrayVars(int index) {
+      return stringArrayVars_[index];
+    }
+    
+    public const int RawVarsFieldNumber = 10;
+    private pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable> rawVars_ = new pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable>();
+    public scg::IList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable> RawVarsList {
+      get { return rawVars_; }
+    }
+    public int RawVarsCount {
+      get { return rawVars_.Count; }
+    }
+    public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable GetRawVars(int index) {
+      return rawVars_[index];
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (!hasSolutionId) return false;
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable element in IntegerVarsList) {
+          if (!element.IsInitialized) return false;
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable element in IntegerArrayVarsList) {
+          if (!element.IsInitialized) return false;
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable element in DoubleVarsList) {
+          if (!element.IsInitialized) return false;
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable element in DoubleArrayVarsList) {
+          if (!element.IsInitialized) return false;
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable element in BoolVarsList) {
+          if (!element.IsInitialized) return false;
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable element in BoolArrayVarsList) {
+          if (!element.IsInitialized) return false;
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable element in StringVarsList) {
+          if (!element.IsInitialized) return false;
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable element in StringArrayVarsList) {
+          if (!element.IsInitialized) return false;
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable element in RawVarsList) {
+          if (!element.IsInitialized) return false;
+        }
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      int size = SerializedSize;
+      string[] field_names = _solutionMessageFieldNames;
+      if (hasSolutionId) {
+        output.WriteInt32(1, field_names[7], SolutionId);
+      }
+      if (integerVars_.Count > 0) {
+        output.WriteMessageArray(2, field_names[5], integerVars_);
+      }
+      if (integerArrayVars_.Count > 0) {
+        output.WriteMessageArray(3, field_names[4], integerArrayVars_);
+      }
+      if (doubleVars_.Count > 0) {
+        output.WriteMessageArray(4, field_names[3], doubleVars_);
+      }
+      if (doubleArrayVars_.Count > 0) {
+        output.WriteMessageArray(5, field_names[2], doubleArrayVars_);
+      }
+      if (boolVars_.Count > 0) {
+        output.WriteMessageArray(6, field_names[1], boolVars_);
+      }
+      if (boolArrayVars_.Count > 0) {
+        output.WriteMessageArray(7, field_names[0], boolArrayVars_);
+      }
+      if (stringVars_.Count > 0) {
+        output.WriteMessageArray(8, field_names[9], stringVars_);
+      }
+      if (stringArrayVars_.Count > 0) {
+        output.WriteMessageArray(9, field_names[8], stringArrayVars_);
+      }
+      if (rawVars_.Count > 0) {
+        output.WriteMessageArray(10, field_names[6], rawVars_);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (hasSolutionId) {
+          size += pb::CodedOutputStream.ComputeInt32Size(1, SolutionId);
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable element in IntegerVarsList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(2, element);
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable element in IntegerArrayVarsList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(3, element);
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable element in DoubleVarsList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(4, element);
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable element in DoubleArrayVarsList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(5, element);
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable element in BoolVarsList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(6, element);
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable element in BoolArrayVarsList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(7, element);
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable element in StringVarsList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(8, element);
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable element in StringArrayVarsList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(9, element);
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable element in RawVarsList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(10, element);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static SolutionMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SolutionMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SolutionMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SolutionMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SolutionMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SolutionMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static SolutionMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static SolutionMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static SolutionMessage ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SolutionMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private SolutionMessage MakeReadOnly() {
+      integerVars_.MakeReadOnly();
+      integerArrayVars_.MakeReadOnly();
+      doubleVars_.MakeReadOnly();
+      doubleArrayVars_.MakeReadOnly();
+      boolVars_.MakeReadOnly();
+      boolArrayVars_.MakeReadOnly();
+      stringVars_.MakeReadOnly();
+      stringArrayVars_.MakeReadOnly();
+      rawVars_.MakeReadOnly();
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(SolutionMessage prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+    public sealed partial class Builder : pb::GeneratedBuilder<SolutionMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(SolutionMessage cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private SolutionMessage result;
+      
+      private SolutionMessage PrepareBuilder() {
+        if (resultIsReadOnly) {
+          SolutionMessage original = result;
+          result = new SolutionMessage();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override SolutionMessage MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Descriptor; }
+      }
+      
+      public override SolutionMessage DefaultInstanceForType {
+        get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.DefaultInstance; }
+      }
+      
+      public override SolutionMessage BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is SolutionMessage) {
+          return MergeFrom((SolutionMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(SolutionMessage other) {
+        if (other == global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasSolutionId) {
+          SolutionId = other.SolutionId;
+        }
+        if (other.integerVars_.Count != 0) {
+          result.integerVars_.Add(other.integerVars_);
+        }
+        if (other.integerArrayVars_.Count != 0) {
+          result.integerArrayVars_.Add(other.integerArrayVars_);
+        }
+        if (other.doubleVars_.Count != 0) {
+          result.doubleVars_.Add(other.doubleVars_);
+        }
+        if (other.doubleArrayVars_.Count != 0) {
+          result.doubleArrayVars_.Add(other.doubleArrayVars_);
+        }
+        if (other.boolVars_.Count != 0) {
+          result.boolVars_.Add(other.boolVars_);
+        }
+        if (other.boolArrayVars_.Count != 0) {
+          result.boolArrayVars_.Add(other.boolArrayVars_);
+        }
+        if (other.stringVars_.Count != 0) {
+          result.stringVars_.Add(other.stringVars_);
+        }
+        if (other.stringArrayVars_.Count != 0) {
+          result.stringArrayVars_.Add(other.stringArrayVars_);
+        }
+        if (other.rawVars_.Count != 0) {
+          result.rawVars_.Add(other.rawVars_);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_solutionMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _solutionMessageFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasSolutionId = input.ReadInt32(ref result.solutionId_);
+              break;
+            }
+            case 18: {
+              input.ReadMessageArray(tag, field_name, result.integerVars_, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 26: {
+              input.ReadMessageArray(tag, field_name, result.integerArrayVars_, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 34: {
+              input.ReadMessageArray(tag, field_name, result.doubleVars_, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 42: {
+              input.ReadMessageArray(tag, field_name, result.doubleArrayVars_, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 50: {
+              input.ReadMessageArray(tag, field_name, result.boolVars_, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 58: {
+              input.ReadMessageArray(tag, field_name, result.boolArrayVars_, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 66: {
+              input.ReadMessageArray(tag, field_name, result.stringVars_, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 74: {
+              input.ReadMessageArray(tag, field_name, result.stringArrayVars_, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 82: {
+              input.ReadMessageArray(tag, field_name, result.rawVars_, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable.DefaultInstance, extensionRegistry);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public bool HasSolutionId {
+        get { return result.hasSolutionId; }
+      }
+      public int SolutionId {
+        get { return result.SolutionId; }
+        set { SetSolutionId(value); }
+      }
+      public Builder SetSolutionId(int value) {
+        PrepareBuilder();
+        result.hasSolutionId = true;
+        result.solutionId_ = value;
+        return this;
+      }
+      public Builder ClearSolutionId() {
+        PrepareBuilder();
+        result.hasSolutionId = false;
+        result.solutionId_ = 0;
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable> IntegerVarsList {
+        get { return PrepareBuilder().integerVars_; }
+      }
+      public int IntegerVarsCount {
+        get { return result.IntegerVarsCount; }
+      }
+      public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable GetIntegerVars(int index) {
+        return result.GetIntegerVars(index);
+      }
+      public Builder SetIntegerVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.integerVars_[index] = value;
+        return this;
+      }
+      public Builder SetIntegerVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.integerVars_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddIntegerVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.integerVars_.Add(value);
+        return this;
+      }
+      public Builder AddIntegerVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.integerVars_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeIntegerVars(scg::IEnumerable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable> values) {
+        PrepareBuilder();
+        result.integerVars_.Add(values);
+        return this;
+      }
+      public Builder ClearIntegerVars() {
+        PrepareBuilder();
+        result.integerVars_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable> IntegerArrayVarsList {
+        get { return PrepareBuilder().integerArrayVars_; }
+      }
+      public int IntegerArrayVarsCount {
+        get { return result.IntegerArrayVarsCount; }
+      }
+      public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable GetIntegerArrayVars(int index) {
+        return result.GetIntegerArrayVars(index);
+      }
+      public Builder SetIntegerArrayVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.integerArrayVars_[index] = value;
+        return this;
+      }
+      public Builder SetIntegerArrayVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.integerArrayVars_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddIntegerArrayVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.integerArrayVars_.Add(value);
+        return this;
+      }
+      public Builder AddIntegerArrayVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.integerArrayVars_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeIntegerArrayVars(scg::IEnumerable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable> values) {
+        PrepareBuilder();
+        result.integerArrayVars_.Add(values);
+        return this;
+      }
+      public Builder ClearIntegerArrayVars() {
+        PrepareBuilder();
+        result.integerArrayVars_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable> DoubleVarsList {
+        get { return PrepareBuilder().doubleVars_; }
+      }
+      public int DoubleVarsCount {
+        get { return result.DoubleVarsCount; }
+      }
+      public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable GetDoubleVars(int index) {
+        return result.GetDoubleVars(index);
+      }
+      public Builder SetDoubleVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.doubleVars_[index] = value;
+        return this;
+      }
+      public Builder SetDoubleVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.doubleVars_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddDoubleVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.doubleVars_.Add(value);
+        return this;
+      }
+      public Builder AddDoubleVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.doubleVars_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeDoubleVars(scg::IEnumerable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable> values) {
+        PrepareBuilder();
+        result.doubleVars_.Add(values);
+        return this;
+      }
+      public Builder ClearDoubleVars() {
+        PrepareBuilder();
+        result.doubleVars_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable> DoubleArrayVarsList {
+        get { return PrepareBuilder().doubleArrayVars_; }
+      }
+      public int DoubleArrayVarsCount {
+        get { return result.DoubleArrayVarsCount; }
+      }
+      public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable GetDoubleArrayVars(int index) {
+        return result.GetDoubleArrayVars(index);
+      }
+      public Builder SetDoubleArrayVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.doubleArrayVars_[index] = value;
+        return this;
+      }
+      public Builder SetDoubleArrayVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.doubleArrayVars_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddDoubleArrayVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.doubleArrayVars_.Add(value);
+        return this;
+      }
+      public Builder AddDoubleArrayVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.doubleArrayVars_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeDoubleArrayVars(scg::IEnumerable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable> values) {
+        PrepareBuilder();
+        result.doubleArrayVars_.Add(values);
+        return this;
+      }
+      public Builder ClearDoubleArrayVars() {
+        PrepareBuilder();
+        result.doubleArrayVars_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable> BoolVarsList {
+        get { return PrepareBuilder().boolVars_; }
+      }
+      public int BoolVarsCount {
+        get { return result.BoolVarsCount; }
+      }
+      public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable GetBoolVars(int index) {
+        return result.GetBoolVars(index);
+      }
+      public Builder SetBoolVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.boolVars_[index] = value;
+        return this;
+      }
+      public Builder SetBoolVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.boolVars_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddBoolVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.boolVars_.Add(value);
+        return this;
+      }
+      public Builder AddBoolVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.boolVars_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeBoolVars(scg::IEnumerable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable> values) {
+        PrepareBuilder();
+        result.boolVars_.Add(values);
+        return this;
+      }
+      public Builder ClearBoolVars() {
+        PrepareBuilder();
+        result.boolVars_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable> BoolArrayVarsList {
+        get { return PrepareBuilder().boolArrayVars_; }
+      }
+      public int BoolArrayVarsCount {
+        get { return result.BoolArrayVarsCount; }
+      }
+      public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable GetBoolArrayVars(int index) {
+        return result.GetBoolArrayVars(index);
+      }
+      public Builder SetBoolArrayVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.boolArrayVars_[index] = value;
+        return this;
+      }
+      public Builder SetBoolArrayVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.boolArrayVars_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddBoolArrayVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.boolArrayVars_.Add(value);
+        return this;
+      }
+      public Builder AddBoolArrayVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.boolArrayVars_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeBoolArrayVars(scg::IEnumerable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable> values) {
+        PrepareBuilder();
+        result.boolArrayVars_.Add(values);
+        return this;
+      }
+      public Builder ClearBoolArrayVars() {
+        PrepareBuilder();
+        result.boolArrayVars_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable> StringVarsList {
+        get { return PrepareBuilder().stringVars_; }
+      }
+      public int StringVarsCount {
+        get { return result.StringVarsCount; }
+      }
+      public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable GetStringVars(int index) {
+        return result.GetStringVars(index);
+      }
+      public Builder SetStringVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.stringVars_[index] = value;
+        return this;
+      }
+      public Builder SetStringVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.stringVars_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddStringVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.stringVars_.Add(value);
+        return this;
+      }
+      public Builder AddStringVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.stringVars_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeStringVars(scg::IEnumerable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable> values) {
+        PrepareBuilder();
+        result.stringVars_.Add(values);
+        return this;
+      }
+      public Builder ClearStringVars() {
+        PrepareBuilder();
+        result.stringVars_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable> StringArrayVarsList {
+        get { return PrepareBuilder().stringArrayVars_; }
+      }
+      public int StringArrayVarsCount {
+        get { return result.StringArrayVarsCount; }
+      }
+      public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable GetStringArrayVars(int index) {
+        return result.GetStringArrayVars(index);
+      }
+      public Builder SetStringArrayVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.stringArrayVars_[index] = value;
+        return this;
+      }
+      public Builder SetStringArrayVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.stringArrayVars_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddStringArrayVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.stringArrayVars_.Add(value);
+        return this;
+      }
+      public Builder AddStringArrayVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.stringArrayVars_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeStringArrayVars(scg::IEnumerable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable> values) {
+        PrepareBuilder();
+        result.stringArrayVars_.Add(values);
+        return this;
+      }
+      public Builder ClearStringArrayVars() {
+        PrepareBuilder();
+        result.stringArrayVars_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable> RawVarsList {
+        get { return PrepareBuilder().rawVars_; }
+      }
+      public int RawVarsCount {
+        get { return result.RawVarsCount; }
+      }
+      public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable GetRawVars(int index) {
+        return result.GetRawVars(index);
+      }
+      public Builder SetRawVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.rawVars_[index] = value;
+        return this;
+      }
+      public Builder SetRawVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.rawVars_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRawVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.rawVars_.Add(value);
+        return this;
+      }
+      public Builder AddRawVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.rawVars_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRawVars(scg::IEnumerable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable> values) {
+        PrepareBuilder();
+        result.rawVars_.Add(values);
+        return this;
+      }
+      public Builder ClearRawVars() {
+        PrepareBuilder();
+        result.rawVars_.Clear();
+        return this;
+      }
+    }
+    static SolutionMessage() {
+      object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+  public sealed partial class QualityMessage : pb::ExtendableMessage<QualityMessage, QualityMessage.Builder> {
+    private QualityMessage() { }
+    private static readonly QualityMessage defaultInstance = new QualityMessage().MakeReadOnly();
+    private static readonly string[] _qualityMessageFieldNames = new string[] { "quality", "solutionId" };
+    private static readonly uint[] _qualityMessageFieldTags = new uint[] { 17, 8 };
+    public static QualityMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override QualityMessage DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override QualityMessage ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_QualityMessage__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<QualityMessage, QualityMessage.Builder> InternalFieldAccessors {
+      get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_QualityMessage__FieldAccessorTable; }
+    }
+    
+    public const int SolutionIdFieldNumber = 1;
+    private bool hasSolutionId;
+    private int solutionId_;
+    public bool HasSolutionId {
+      get { return hasSolutionId; }
+    }
+    public int SolutionId {
+      get { return solutionId_; }
+    }
+    
+    public const int QualityFieldNumber = 2;
+    private bool hasQuality;
+    private double quality_;
+    public bool HasQuality {
+      get { return hasQuality; }
+    }
+    public double Quality {
+      get { return quality_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (!hasSolutionId) return false;
+        if (!hasQuality) return false;
+        if (!ExtensionsAreInitialized) return false;
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      int size = SerializedSize;
+      string[] field_names = _qualityMessageFieldNames;
+      pb::ExtendableMessage<QualityMessage, QualityMessage.Builder>.ExtensionWriter extensionWriter = CreateExtensionWriter(this);
+      if (hasSolutionId) {
+        output.WriteInt32(1, field_names[1], SolutionId);
+      }
+      if (hasQuality) {
+        output.WriteDouble(2, field_names[0], Quality);
+      }
+      extensionWriter.WriteUntil(536870912, output);
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (hasSolutionId) {
+          size += pb::CodedOutputStream.ComputeInt32Size(1, SolutionId);
+        }
+        if (hasQuality) {
+          size += pb::CodedOutputStream.ComputeDoubleSize(2, Quality);
+        }
+        size += ExtensionsSerializedSize;
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static QualityMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static QualityMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static QualityMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static QualityMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static QualityMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static QualityMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static QualityMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static QualityMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static QualityMessage ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static QualityMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private QualityMessage MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(QualityMessage prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+    public sealed partial class Builder : pb::ExtendableBuilder<QualityMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(QualityMessage cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private QualityMessage result;
+      
+      private QualityMessage PrepareBuilder() {
+        if (resultIsReadOnly) {
+          QualityMessage original = result;
+          result = new QualityMessage();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override QualityMessage MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::HeuristicLab.Problems.ExternalEvaluation.QualityMessage.Descriptor; }
+      }
+      
+      public override QualityMessage DefaultInstanceForType {
+        get { return global::HeuristicLab.Problems.ExternalEvaluation.QualityMessage.DefaultInstance; }
+      }
+      
+      public override QualityMessage BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is QualityMessage) {
+          return MergeFrom((QualityMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(QualityMessage other) {
+        if (other == global::HeuristicLab.Problems.ExternalEvaluation.QualityMessage.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasSolutionId) {
+          SolutionId = other.SolutionId;
+        }
+        if (other.HasQuality) {
+          Quality = other.Quality;
+        }
+          this.MergeExtensionFields(other);
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_qualityMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _qualityMessageFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasSolutionId = input.ReadInt32(ref result.solutionId_);
+              break;
+            }
+            case 17: {
+              result.hasQuality = input.ReadDouble(ref result.quality_);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public bool HasSolutionId {
+        get { return result.hasSolutionId; }
+      }
+      public int SolutionId {
+        get { return result.SolutionId; }
+        set { SetSolutionId(value); }
+      }
+      public Builder SetSolutionId(int value) {
+        PrepareBuilder();
+        result.hasSolutionId = true;
+        result.solutionId_ = value;
+        return this;
+      }
+      public Builder ClearSolutionId() {
+        PrepareBuilder();
+        result.hasSolutionId = false;
+        result.solutionId_ = 0;
+        return this;
+      }
+      
+      public bool HasQuality {
+        get { return result.hasQuality; }
+      }
+      public double Quality {
+        get { return result.Quality; }
+        set { SetQuality(value); }
+      }
+      public Builder SetQuality(double value) {
+        PrepareBuilder();
+        result.hasQuality = true;
+        result.quality_ = value;
+        return this;
+      }
+      public Builder ClearQuality() {
+        PrepareBuilder();
+        result.hasQuality = false;
+        result.quality_ = 0D;
+        return this;
+      }
+    }
+    static QualityMessage() {
+      object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+    }
+  }
+  
+  #endregion
+  
+  #region Services
+  /*
+  * Service generation is now disabled by default, use the following option to enable:
+  * option (google.protobuf.csharp_file_options).service_generator_type = GENERIC;
+  */
+  #endregion
+  
+}
+
+#endregion Designer generated code
Index: trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/ExternalEvaluationMessages.proto
===================================================================
--- trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/ExternalEvaluationMessages.proto	(revision 15014)
+++ trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/ExternalEvaluationMessages.proto	(revision 15014)
@@ -0,0 +1,94 @@
+package HeuristicLab.Problems.ExternalEvaluation;
+option java_package = "com.heuristiclab.problems.externalevaluation";
+
+message SolutionMessage {
+	required int32 solutionId = 1;
+  
+	message IntegerVariable {
+		required string name = 1;
+		optional int32 data = 2;
+	}
+	repeated IntegerVariable integerVars = 2;
+  
+	message IntegerArrayVariable {
+		required string name = 1;
+		repeated int32 data = 2;
+		optional int32 length = 3;
+	}
+	repeated IntegerArrayVariable integerArrayVars = 3;
+  
+	message DoubleVariable {
+		required string name = 1;
+		optional double data = 2;
+	}
+	repeated DoubleVariable doubleVars = 4;
+  
+	message DoubleArrayVariable {
+		required string name = 1;
+		repeated double data = 2;
+		optional int32 length = 3;
+	}
+	repeated DoubleArrayVariable doubleArrayVars = 5;
+  
+	message BoolVariable {
+		required string name = 1;
+		optional bool data = 2;
+	}
+	repeated BoolVariable boolVars = 6;
+  
+	message BoolArrayVariable {
+		required string name = 1;
+		repeated bool data = 2;
+		optional int32 length = 3;
+	}
+	repeated BoolArrayVariable boolArrayVars = 7;
+  
+	message StringVariable {
+		required string name = 1;
+		optional string data = 2;
+	}
+	repeated StringVariable stringVars = 8;
+  
+	message StringArrayVariable {
+		required string name = 1;
+		repeated string data = 2;
+		optional int32 length = 3;
+	}
+	repeated StringArrayVariable stringArrayVars = 9;
+  
+	message RawVariable {
+		required string name = 1;
+		optional bytes data = 2;
+	}
+	repeated RawVariable rawVars = 10;
+}
+
+// Nested Extensions http://www.indelible.org/ink/protobuf-polymorphism/
+message QualityMessage {
+	required int32 solutionId = 1;
+	enum Type {
+		SingleObjectiveQualityMessage = 1;
+		MultiObjectiveQualityMessage = 2;
+	}
+	required Type type = 2;
+	extensions 1000 to max;
+}
+
+message SingleObjectiveQualityMessage {
+	extend QualityMessage {
+		required SingleObjectiveQualityMessage qualityMessage = 1000;  // unique QualityMessage extension number
+	}
+	required double quality = 1;
+}
+message MultiObjectiveQualityMessage {
+	extend QualityMessage {
+		required MultiObjectiveQualityMessage qualityMessage = 1001;  // unique QualityMessage extension number
+	}
+	repeated double qualities = 1;
+}
+
+  
+service EvaluationService {
+	rpc EvaluateSingleObjective (SolutionMessage) returns (SingleObjectiveQualityMessage);
+	rpc EvaluateMultiObjectives (SolutionMessage) returns (MultiObjectiveQualityMessage);
+}
Index: trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/Interfaces/IChannel.cs
===================================================================
--- trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/Interfaces/IChannel.cs	(revision 15014)
+++ trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/Interfaces/IChannel.cs	(revision 15014)
@@ -0,0 +1,36 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Google.ProtocolBuffers;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.Service {
+  public interface IChannel {
+    bool IsInitialized { get; }
+    void Open();
+    void Send(IMessage msg);
+    IMessage Receive(IBuilder builder);
+    void Close();
+  }
+}
Index: trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/Interfaces/IListener.cs
===================================================================
--- trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/Interfaces/IListener.cs	(revision 15014)
+++ trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/Interfaces/IListener.cs	(revision 15014)
@@ -0,0 +1,33 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.Service {
+  public interface IListener {
+    void Listen();
+    void Stop();
+    event EventHandler<EventArgs<IChannel>> Discovered;
+  }
+}
Index: trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/Interfaces/IListenerFactory.cs
===================================================================
--- trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/Interfaces/IListenerFactory.cs	(revision 15014)
+++ trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/Interfaces/IListenerFactory.cs	(revision 15014)
@@ -0,0 +1,31 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.Service {
+  public interface IListenerFactory {
+    IListener CreateListener();
+  }
+}
Index: trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/PollService.cs
===================================================================
--- trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/PollService.cs	(revision 15014)
+++ trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/PollService.cs	(revision 15014)
@@ -0,0 +1,76 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.Service {
+  public class PollService : Service {
+    private BlockingQueue<SolutionMessage> messageQueue;
+
+    public PollService(IListenerFactory driverFactory)
+      : base(driverFactory) {
+      messageQueue = new BlockingQueue<SolutionMessage>(int.MaxValue);
+    }
+
+    public override void Stop() {
+      messageQueue.Close();
+      base.Stop();
+    }
+
+    public SolutionMessage GetSolution() {
+      try {
+        return messageQueue.Dequeue();
+      } catch (QueueClosedException) { }
+      return null;
+    }
+
+    public QualityMessage.Builder PrepareQualityMessage(SolutionMessage msg, double quality) {
+      QualityMessage.Builder qualityMessageBuilder = QualityMessage.CreateBuilder();
+      qualityMessageBuilder.SetSolutionId(msg.SolutionId)
+                           .SetQuality(quality);
+      return qualityMessageBuilder;
+    }
+
+    public void SendQualityMessage(SolutionMessage sMsg, QualityMessage qMsg) {
+      Send(qMsg, sMsg);
+    }
+
+    public void SendQuality(SolutionMessage msg, double quality) {
+      QualityMessage.Builder qualityMessageBuilder = QualityMessage.CreateBuilder();
+      qualityMessageBuilder.SetSolutionId(msg.SolutionId)
+                           .SetQuality(quality);
+      Send(qualityMessageBuilder.Build(), msg);
+    }
+
+    public event EventHandler SolutionProduced;
+
+    protected override void OnSolutionProduced(SolutionMessage msg, IChannel channel) {
+      base.OnSolutionProduced(msg, channel);
+      try {
+        messageQueue.Enqueue(msg);
+      } catch (QueueClosedException) {
+        return;
+      }
+      EventHandler handler = SolutionProduced;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+  }
+}
Index: trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/Properties/AssemblyInfo.cs
===================================================================
--- trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/Properties/AssemblyInfo.cs	(revision 15014)
+++ trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/Properties/AssemblyInfo.cs	(revision 15014)
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Problems.ExternalEvaluation.Service")]
+[assembly: AssemblyDescription("Service implementation to talk to HeuristicLab's External Evaluation Problem.")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("HEAL")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("Copyright © HEAL 2002-2012")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("bc1dcd80-8c90-44b7-8f54-0e570548387f")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.7.0")]
Index: trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/Properties/AssemblyInfo.cs.frame
===================================================================
--- trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/Properties/AssemblyInfo.cs.frame	(revision 15014)
+++ trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/Properties/AssemblyInfo.cs.frame	(revision 15014)
@@ -0,0 +1,36 @@
+﻿using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Problems.ExternalEvaluation.Service")]
+[assembly: AssemblyDescription("Service implementation to talk to HeuristicLab's External Evaluation Problem.")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("HEAL")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("Copyright © HEAL 2002-2012")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("bc1dcd80-8c90-44b7-8f54-0e570548387f")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.7.$WCREV$")]
Index: trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/ServerSocketListener.cs
===================================================================
--- trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/ServerSocketListener.cs	(revision 15014)
+++ trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/ServerSocketListener.cs	(revision 15014)
@@ -0,0 +1,88 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Net.Sockets;
+using System.Net;
+using System.Threading;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.Service {
+  public class ServerSocketListener : IListener {
+    private int port;
+    private IPAddress bindAddress;
+    private TcpListener server;
+    private Thread listenerThread;
+
+    public ServerSocketListener(int port) {
+      this.port = port;
+      this.bindAddress = null;
+    }
+
+    public ServerSocketListener(int port, String ipAddress) {
+      this.port = port;
+      this.bindAddress = IPAddress.Parse(ipAddress);
+    }
+
+    public void Listen() {
+      if (server == null) {
+        if (bindAddress == null)
+          server = new TcpListener(new IPEndPoint(IPAddress.Any, port));
+        else
+          server = new TcpListener(new IPEndPoint(bindAddress, port));
+        server.Start();
+        listenerThread = new Thread(this.ListenForClient);
+        listenerThread.Start();
+      }
+    }
+
+    private void ListenForClient() {
+      while (true) {
+        try {
+          TcpClient client = server.AcceptTcpClient();
+          StreamChannel streamChannel = new StreamChannel(client.GetStream(), client.GetStream());
+          OnDiscovered(streamChannel);
+        } catch (Exception) {
+          try {
+            Stop();
+          } catch (ThreadAbortException) { }
+          break;
+        }
+      }
+    }
+
+    public void Stop() {
+      listenerThread.Abort();
+      if (server != null) {
+        server.Stop();
+        server = null;
+      }
+    }
+
+    public event EventHandler<EventArgs<IChannel>> Discovered;
+    protected void OnDiscovered(IChannel channel) {
+      var handler = Discovered;
+      if (handler != null) Discovered(this, new EventArgs<IChannel>(channel));
+    }
+  }
+}
Index: trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/ServerSocketListenerFactory.cs
===================================================================
--- trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/ServerSocketListenerFactory.cs	(revision 15014)
+++ trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/ServerSocketListenerFactory.cs	(revision 15014)
@@ -0,0 +1,49 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.Service {
+  public class ServerSocketListenerFactory : IListenerFactory {
+    private string ipAddress;
+    private int port;
+
+    public ServerSocketListenerFactory(int port) {
+      this.ipAddress = null;
+      this.port = port;
+    }
+
+    public ServerSocketListenerFactory(int port, string ipAddress) {
+      this.ipAddress = ipAddress;
+      this.port = port;
+    }
+
+    public IListener CreateListener() {
+      if (ipAddress == null)
+        return new ServerSocketListener(port);
+      else
+        return new ServerSocketListener(port, ipAddress);
+    }
+  }
+}
Index: trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/Service.cs
===================================================================
--- trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/Service.cs	(revision 15014)
+++ trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/Service.cs	(revision 15014)
@@ -0,0 +1,143 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using Google.ProtocolBuffers;
+using HeuristicLab.Problems.ExternalEvaluation;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.Service {
+  public abstract class Service {
+    private static readonly int maxConnections = 10;
+    protected IListener listener;
+    private Dictionary<SolutionMessage, IChannel> recipientMemory;
+    private List<IChannel> channels;
+
+    public Service(IListenerFactory listenerFactory) {
+      channels = new List<IChannel>();
+      recipientMemory = new Dictionary<SolutionMessage, IChannel>();
+      listener = listenerFactory.CreateListener();
+      listener.Discovered += new EventHandler<EventArgs<IChannel>>(listener_Discovered);
+    }
+
+    public virtual void Start() {
+      listener.Listen();
+    }
+
+    public virtual void Stop() {
+      listener.Stop();
+      lock (channels) {
+        foreach (IChannel channel in channels)
+          channel.Close();
+        channels.Clear();
+      }
+      lock (recipientMemory) {
+        recipientMemory.Clear();
+      }
+    }
+
+    private void listener_Discovered(object sender, EventArgs<IChannel> e) {
+      lock (channels) {
+        if (channels.Count < maxConnections) {
+          channels.Add(e.Value);
+          SolutionProducer producer = new SolutionProducer(this, e.Value);
+          Thread tmp = new Thread(producer.Produce);
+          producer.Finished += new EventHandler<EventArgs<IChannel>>(producer_Finished);
+          tmp.Start();
+        } else e.Value.Close();
+      }
+    }
+
+    private void producer_Finished(object sender, EventArgs<IChannel> e) {
+      lock (channels) {
+        channels.Remove(e.Value);
+      }
+      lock (recipientMemory) {
+        var solutions = recipientMemory.Where(x => x.Value == e.Value).Select(x => x.Key).ToList();
+        foreach (SolutionMessage msg in solutions)
+          recipientMemory.Remove(msg);
+      }
+    }
+
+    protected virtual void Send(QualityMessage msg, SolutionMessage original) {
+      lock (recipientMemory) {
+        if (recipientMemory.ContainsKey(original)) {
+          recipientMemory[original].Send(msg);
+          recipientMemory.Remove(original);
+        }
+      }
+    }
+
+    protected virtual void OnSolutionProduced(SolutionMessage msg, IChannel channel) {
+      lock (recipientMemory) {
+        recipientMemory.Add(msg, channel);
+      }
+    }
+
+    private class SolutionProducer {
+      private IChannel channel;
+      private Service service;
+
+      public SolutionProducer(Service service, IChannel channel) {
+        this.service = service;
+        this.channel = channel;
+      }
+
+      public void Produce() {
+        while (true) {
+          SolutionMessage.Builder builder = SolutionMessage.CreateBuilder();
+          try {
+            SolutionMessage msg = (SolutionMessage)channel.Receive(builder);
+            MessageNotifier notifier = new MessageNotifier(msg, channel);
+            ThreadPool.QueueUserWorkItem(new WaitCallback(notifier.Notify), service);
+          } catch (Exception) {
+            break;
+          }
+        }
+        OnFinished();
+      }
+
+      public event EventHandler<EventArgs<IChannel>> Finished;
+      private void OnFinished() {
+        var handler = Finished;
+        if (handler != null) handler(this, new EventArgs<IChannel>(channel));
+      }
+
+      private class MessageNotifier {
+        SolutionMessage msg;
+        IChannel channel;
+
+        public MessageNotifier(SolutionMessage msg, IChannel channel) {
+          this.msg = msg;
+          this.channel = channel;
+        }
+
+        public void Notify(object state) {
+          Service service = (Service)state;
+          service.OnSolutionProduced(msg, channel);
+        }
+      }
+    }
+  }
+}
Index: trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/StreamChannel.cs
===================================================================
--- trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/StreamChannel.cs	(revision 15014)
+++ trunk/tools/ExternalEvaluation/CSharp/ExternalEvaluation.Service/StreamChannel.cs	(revision 15014)
@@ -0,0 +1,72 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.IO;
+using Google.ProtocolBuffers;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.Service {
+  public class StreamChannel : Channel {
+    private object inputLock = new object();
+    private Stream input;
+    private object outputLock = new object();
+    private Stream output;
+
+    public StreamChannel(Stream input, Stream output)
+      : base() {
+      this.input = input;
+      this.output = output;
+    }
+
+    public override void Open() {
+      base.Open();
+    }
+
+    public override void Send(IMessage msg) {
+      lock (outputLock) {
+        msg.WriteDelimitedTo(output);
+        output.Flush(); // very important!
+      }
+    }
+
+    public override IMessage Receive(IBuilder builder) {
+      lock (inputLock) {
+        // hacky, there doesn't seem to be an IBuilder.WeakMergeDelimitedFrom
+        CodedInputStream cIn = CodedInputStream.CreateInstance(input);
+        uint length = cIn.ReadRawVarint32();
+        byte[] message = cIn.ReadRawBytes((int)length);
+        builder.WeakMergeFrom(ByteString.CopyFrom(message));
+        if (builder.IsInitialized)
+          return builder.WeakBuild();
+        else throw new EndOfStreamException("EOF reached, but message is incomplete.");
+      }
+    }
+
+    public override void Close() {
+      base.Close();
+      input.Close();
+      output.Close();
+    }
+  }
+}
Index: trunk/tools/ExternalEvaluation/CSharp/HL3ExternalEvaluation.sln
===================================================================
--- trunk/tools/ExternalEvaluation/CSharp/HL3ExternalEvaluation.sln	(revision 15014)
+++ trunk/tools/ExternalEvaluation/CSharp/HL3ExternalEvaluation.sln	(revision 15014)
@@ -0,0 +1,46 @@
+﻿
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.26430.6
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExternalEvaluation.Service", "ExternalEvaluation.Service\ExternalEvaluation.Service.csproj", "{79C76C35-4D81-4E8F-BC0A-15A1C435A112}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExternalEvaluation.Service.Host", "ExternalEvaluation.Service.Host\ExternalEvaluation.Service.Host.csproj", "{C08BC223-0B50-40DB-A646-2AE083FFA189}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{3CD2B498-DC9C-4DA9-9FF6-DA7D5899886A}"
+	ProjectSection(SolutionItems) = preProject
+		Google.ProtocolBuffers-2.4.1.473.dll = Google.ProtocolBuffers-2.4.1.473.dll
+		PreBuildEvent.cmd = PreBuildEvent.cmd
+		protoc.exe = protoc.exe
+		ProtoGen.exe = ProtoGen.exe
+	EndProjectSection
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Debug|x86 = Debug|x86
+		Release|Any CPU = Release|Any CPU
+		Release|x86 = Release|x86
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{79C76C35-4D81-4E8F-BC0A-15A1C435A112}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{79C76C35-4D81-4E8F-BC0A-15A1C435A112}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{79C76C35-4D81-4E8F-BC0A-15A1C435A112}.Debug|x86.ActiveCfg = Debug|x86
+		{79C76C35-4D81-4E8F-BC0A-15A1C435A112}.Debug|x86.Build.0 = Debug|x86
+		{79C76C35-4D81-4E8F-BC0A-15A1C435A112}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{79C76C35-4D81-4E8F-BC0A-15A1C435A112}.Release|Any CPU.Build.0 = Release|Any CPU
+		{79C76C35-4D81-4E8F-BC0A-15A1C435A112}.Release|x86.ActiveCfg = Release|x86
+		{79C76C35-4D81-4E8F-BC0A-15A1C435A112}.Release|x86.Build.0 = Release|x86
+		{C08BC223-0B50-40DB-A646-2AE083FFA189}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{C08BC223-0B50-40DB-A646-2AE083FFA189}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{C08BC223-0B50-40DB-A646-2AE083FFA189}.Debug|x86.ActiveCfg = Debug|x86
+		{C08BC223-0B50-40DB-A646-2AE083FFA189}.Debug|x86.Build.0 = Debug|x86
+		{C08BC223-0B50-40DB-A646-2AE083FFA189}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{C08BC223-0B50-40DB-A646-2AE083FFA189}.Release|Any CPU.Build.0 = Release|Any CPU
+		{C08BC223-0B50-40DB-A646-2AE083FFA189}.Release|x86.ActiveCfg = Release|x86
+		{C08BC223-0B50-40DB-A646-2AE083FFA189}.Release|x86.Build.0 = Release|x86
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
Index: trunk/tools/ExternalEvaluation/CSharp/PreBuildEvent.cmd
===================================================================
--- trunk/tools/ExternalEvaluation/CSharp/PreBuildEvent.cmd	(revision 15014)
+++ trunk/tools/ExternalEvaluation/CSharp/PreBuildEvent.cmd	(revision 15014)
@@ -0,0 +1,11 @@
+IF EXIST "%ProjectDir%\Properties\AssemblyInfo.cs.frame" SubWCRev "%ProjectDir%\" "%ProjectDir%\Properties\AssemblyInfo.cs.frame" "%ProjectDir%\Properties\AssemblyInfo.cs"
+IF %ERRORLEVEL% NEQ 0 GOTO Error_Handling
+IF EXIST "%ProjectDir%\Plugin.cs.frame" SubWCRev "%ProjectDir%\" "%ProjectDir%\Plugin.cs.frame" "%ProjectDir%\Plugin.cs"
+IF %ERRORLEVEL% NEQ 0 GOTO Error_Handling
+GOTO Done
+
+:Error_Handling
+ECHO There was an error while running subwcrev. Please verify that the *.cs.frame files have been correctly converted to *.cs files, otherwise HeuristicLab won't build. 
+exit 0
+
+:Done
Index: trunk/tools/ExternalEvaluation/Java/ExtendedExternalApplication/.classpath
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExtendedExternalApplication/.classpath	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExtendedExternalApplication/.classpath	(revision 15014)
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/HL3ExternalEvaluation"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
Index: trunk/tools/ExternalEvaluation/Java/ExtendedExternalApplication/.project
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExtendedExternalApplication/.project	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExtendedExternalApplication/.project	(revision 15014)
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>ExtendedExternalApplication</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
Index: trunk/tools/ExternalEvaluation/Java/ExtendedExternalApplication/.settings/org.eclipse.jdt.core.prefs
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExtendedExternalApplication/.settings/org.eclipse.jdt.core.prefs	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExtendedExternalApplication/.settings/org.eclipse.jdt.core.prefs	(revision 15014)
@@ -0,0 +1,12 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
Index: trunk/tools/ExternalEvaluation/Java/ExtendedExternalApplication/protoc-license.txt
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExtendedExternalApplication/protoc-license.txt	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExtendedExternalApplication/protoc-license.txt	(revision 15014)
@@ -0,0 +1,36 @@
+protoc.exe was built from the original source at http://code.google.com/p/protobuf/
+The licence for this code is as follows:
+
+Copyright 2008, Google Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+    * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Code generated by the Protocol Buffer compiler is owned by the owner
+of the input file used when generating it.  This code is not
+standalone and requires a support library to be linked with it.  This
+support library is itself covered by the above license.
Index: trunk/tools/ExternalEvaluation/Java/ExtendedExternalApplication/protos/ExternalEvaluationMessages.proto
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExtendedExternalApplication/protos/ExternalEvaluationMessages.proto	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExtendedExternalApplication/protos/ExternalEvaluationMessages.proto	(revision 15014)
@@ -0,0 +1,94 @@
+package HeuristicLab.Problems.ExternalEvaluation;
+option java_package = "com.heuristiclab.problems.externalevaluation";
+
+message SolutionMessage {
+  required int32 solutionId = 1;
+  
+  message IntegerVariable {
+    required string name = 1;
+    optional int32 data = 2;
+  }
+  repeated IntegerVariable integerVars = 2;
+  
+  message IntegerArrayVariable {
+    required string name = 1;
+    repeated int32 data = 2;
+    optional int32 length = 3;
+  }
+  repeated IntegerArrayVariable integerArrayVars = 3;
+  
+  message DoubleVariable {
+    required string name = 1;
+    optional double data = 2;
+  }
+  repeated DoubleVariable doubleVars = 4;
+  
+  message DoubleArrayVariable {
+    required string name = 1;
+    repeated double data = 2;
+    optional int32 length = 3;
+  }
+  repeated DoubleArrayVariable doubleArrayVars = 5;
+  
+  message BoolVariable {
+    required string name = 1;
+    optional bool data = 2;
+  }
+  repeated BoolVariable boolVars = 6;
+  
+  message BoolArrayVariable {
+    required string name = 1;
+    repeated bool data = 2;
+    optional int32 length = 3;
+  }
+  repeated BoolArrayVariable boolArrayVars = 7;
+  
+  message StringVariable {
+    required string name = 1;
+    optional string data = 2;
+  }
+  repeated StringVariable stringVars = 8;
+  
+  message StringArrayVariable {
+    required string name = 1;
+    repeated string data = 2;
+    optional int32 length = 3;
+  }
+  repeated StringArrayVariable stringArrayVars = 9;
+  
+  message RawVariable {
+    required string name = 1;
+    optional bytes data = 2;
+  }
+  repeated RawVariable rawVars = 10;
+}
+
+// Nested Extensions http://www.indelible.org/ink/protobuf-polymorphism/
+message QualityMessage {
+  required int32 solutionId = 1;
+  enum Type {
+    SingleObjectiveQualityMessage = 1;
+    MultiObjectiveQualityMessage = 2;
+  }
+  required Type type = 2;
+  extensions 1000 to max;
+}
+
+message SingleObjectiveQualityMessage {
+  extend QualityMessage {
+    required SingleObjectiveQualityMessage qualityMessage = 1000;  // unique QualityMessage extension number
+  }
+  required double quality = 1;
+}
+message MultiObjectiveQualityMessage {
+  extend QualityMessage {
+    required MultiObjectiveQualityMessage qualityMessage = 1001;  // unique QualityMessage extension number
+  }
+  repeated double qualities = 1;
+}
+
+  
+service EvaluationService {
+  rpc EvaluateSingleObjective (SolutionMessage) returns (SingleObjectiveQualityMessage);
+  rpc EvaluateMultiObjectives (SolutionMessage) returns (MultiObjectiveQualityMessage);
+}
Index: trunk/tools/ExternalEvaluation/Java/ExtendedExternalApplication/protos/RepetitionsQualityMessage.proto
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExtendedExternalApplication/protos/RepetitionsQualityMessage.proto	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExtendedExternalApplication/protos/RepetitionsQualityMessage.proto	(revision 15014)
@@ -0,0 +1,11 @@
+import "ExternalEvaluationMessages.proto";
+package HeuristicLab.Problems.ExternalEvaluation.RepetitionsExtension;
+option java_package = "com.heuristiclab.problems.externalevaluation.repetitionsextension";
+
+message RepetitionsResponse {
+  extend HeuristicLab.Problems.ExternalEvaluation.QualityMessage {
+    required int32 repetitions = 1010;
+    optional double variance = 1020;
+    optional int32 numFailed = 1030;
+  }
+}
Index: trunk/tools/ExternalEvaluation/Java/ExtendedExternalApplication/src/com/heuristiclab/problems/externalevaluation/repetitionsextension/RandomSocketPollEvaluator.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExtendedExternalApplication/src/com/heuristiclab/problems/externalevaluation/repetitionsextension/RandomSocketPollEvaluator.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExtendedExternalApplication/src/com/heuristiclab/problems/externalevaluation/repetitionsextension/RandomSocketPollEvaluator.java	(revision 15014)
@@ -0,0 +1,36 @@
+package com.heuristiclab.problems.externalevaluation.repetitionsextension;
+
+import java.io.IOException;
+import java.util.*;
+import com.heuristiclab.problems.externalevaluation.*;
+import com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.*;
+import com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse;
+
+public class RandomSocketPollEvaluator {
+
+	public static void main(String[] args) {
+		ServerSocketListenerFactory factory = new ServerSocketListenerFactory(8842);
+		PollService service = new PollService(factory, 1);
+		service.start();
+		
+		Random random = new Random();
+		while (true) {
+			SolutionMessage msg = service.getSolution();
+			double quality = 0;
+			
+			// replace the line below to calculate the quality
+			quality = random.nextDouble();
+			// for the simple purpose here it's just a random number
+			// now we want to populate the extension fields before we send the message back
+			QualityMessage.Builder qualityMessage = 
+					service.prepareQualityMessage(msg, quality)
+					.setExtension(RepetitionsResponse.repetitions, 1);
+			
+			try {
+				service.sendQualityMessage(msg, qualityMessage.build());
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+	}
+}
Index: trunk/tools/ExternalEvaluation/Java/ExtendedExternalApplication/src/com/heuristiclab/problems/externalevaluation/repetitionsextension/RandomSocketPushEvaluator.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExtendedExternalApplication/src/com/heuristiclab/problems/externalevaluation/repetitionsextension/RandomSocketPushEvaluator.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExtendedExternalApplication/src/com/heuristiclab/problems/externalevaluation/repetitionsextension/RandomSocketPushEvaluator.java	(revision 15014)
@@ -0,0 +1,50 @@
+package com.heuristiclab.problems.externalevaluation.repetitionsextension;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Random;
+import com.heuristiclab.problems.externalevaluation.*;
+import com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.*;
+import com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse;
+
+public class RandomSocketPushEvaluator {
+	private PushService service;
+	
+	public static void main(String[] args) {
+		RandomSocketPushEvaluator main = new RandomSocketPushEvaluator();
+		main.run();
+		System.out.println("Service is running, terminate by pressing <Return> or <Enter>.");
+		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+		try {
+			br.readLine();
+			br.close();
+		} catch (IOException e) { e.printStackTrace(); }
+		main.terminate();
+	}
+	
+	private void run() {
+		ServerSocketListenerFactory factory = new ServerSocketListenerFactory(8842);
+		service = new PushService(factory, 1, new RandomEvaluator());
+		service.start();
+	}
+	
+	private void terminate() {
+		service.stop();
+	}
+	
+	private class RandomEvaluator implements IEvaluationService {
+		Random random;
+		
+		public RandomEvaluator() {
+			random = new Random();
+		}
+		
+		@Override
+		public double evaluate(SolutionMessage msg, QualityMessage.Builder responseBuilder) {
+			responseBuilder.setExtension(RepetitionsResponse.repetitions, 1);
+			return random.nextDouble();
+		}
+		
+	}
+}
Index: trunk/tools/ExternalEvaluation/Java/ExtendedExternalApplication/src/com/heuristiclab/problems/externalevaluation/repetitionsextension/RepetitionsQualityMessage.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExtendedExternalApplication/src/com/heuristiclab/problems/externalevaluation/repetitionsextension/RepetitionsQualityMessage.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExtendedExternalApplication/src/com/heuristiclab/problems/externalevaluation/repetitionsextension/RepetitionsQualityMessage.java	(revision 15014)
@@ -0,0 +1,371 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: RepetitionsQualityMessage.proto
+
+package com.heuristiclab.problems.externalevaluation.repetitionsextension;
+
+public final class RepetitionsQualityMessage {
+  private RepetitionsQualityMessage() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+    registry.add(com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse.repetitions);
+    registry.add(com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse.variance);
+    registry.add(com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse.numFailed);
+  }
+  public interface RepetitionsResponseOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+  }
+  public static final class RepetitionsResponse extends
+      com.google.protobuf.GeneratedMessage
+      implements RepetitionsResponseOrBuilder {
+    // Use RepetitionsResponse.newBuilder() to construct.
+    private RepetitionsResponse(Builder builder) {
+      super(builder);
+    }
+    private RepetitionsResponse(boolean noInit) {}
+    
+    private static final RepetitionsResponse defaultInstance;
+    public static RepetitionsResponse getDefaultInstance() {
+      return defaultInstance;
+    }
+    
+    public RepetitionsResponse getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+    
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.internal_static_HeuristicLab_Problems_ExternalEvaluation_RepetitionsExtension_RepetitionsResponse_descriptor;
+    }
+    
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.internal_static_HeuristicLab_Problems_ExternalEvaluation_RepetitionsExtension_RepetitionsResponse_fieldAccessorTable;
+    }
+    
+    private void initFields() {
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+      
+      memoizedIsInitialized = 1;
+      return true;
+    }
+    
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      getUnknownFields().writeTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+    
+      size = 0;
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+    
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+    
+    public static com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+    
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponseOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.internal_static_HeuristicLab_Problems_ExternalEvaluation_RepetitionsExtension_RepetitionsResponse_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.internal_static_HeuristicLab_Problems_ExternalEvaluation_RepetitionsExtension_RepetitionsResponse_fieldAccessorTable;
+      }
+      
+      // Construct using com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+      
+      private Builder(BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+      
+      public Builder clear() {
+        super.clear();
+        return this;
+      }
+      
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+      
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse.getDescriptor();
+      }
+      
+      public com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse getDefaultInstanceForType() {
+        return com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse.getDefaultInstance();
+      }
+      
+      public com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse build() {
+        com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+      
+      private com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse buildParsed()
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(
+            result).asInvalidProtocolBufferException();
+        }
+        return result;
+      }
+      
+      public com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse buildPartial() {
+        com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse result = new com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse(this);
+        onBuilt();
+        return result;
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse) {
+          return mergeFrom((com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+      
+      public Builder mergeFrom(com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse other) {
+        if (other == com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse.getDefaultInstance()) return this;
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+      
+      public final boolean isInitialized() {
+        return true;
+      }
+      
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder(
+            this.getUnknownFields());
+        while (true) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              this.setUnknownFields(unknownFields.build());
+              onChanged();
+              return this;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              }
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      // @@protoc_insertion_point(builder_scope:HeuristicLab.Problems.ExternalEvaluation.RepetitionsExtension.RepetitionsResponse)
+    }
+    
+    static {
+      defaultInstance = new RepetitionsResponse(true);
+      defaultInstance.initFields();
+    }
+    
+    // @@protoc_insertion_point(class_scope:HeuristicLab.Problems.ExternalEvaluation.RepetitionsExtension.RepetitionsResponse)
+    public static final int REPETITIONS_FIELD_NUMBER = 1010;
+    public static final
+      com.google.protobuf.GeneratedMessage.GeneratedExtension<
+        com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage,
+        java.lang.Integer> repetitions = com.google.protobuf.GeneratedMessage
+            .newMessageScopedGeneratedExtension(
+          com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse.getDefaultInstance(),
+          0,
+          java.lang.Integer.class,
+          null);
+    public static final int VARIANCE_FIELD_NUMBER = 1020;
+    public static final
+      com.google.protobuf.GeneratedMessage.GeneratedExtension<
+        com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage,
+        java.lang.Double> variance = com.google.protobuf.GeneratedMessage
+            .newMessageScopedGeneratedExtension(
+          com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse.getDefaultInstance(),
+          1,
+          java.lang.Double.class,
+          null);
+    public static final int NUMFAILED_FIELD_NUMBER = 1030;
+    public static final
+      com.google.protobuf.GeneratedMessage.GeneratedExtension<
+        com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage,
+        java.lang.Integer> numFailed = com.google.protobuf.GeneratedMessage
+            .newMessageScopedGeneratedExtension(
+          com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse.getDefaultInstance(),
+          2,
+          java.lang.Integer.class,
+          null);
+  }
+  
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_HeuristicLab_Problems_ExternalEvaluation_RepetitionsExtension_RepetitionsResponse_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_HeuristicLab_Problems_ExternalEvaluation_RepetitionsExtension_RepetitionsResponse_fieldAccessorTable;
+  
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n\037RepetitionsQualityMessage.proto\022=Heuri" +
+      "sticLab.Problems.ExternalEvaluation.Repe" +
+      "titionsExtension\032 ExternalEvaluationMess" +
+      "ages.proto\"\200\002\n\023RepetitionsResponse2N\n\013re" +
+      "petitions\0228.HeuristicLab.Problems.Extern" +
+      "alEvaluation.QualityMessage\030\362\007 \002(\0052K\n\010va" +
+      "riance\0228.HeuristicLab.Problems.ExternalE" +
+      "valuation.QualityMessage\030\374\007 \001(\0012L\n\tnumFa" +
+      "iled\0228.HeuristicLab.Problems.ExternalEva" +
+      "luation.QualityMessage\030\206\010 \001(\005BC\nAcom.heu",
+      "risticlab.problems.externalevaluation.re" +
+      "petitionsextension"
+    };
+    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
+      new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
+        public com.google.protobuf.ExtensionRegistry assignDescriptors(
+            com.google.protobuf.Descriptors.FileDescriptor root) {
+          descriptor = root;
+          internal_static_HeuristicLab_Problems_ExternalEvaluation_RepetitionsExtension_RepetitionsResponse_descriptor =
+            getDescriptor().getMessageTypes().get(0);
+          internal_static_HeuristicLab_Problems_ExternalEvaluation_RepetitionsExtension_RepetitionsResponse_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_HeuristicLab_Problems_ExternalEvaluation_RepetitionsExtension_RepetitionsResponse_descriptor,
+              new java.lang.String[] { },
+              com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse.class,
+              com.heuristiclab.problems.externalevaluation.repetitionsextension.RepetitionsQualityMessage.RepetitionsResponse.Builder.class);
+          return null;
+        }
+      };
+    com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.getDescriptor(),
+        }, assigner);
+  }
+  
+  // @@protoc_insertion_point(outer_class_scope)
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/.classpath
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/.classpath	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/.classpath	(revision 15014)
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry excluding="**/.svn/" kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/.project
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/.project	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/.project	(revision 15014)
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>HL3ExternalEvaluation</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/build protos.cmd
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/build protos.cmd	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/build protos.cmd	(revision 15014)
@@ -0,0 +1,2 @@
+@echo off
+protoc.exe --java_out=./src -I ./protos ./protos/ExternalEvaluationMessages.proto
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/protoc-license.txt
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/protoc-license.txt	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/protoc-license.txt	(revision 15014)
@@ -0,0 +1,36 @@
+protoc.exe was built from the original source at http://code.google.com/p/protobuf/
+The licence for this code is as follows:
+
+Copyright 2008, Google Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+    * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Code generated by the Protocol Buffer compiler is owned by the owner
+of the input file used when generating it.  This code is not
+standalone and requires a support library to be linked with it.  This
+support library is itself covered by the above license.
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/protos/ExternalEvaluationMessages.proto
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/protos/ExternalEvaluationMessages.proto	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/protos/ExternalEvaluationMessages.proto	(revision 15014)
@@ -0,0 +1,94 @@
+package HeuristicLab.Problems.ExternalEvaluation;
+option java_package = "com.heuristiclab.problems.externalevaluation";
+
+message SolutionMessage {
+  required int32 solutionId = 1;
+  
+  message IntegerVariable {
+    required string name = 1;
+    optional int32 data = 2;
+  }
+  repeated IntegerVariable integerVars = 2;
+  
+  message IntegerArrayVariable {
+    required string name = 1;
+    repeated int32 data = 2;
+    optional int32 length = 3;
+  }
+  repeated IntegerArrayVariable integerArrayVars = 3;
+  
+  message DoubleVariable {
+    required string name = 1;
+    optional double data = 2;
+  }
+  repeated DoubleVariable doubleVars = 4;
+  
+  message DoubleArrayVariable {
+    required string name = 1;
+    repeated double data = 2;
+    optional int32 length = 3;
+  }
+  repeated DoubleArrayVariable doubleArrayVars = 5;
+  
+  message BoolVariable {
+    required string name = 1;
+    optional bool data = 2;
+  }
+  repeated BoolVariable boolVars = 6;
+  
+  message BoolArrayVariable {
+    required string name = 1;
+    repeated bool data = 2;
+    optional int32 length = 3;
+  }
+  repeated BoolArrayVariable boolArrayVars = 7;
+  
+  message StringVariable {
+    required string name = 1;
+    optional string data = 2;
+  }
+  repeated StringVariable stringVars = 8;
+  
+  message StringArrayVariable {
+    required string name = 1;
+    repeated string data = 2;
+    optional int32 length = 3;
+  }
+  repeated StringArrayVariable stringArrayVars = 9;
+  
+  message RawVariable {
+    required string name = 1;
+    optional bytes data = 2;
+  }
+  repeated RawVariable rawVars = 10;
+}
+
+// Nested Extensions http://www.indelible.org/ink/protobuf-polymorphism/
+message QualityMessage {
+  required int32 solutionId = 1;
+  enum Type {
+    SingleObjectiveQualityMessage = 1;
+    MultiObjectiveQualityMessage = 2;
+  }
+  required Type type = 2;
+  extensions 1000 to max;
+}
+
+message SingleObjectiveQualityMessage {
+  extend QualityMessage {
+    required SingleObjectiveQualityMessage qualityMessage = 1000;  // unique QualityMessage extension number
+  }
+  required double quality = 1;
+}
+message MultiObjectiveQualityMessage {
+  extend QualityMessage {
+    required MultiObjectiveQualityMessage qualityMessage = 1001;  // unique QualityMessage extension number
+  }
+  repeated double qualities = 1;
+}
+
+  
+service EvaluationService {
+  rpc EvaluateSingleObjective (SolutionMessage) returns (SingleObjectiveQualityMessage);
+  rpc EvaluateMultiObjectives (SolutionMessage) returns (MultiObjectiveQualityMessage);
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/AbstractMessage.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/AbstractMessage.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/AbstractMessage.java	(revision 15014)
@@ -0,0 +1,764 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.Descriptors.Descriptor;
+import com.google.protobuf.Descriptors.FieldDescriptor;
+import com.google.protobuf.Internal.EnumLite;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * A partial implementation of the {@link Message} interface which implements
+ * as many methods of that interface as possible in terms of other methods.
+ *
+ * @author kenton@google.com Kenton Varda
+ */
+public abstract class AbstractMessage extends AbstractMessageLite
+                                      implements Message {
+  @SuppressWarnings("unchecked")
+  public boolean isInitialized() {
+    // Check that all required fields are present.
+    for (final FieldDescriptor field : getDescriptorForType().getFields()) {
+      if (field.isRequired()) {
+        if (!hasField(field)) {
+          return false;
+        }
+      }
+    }
+
+    // Check that embedded messages are initialized.
+    for (final Map.Entry<FieldDescriptor, Object> entry :
+        getAllFields().entrySet()) {
+      final FieldDescriptor field = entry.getKey();
+      if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
+        if (field.isRepeated()) {
+          for (final Message element : (List<Message>) entry.getValue()) {
+            if (!element.isInitialized()) {
+              return false;
+            }
+          }
+        } else {
+          if (!((Message) entry.getValue()).isInitialized()) {
+            return false;
+          }
+        }
+      }
+    }
+
+    return true;
+  }
+
+  @Override
+  public final String toString() {
+    return TextFormat.printToString(this);
+  }
+
+  public void writeTo(final CodedOutputStream output) throws IOException {
+    final boolean isMessageSet =
+        getDescriptorForType().getOptions().getMessageSetWireFormat();
+
+    for (final Map.Entry<FieldDescriptor, Object> entry :
+        getAllFields().entrySet()) {
+      final FieldDescriptor field = entry.getKey();
+      final Object value = entry.getValue();
+      if (isMessageSet && field.isExtension() &&
+          field.getType() == FieldDescriptor.Type.MESSAGE &&
+          !field.isRepeated()) {
+        output.writeMessageSetExtension(field.getNumber(), (Message) value);
+      } else {
+        FieldSet.writeField(field, value, output);
+      }
+    }
+
+    final UnknownFieldSet unknownFields = getUnknownFields();
+    if (isMessageSet) {
+      unknownFields.writeAsMessageSetTo(output);
+    } else {
+      unknownFields.writeTo(output);
+    }
+  }
+
+  private int memoizedSize = -1;
+
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) {
+      return size;
+    }
+
+    size = 0;
+    final boolean isMessageSet =
+        getDescriptorForType().getOptions().getMessageSetWireFormat();
+
+    for (final Map.Entry<FieldDescriptor, Object> entry :
+        getAllFields().entrySet()) {
+      final FieldDescriptor field = entry.getKey();
+      final Object value = entry.getValue();
+      if (isMessageSet && field.isExtension() &&
+          field.getType() == FieldDescriptor.Type.MESSAGE &&
+          !field.isRepeated()) {
+        size += CodedOutputStream.computeMessageSetExtensionSize(
+            field.getNumber(), (Message) value);
+      } else {
+        size += FieldSet.computeFieldSize(field, value);
+      }
+    }
+
+    final UnknownFieldSet unknownFields = getUnknownFields();
+    if (isMessageSet) {
+      size += unknownFields.getSerializedSizeAsMessageSet();
+    } else {
+      size += unknownFields.getSerializedSize();
+    }
+
+    memoizedSize = size;
+    return size;
+  }
+
+  @Override
+  public boolean equals(final Object other) {
+    if (other == this) {
+      return true;
+    }
+    if (!(other instanceof Message)) {
+      return false;
+    }
+    final Message otherMessage = (Message) other;
+    if (getDescriptorForType() != otherMessage.getDescriptorForType()) {
+      return false;
+    }
+    return getAllFields().equals(otherMessage.getAllFields()) &&
+        getUnknownFields().equals(otherMessage.getUnknownFields());
+  }
+
+  @Override
+  public int hashCode() {
+    int hash = 41;
+    hash = (19 * hash) + getDescriptorForType().hashCode();
+    hash = hashFields(hash, getAllFields());
+    hash = (29 * hash) + getUnknownFields().hashCode();
+    return hash;
+  }
+
+  /** Get a hash code for given fields and values, using the given seed. */
+  @SuppressWarnings("unchecked")
+  protected int hashFields(int hash, Map<FieldDescriptor, Object> map) {
+    for (Map.Entry<FieldDescriptor, Object> entry : map.entrySet()) {
+      FieldDescriptor field = entry.getKey();
+      Object value = entry.getValue();
+      hash = (37 * hash) + field.getNumber();
+      if (field.getType() != FieldDescriptor.Type.ENUM){
+        hash = (53 * hash) + value.hashCode();
+      } else if (field.isRepeated()) {
+        List<? extends EnumLite> list = (List<? extends EnumLite>) value;
+        hash = (53 * hash) + hashEnumList(list);
+      } else {
+        hash = (53 * hash) + hashEnum((EnumLite) value);
+      }
+    }
+    return hash;
+  }
+
+  /**
+   * Helper method for implementing {@link Message#hashCode()}.
+   * @see Boolean#hashCode()
+   */
+  protected static int hashLong(long n) {
+    return (int) (n ^ (n >>> 32));
+  }
+
+  /**
+   * Helper method for implementing {@link Message#hashCode()}.
+   * @see Boolean#hashCode()
+   */
+  protected static int hashBoolean(boolean b) {
+    return b ? 1231 : 1237;
+  }
+
+  /**
+   * Helper method for implementing {@link Message#hashCode()}.
+   * <p>
+   * This is needed because {@link java.lang.Enum#hashCode()} is final, but we
+   * need to use the field number as the hash code to ensure compatibility
+   * between statically and dynamically generated enum objects.
+   */
+  protected static int hashEnum(EnumLite e) {
+    return e.getNumber();
+  }
+
+  /** Helper method for implementing {@link Message#hashCode()}. */
+  protected static int hashEnumList(List<? extends EnumLite> list) {
+    int hash = 1;
+    for (EnumLite e : list) {
+      hash = 31 * hash + hashEnum(e);
+    }
+    return hash;
+  }
+
+  // =================================================================
+
+  /**
+   * A partial implementation of the {@link Message.Builder} interface which
+   * implements as many methods of that interface as possible in terms of
+   * other methods.
+   */
+  @SuppressWarnings("unchecked")
+  public static abstract class Builder<BuilderType extends Builder>
+      extends AbstractMessageLite.Builder<BuilderType>
+      implements Message.Builder {
+    // The compiler produces an error if this is not declared explicitly.
+    @Override
+    public abstract BuilderType clone();
+
+    public BuilderType clear() {
+      for (final Map.Entry<FieldDescriptor, Object> entry :
+           getAllFields().entrySet()) {
+        clearField(entry.getKey());
+      }
+      return (BuilderType) this;
+    }
+
+    public BuilderType mergeFrom(final Message other) {
+      if (other.getDescriptorForType() != getDescriptorForType()) {
+        throw new IllegalArgumentException(
+          "mergeFrom(Message) can only merge messages of the same type.");
+      }
+
+      // Note:  We don't attempt to verify that other's fields have valid
+      //   types.  Doing so would be a losing battle.  We'd have to verify
+      //   all sub-messages as well, and we'd have to make copies of all of
+      //   them to insure that they don't change after verification (since
+      //   the Message interface itself cannot enforce immutability of
+      //   implementations).
+      // TODO(kenton):  Provide a function somewhere called makeDeepCopy()
+      //   which allows people to make secure deep copies of messages.
+
+      for (final Map.Entry<FieldDescriptor, Object> entry :
+           other.getAllFields().entrySet()) {
+        final FieldDescriptor field = entry.getKey();
+        if (field.isRepeated()) {
+          for (final Object element : (List)entry.getValue()) {
+            addRepeatedField(field, element);
+          }
+        } else if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
+          final Message existingValue = (Message)getField(field);
+          if (existingValue == existingValue.getDefaultInstanceForType()) {
+            setField(field, entry.getValue());
+          } else {
+            setField(field,
+              existingValue.newBuilderForType()
+                .mergeFrom(existingValue)
+                .mergeFrom((Message)entry.getValue())
+                .build());
+          }
+        } else {
+          setField(field, entry.getValue());
+        }
+      }
+
+      mergeUnknownFields(other.getUnknownFields());
+
+      return (BuilderType) this;
+    }
+
+    @Override
+    public BuilderType mergeFrom(final CodedInputStream input)
+                                 throws IOException {
+      return mergeFrom(input, ExtensionRegistry.getEmptyRegistry());
+    }
+
+    @Override
+    public BuilderType mergeFrom(
+        final CodedInputStream input,
+        final ExtensionRegistryLite extensionRegistry)
+        throws IOException {
+      final UnknownFieldSet.Builder unknownFields =
+        UnknownFieldSet.newBuilder(getUnknownFields());
+      while (true) {
+        final int tag = input.readTag();
+        if (tag == 0) {
+          break;
+        }
+
+        if (!mergeFieldFrom(input, unknownFields, extensionRegistry,
+                            this, tag)) {
+          // end group tag
+          break;
+        }
+      }
+      setUnknownFields(unknownFields.build());
+      return (BuilderType) this;
+    }
+
+    /**
+     * Like {@link #mergeFrom(CodedInputStream, UnknownFieldSet.Builder,
+     * ExtensionRegistryLite, Message.Builder)}, but parses a single field.
+     * Package-private because it is used by GeneratedMessage.ExtendableMessage.
+     * @param tag The tag, which should have already been read.
+     * @return {@code true} unless the tag is an end-group tag.
+     */
+    static boolean mergeFieldFrom(
+        final CodedInputStream input,
+        final UnknownFieldSet.Builder unknownFields,
+        final ExtensionRegistryLite extensionRegistry,
+        final Message.Builder builder,
+        final int tag) throws IOException {
+      final Descriptor type = builder.getDescriptorForType();
+
+      if (type.getOptions().getMessageSetWireFormat() &&
+          tag == WireFormat.MESSAGE_SET_ITEM_TAG) {
+        mergeMessageSetExtensionFromCodedStream(
+          input, unknownFields, extensionRegistry, builder);
+        return true;
+      }
+
+      final int wireType = WireFormat.getTagWireType(tag);
+      final int fieldNumber = WireFormat.getTagFieldNumber(tag);
+
+      final FieldDescriptor field;
+      Message defaultInstance = null;
+
+      if (type.isExtensionNumber(fieldNumber)) {
+        // extensionRegistry may be either ExtensionRegistry or
+        // ExtensionRegistryLite.  Since the type we are parsing is a full
+        // message, only a full ExtensionRegistry could possibly contain
+        // extensions of it.  Otherwise we will treat the registry as if it
+        // were empty.
+        if (extensionRegistry instanceof ExtensionRegistry) {
+          final ExtensionRegistry.ExtensionInfo extension =
+            ((ExtensionRegistry) extensionRegistry)
+              .findExtensionByNumber(type, fieldNumber);
+          if (extension == null) {
+            field = null;
+          } else {
+            field = extension.descriptor;
+            defaultInstance = extension.defaultInstance;
+            if (defaultInstance == null &&
+                field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
+              throw new IllegalStateException(
+                  "Message-typed extension lacked default instance: " +
+                  field.getFullName());
+            }
+          }
+        } else {
+          field = null;
+        }
+      } else {
+        field = type.findFieldByNumber(fieldNumber);
+      }
+
+      boolean unknown = false;
+      boolean packed = false;
+      if (field == null) {
+        unknown = true;  // Unknown field.
+      } else if (wireType == FieldSet.getWireFormatForFieldType(
+                   field.getLiteType(),
+                   false  /* isPacked */)) {
+        packed = false;
+      } else if (field.isPackable() &&
+                 wireType == FieldSet.getWireFormatForFieldType(
+                   field.getLiteType(),
+                   true  /* isPacked */)) {
+        packed = true;
+      } else {
+        unknown = true;  // Unknown wire type.
+      }
+
+      if (unknown) {  // Unknown field or wrong wire type.  Skip.
+        return unknownFields.mergeFieldFrom(tag, input);
+      }
+
+      if (packed) {
+        final int length = input.readRawVarint32();
+        final int limit = input.pushLimit(length);
+        if (field.getLiteType() == WireFormat.FieldType.ENUM) {
+          while (input.getBytesUntilLimit() > 0) {
+            final int rawValue = input.readEnum();
+            final Object value = field.getEnumType().findValueByNumber(rawValue);
+            if (value == null) {
+              // If the number isn't recognized as a valid value for this
+              // enum, drop it (don't even add it to unknownFields).
+              return true;
+            }
+            builder.addRepeatedField(field, value);
+          }
+        } else {
+          while (input.getBytesUntilLimit() > 0) {
+            final Object value =
+              FieldSet.readPrimitiveField(input, field.getLiteType());
+            builder.addRepeatedField(field, value);
+          }
+        }
+        input.popLimit(limit);
+      } else {
+        final Object value;
+        switch (field.getType()) {
+          case GROUP: {
+            final Message.Builder subBuilder;
+            if (defaultInstance != null) {
+              subBuilder = defaultInstance.newBuilderForType();
+            } else {
+              subBuilder = builder.newBuilderForField(field);
+            }
+            if (!field.isRepeated()) {
+              subBuilder.mergeFrom((Message) builder.getField(field));
+            }
+            input.readGroup(field.getNumber(), subBuilder, extensionRegistry);
+            value = subBuilder.build();
+            break;
+          }
+          case MESSAGE: {
+            final Message.Builder subBuilder;
+            if (defaultInstance != null) {
+              subBuilder = defaultInstance.newBuilderForType();
+            } else {
+              subBuilder = builder.newBuilderForField(field);
+            }
+            if (!field.isRepeated()) {
+              subBuilder.mergeFrom((Message) builder.getField(field));
+            }
+            input.readMessage(subBuilder, extensionRegistry);
+            value = subBuilder.build();
+            break;
+          }
+          case ENUM:
+            final int rawValue = input.readEnum();
+            value = field.getEnumType().findValueByNumber(rawValue);
+            // If the number isn't recognized as a valid value for this enum,
+            // drop it.
+            if (value == null) {
+              unknownFields.mergeVarintField(fieldNumber, rawValue);
+              return true;
+            }
+            break;
+          default:
+            value = FieldSet.readPrimitiveField(input, field.getLiteType());
+            break;
+        }
+
+        if (field.isRepeated()) {
+          builder.addRepeatedField(field, value);
+        } else {
+          builder.setField(field, value);
+        }
+      }
+
+      return true;
+    }
+
+    /** Called by {@code #mergeFieldFrom()} to parse a MessageSet extension. */
+    private static void mergeMessageSetExtensionFromCodedStream(
+        final CodedInputStream input,
+        final UnknownFieldSet.Builder unknownFields,
+        final ExtensionRegistryLite extensionRegistry,
+        final Message.Builder builder) throws IOException {
+      final Descriptor type = builder.getDescriptorForType();
+
+      // The wire format for MessageSet is:
+      //   message MessageSet {
+      //     repeated group Item = 1 {
+      //       required int32 typeId = 2;
+      //       required bytes message = 3;
+      //     }
+      //   }
+      // "typeId" is the extension's field number.  The extension can only be
+      // a message type, where "message" contains the encoded bytes of that
+      // message.
+      //
+      // In practice, we will probably never see a MessageSet item in which
+      // the message appears before the type ID, or where either field does not
+      // appear exactly once.  However, in theory such cases are valid, so we
+      // should be prepared to accept them.
+
+      int typeId = 0;
+      ByteString rawBytes = null;  // If we encounter "message" before "typeId"
+      Message.Builder subBuilder = null;
+      FieldDescriptor field = null;
+
+      while (true) {
+        final int tag = input.readTag();
+        if (tag == 0) {
+          break;
+        }
+
+        if (tag == WireFormat.MESSAGE_SET_TYPE_ID_TAG) {
+          typeId = input.readUInt32();
+          // Zero is not a valid type ID.
+          if (typeId != 0) {
+            final ExtensionRegistry.ExtensionInfo extension;
+
+            // extensionRegistry may be either ExtensionRegistry or
+            // ExtensionRegistryLite.  Since the type we are parsing is a full
+            // message, only a full ExtensionRegistry could possibly contain
+            // extensions of it.  Otherwise we will treat the registry as if it
+            // were empty.
+            if (extensionRegistry instanceof ExtensionRegistry) {
+              extension = ((ExtensionRegistry) extensionRegistry)
+                  .findExtensionByNumber(type, typeId);
+            } else {
+              extension = null;
+            }
+
+            if (extension != null) {
+              field = extension.descriptor;
+              subBuilder = extension.defaultInstance.newBuilderForType();
+              final Message originalMessage = (Message)builder.getField(field);
+              if (originalMessage != null) {
+                subBuilder.mergeFrom(originalMessage);
+              }
+              if (rawBytes != null) {
+                // We already encountered the message.  Parse it now.
+                subBuilder.mergeFrom(
+                  CodedInputStream.newInstance(rawBytes.newInput()));
+                rawBytes = null;
+              }
+            } else {
+              // Unknown extension number.  If we already saw data, put it
+              // in rawBytes.
+              if (rawBytes != null) {
+                unknownFields.mergeField(typeId,
+                  UnknownFieldSet.Field.newBuilder()
+                    .addLengthDelimited(rawBytes)
+                    .build());
+                rawBytes = null;
+              }
+            }
+          }
+        } else if (tag == WireFormat.MESSAGE_SET_MESSAGE_TAG) {
+          if (typeId == 0) {
+            // We haven't seen a type ID yet, so we have to store the raw bytes
+            // for now.
+            rawBytes = input.readBytes();
+          } else if (subBuilder == null) {
+            // We don't know how to parse this.  Ignore it.
+            unknownFields.mergeField(typeId,
+              UnknownFieldSet.Field.newBuilder()
+                .addLengthDelimited(input.readBytes())
+                .build());
+          } else {
+            // We already know the type, so we can parse directly from the input
+            // with no copying.  Hooray!
+            input.readMessage(subBuilder, extensionRegistry);
+          }
+        } else {
+          // Unknown tag.  Skip it.
+          if (!input.skipField(tag)) {
+            break;  // end of group
+          }
+        }
+      }
+
+      input.checkLastTagWas(WireFormat.MESSAGE_SET_ITEM_END_TAG);
+
+      if (subBuilder != null) {
+        builder.setField(field, subBuilder.build());
+      }
+    }
+
+    public BuilderType mergeUnknownFields(final UnknownFieldSet unknownFields) {
+      setUnknownFields(
+        UnknownFieldSet.newBuilder(getUnknownFields())
+                       .mergeFrom(unknownFields)
+                       .build());
+      return (BuilderType) this;
+    }
+
+    /**
+     * Construct an UninitializedMessageException reporting missing fields in
+     * the given message.
+     */
+    protected static UninitializedMessageException
+        newUninitializedMessageException(Message message) {
+      return new UninitializedMessageException(findMissingFields(message));
+    }
+
+    /**
+     * Populates {@code this.missingFields} with the full "path" of each
+     * missing required field in the given message.
+     */
+    private static List<String> findMissingFields(final Message message) {
+      final List<String> results = new ArrayList<String>();
+      findMissingFields(message, "", results);
+      return results;
+    }
+
+    /** Recursive helper implementing {@link #findMissingFields(Message)}. */
+    private static void findMissingFields(final Message message,
+                                          final String prefix,
+                                          final List<String> results) {
+      for (final FieldDescriptor field :
+          message.getDescriptorForType().getFields()) {
+        if (field.isRequired() && !message.hasField(field)) {
+          results.add(prefix + field.getName());
+        }
+      }
+
+      for (final Map.Entry<FieldDescriptor, Object> entry :
+           message.getAllFields().entrySet()) {
+        final FieldDescriptor field = entry.getKey();
+        final Object value = entry.getValue();
+
+        if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
+          if (field.isRepeated()) {
+            int i = 0;
+            for (final Object element : (List) value) {
+              findMissingFields((Message) element,
+                                subMessagePrefix(prefix, field, i++),
+                                results);
+            }
+          } else {
+            if (message.hasField(field)) {
+              findMissingFields((Message) value,
+                                subMessagePrefix(prefix, field, -1),
+                                results);
+            }
+          }
+        }
+      }
+    }
+
+    private static String subMessagePrefix(final String prefix,
+                                           final FieldDescriptor field,
+                                           final int index) {
+      final StringBuilder result = new StringBuilder(prefix);
+      if (field.isExtension()) {
+        result.append('(')
+              .append(field.getFullName())
+              .append(')');
+      } else {
+        result.append(field.getName());
+      }
+      if (index != -1) {
+        result.append('[')
+              .append(index)
+              .append(']');
+      }
+      result.append('.');
+      return result.toString();
+    }
+
+    // ===============================================================
+    // The following definitions seem to be required in order to make javac
+    // not produce weird errors like:
+    //
+    // java/com/google/protobuf/DynamicMessage.java:203: types
+    //   com.google.protobuf.AbstractMessage.Builder<
+    //     com.google.protobuf.DynamicMessage.Builder> and
+    //   com.google.protobuf.AbstractMessage.Builder<
+    //     com.google.protobuf.DynamicMessage.Builder> are incompatible; both
+    //   define mergeFrom(com.google.protobuf.ByteString), but with unrelated
+    //   return types.
+    //
+    // Strangely, these lines are only needed if javac is invoked separately
+    // on AbstractMessage.java and AbstractMessageLite.java.  If javac is
+    // invoked on both simultaneously, it works.  (Or maybe the important
+    // point is whether or not DynamicMessage.java is compiled together with
+    // AbstractMessageLite.java -- not sure.)  I suspect this is a compiler
+    // bug.
+
+    @Override
+    public BuilderType mergeFrom(final ByteString data)
+        throws InvalidProtocolBufferException {
+      return super.mergeFrom(data);
+    }
+
+    @Override
+    public BuilderType mergeFrom(
+        final ByteString data,
+        final ExtensionRegistryLite extensionRegistry)
+        throws InvalidProtocolBufferException {
+      return super.mergeFrom(data, extensionRegistry);
+    }
+
+    @Override
+    public BuilderType mergeFrom(final byte[] data)
+        throws InvalidProtocolBufferException {
+      return super.mergeFrom(data);
+    }
+
+    @Override
+    public BuilderType mergeFrom(
+        final byte[] data, final int off, final int len)
+        throws InvalidProtocolBufferException {
+      return super.mergeFrom(data, off, len);
+    }
+
+    @Override
+    public BuilderType mergeFrom(
+        final byte[] data,
+        final ExtensionRegistryLite extensionRegistry)
+        throws InvalidProtocolBufferException {
+      return super.mergeFrom(data, extensionRegistry);
+    }
+
+    @Override
+    public BuilderType mergeFrom(
+        final byte[] data, final int off, final int len,
+        final ExtensionRegistryLite extensionRegistry)
+        throws InvalidProtocolBufferException {
+      return super.mergeFrom(data, off, len, extensionRegistry);
+    }
+
+    @Override
+    public BuilderType mergeFrom(final InputStream input)
+        throws IOException {
+      return super.mergeFrom(input);
+    }
+
+    @Override
+    public BuilderType mergeFrom(
+        final InputStream input,
+        final ExtensionRegistryLite extensionRegistry)
+        throws IOException {
+      return super.mergeFrom(input, extensionRegistry);
+    }
+
+    @Override
+    public boolean mergeDelimitedFrom(final InputStream input)
+        throws IOException {
+      return super.mergeDelimitedFrom(input);
+    }
+
+    @Override
+    public boolean mergeDelimitedFrom(
+        final InputStream input,
+        final ExtensionRegistryLite extensionRegistry)
+        throws IOException {
+      return super.mergeDelimitedFrom(input, extensionRegistry);
+    }
+
+  }
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/AbstractMessageLite.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/AbstractMessageLite.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/AbstractMessageLite.java	(revision 15014)
@@ -0,0 +1,325 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import java.io.FilterInputStream;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Collection;
+
+/**
+ * A partial implementation of the {@link MessageLite} interface which
+ * implements as many methods of that interface as possible in terms of other
+ * methods.
+ *
+ * @author kenton@google.com Kenton Varda
+ */
+public abstract class AbstractMessageLite implements MessageLite {
+  public ByteString toByteString() {
+    try {
+      final ByteString.CodedBuilder out =
+        ByteString.newCodedBuilder(getSerializedSize());
+      writeTo(out.getCodedOutput());
+      return out.build();
+    } catch (IOException e) {
+      throw new RuntimeException(
+        "Serializing to a ByteString threw an IOException (should " +
+        "never happen).", e);
+    }
+  }
+
+  public byte[] toByteArray() {
+    try {
+      final byte[] result = new byte[getSerializedSize()];
+      final CodedOutputStream output = CodedOutputStream.newInstance(result);
+      writeTo(output);
+      output.checkNoSpaceLeft();
+      return result;
+    } catch (IOException e) {
+      throw new RuntimeException(
+        "Serializing to a byte array threw an IOException " +
+        "(should never happen).", e);
+    }
+  }
+
+  public void writeTo(final OutputStream output) throws IOException {
+    final int bufferSize =
+        CodedOutputStream.computePreferredBufferSize(getSerializedSize());
+    final CodedOutputStream codedOutput =
+        CodedOutputStream.newInstance(output, bufferSize);
+    writeTo(codedOutput);
+    codedOutput.flush();
+  }
+
+  public void writeDelimitedTo(final OutputStream output) throws IOException {
+    final int serialized = getSerializedSize();
+    final int bufferSize = CodedOutputStream.computePreferredBufferSize(
+        CodedOutputStream.computeRawVarint32Size(serialized) + serialized);
+    final CodedOutputStream codedOutput =
+        CodedOutputStream.newInstance(output, bufferSize);
+    codedOutput.writeRawVarint32(serialized);
+    writeTo(codedOutput);
+    codedOutput.flush();
+  }
+
+  /**
+   * A partial implementation of the {@link Message.Builder} interface which
+   * implements as many methods of that interface as possible in terms of
+   * other methods.
+   */
+  @SuppressWarnings("unchecked")
+  public static abstract class Builder<BuilderType extends Builder>
+      implements MessageLite.Builder {
+    // The compiler produces an error if this is not declared explicitly.
+    @Override
+    public abstract BuilderType clone();
+
+    public BuilderType mergeFrom(final CodedInputStream input)
+                                 throws IOException {
+      return mergeFrom(input, ExtensionRegistryLite.getEmptyRegistry());
+    }
+
+    // Re-defined here for return type covariance.
+    public abstract BuilderType mergeFrom(
+        final CodedInputStream input,
+        final ExtensionRegistryLite extensionRegistry)
+        throws IOException;
+
+    public BuilderType mergeFrom(final ByteString data)
+        throws InvalidProtocolBufferException {
+      try {
+        final CodedInputStream input = data.newCodedInput();
+        mergeFrom(input);
+        input.checkLastTagWas(0);
+        return (BuilderType) this;
+      } catch (InvalidProtocolBufferException e) {
+        throw e;
+      } catch (IOException e) {
+        throw new RuntimeException(
+          "Reading from a ByteString threw an IOException (should " +
+          "never happen).", e);
+      }
+    }
+
+    public BuilderType mergeFrom(
+        final ByteString data,
+        final ExtensionRegistryLite extensionRegistry)
+        throws InvalidProtocolBufferException {
+      try {
+        final CodedInputStream input = data.newCodedInput();
+        mergeFrom(input, extensionRegistry);
+        input.checkLastTagWas(0);
+        return (BuilderType) this;
+      } catch (InvalidProtocolBufferException e) {
+        throw e;
+      } catch (IOException e) {
+        throw new RuntimeException(
+          "Reading from a ByteString threw an IOException (should " +
+          "never happen).", e);
+      }
+    }
+
+    public BuilderType mergeFrom(final byte[] data)
+        throws InvalidProtocolBufferException {
+      return mergeFrom(data, 0, data.length);
+    }
+
+    public BuilderType mergeFrom(final byte[] data, final int off,
+                                 final int len)
+                                 throws InvalidProtocolBufferException {
+      try {
+        final CodedInputStream input =
+            CodedInputStream.newInstance(data, off, len);
+        mergeFrom(input);
+        input.checkLastTagWas(0);
+        return (BuilderType) this;
+      } catch (InvalidProtocolBufferException e) {
+        throw e;
+      } catch (IOException e) {
+        throw new RuntimeException(
+          "Reading from a byte array threw an IOException (should " +
+          "never happen).", e);
+      }
+    }
+
+    public BuilderType mergeFrom(
+        final byte[] data,
+        final ExtensionRegistryLite extensionRegistry)
+        throws InvalidProtocolBufferException {
+      return mergeFrom(data, 0, data.length, extensionRegistry);
+    }
+
+    public BuilderType mergeFrom(
+        final byte[] data, final int off, final int len,
+        final ExtensionRegistryLite extensionRegistry)
+        throws InvalidProtocolBufferException {
+      try {
+        final CodedInputStream input =
+            CodedInputStream.newInstance(data, off, len);
+        mergeFrom(input, extensionRegistry);
+        input.checkLastTagWas(0);
+        return (BuilderType) this;
+      } catch (InvalidProtocolBufferException e) {
+        throw e;
+      } catch (IOException e) {
+        throw new RuntimeException(
+          "Reading from a byte array threw an IOException (should " +
+          "never happen).", e);
+      }
+    }
+
+    public BuilderType mergeFrom(final InputStream input) throws IOException {
+      final CodedInputStream codedInput = CodedInputStream.newInstance(input);
+      mergeFrom(codedInput);
+      codedInput.checkLastTagWas(0);
+      return (BuilderType) this;
+    }
+
+    public BuilderType mergeFrom(
+        final InputStream input,
+        final ExtensionRegistryLite extensionRegistry)
+        throws IOException {
+      final CodedInputStream codedInput = CodedInputStream.newInstance(input);
+      mergeFrom(codedInput, extensionRegistry);
+      codedInput.checkLastTagWas(0);
+      return (BuilderType) this;
+    }
+
+    /**
+     * An InputStream implementations which reads from some other InputStream
+     * but is limited to a particular number of bytes.  Used by
+     * mergeDelimitedFrom().  This is intentionally package-private so that
+     * UnknownFieldSet can share it.
+     */
+    static final class LimitedInputStream extends FilterInputStream {
+      private int limit;
+
+      LimitedInputStream(InputStream in, int limit) {
+        super(in);
+        this.limit = limit;
+      }
+
+      @Override
+      public int available() throws IOException {
+        return Math.min(super.available(), limit);
+      }
+
+      @Override
+      public int read() throws IOException {
+        if (limit <= 0) {
+          return -1;
+        }
+        final int result = super.read();
+        if (result >= 0) {
+          --limit;
+        }
+        return result;
+      }
+
+      @Override
+      public int read(final byte[] b, final int off, int len)
+                      throws IOException {
+        if (limit <= 0) {
+          return -1;
+        }
+        len = Math.min(len, limit);
+        final int result = super.read(b, off, len);
+        if (result >= 0) {
+          limit -= result;
+        }
+        return result;
+      }
+
+      @Override
+      public long skip(final long n) throws IOException {
+        final long result = super.skip(Math.min(n, limit));
+        if (result >= 0) {
+          limit -= result;
+        }
+        return result;
+      }
+    }
+
+    public boolean mergeDelimitedFrom(
+        final InputStream input,
+        final ExtensionRegistryLite extensionRegistry)
+        throws IOException {
+      final int firstByte = input.read();
+      if (firstByte == -1) {
+        return false;
+      }
+      final int size = CodedInputStream.readRawVarint32(firstByte, input);
+      final InputStream limitedInput = new LimitedInputStream(input, size);
+      mergeFrom(limitedInput, extensionRegistry);
+      return true;
+    }
+
+    public boolean mergeDelimitedFrom(final InputStream input)
+        throws IOException {
+      return mergeDelimitedFrom(input,
+          ExtensionRegistryLite.getEmptyRegistry());
+    }
+
+    /**
+     * Construct an UninitializedMessageException reporting missing fields in
+     * the given message.
+     */
+    protected static UninitializedMessageException
+        newUninitializedMessageException(MessageLite message) {
+      return new UninitializedMessageException(message);
+    }
+
+    /**
+     * Adds the {@code values} to the {@code list}.  This is a helper method
+     * used by generated code.  Users should ignore it.
+     *
+     * @throws NullPointerException if any of the elements of {@code values} is
+     * null.
+     */
+    protected static <T> void addAll(final Iterable<T> values,
+                                     final Collection<? super T> list) {
+      for (final T value : values) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+      }
+      if (values instanceof Collection) {
+        final Collection<T> collection = (Collection<T>) values;
+        list.addAll(collection);
+      } else {
+        for (final T value : values) {
+          list.add(value);
+        }
+      }
+    }
+  }
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/BlockingRpcChannel.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/BlockingRpcChannel.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/BlockingRpcChannel.java	(revision 15014)
@@ -0,0 +1,51 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+/**
+ * <p>Abstract interface for a blocking RPC channel.  {@code BlockingRpcChannel}
+ * is the blocking equivalent to {@link RpcChannel}.
+ *
+ * @author kenton@google.com Kenton Varda
+ * @author cpovirk@google.com Chris Povirk
+ */
+public interface BlockingRpcChannel {
+  /**
+   * Call the given method of the remote service and blocks until it returns.
+   * {@code callBlockingMethod()} is the blocking equivalent to
+   * {@link RpcChannel#callMethod}.
+   */
+  Message callBlockingMethod(
+      Descriptors.MethodDescriptor method,
+      RpcController controller,
+      Message request,
+      Message responsePrototype) throws ServiceException;
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/BlockingService.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/BlockingService.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/BlockingService.java	(revision 15014)
@@ -0,0 +1,64 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+/**
+ * Blocking equivalent to {@link Service}.
+ *
+ * @author kenton@google.com Kenton Varda
+ * @author cpovirk@google.com Chris Povirk
+ */
+public interface BlockingService {
+  /**
+   * Equivalent to {@link Service#getDescriptorForType}.
+   */
+  Descriptors.ServiceDescriptor getDescriptorForType();
+
+  /**
+   * Equivalent to {@link Service#callMethod}, except that
+   * {@code callBlockingMethod()} returns the result of the RPC or throws a
+   * {@link ServiceException} if there is a failure, rather than passing the
+   * information to a callback.
+   */
+  Message callBlockingMethod(Descriptors.MethodDescriptor method,
+                             RpcController controller,
+                             Message request) throws ServiceException;
+
+  /**
+   * Equivalent to {@link Service#getRequestPrototype}.
+   */
+  Message getRequestPrototype(Descriptors.MethodDescriptor method);
+
+  /**
+   * Equivalent to {@link Service#getResponsePrototype}.
+   */
+  Message getResponsePrototype(Descriptors.MethodDescriptor method);
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/ByteString.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/ByteString.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/ByteString.java	(revision 15014)
@@ -0,0 +1,403 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import java.io.InputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.FilterOutputStream;
+import java.io.UnsupportedEncodingException;
+import java.nio.ByteBuffer;
+import java.util.List;
+
+/**
+ * Immutable array of bytes.
+ *
+ * @author crazybob@google.com Bob Lee
+ * @author kenton@google.com Kenton Varda
+ */
+public final class ByteString {
+  private final byte[] bytes;
+
+  private ByteString(final byte[] bytes) {
+    this.bytes = bytes;
+  }
+
+  /**
+   * Gets the byte at the given index.
+   *
+   * @throws ArrayIndexOutOfBoundsException {@code index} is < 0 or >= size
+   */
+  public byte byteAt(final int index) {
+    return bytes[index];
+  }
+
+  /**
+   * Gets the number of bytes.
+   */
+  public int size() {
+    return bytes.length;
+  }
+
+  /**
+   * Returns {@code true} if the size is {@code 0}, {@code false} otherwise.
+   */
+  public boolean isEmpty() {
+    return bytes.length == 0;
+  }
+
+  // =================================================================
+  // byte[] -> ByteString
+
+  /**
+   * Empty ByteString.
+   */
+  public static final ByteString EMPTY = new ByteString(new byte[0]);
+
+  /**
+   * Copies the given bytes into a {@code ByteString}.
+   */
+  public static ByteString copyFrom(final byte[] bytes, final int offset,
+                                    final int size) {
+    final byte[] copy = new byte[size];
+    System.arraycopy(bytes, offset, copy, 0, size);
+    return new ByteString(copy);
+  }
+
+  /**
+   * Copies the given bytes into a {@code ByteString}.
+   */
+  public static ByteString copyFrom(final byte[] bytes) {
+    return copyFrom(bytes, 0, bytes.length);
+  }
+
+  /**
+   * Copies {@code size} bytes from a {@code java.nio.ByteBuffer} into
+   * a {@code ByteString}.
+   */
+  public static ByteString copyFrom(final ByteBuffer bytes, final int size) {
+    final byte[] copy = new byte[size];
+    bytes.get(copy);
+    return new ByteString(copy);
+  }
+
+  /**
+   * Copies the remaining bytes from a {@code java.nio.ByteBuffer} into
+   * a {@code ByteString}.
+   */
+  public static ByteString copyFrom(final ByteBuffer bytes) {
+    return copyFrom(bytes, bytes.remaining());
+  }
+
+  /**
+   * Encodes {@code text} into a sequence of bytes using the named charset
+   * and returns the result as a {@code ByteString}.
+   */
+  public static ByteString copyFrom(final String text, final String charsetName)
+      throws UnsupportedEncodingException {
+    return new ByteString(text.getBytes(charsetName));
+  }
+
+  /**
+   * Encodes {@code text} into a sequence of UTF-8 bytes and returns the
+   * result as a {@code ByteString}.
+   */
+  public static ByteString copyFromUtf8(final String text) {
+    try {
+      return new ByteString(text.getBytes("UTF-8"));
+    } catch (UnsupportedEncodingException e) {
+      throw new RuntimeException("UTF-8 not supported?", e);
+    }
+  }
+
+  /**
+   * Concatenates all byte strings in the list and returns the result.
+   *
+   * <p>The returned {@code ByteString} is not necessarily a unique object.
+   * If the list is empty, the returned object is the singleton empty
+   * {@code ByteString}.  If the list has only one element, that
+   * {@code ByteString} will be returned without copying.
+   */
+  public static ByteString copyFrom(List<ByteString> list) {
+    if (list.size() == 0) {
+      return EMPTY;
+    } else if (list.size() == 1) {
+      return list.get(0);
+    }
+
+    int size = 0;
+    for (ByteString str : list) {
+      size += str.size();
+    }
+    byte[] bytes = new byte[size];
+    int pos = 0;
+    for (ByteString str : list) {
+      System.arraycopy(str.bytes, 0, bytes, pos, str.size());
+      pos += str.size();
+    }
+    return new ByteString(bytes);
+  }
+
+  // =================================================================
+  // ByteString -> byte[]
+
+  /**
+   * Copies bytes into a buffer at the given offset.
+   *
+   * @param target buffer to copy into
+   * @param offset in the target buffer
+   */
+  public void copyTo(final byte[] target, final int offset) {
+    System.arraycopy(bytes, 0, target, offset, bytes.length);
+  }
+
+  /**
+   * Copies bytes into a buffer.
+   *
+   * @param target buffer to copy into
+   * @param sourceOffset offset within these bytes
+   * @param targetOffset offset within the target buffer
+   * @param size number of bytes to copy
+   */
+  public void copyTo(final byte[] target, final int sourceOffset,
+                     final int targetOffset,
+      final int size) {
+    System.arraycopy(bytes, sourceOffset, target, targetOffset, size);
+  }
+
+  /**
+   * Copies bytes into a ByteBuffer.
+   *
+   * @param target ByteBuffer to copy into.
+   * @throws ReadOnlyBufferException if the {@code target} is read-only
+   * @throws BufferOverflowException if the {@code target}'s remaining()
+   *         space is not large enough to hold the data.
+   */
+  public void copyTo(ByteBuffer target) {
+    target.put(bytes, 0, bytes.length);
+  }
+
+  /**
+   * Copies bytes to a {@code byte[]}.
+   */
+  public byte[] toByteArray() {
+    final int size = bytes.length;
+    final byte[] copy = new byte[size];
+    System.arraycopy(bytes, 0, copy, 0, size);
+    return copy;
+  }
+
+  /**
+   * Constructs a new read-only {@code java.nio.ByteBuffer} with the
+   * same backing byte array.
+   */
+  public ByteBuffer asReadOnlyByteBuffer() {
+    final ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);
+    return byteBuffer.asReadOnlyBuffer();
+  }
+
+  /**
+   * Constructs a new {@code String} by decoding the bytes using the
+   * specified charset.
+   */
+  public String toString(final String charsetName)
+      throws UnsupportedEncodingException {
+    return new String(bytes, charsetName);
+  }
+
+  /**
+   * Constructs a new {@code String} by decoding the bytes as UTF-8.
+   */
+  public String toStringUtf8() {
+    try {
+      return new String(bytes, "UTF-8");
+    } catch (UnsupportedEncodingException e) {
+      throw new RuntimeException("UTF-8 not supported?", e);
+    }
+  }
+
+  // =================================================================
+  // equals() and hashCode()
+
+  @Override
+  public boolean equals(final Object o) {
+    if (o == this) {
+      return true;
+    }
+
+    if (!(o instanceof ByteString)) {
+      return false;
+    }
+
+    final ByteString other = (ByteString) o;
+    final int size = bytes.length;
+    if (size != other.bytes.length) {
+      return false;
+    }
+
+    final byte[] thisBytes = bytes;
+    final byte[] otherBytes = other.bytes;
+    for (int i = 0; i < size; i++) {
+      if (thisBytes[i] != otherBytes[i]) {
+        return false;
+      }
+    }
+
+    return true;
+  }
+
+  private volatile int hash = 0;
+
+  @Override
+  public int hashCode() {
+    int h = hash;
+
+    if (h == 0) {
+      final byte[] thisBytes = bytes;
+      final int size = bytes.length;
+
+      h = size;
+      for (int i = 0; i < size; i++) {
+        h = h * 31 + thisBytes[i];
+      }
+      if (h == 0) {
+        h = 1;
+      }
+
+      hash = h;
+    }
+
+    return h;
+  }
+
+  // =================================================================
+  // Input stream
+
+  /**
+   * Creates an {@code InputStream} which can be used to read the bytes.
+   */
+  public InputStream newInput() {
+    return new ByteArrayInputStream(bytes);
+  }
+
+  /**
+   * Creates a {@link CodedInputStream} which can be used to read the bytes.
+   * Using this is more efficient than creating a {@link CodedInputStream}
+   * wrapping the result of {@link #newInput()}.
+   */
+  public CodedInputStream newCodedInput() {
+    // We trust CodedInputStream not to modify the bytes, or to give anyone
+    // else access to them.
+    return CodedInputStream.newInstance(bytes);
+  }
+
+  // =================================================================
+  // Output stream
+
+  /**
+   * Creates a new {@link Output} with the given initial capacity.
+   */
+  public static Output newOutput(final int initialCapacity) {
+    return new Output(new ByteArrayOutputStream(initialCapacity));
+  }
+
+  /**
+   * Creates a new {@link Output}.
+   */
+  public static Output newOutput() {
+    return newOutput(32);
+  }
+
+  /**
+   * Outputs to a {@code ByteString} instance. Call {@link #toByteString()} to
+   * create the {@code ByteString} instance.
+   */
+  public static final class Output extends FilterOutputStream {
+    private final ByteArrayOutputStream bout;
+
+    /**
+     * Constructs a new output with the given initial capacity.
+     */
+    private Output(final ByteArrayOutputStream bout) {
+      super(bout);
+      this.bout = bout;
+    }
+
+    /**
+     * Creates a {@code ByteString} instance from this {@code Output}.
+     */
+    public ByteString toByteString() {
+      final byte[] byteArray = bout.toByteArray();
+      return new ByteString(byteArray);
+    }
+  }
+
+  /**
+   * Constructs a new ByteString builder, which allows you to efficiently
+   * construct a {@code ByteString} by writing to a {@link CodedOutputStream}.
+   * Using this is much more efficient than calling {@code newOutput()} and
+   * wrapping that in a {@code CodedOutputStream}.
+   *
+   * <p>This is package-private because it's a somewhat confusing interface.
+   * Users can call {@link Message#toByteString()} instead of calling this
+   * directly.
+   *
+   * @param size The target byte size of the {@code ByteString}.  You must
+   *             write exactly this many bytes before building the result.
+   */
+  static CodedBuilder newCodedBuilder(final int size) {
+    return new CodedBuilder(size);
+  }
+
+  /** See {@link ByteString#newCodedBuilder(int)}. */
+  static final class CodedBuilder {
+    private final CodedOutputStream output;
+    private final byte[] buffer;
+
+    private CodedBuilder(final int size) {
+      buffer = new byte[size];
+      output = CodedOutputStream.newInstance(buffer);
+    }
+
+    public ByteString build() {
+      output.checkNoSpaceLeft();
+
+      // We can be confident that the CodedOutputStream will not modify the
+      // underlying bytes anymore because it already wrote all of them.  So,
+      // no need to make a copy.
+      return new ByteString(buffer);
+    }
+
+    public CodedOutputStream getCodedOutput() {
+      return output;
+    }
+  }
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/CodedInputStream.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/CodedInputStream.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/CodedInputStream.java	(revision 15014)
@@ -0,0 +1,885 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Reads and decodes protocol message fields.
+ *
+ * This class contains two kinds of methods:  methods that read specific
+ * protocol message constructs and field types (e.g. {@link #readTag()} and
+ * {@link #readInt32()}) and methods that read low-level values (e.g.
+ * {@link #readRawVarint32()} and {@link #readRawBytes}).  If you are reading
+ * encoded protocol messages, you should use the former methods, but if you are
+ * reading some other format of your own design, use the latter.
+ *
+ * @author kenton@google.com Kenton Varda
+ */
+public final class CodedInputStream {
+  /**
+   * Create a new CodedInputStream wrapping the given InputStream.
+   */
+  public static CodedInputStream newInstance(final InputStream input) {
+    return new CodedInputStream(input);
+  }
+
+  /**
+   * Create a new CodedInputStream wrapping the given byte array.
+   */
+  public static CodedInputStream newInstance(final byte[] buf) {
+    return newInstance(buf, 0, buf.length);
+  }
+
+  /**
+   * Create a new CodedInputStream wrapping the given byte array slice.
+   */
+  public static CodedInputStream newInstance(final byte[] buf, final int off,
+                                             final int len) {
+    CodedInputStream result = new CodedInputStream(buf, off, len);
+    try {
+      // Some uses of CodedInputStream can be more efficient if they know
+      // exactly how many bytes are available.  By pushing the end point of the
+      // buffer as a limit, we allow them to get this information via
+      // getBytesUntilLimit().  Pushing a limit that we know is at the end of
+      // the stream can never hurt, since we can never past that point anyway.
+      result.pushLimit(len);
+    } catch (InvalidProtocolBufferException ex) {
+      // The only reason pushLimit() might throw an exception here is if len
+      // is negative. Normally pushLimit()'s parameter comes directly off the
+      // wire, so it's important to catch exceptions in case of corrupt or
+      // malicious data. However, in this case, we expect that len is not a
+      // user-supplied value, so we can assume that it being negative indicates
+      // a programming error. Therefore, throwing an unchecked exception is
+      // appropriate.
+      throw new IllegalArgumentException(ex);
+    }
+    return result;
+  }
+
+  // -----------------------------------------------------------------
+
+  /**
+   * Attempt to read a field tag, returning zero if we have reached EOF.
+   * Protocol message parsers use this to read tags, since a protocol message
+   * may legally end wherever a tag occurs, and zero is not a valid tag number.
+   */
+  public int readTag() throws IOException {
+    if (isAtEnd()) {
+      lastTag = 0;
+      return 0;
+    }
+
+    lastTag = readRawVarint32();
+    if (WireFormat.getTagFieldNumber(lastTag) == 0) {
+      // If we actually read zero (or any tag number corresponding to field
+      // number zero), that's not a valid tag.
+      throw InvalidProtocolBufferException.invalidTag();
+    }
+    return lastTag;
+  }
+
+  /**
+   * Verifies that the last call to readTag() returned the given tag value.
+   * This is used to verify that a nested group ended with the correct
+   * end tag.
+   *
+   * @throws InvalidProtocolBufferException {@code value} does not match the
+   *                                        last tag.
+   */
+  public void checkLastTagWas(final int value)
+                              throws InvalidProtocolBufferException {
+    if (lastTag != value) {
+      throw InvalidProtocolBufferException.invalidEndTag();
+    }
+  }
+
+  /**
+   * Reads and discards a single field, given its tag value.
+   *
+   * @return {@code false} if the tag is an endgroup tag, in which case
+   *         nothing is skipped.  Otherwise, returns {@code true}.
+   */
+  public boolean skipField(final int tag) throws IOException {
+    switch (WireFormat.getTagWireType(tag)) {
+      case WireFormat.WIRETYPE_VARINT:
+        readInt32();
+        return true;
+      case WireFormat.WIRETYPE_FIXED64:
+        readRawLittleEndian64();
+        return true;
+      case WireFormat.WIRETYPE_LENGTH_DELIMITED:
+        skipRawBytes(readRawVarint32());
+        return true;
+      case WireFormat.WIRETYPE_START_GROUP:
+        skipMessage();
+        checkLastTagWas(
+          WireFormat.makeTag(WireFormat.getTagFieldNumber(tag),
+                             WireFormat.WIRETYPE_END_GROUP));
+        return true;
+      case WireFormat.WIRETYPE_END_GROUP:
+        return false;
+      case WireFormat.WIRETYPE_FIXED32:
+        readRawLittleEndian32();
+        return true;
+      default:
+        throw InvalidProtocolBufferException.invalidWireType();
+    }
+  }
+
+  /**
+   * Reads and discards an entire message.  This will read either until EOF
+   * or until an endgroup tag, whichever comes first.
+   */
+  public void skipMessage() throws IOException {
+    while (true) {
+      final int tag = readTag();
+      if (tag == 0 || !skipField(tag)) {
+        return;
+      }
+    }
+  }
+
+  // -----------------------------------------------------------------
+
+  /** Read a {@code double} field value from the stream. */
+  public double readDouble() throws IOException {
+    return Double.longBitsToDouble(readRawLittleEndian64());
+  }
+
+  /** Read a {@code float} field value from the stream. */
+  public float readFloat() throws IOException {
+    return Float.intBitsToFloat(readRawLittleEndian32());
+  }
+
+  /** Read a {@code uint64} field value from the stream. */
+  public long readUInt64() throws IOException {
+    return readRawVarint64();
+  }
+
+  /** Read an {@code int64} field value from the stream. */
+  public long readInt64() throws IOException {
+    return readRawVarint64();
+  }
+
+  /** Read an {@code int32} field value from the stream. */
+  public int readInt32() throws IOException {
+    return readRawVarint32();
+  }
+
+  /** Read a {@code fixed64} field value from the stream. */
+  public long readFixed64() throws IOException {
+    return readRawLittleEndian64();
+  }
+
+  /** Read a {@code fixed32} field value from the stream. */
+  public int readFixed32() throws IOException {
+    return readRawLittleEndian32();
+  }
+
+  /** Read a {@code bool} field value from the stream. */
+  public boolean readBool() throws IOException {
+    return readRawVarint32() != 0;
+  }
+
+  /** Read a {@code string} field value from the stream. */
+  public String readString() throws IOException {
+    final int size = readRawVarint32();
+    if (size <= (bufferSize - bufferPos) && size > 0) {
+      // Fast path:  We already have the bytes in a contiguous buffer, so
+      //   just copy directly from it.
+      final String result = new String(buffer, bufferPos, size, "UTF-8");
+      bufferPos += size;
+      return result;
+    } else {
+      // Slow path:  Build a byte array first then copy it.
+      return new String(readRawBytes(size), "UTF-8");
+    }
+  }
+
+  /** Read a {@code group} field value from the stream. */
+  public void readGroup(final int fieldNumber,
+                        final MessageLite.Builder builder,
+                        final ExtensionRegistryLite extensionRegistry)
+      throws IOException {
+    if (recursionDepth >= recursionLimit) {
+      throw InvalidProtocolBufferException.recursionLimitExceeded();
+    }
+    ++recursionDepth;
+    builder.mergeFrom(this, extensionRegistry);
+    checkLastTagWas(
+      WireFormat.makeTag(fieldNumber, WireFormat.WIRETYPE_END_GROUP));
+    --recursionDepth;
+  }
+
+  /**
+   * Reads a {@code group} field value from the stream and merges it into the
+   * given {@link UnknownFieldSet}.
+   *
+   * @deprecated UnknownFieldSet.Builder now implements MessageLite.Builder, so
+   *             you can just call {@link #readGroup}.
+   */
+  @Deprecated
+  public void readUnknownGroup(final int fieldNumber,
+                               final MessageLite.Builder builder)
+      throws IOException {
+    // We know that UnknownFieldSet will ignore any ExtensionRegistry so it
+    // is safe to pass null here.  (We can't call
+    // ExtensionRegistry.getEmptyRegistry() because that would make this
+    // class depend on ExtensionRegistry, which is not part of the lite
+    // library.)
+    readGroup(fieldNumber, builder, null);
+  }
+
+  /** Read an embedded message field value from the stream. */
+  public void readMessage(final MessageLite.Builder builder,
+                          final ExtensionRegistryLite extensionRegistry)
+      throws IOException {
+    final int length = readRawVarint32();
+    if (recursionDepth >= recursionLimit) {
+      throw InvalidProtocolBufferException.recursionLimitExceeded();
+    }
+    final int oldLimit = pushLimit(length);
+    ++recursionDepth;
+    builder.mergeFrom(this, extensionRegistry);
+    checkLastTagWas(0);
+    --recursionDepth;
+    popLimit(oldLimit);
+  }
+
+  /** Read a {@code bytes} field value from the stream. */
+  public ByteString readBytes() throws IOException {
+    final int size = readRawVarint32();
+    if (size == 0) {
+      return ByteString.EMPTY;
+    } else if (size <= (bufferSize - bufferPos) && size > 0) {
+      // Fast path:  We already have the bytes in a contiguous buffer, so
+      //   just copy directly from it.
+      final ByteString result = ByteString.copyFrom(buffer, bufferPos, size);
+      bufferPos += size;
+      return result;
+    } else {
+      // Slow path:  Build a byte array first then copy it.
+      return ByteString.copyFrom(readRawBytes(size));
+    }
+  }
+
+  /** Read a {@code uint32} field value from the stream. */
+  public int readUInt32() throws IOException {
+    return readRawVarint32();
+  }
+
+  /**
+   * Read an enum field value from the stream.  Caller is responsible
+   * for converting the numeric value to an actual enum.
+   */
+  public int readEnum() throws IOException {
+    return readRawVarint32();
+  }
+
+  /** Read an {@code sfixed32} field value from the stream. */
+  public int readSFixed32() throws IOException {
+    return readRawLittleEndian32();
+  }
+
+  /** Read an {@code sfixed64} field value from the stream. */
+  public long readSFixed64() throws IOException {
+    return readRawLittleEndian64();
+  }
+
+  /** Read an {@code sint32} field value from the stream. */
+  public int readSInt32() throws IOException {
+    return decodeZigZag32(readRawVarint32());
+  }
+
+  /** Read an {@code sint64} field value from the stream. */
+  public long readSInt64() throws IOException {
+    return decodeZigZag64(readRawVarint64());
+  }
+
+  // =================================================================
+
+  /**
+   * Read a raw Varint from the stream.  If larger than 32 bits, discard the
+   * upper bits.
+   */
+  public int readRawVarint32() throws IOException {
+    byte tmp = readRawByte();
+    if (tmp >= 0) {
+      return tmp;
+    }
+    int result = tmp & 0x7f;
+    if ((tmp = readRawByte()) >= 0) {
+      result |= tmp << 7;
+    } else {
+      result |= (tmp & 0x7f) << 7;
+      if ((tmp = readRawByte()) >= 0) {
+        result |= tmp << 14;
+      } else {
+        result |= (tmp & 0x7f) << 14;
+        if ((tmp = readRawByte()) >= 0) {
+          result |= tmp << 21;
+        } else {
+          result |= (tmp & 0x7f) << 21;
+          result |= (tmp = readRawByte()) << 28;
+          if (tmp < 0) {
+            // Discard upper 32 bits.
+            for (int i = 0; i < 5; i++) {
+              if (readRawByte() >= 0) {
+                return result;
+              }
+            }
+            throw InvalidProtocolBufferException.malformedVarint();
+          }
+        }
+      }
+    }
+    return result;
+  }
+
+  /**
+   * Reads a varint from the input one byte at a time, so that it does not
+   * read any bytes after the end of the varint.  If you simply wrapped the
+   * stream in a CodedInputStream and used {@link #readRawVarint32(InputStream)}
+   * then you would probably end up reading past the end of the varint since
+   * CodedInputStream buffers its input.
+   */
+  static int readRawVarint32(final InputStream input) throws IOException {
+    final int firstByte = input.read();
+    if (firstByte == -1) {
+      throw InvalidProtocolBufferException.truncatedMessage();
+    }
+    return readRawVarint32(firstByte, input);
+  }
+
+  /**
+   * Like {@link #readRawVarint32(InputStream)}, but expects that the caller
+   * has already read one byte.  This allows the caller to determine if EOF
+   * has been reached before attempting to read.
+   */
+  public static int readRawVarint32(
+      final int firstByte, final InputStream input) throws IOException {
+    if ((firstByte & 0x80) == 0) {
+      return firstByte;
+    }
+
+    int result = firstByte & 0x7f;
+    int offset = 7;
+    for (; offset < 32; offset += 7) {
+      final int b = input.read();
+      if (b == -1) {
+        throw InvalidProtocolBufferException.truncatedMessage();
+      }
+      result |= (b & 0x7f) << offset;
+      if ((b & 0x80) == 0) {
+        return result;
+      }
+    }
+    // Keep reading up to 64 bits.
+    for (; offset < 64; offset += 7) {
+      final int b = input.read();
+      if (b == -1) {
+        throw InvalidProtocolBufferException.truncatedMessage();
+      }
+      if ((b & 0x80) == 0) {
+        return result;
+      }
+    }
+    throw InvalidProtocolBufferException.malformedVarint();
+  }
+
+  /** Read a raw Varint from the stream. */
+  public long readRawVarint64() throws IOException {
+    int shift = 0;
+    long result = 0;
+    while (shift < 64) {
+      final byte b = readRawByte();
+      result |= (long)(b & 0x7F) << shift;
+      if ((b & 0x80) == 0) {
+        return result;
+      }
+      shift += 7;
+    }
+    throw InvalidProtocolBufferException.malformedVarint();
+  }
+
+  /** Read a 32-bit little-endian integer from the stream. */
+  public int readRawLittleEndian32() throws IOException {
+    final byte b1 = readRawByte();
+    final byte b2 = readRawByte();
+    final byte b3 = readRawByte();
+    final byte b4 = readRawByte();
+    return (((int)b1 & 0xff)      ) |
+           (((int)b2 & 0xff) <<  8) |
+           (((int)b3 & 0xff) << 16) |
+           (((int)b4 & 0xff) << 24);
+  }
+
+  /** Read a 64-bit little-endian integer from the stream. */
+  public long readRawLittleEndian64() throws IOException {
+    final byte b1 = readRawByte();
+    final byte b2 = readRawByte();
+    final byte b3 = readRawByte();
+    final byte b4 = readRawByte();
+    final byte b5 = readRawByte();
+    final byte b6 = readRawByte();
+    final byte b7 = readRawByte();
+    final byte b8 = readRawByte();
+    return (((long)b1 & 0xff)      ) |
+           (((long)b2 & 0xff) <<  8) |
+           (((long)b3 & 0xff) << 16) |
+           (((long)b4 & 0xff) << 24) |
+           (((long)b5 & 0xff) << 32) |
+           (((long)b6 & 0xff) << 40) |
+           (((long)b7 & 0xff) << 48) |
+           (((long)b8 & 0xff) << 56);
+  }
+
+  /**
+   * Decode a ZigZag-encoded 32-bit value.  ZigZag encodes signed integers
+   * into values that can be efficiently encoded with varint.  (Otherwise,
+   * negative values must be sign-extended to 64 bits to be varint encoded,
+   * thus always taking 10 bytes on the wire.)
+   *
+   * @param n An unsigned 32-bit integer, stored in a signed int because
+   *          Java has no explicit unsigned support.
+   * @return A signed 32-bit integer.
+   */
+  public static int decodeZigZag32(final int n) {
+    return (n >>> 1) ^ -(n & 1);
+  }
+
+  /**
+   * Decode a ZigZag-encoded 64-bit value.  ZigZag encodes signed integers
+   * into values that can be efficiently encoded with varint.  (Otherwise,
+   * negative values must be sign-extended to 64 bits to be varint encoded,
+   * thus always taking 10 bytes on the wire.)
+   *
+   * @param n An unsigned 64-bit integer, stored in a signed int because
+   *          Java has no explicit unsigned support.
+   * @return A signed 64-bit integer.
+   */
+  public static long decodeZigZag64(final long n) {
+    return (n >>> 1) ^ -(n & 1);
+  }
+
+  // -----------------------------------------------------------------
+
+  private final byte[] buffer;
+  private int bufferSize;
+  private int bufferSizeAfterLimit;
+  private int bufferPos;
+  private final InputStream input;
+  private int lastTag;
+
+  /**
+   * The total number of bytes read before the current buffer.  The total
+   * bytes read up to the current position can be computed as
+   * {@code totalBytesRetired + bufferPos}.  This value may be negative if
+   * reading started in the middle of the current buffer (e.g. if the
+   * constructor that takes a byte array and an offset was used).
+   */
+  private int totalBytesRetired;
+
+  /** The absolute position of the end of the current message. */
+  private int currentLimit = Integer.MAX_VALUE;
+
+  /** See setRecursionLimit() */
+  private int recursionDepth;
+  private int recursionLimit = DEFAULT_RECURSION_LIMIT;
+
+  /** See setSizeLimit() */
+  private int sizeLimit = DEFAULT_SIZE_LIMIT;
+
+  private static final int DEFAULT_RECURSION_LIMIT = 64;
+  private static final int DEFAULT_SIZE_LIMIT = 64 << 20;  // 64MB
+  private static final int BUFFER_SIZE = 4096;
+
+  private CodedInputStream(final byte[] buffer, final int off, final int len) {
+    this.buffer = buffer;
+    bufferSize = off + len;
+    bufferPos = off;
+    totalBytesRetired = -off;
+    input = null;
+  }
+
+  private CodedInputStream(final InputStream input) {
+    buffer = new byte[BUFFER_SIZE];
+    bufferSize = 0;
+    bufferPos = 0;
+    totalBytesRetired = 0;
+    this.input = input;
+  }
+
+  /**
+   * Set the maximum message recursion depth.  In order to prevent malicious
+   * messages from causing stack overflows, {@code CodedInputStream} limits
+   * how deeply messages may be nested.  The default limit is 64.
+   *
+   * @return the old limit.
+   */
+  public int setRecursionLimit(final int limit) {
+    if (limit < 0) {
+      throw new IllegalArgumentException(
+        "Recursion limit cannot be negative: " + limit);
+    }
+    final int oldLimit = recursionLimit;
+    recursionLimit = limit;
+    return oldLimit;
+  }
+
+  /**
+   * Set the maximum message size.  In order to prevent malicious
+   * messages from exhausting memory or causing integer overflows,
+   * {@code CodedInputStream} limits how large a message may be.
+   * The default limit is 64MB.  You should set this limit as small
+   * as you can without harming your app's functionality.  Note that
+   * size limits only apply when reading from an {@code InputStream}, not
+   * when constructed around a raw byte array (nor with
+   * {@link ByteString#newCodedInput}).
+   * <p>
+   * If you want to read several messages from a single CodedInputStream, you
+   * could call {@link #resetSizeCounter()} after each one to avoid hitting the
+   * size limit.
+   *
+   * @return the old limit.
+   */
+  public int setSizeLimit(final int limit) {
+    if (limit < 0) {
+      throw new IllegalArgumentException(
+        "Size limit cannot be negative: " + limit);
+    }
+    final int oldLimit = sizeLimit;
+    sizeLimit = limit;
+    return oldLimit;
+  }
+
+  /**
+   * Resets the current size counter to zero (see {@link #setSizeLimit(int)}).
+   */
+  public void resetSizeCounter() {
+    totalBytesRetired = -bufferPos;
+  }
+
+  /**
+   * Sets {@code currentLimit} to (current position) + {@code byteLimit}.  This
+   * is called when descending into a length-delimited embedded message.
+   *
+   * <p>Note that {@code pushLimit()} does NOT affect how many bytes the
+   * {@code CodedInputStream} reads from an underlying {@code InputStream} when
+   * refreshing its buffer.  If you need to prevent reading past a certain
+   * point in the underlying {@code InputStream} (e.g. because you expect it to
+   * contain more data after the end of the message which you need to handle
+   * differently) then you must place a wrapper around you {@code InputStream}
+   * which limits the amount of data that can be read from it.
+   *
+   * @return the old limit.
+   */
+  public int pushLimit(int byteLimit) throws InvalidProtocolBufferException {
+    if (byteLimit < 0) {
+      throw InvalidProtocolBufferException.negativeSize();
+    }
+    byteLimit += totalBytesRetired + bufferPos;
+    final int oldLimit = currentLimit;
+    if (byteLimit > oldLimit) {
+      throw InvalidProtocolBufferException.truncatedMessage();
+    }
+    currentLimit = byteLimit;
+
+    recomputeBufferSizeAfterLimit();
+
+    return oldLimit;
+  }
+
+  private void recomputeBufferSizeAfterLimit() {
+    bufferSize += bufferSizeAfterLimit;
+    final int bufferEnd = totalBytesRetired + bufferSize;
+    if (bufferEnd > currentLimit) {
+      // Limit is in current buffer.
+      bufferSizeAfterLimit = bufferEnd - currentLimit;
+      bufferSize -= bufferSizeAfterLimit;
+    } else {
+      bufferSizeAfterLimit = 0;
+    }
+  }
+
+  /**
+   * Discards the current limit, returning to the previous limit.
+   *
+   * @param oldLimit The old limit, as returned by {@code pushLimit}.
+   */
+  public void popLimit(final int oldLimit) {
+    currentLimit = oldLimit;
+    recomputeBufferSizeAfterLimit();
+  }
+
+  /**
+   * Returns the number of bytes to be read before the current limit.
+   * If no limit is set, returns -1.
+   */
+  public int getBytesUntilLimit() {
+    if (currentLimit == Integer.MAX_VALUE) {
+      return -1;
+    }
+
+    final int currentAbsolutePosition = totalBytesRetired + bufferPos;
+    return currentLimit - currentAbsolutePosition;
+  }
+
+  /**
+   * Returns true if the stream has reached the end of the input.  This is the
+   * case if either the end of the underlying input source has been reached or
+   * if the stream has reached a limit created using {@link #pushLimit(int)}.
+   */
+  public boolean isAtEnd() throws IOException {
+    return bufferPos == bufferSize && !refillBuffer(false);
+  }
+
+  /**
+   * The total bytes read up to the current position. Calling
+   * {@link #resetSizeCounter()} resets this value to zero.
+   */
+  public int getTotalBytesRead() {
+      return totalBytesRetired + bufferPos;
+  }
+
+  /**
+   * Called with {@code this.buffer} is empty to read more bytes from the
+   * input.  If {@code mustSucceed} is true, refillBuffer() gurantees that
+   * either there will be at least one byte in the buffer when it returns
+   * or it will throw an exception.  If {@code mustSucceed} is false,
+   * refillBuffer() returns false if no more bytes were available.
+   */
+  private boolean refillBuffer(final boolean mustSucceed) throws IOException {
+    if (bufferPos < bufferSize) {
+      throw new IllegalStateException(
+        "refillBuffer() called when buffer wasn't empty.");
+    }
+
+    if (totalBytesRetired + bufferSize == currentLimit) {
+      // Oops, we hit a limit.
+      if (mustSucceed) {
+        throw InvalidProtocolBufferException.truncatedMessage();
+      } else {
+        return false;
+      }
+    }
+
+    totalBytesRetired += bufferSize;
+
+    bufferPos = 0;
+    bufferSize = (input == null) ? -1 : input.read(buffer);
+    if (bufferSize == 0 || bufferSize < -1) {
+      throw new IllegalStateException(
+          "InputStream#read(byte[]) returned invalid result: " + bufferSize +
+          "\nThe InputStream implementation is buggy.");
+    }
+    if (bufferSize == -1) {
+      bufferSize = 0;
+      if (mustSucceed) {
+        throw InvalidProtocolBufferException.truncatedMessage();
+      } else {
+        return false;
+      }
+    } else {
+      recomputeBufferSizeAfterLimit();
+      final int totalBytesRead =
+        totalBytesRetired + bufferSize + bufferSizeAfterLimit;
+      if (totalBytesRead > sizeLimit || totalBytesRead < 0) {
+        throw InvalidProtocolBufferException.sizeLimitExceeded();
+      }
+      return true;
+    }
+  }
+
+  /**
+   * Read one byte from the input.
+   *
+   * @throws InvalidProtocolBufferException The end of the stream or the current
+   *                                        limit was reached.
+   */
+  public byte readRawByte() throws IOException {
+    if (bufferPos == bufferSize) {
+      refillBuffer(true);
+    }
+    return buffer[bufferPos++];
+  }
+
+  /**
+   * Read a fixed size of bytes from the input.
+   *
+   * @throws InvalidProtocolBufferException The end of the stream or the current
+   *                                        limit was reached.
+   */
+  public byte[] readRawBytes(final int size) throws IOException {
+    if (size < 0) {
+      throw InvalidProtocolBufferException.negativeSize();
+    }
+
+    if (totalBytesRetired + bufferPos + size > currentLimit) {
+      // Read to the end of the stream anyway.
+      skipRawBytes(currentLimit - totalBytesRetired - bufferPos);
+      // Then fail.
+      throw InvalidProtocolBufferException.truncatedMessage();
+    }
+
+    if (size <= bufferSize - bufferPos) {
+      // We have all the bytes we need already.
+      final byte[] bytes = new byte[size];
+      System.arraycopy(buffer, bufferPos, bytes, 0, size);
+      bufferPos += size;
+      return bytes;
+    } else if (size < BUFFER_SIZE) {
+      // Reading more bytes than are in the buffer, but not an excessive number
+      // of bytes.  We can safely allocate the resulting array ahead of time.
+
+      // First copy what we have.
+      final byte[] bytes = new byte[size];
+      int pos = bufferSize - bufferPos;
+      System.arraycopy(buffer, bufferPos, bytes, 0, pos);
+      bufferPos = bufferSize;
+
+      // We want to use refillBuffer() and then copy from the buffer into our
+      // byte array rather than reading directly into our byte array because
+      // the input may be unbuffered.
+      refillBuffer(true);
+
+      while (size - pos > bufferSize) {
+        System.arraycopy(buffer, 0, bytes, pos, bufferSize);
+        pos += bufferSize;
+        bufferPos = bufferSize;
+        refillBuffer(true);
+      }
+
+      System.arraycopy(buffer, 0, bytes, pos, size - pos);
+      bufferPos = size - pos;
+
+      return bytes;
+    } else {
+      // The size is very large.  For security reasons, we can't allocate the
+      // entire byte array yet.  The size comes directly from the input, so a
+      // maliciously-crafted message could provide a bogus very large size in
+      // order to trick the app into allocating a lot of memory.  We avoid this
+      // by allocating and reading only a small chunk at a time, so that the
+      // malicious message must actually *be* extremely large to cause
+      // problems.  Meanwhile, we limit the allowed size of a message elsewhere.
+
+      // Remember the buffer markers since we'll have to copy the bytes out of
+      // it later.
+      final int originalBufferPos = bufferPos;
+      final int originalBufferSize = bufferSize;
+
+      // Mark the current buffer consumed.
+      totalBytesRetired += bufferSize;
+      bufferPos = 0;
+      bufferSize = 0;
+
+      // Read all the rest of the bytes we need.
+      int sizeLeft = size - (originalBufferSize - originalBufferPos);
+      final List<byte[]> chunks = new ArrayList<byte[]>();
+
+      while (sizeLeft > 0) {
+        final byte[] chunk = new byte[Math.min(sizeLeft, BUFFER_SIZE)];
+        int pos = 0;
+        while (pos < chunk.length) {
+          final int n = (input == null) ? -1 :
+            input.read(chunk, pos, chunk.length - pos);
+          if (n == -1) {
+            throw InvalidProtocolBufferException.truncatedMessage();
+          }
+          totalBytesRetired += n;
+          pos += n;
+        }
+        sizeLeft -= chunk.length;
+        chunks.add(chunk);
+      }
+
+      // OK, got everything.  Now concatenate it all into one buffer.
+      final byte[] bytes = new byte[size];
+
+      // Start by copying the leftover bytes from this.buffer.
+      int pos = originalBufferSize - originalBufferPos;
+      System.arraycopy(buffer, originalBufferPos, bytes, 0, pos);
+
+      // And now all the chunks.
+      for (final byte[] chunk : chunks) {
+        System.arraycopy(chunk, 0, bytes, pos, chunk.length);
+        pos += chunk.length;
+      }
+
+      // Done.
+      return bytes;
+    }
+  }
+
+  /**
+   * Reads and discards {@code size} bytes.
+   *
+   * @throws InvalidProtocolBufferException The end of the stream or the current
+   *                                        limit was reached.
+   */
+  public void skipRawBytes(final int size) throws IOException {
+    if (size < 0) {
+      throw InvalidProtocolBufferException.negativeSize();
+    }
+
+    if (totalBytesRetired + bufferPos + size > currentLimit) {
+      // Read to the end of the stream anyway.
+      skipRawBytes(currentLimit - totalBytesRetired - bufferPos);
+      // Then fail.
+      throw InvalidProtocolBufferException.truncatedMessage();
+    }
+
+    if (size <= bufferSize - bufferPos) {
+      // We have all the bytes we need already.
+      bufferPos += size;
+    } else {
+      // Skipping more bytes than are in the buffer.  First skip what we have.
+      int pos = bufferSize - bufferPos;
+      bufferPos = bufferSize;
+
+      // Keep refilling the buffer until we get to the point we wanted to skip
+      // to.  This has the side effect of ensuring the limits are updated
+      // correctly.
+      refillBuffer(true);
+      while (size - pos > bufferSize) {
+        pos += bufferSize;
+        bufferPos = bufferSize;
+        refillBuffer(true);
+      }
+
+      bufferPos = size - pos; 
+    }
+  }
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/CodedOutputStream.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/CodedOutputStream.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/CodedOutputStream.java	(revision 15014)
@@ -0,0 +1,1081 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import java.io.OutputStream;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.io.InputStream;
+
+/**
+ * Encodes and writes protocol message fields.
+ *
+ * <p>This class contains two kinds of methods:  methods that write specific
+ * protocol message constructs and field types (e.g. {@link #writeTag} and
+ * {@link #writeInt32}) and methods that write low-level values (e.g.
+ * {@link #writeRawVarint32} and {@link #writeRawBytes}).  If you are
+ * writing encoded protocol messages, you should use the former methods, but if
+ * you are writing some other format of your own design, use the latter.
+ *
+ * <p>This class is totally unsynchronized.
+ *
+ * @author kneton@google.com Kenton Varda
+ */
+public final class CodedOutputStream {
+  private final byte[] buffer;
+  private final int limit;
+  private int position;
+
+  private final OutputStream output;
+
+  /**
+   * The buffer size used in {@link #newInstance(OutputStream)}.
+   */
+  public static final int DEFAULT_BUFFER_SIZE = 4096;
+
+  /**
+   * Returns the buffer size to efficiently write dataLength bytes to this
+   * CodedOutputStream. Used by AbstractMessageLite.
+   *
+   * @return the buffer size to efficiently write dataLength bytes to this
+   *         CodedOutputStream.
+   */
+  static int computePreferredBufferSize(int dataLength) {
+    if (dataLength > DEFAULT_BUFFER_SIZE) return DEFAULT_BUFFER_SIZE;
+    return dataLength;
+  }
+
+  private CodedOutputStream(final byte[] buffer, final int offset,
+                            final int length) {
+    output = null;
+    this.buffer = buffer;
+    position = offset;
+    limit = offset + length;
+  }
+
+  private CodedOutputStream(final OutputStream output, final byte[] buffer) {
+    this.output = output;
+    this.buffer = buffer;
+    position = 0;
+    limit = buffer.length;
+  }
+
+  /**
+   * Create a new {@code CodedOutputStream} wrapping the given
+   * {@code OutputStream}.
+   */
+  public static CodedOutputStream newInstance(final OutputStream output) {
+    return newInstance(output, DEFAULT_BUFFER_SIZE);
+  }
+
+  /**
+   * Create a new {@code CodedOutputStream} wrapping the given
+   * {@code OutputStream} with a given buffer size.
+   */
+  public static CodedOutputStream newInstance(final OutputStream output,
+      final int bufferSize) {
+    return new CodedOutputStream(output, new byte[bufferSize]);
+  }
+
+  /**
+   * Create a new {@code CodedOutputStream} that writes directly to the given
+   * byte array.  If more bytes are written than fit in the array,
+   * {@link OutOfSpaceException} will be thrown.  Writing directly to a flat
+   * array is faster than writing to an {@code OutputStream}.  See also
+   * {@link ByteString#newCodedBuilder}.
+   */
+  public static CodedOutputStream newInstance(final byte[] flatArray) {
+    return newInstance(flatArray, 0, flatArray.length);
+  }
+
+  /**
+   * Create a new {@code CodedOutputStream} that writes directly to the given
+   * byte array slice.  If more bytes are written than fit in the slice,
+   * {@link OutOfSpaceException} will be thrown.  Writing directly to a flat
+   * array is faster than writing to an {@code OutputStream}.  See also
+   * {@link ByteString#newCodedBuilder}.
+   */
+  public static CodedOutputStream newInstance(final byte[] flatArray,
+                                              final int offset,
+                                              final int length) {
+    return new CodedOutputStream(flatArray, offset, length);
+  }
+
+  // -----------------------------------------------------------------
+
+  /** Write a {@code double} field, including tag, to the stream. */
+  public void writeDouble(final int fieldNumber, final double value)
+                          throws IOException {
+    writeTag(fieldNumber, WireFormat.WIRETYPE_FIXED64);
+    writeDoubleNoTag(value);
+  }
+
+  /** Write a {@code float} field, including tag, to the stream. */
+  public void writeFloat(final int fieldNumber, final float value)
+                         throws IOException {
+    writeTag(fieldNumber, WireFormat.WIRETYPE_FIXED32);
+    writeFloatNoTag(value);
+  }
+
+  /** Write a {@code uint64} field, including tag, to the stream. */
+  public void writeUInt64(final int fieldNumber, final long value)
+                          throws IOException {
+    writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT);
+    writeUInt64NoTag(value);
+  }
+
+  /** Write an {@code int64} field, including tag, to the stream. */
+  public void writeInt64(final int fieldNumber, final long value)
+                         throws IOException {
+    writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT);
+    writeInt64NoTag(value);
+  }
+
+  /** Write an {@code int32} field, including tag, to the stream. */
+  public void writeInt32(final int fieldNumber, final int value)
+                         throws IOException {
+    writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT);
+    writeInt32NoTag(value);
+  }
+
+  /** Write a {@code fixed64} field, including tag, to the stream. */
+  public void writeFixed64(final int fieldNumber, final long value)
+                           throws IOException {
+    writeTag(fieldNumber, WireFormat.WIRETYPE_FIXED64);
+    writeFixed64NoTag(value);
+  }
+
+  /** Write a {@code fixed32} field, including tag, to the stream. */
+  public void writeFixed32(final int fieldNumber, final int value)
+                           throws IOException {
+    writeTag(fieldNumber, WireFormat.WIRETYPE_FIXED32);
+    writeFixed32NoTag(value);
+  }
+
+  /** Write a {@code bool} field, including tag, to the stream. */
+  public void writeBool(final int fieldNumber, final boolean value)
+                        throws IOException {
+    writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT);
+    writeBoolNoTag(value);
+  }
+
+  /** Write a {@code string} field, including tag, to the stream. */
+  public void writeString(final int fieldNumber, final String value)
+                          throws IOException {
+    writeTag(fieldNumber, WireFormat.WIRETYPE_LENGTH_DELIMITED);
+    writeStringNoTag(value);
+  }
+
+  /** Write a {@code group} field, including tag, to the stream. */
+  public void writeGroup(final int fieldNumber, final MessageLite value)
+                         throws IOException {
+    writeTag(fieldNumber, WireFormat.WIRETYPE_START_GROUP);
+    writeGroupNoTag(value);
+    writeTag(fieldNumber, WireFormat.WIRETYPE_END_GROUP);
+  }
+
+  /**
+   * Write a group represented by an {@link UnknownFieldSet}.
+   *
+   * @deprecated UnknownFieldSet now implements MessageLite, so you can just
+   *             call {@link #writeGroup}.
+   */
+  @Deprecated
+  public void writeUnknownGroup(final int fieldNumber,
+                                final MessageLite value)
+                                throws IOException {
+    writeGroup(fieldNumber, value);
+  }
+
+  /** Write an embedded message field, including tag, to the stream. */
+  public void writeMessage(final int fieldNumber, final MessageLite value)
+                           throws IOException {
+    writeTag(fieldNumber, WireFormat.WIRETYPE_LENGTH_DELIMITED);
+    writeMessageNoTag(value);
+  }
+
+  /** Write a {@code bytes} field, including tag, to the stream. */
+  public void writeBytes(final int fieldNumber, final ByteString value)
+                         throws IOException {
+    writeTag(fieldNumber, WireFormat.WIRETYPE_LENGTH_DELIMITED);
+    writeBytesNoTag(value);
+  }
+
+  /** Write a {@code uint32} field, including tag, to the stream. */
+  public void writeUInt32(final int fieldNumber, final int value)
+                          throws IOException {
+    writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT);
+    writeUInt32NoTag(value);
+  }
+
+  /**
+   * Write an enum field, including tag, to the stream.  Caller is responsible
+   * for converting the enum value to its numeric value.
+   */
+  public void writeEnum(final int fieldNumber, final int value)
+                        throws IOException {
+    writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT);
+    writeEnumNoTag(value);
+  }
+
+  /** Write an {@code sfixed32} field, including tag, to the stream. */
+  public void writeSFixed32(final int fieldNumber, final int value)
+                            throws IOException {
+    writeTag(fieldNumber, WireFormat.WIRETYPE_FIXED32);
+    writeSFixed32NoTag(value);
+  }
+
+  /** Write an {@code sfixed64} field, including tag, to the stream. */
+  public void writeSFixed64(final int fieldNumber, final long value)
+                            throws IOException {
+    writeTag(fieldNumber, WireFormat.WIRETYPE_FIXED64);
+    writeSFixed64NoTag(value);
+  }
+
+  /** Write an {@code sint32} field, including tag, to the stream. */
+  public void writeSInt32(final int fieldNumber, final int value)
+                          throws IOException {
+    writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT);
+    writeSInt32NoTag(value);
+  }
+
+  /** Write an {@code sint64} field, including tag, to the stream. */
+  public void writeSInt64(final int fieldNumber, final long value)
+                          throws IOException {
+    writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT);
+    writeSInt64NoTag(value);
+  }
+
+  /**
+   * Write a MessageSet extension field to the stream.  For historical reasons,
+   * the wire format differs from normal fields.
+   */
+  public void writeMessageSetExtension(final int fieldNumber,
+                                       final MessageLite value)
+                                       throws IOException {
+    writeTag(WireFormat.MESSAGE_SET_ITEM, WireFormat.WIRETYPE_START_GROUP);
+    writeUInt32(WireFormat.MESSAGE_SET_TYPE_ID, fieldNumber);
+    writeMessage(WireFormat.MESSAGE_SET_MESSAGE, value);
+    writeTag(WireFormat.MESSAGE_SET_ITEM, WireFormat.WIRETYPE_END_GROUP);
+  }
+
+  /**
+   * Write an unparsed MessageSet extension field to the stream.  For
+   * historical reasons, the wire format differs from normal fields.
+   */
+  public void writeRawMessageSetExtension(final int fieldNumber,
+                                          final ByteString value)
+                                          throws IOException {
+    writeTag(WireFormat.MESSAGE_SET_ITEM, WireFormat.WIRETYPE_START_GROUP);
+    writeUInt32(WireFormat.MESSAGE_SET_TYPE_ID, fieldNumber);
+    writeBytes(WireFormat.MESSAGE_SET_MESSAGE, value);
+    writeTag(WireFormat.MESSAGE_SET_ITEM, WireFormat.WIRETYPE_END_GROUP);
+  }
+
+  // -----------------------------------------------------------------
+
+  /** Write a {@code double} field to the stream. */
+  public void writeDoubleNoTag(final double value) throws IOException {
+    writeRawLittleEndian64(Double.doubleToRawLongBits(value));
+  }
+
+  /** Write a {@code float} field to the stream. */
+  public void writeFloatNoTag(final float value) throws IOException {
+    writeRawLittleEndian32(Float.floatToRawIntBits(value));
+  }
+
+  /** Write a {@code uint64} field to the stream. */
+  public void writeUInt64NoTag(final long value) throws IOException {
+    writeRawVarint64(value);
+  }
+
+  /** Write an {@code int64} field to the stream. */
+  public void writeInt64NoTag(final long value) throws IOException {
+    writeRawVarint64(value);
+  }
+
+  /** Write an {@code int32} field to the stream. */
+  public void writeInt32NoTag(final int value) throws IOException {
+    if (value >= 0) {
+      writeRawVarint32(value);
+    } else {
+      // Must sign-extend.
+      writeRawVarint64(value);
+    }
+  }
+
+  /** Write a {@code fixed64} field to the stream. */
+  public void writeFixed64NoTag(final long value) throws IOException {
+    writeRawLittleEndian64(value);
+  }
+
+  /** Write a {@code fixed32} field to the stream. */
+  public void writeFixed32NoTag(final int value) throws IOException {
+    writeRawLittleEndian32(value);
+  }
+
+  /** Write a {@code bool} field to the stream. */
+  public void writeBoolNoTag(final boolean value) throws IOException {
+    writeRawByte(value ? 1 : 0);
+  }
+
+  /** Write a {@code string} field to the stream. */
+  public void writeStringNoTag(final String value) throws IOException {
+    // Unfortunately there does not appear to be any way to tell Java to encode
+    // UTF-8 directly into our buffer, so we have to let it create its own byte
+    // array and then copy.
+    final byte[] bytes = value.getBytes("UTF-8");
+    writeRawVarint32(bytes.length);
+    writeRawBytes(bytes);
+  }
+
+  /** Write a {@code group} field to the stream. */
+  public void writeGroupNoTag(final MessageLite value) throws IOException {
+    value.writeTo(this);
+  }
+
+  /**
+   * Write a group represented by an {@link UnknownFieldSet}.
+   *
+   * @deprecated UnknownFieldSet now implements MessageLite, so you can just
+   *             call {@link #writeGroupNoTag}.
+   */
+  @Deprecated
+  public void writeUnknownGroupNoTag(final MessageLite value)
+      throws IOException {
+    writeGroupNoTag(value);
+  }
+
+  /** Write an embedded message field to the stream. */
+  public void writeMessageNoTag(final MessageLite value) throws IOException {
+    writeRawVarint32(value.getSerializedSize());
+    value.writeTo(this);
+  }
+
+  /** Write a {@code bytes} field to the stream. */
+  public void writeBytesNoTag(final ByteString value) throws IOException {
+    writeRawVarint32(value.size());
+    writeRawBytes(value);
+  }
+
+  /** Write a {@code uint32} field to the stream. */
+  public void writeUInt32NoTag(final int value) throws IOException {
+    writeRawVarint32(value);
+  }
+
+  /**
+   * Write an enum field to the stream.  Caller is responsible
+   * for converting the enum value to its numeric value.
+   */
+  public void writeEnumNoTag(final int value) throws IOException {
+    writeInt32NoTag(value);
+  }
+
+  /** Write an {@code sfixed32} field to the stream. */
+  public void writeSFixed32NoTag(final int value) throws IOException {
+    writeRawLittleEndian32(value);
+  }
+
+  /** Write an {@code sfixed64} field to the stream. */
+  public void writeSFixed64NoTag(final long value) throws IOException {
+    writeRawLittleEndian64(value);
+  }
+
+  /** Write an {@code sint32} field to the stream. */
+  public void writeSInt32NoTag(final int value) throws IOException {
+    writeRawVarint32(encodeZigZag32(value));
+  }
+
+  /** Write an {@code sint64} field to the stream. */
+  public void writeSInt64NoTag(final long value) throws IOException {
+    writeRawVarint64(encodeZigZag64(value));
+  }
+
+  // =================================================================
+
+  /**
+   * Compute the number of bytes that would be needed to encode a
+   * {@code double} field, including tag.
+   */
+  public static int computeDoubleSize(final int fieldNumber,
+                                      final double value) {
+    return computeTagSize(fieldNumber) + computeDoubleSizeNoTag(value);
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode a
+   * {@code float} field, including tag.
+   */
+  public static int computeFloatSize(final int fieldNumber, final float value) {
+    return computeTagSize(fieldNumber) + computeFloatSizeNoTag(value);
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode a
+   * {@code uint64} field, including tag.
+   */
+  public static int computeUInt64Size(final int fieldNumber, final long value) {
+    return computeTagSize(fieldNumber) + computeUInt64SizeNoTag(value);
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode an
+   * {@code int64} field, including tag.
+   */
+  public static int computeInt64Size(final int fieldNumber, final long value) {
+    return computeTagSize(fieldNumber) + computeInt64SizeNoTag(value);
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode an
+   * {@code int32} field, including tag.
+   */
+  public static int computeInt32Size(final int fieldNumber, final int value) {
+    return computeTagSize(fieldNumber) + computeInt32SizeNoTag(value);
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode a
+   * {@code fixed64} field, including tag.
+   */
+  public static int computeFixed64Size(final int fieldNumber,
+                                       final long value) {
+    return computeTagSize(fieldNumber) + computeFixed64SizeNoTag(value);
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode a
+   * {@code fixed32} field, including tag.
+   */
+  public static int computeFixed32Size(final int fieldNumber,
+                                       final int value) {
+    return computeTagSize(fieldNumber) + computeFixed32SizeNoTag(value);
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode a
+   * {@code bool} field, including tag.
+   */
+  public static int computeBoolSize(final int fieldNumber,
+                                    final boolean value) {
+    return computeTagSize(fieldNumber) + computeBoolSizeNoTag(value);
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode a
+   * {@code string} field, including tag.
+   */
+  public static int computeStringSize(final int fieldNumber,
+                                      final String value) {
+    return computeTagSize(fieldNumber) + computeStringSizeNoTag(value);
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode a
+   * {@code group} field, including tag.
+   */
+  public static int computeGroupSize(final int fieldNumber,
+                                     final MessageLite value) {
+    return computeTagSize(fieldNumber) * 2 + computeGroupSizeNoTag(value);
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode a
+   * {@code group} field represented by an {@code UnknownFieldSet}, including
+   * tag.
+   *
+   * @deprecated UnknownFieldSet now implements MessageLite, so you can just
+   *             call {@link #computeGroupSize}.
+   */
+  @Deprecated
+  public static int computeUnknownGroupSize(final int fieldNumber,
+                                            final MessageLite value) {
+    return computeGroupSize(fieldNumber, value);
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode an
+   * embedded message field, including tag.
+   */
+  public static int computeMessageSize(final int fieldNumber,
+                                       final MessageLite value) {
+    return computeTagSize(fieldNumber) + computeMessageSizeNoTag(value);
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode a
+   * {@code bytes} field, including tag.
+   */
+  public static int computeBytesSize(final int fieldNumber,
+                                     final ByteString value) {
+    return computeTagSize(fieldNumber) + computeBytesSizeNoTag(value);
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode a
+   * {@code uint32} field, including tag.
+   */
+  public static int computeUInt32Size(final int fieldNumber, final int value) {
+    return computeTagSize(fieldNumber) + computeUInt32SizeNoTag(value);
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode an
+   * enum field, including tag.  Caller is responsible for converting the
+   * enum value to its numeric value.
+   */
+  public static int computeEnumSize(final int fieldNumber, final int value) {
+    return computeTagSize(fieldNumber) + computeEnumSizeNoTag(value);
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode an
+   * {@code sfixed32} field, including tag.
+   */
+  public static int computeSFixed32Size(final int fieldNumber,
+                                        final int value) {
+    return computeTagSize(fieldNumber) + computeSFixed32SizeNoTag(value);
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode an
+   * {@code sfixed64} field, including tag.
+   */
+  public static int computeSFixed64Size(final int fieldNumber,
+                                        final long value) {
+    return computeTagSize(fieldNumber) + computeSFixed64SizeNoTag(value);
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode an
+   * {@code sint32} field, including tag.
+   */
+  public static int computeSInt32Size(final int fieldNumber, final int value) {
+    return computeTagSize(fieldNumber) + computeSInt32SizeNoTag(value);
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode an
+   * {@code sint64} field, including tag.
+   */
+  public static int computeSInt64Size(final int fieldNumber, final long value) {
+    return computeTagSize(fieldNumber) + computeSInt64SizeNoTag(value);
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode a
+   * MessageSet extension to the stream.  For historical reasons,
+   * the wire format differs from normal fields.
+   */
+  public static int computeMessageSetExtensionSize(
+      final int fieldNumber, final MessageLite value) {
+    return computeTagSize(WireFormat.MESSAGE_SET_ITEM) * 2 +
+           computeUInt32Size(WireFormat.MESSAGE_SET_TYPE_ID, fieldNumber) +
+           computeMessageSize(WireFormat.MESSAGE_SET_MESSAGE, value);
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode an
+   * unparsed MessageSet extension field to the stream.  For
+   * historical reasons, the wire format differs from normal fields.
+   */
+  public static int computeRawMessageSetExtensionSize(
+      final int fieldNumber, final ByteString value) {
+    return computeTagSize(WireFormat.MESSAGE_SET_ITEM) * 2 +
+           computeUInt32Size(WireFormat.MESSAGE_SET_TYPE_ID, fieldNumber) +
+           computeBytesSize(WireFormat.MESSAGE_SET_MESSAGE, value);
+  }
+
+  // -----------------------------------------------------------------
+
+  /**
+   * Compute the number of bytes that would be needed to encode a
+   * {@code double} field, including tag.
+   */
+  public static int computeDoubleSizeNoTag(final double value) {
+    return LITTLE_ENDIAN_64_SIZE;
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode a
+   * {@code float} field, including tag.
+   */
+  public static int computeFloatSizeNoTag(final float value) {
+    return LITTLE_ENDIAN_32_SIZE;
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode a
+   * {@code uint64} field, including tag.
+   */
+  public static int computeUInt64SizeNoTag(final long value) {
+    return computeRawVarint64Size(value);
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode an
+   * {@code int64} field, including tag.
+   */
+  public static int computeInt64SizeNoTag(final long value) {
+    return computeRawVarint64Size(value);
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode an
+   * {@code int32} field, including tag.
+   */
+  public static int computeInt32SizeNoTag(final int value) {
+    if (value >= 0) {
+      return computeRawVarint32Size(value);
+    } else {
+      // Must sign-extend.
+      return 10;
+    }
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode a
+   * {@code fixed64} field.
+   */
+  public static int computeFixed64SizeNoTag(final long value) {
+    return LITTLE_ENDIAN_64_SIZE;
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode a
+   * {@code fixed32} field.
+   */
+  public static int computeFixed32SizeNoTag(final int value) {
+    return LITTLE_ENDIAN_32_SIZE;
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode a
+   * {@code bool} field.
+   */
+  public static int computeBoolSizeNoTag(final boolean value) {
+    return 1;
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode a
+   * {@code string} field.
+   */
+  public static int computeStringSizeNoTag(final String value) {
+    try {
+      final byte[] bytes = value.getBytes("UTF-8");
+      return computeRawVarint32Size(bytes.length) +
+             bytes.length;
+    } catch (UnsupportedEncodingException e) {
+      throw new RuntimeException("UTF-8 not supported.", e);
+    }
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode a
+   * {@code group} field.
+   */
+  public static int computeGroupSizeNoTag(final MessageLite value) {
+    return value.getSerializedSize();
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode a
+   * {@code group} field represented by an {@code UnknownFieldSet}, including
+   * tag.
+   *
+   * @deprecated UnknownFieldSet now implements MessageLite, so you can just
+   *             call {@link #computeUnknownGroupSizeNoTag}.
+   */
+  @Deprecated
+  public static int computeUnknownGroupSizeNoTag(final MessageLite value) {
+    return computeGroupSizeNoTag(value);
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode an embedded
+   * message field.
+   */
+  public static int computeMessageSizeNoTag(final MessageLite value) {
+    final int size = value.getSerializedSize();
+    return computeRawVarint32Size(size) + size;
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode a
+   * {@code bytes} field.
+   */
+  public static int computeBytesSizeNoTag(final ByteString value) {
+    return computeRawVarint32Size(value.size()) +
+           value.size();
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode a
+   * {@code uint32} field.
+   */
+  public static int computeUInt32SizeNoTag(final int value) {
+    return computeRawVarint32Size(value);
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode an enum field.
+   * Caller is responsible for converting the enum value to its numeric value.
+   */
+  public static int computeEnumSizeNoTag(final int value) {
+    return computeInt32SizeNoTag(value);
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode an
+   * {@code sfixed32} field.
+   */
+  public static int computeSFixed32SizeNoTag(final int value) {
+    return LITTLE_ENDIAN_32_SIZE;
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode an
+   * {@code sfixed64} field.
+   */
+  public static int computeSFixed64SizeNoTag(final long value) {
+    return LITTLE_ENDIAN_64_SIZE;
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode an
+   * {@code sint32} field.
+   */
+  public static int computeSInt32SizeNoTag(final int value) {
+    return computeRawVarint32Size(encodeZigZag32(value));
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode an
+   * {@code sint64} field.
+   */
+  public static int computeSInt64SizeNoTag(final long value) {
+    return computeRawVarint64Size(encodeZigZag64(value));
+  }
+
+  // =================================================================
+
+  /**
+   * Internal helper that writes the current buffer to the output. The
+   * buffer position is reset to its initial value when this returns.
+   */
+  private void refreshBuffer() throws IOException {
+    if (output == null) {
+      // We're writing to a single buffer.
+      throw new OutOfSpaceException();
+    }
+
+    // Since we have an output stream, this is our buffer
+    // and buffer offset == 0
+    output.write(buffer, 0, position);
+    position = 0;
+  }
+
+  /**
+   * Flushes the stream and forces any buffered bytes to be written.  This
+   * does not flush the underlying OutputStream.
+   */
+  public void flush() throws IOException {
+    if (output != null) {
+      refreshBuffer();
+    }
+  }
+
+  /**
+   * If writing to a flat array, return the space left in the array.
+   * Otherwise, throws {@code UnsupportedOperationException}.
+   */
+  public int spaceLeft() {
+    if (output == null) {
+      return limit - position;
+    } else {
+      throw new UnsupportedOperationException(
+        "spaceLeft() can only be called on CodedOutputStreams that are " +
+        "writing to a flat array.");
+    }
+  }
+
+  /**
+   * Verifies that {@link #spaceLeft()} returns zero.  It's common to create
+   * a byte array that is exactly big enough to hold a message, then write to
+   * it with a {@code CodedOutputStream}.  Calling {@code checkNoSpaceLeft()}
+   * after writing verifies that the message was actually as big as expected,
+   * which can help catch bugs.
+   */
+  public void checkNoSpaceLeft() {
+    if (spaceLeft() != 0) {
+      throw new IllegalStateException(
+        "Did not write as much data as expected.");
+    }
+  }
+
+  /**
+   * If you create a CodedOutputStream around a simple flat array, you must
+   * not attempt to write more bytes than the array has space.  Otherwise,
+   * this exception will be thrown.
+   */
+  public static class OutOfSpaceException extends IOException {
+    private static final long serialVersionUID = -6947486886997889499L;
+
+    OutOfSpaceException() {
+      super("CodedOutputStream was writing to a flat byte array and ran " +
+            "out of space.");
+    }
+  }
+
+  /** Write a single byte. */
+  public void writeRawByte(final byte value) throws IOException {
+    if (position == limit) {
+      refreshBuffer();
+    }
+
+    buffer[position++] = value;
+  }
+
+  /** Write a single byte, represented by an integer value. */
+  public void writeRawByte(final int value) throws IOException {
+    writeRawByte((byte) value);
+  }
+
+  /** Write a byte string. */
+  public void writeRawBytes(final ByteString value) throws IOException {
+    writeRawBytes(value, 0, value.size());
+  }
+
+  /** Write an array of bytes. */
+  public void writeRawBytes(final byte[] value) throws IOException {
+    writeRawBytes(value, 0, value.length);
+  }
+
+  /** Write part of an array of bytes. */
+  public void writeRawBytes(final byte[] value, int offset, int length)
+                            throws IOException {
+    if (limit - position >= length) {
+      // We have room in the current buffer.
+      System.arraycopy(value, offset, buffer, position, length);
+      position += length;
+    } else {
+      // Write extends past current buffer.  Fill the rest of this buffer and
+      // flush.
+      final int bytesWritten = limit - position;
+      System.arraycopy(value, offset, buffer, position, bytesWritten);
+      offset += bytesWritten;
+      length -= bytesWritten;
+      position = limit;
+      refreshBuffer();
+
+      // Now deal with the rest.
+      // Since we have an output stream, this is our buffer
+      // and buffer offset == 0
+      if (length <= limit) {
+        // Fits in new buffer.
+        System.arraycopy(value, offset, buffer, 0, length);
+        position = length;
+      } else {
+        // Write is very big.  Let's do it all at once.
+        output.write(value, offset, length);
+      }
+    }
+  }
+
+  /** Write part of a byte string. */
+  public void writeRawBytes(final ByteString value, int offset, int length)
+                            throws IOException {
+    if (limit - position >= length) {
+      // We have room in the current buffer.
+      value.copyTo(buffer, offset, position, length);
+      position += length;
+    } else {
+      // Write extends past current buffer.  Fill the rest of this buffer and
+      // flush.
+      final int bytesWritten = limit - position;
+      value.copyTo(buffer, offset, position, bytesWritten);
+      offset += bytesWritten;
+      length -= bytesWritten;
+      position = limit;
+      refreshBuffer();
+
+      // Now deal with the rest.
+      // Since we have an output stream, this is our buffer
+      // and buffer offset == 0
+      if (length <= limit) {
+        // Fits in new buffer.
+        value.copyTo(buffer, offset, 0, length);
+        position = length;
+      } else {
+        // Write is very big, but we can't do it all at once without allocating
+        // an a copy of the byte array since ByteString does not give us access
+        // to the underlying bytes. Use the InputStream interface on the
+        // ByteString and our buffer to copy between the two.
+        InputStream inputStreamFrom = value.newInput();
+        if (offset != inputStreamFrom.skip(offset)) {
+          throw new IllegalStateException("Skip failed? Should never happen.");
+        }
+        // Use the buffer as the temporary buffer to avoid allocating memory.
+        while (length > 0) {
+          int bytesToRead = Math.min(length, limit);
+          int bytesRead = inputStreamFrom.read(buffer, 0, bytesToRead);
+          if (bytesRead != bytesToRead) {
+            throw new IllegalStateException("Read failed? Should never happen");
+          }
+          output.write(buffer, 0, bytesRead);
+          length -= bytesRead;
+        }
+      }
+    }
+  }
+
+  /** Encode and write a tag. */
+  public void writeTag(final int fieldNumber, final int wireType)
+                       throws IOException {
+    writeRawVarint32(WireFormat.makeTag(fieldNumber, wireType));
+  }
+
+  /** Compute the number of bytes that would be needed to encode a tag. */
+  public static int computeTagSize(final int fieldNumber) {
+    return computeRawVarint32Size(WireFormat.makeTag(fieldNumber, 0));
+  }
+
+  /**
+   * Encode and write a varint.  {@code value} is treated as
+   * unsigned, so it won't be sign-extended if negative.
+   */
+  public void writeRawVarint32(int value) throws IOException {
+    while (true) {
+      if ((value & ~0x7F) == 0) {
+        writeRawByte(value);
+        return;
+      } else {
+        writeRawByte((value & 0x7F) | 0x80);
+        value >>>= 7;
+      }
+    }
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode a varint.
+   * {@code value} is treated as unsigned, so it won't be sign-extended if
+   * negative.
+   */
+  public static int computeRawVarint32Size(final int value) {
+    if ((value & (0xffffffff <<  7)) == 0) return 1;
+    if ((value & (0xffffffff << 14)) == 0) return 2;
+    if ((value & (0xffffffff << 21)) == 0) return 3;
+    if ((value & (0xffffffff << 28)) == 0) return 4;
+    return 5;
+  }
+
+  /** Encode and write a varint. */
+  public void writeRawVarint64(long value) throws IOException {
+    while (true) {
+      if ((value & ~0x7FL) == 0) {
+        writeRawByte((int)value);
+        return;
+      } else {
+        writeRawByte(((int)value & 0x7F) | 0x80);
+        value >>>= 7;
+      }
+    }
+  }
+
+  /** Compute the number of bytes that would be needed to encode a varint. */
+  public static int computeRawVarint64Size(final long value) {
+    if ((value & (0xffffffffffffffffL <<  7)) == 0) return 1;
+    if ((value & (0xffffffffffffffffL << 14)) == 0) return 2;
+    if ((value & (0xffffffffffffffffL << 21)) == 0) return 3;
+    if ((value & (0xffffffffffffffffL << 28)) == 0) return 4;
+    if ((value & (0xffffffffffffffffL << 35)) == 0) return 5;
+    if ((value & (0xffffffffffffffffL << 42)) == 0) return 6;
+    if ((value & (0xffffffffffffffffL << 49)) == 0) return 7;
+    if ((value & (0xffffffffffffffffL << 56)) == 0) return 8;
+    if ((value & (0xffffffffffffffffL << 63)) == 0) return 9;
+    return 10;
+  }
+
+  /** Write a little-endian 32-bit integer. */
+  public void writeRawLittleEndian32(final int value) throws IOException {
+    writeRawByte((value      ) & 0xFF);
+    writeRawByte((value >>  8) & 0xFF);
+    writeRawByte((value >> 16) & 0xFF);
+    writeRawByte((value >> 24) & 0xFF);
+  }
+
+  public static final int LITTLE_ENDIAN_32_SIZE = 4;
+
+  /** Write a little-endian 64-bit integer. */
+  public void writeRawLittleEndian64(final long value) throws IOException {
+    writeRawByte((int)(value      ) & 0xFF);
+    writeRawByte((int)(value >>  8) & 0xFF);
+    writeRawByte((int)(value >> 16) & 0xFF);
+    writeRawByte((int)(value >> 24) & 0xFF);
+    writeRawByte((int)(value >> 32) & 0xFF);
+    writeRawByte((int)(value >> 40) & 0xFF);
+    writeRawByte((int)(value >> 48) & 0xFF);
+    writeRawByte((int)(value >> 56) & 0xFF);
+  }
+
+  public static final int LITTLE_ENDIAN_64_SIZE = 8;
+
+  /**
+   * Encode a ZigZag-encoded 32-bit value.  ZigZag encodes signed integers
+   * into values that can be efficiently encoded with varint.  (Otherwise,
+   * negative values must be sign-extended to 64 bits to be varint encoded,
+   * thus always taking 10 bytes on the wire.)
+   *
+   * @param n A signed 32-bit integer.
+   * @return An unsigned 32-bit integer, stored in a signed int because
+   *         Java has no explicit unsigned support.
+   */
+  public static int encodeZigZag32(final int n) {
+    // Note:  the right-shift must be arithmetic
+    return (n << 1) ^ (n >> 31);
+  }
+
+  /**
+   * Encode a ZigZag-encoded 64-bit value.  ZigZag encodes signed integers
+   * into values that can be efficiently encoded with varint.  (Otherwise,
+   * negative values must be sign-extended to 64 bits to be varint encoded,
+   * thus always taking 10 bytes on the wire.)
+   *
+   * @param n A signed 64-bit integer.
+   * @return An unsigned 64-bit integer, stored in a signed int because
+   *         Java has no explicit unsigned support.
+   */
+  public static long encodeZigZag64(final long n) {
+    // Note:  the right-shift must be arithmetic
+    return (n << 1) ^ (n >> 63);
+  }
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/DescriptorProtos.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/DescriptorProtos.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/DescriptorProtos.java	(revision 15014)
@@ -0,0 +1,17063 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: google/protobuf/descriptor.proto
+
+package com.google.protobuf;
+
+public final class DescriptorProtos {
+  private DescriptorProtos() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+  }
+  public interface FileDescriptorSetOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+    
+    // repeated .google.protobuf.FileDescriptorProto file = 1;
+    java.util.List<com.google.protobuf.DescriptorProtos.FileDescriptorProto> 
+        getFileList();
+    com.google.protobuf.DescriptorProtos.FileDescriptorProto getFile(int index);
+    int getFileCount();
+    java.util.List<? extends com.google.protobuf.DescriptorProtos.FileDescriptorProtoOrBuilder> 
+        getFileOrBuilderList();
+    com.google.protobuf.DescriptorProtos.FileDescriptorProtoOrBuilder getFileOrBuilder(
+        int index);
+  }
+  public static final class FileDescriptorSet extends
+      com.google.protobuf.GeneratedMessage
+      implements FileDescriptorSetOrBuilder {
+    // Use FileDescriptorSet.newBuilder() to construct.
+    private FileDescriptorSet(Builder builder) {
+      super(builder);
+    }
+    private FileDescriptorSet(boolean noInit) {}
+    
+    private static final FileDescriptorSet defaultInstance;
+    public static FileDescriptorSet getDefaultInstance() {
+      return defaultInstance;
+    }
+    
+    public FileDescriptorSet getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+    
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_FileDescriptorSet_descriptor;
+    }
+    
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_FileDescriptorSet_fieldAccessorTable;
+    }
+    
+    // repeated .google.protobuf.FileDescriptorProto file = 1;
+    public static final int FILE_FIELD_NUMBER = 1;
+    private java.util.List<com.google.protobuf.DescriptorProtos.FileDescriptorProto> file_;
+    public java.util.List<com.google.protobuf.DescriptorProtos.FileDescriptorProto> getFileList() {
+      return file_;
+    }
+    public java.util.List<? extends com.google.protobuf.DescriptorProtos.FileDescriptorProtoOrBuilder> 
+        getFileOrBuilderList() {
+      return file_;
+    }
+    public int getFileCount() {
+      return file_.size();
+    }
+    public com.google.protobuf.DescriptorProtos.FileDescriptorProto getFile(int index) {
+      return file_.get(index);
+    }
+    public com.google.protobuf.DescriptorProtos.FileDescriptorProtoOrBuilder getFileOrBuilder(
+        int index) {
+      return file_.get(index);
+    }
+    
+    private void initFields() {
+      file_ = java.util.Collections.emptyList();
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+      
+      for (int i = 0; i < getFileCount(); i++) {
+        if (!getFile(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+    
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      for (int i = 0; i < file_.size(); i++) {
+        output.writeMessage(1, file_.get(i));
+      }
+      getUnknownFields().writeTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+    
+      size = 0;
+      for (int i = 0; i < file_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, file_.get(i));
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+    
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+    
+    public static com.google.protobuf.DescriptorProtos.FileDescriptorSet parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FileDescriptorSet parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FileDescriptorSet parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FileDescriptorSet parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FileDescriptorSet parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FileDescriptorSet parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FileDescriptorSet parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.FileDescriptorSet parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.FileDescriptorSet parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FileDescriptorSet parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(com.google.protobuf.DescriptorProtos.FileDescriptorSet prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+    
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements com.google.protobuf.DescriptorProtos.FileDescriptorSetOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_FileDescriptorSet_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_FileDescriptorSet_fieldAccessorTable;
+      }
+      
+      // Construct using com.google.protobuf.DescriptorProtos.FileDescriptorSet.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+      
+      private Builder(BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          getFileFieldBuilder();
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+      
+      public Builder clear() {
+        super.clear();
+        if (fileBuilder_ == null) {
+          file_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+        } else {
+          fileBuilder_.clear();
+        }
+        return this;
+      }
+      
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+      
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return com.google.protobuf.DescriptorProtos.FileDescriptorSet.getDescriptor();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.FileDescriptorSet getDefaultInstanceForType() {
+        return com.google.protobuf.DescriptorProtos.FileDescriptorSet.getDefaultInstance();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.FileDescriptorSet build() {
+        com.google.protobuf.DescriptorProtos.FileDescriptorSet result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+      
+      private com.google.protobuf.DescriptorProtos.FileDescriptorSet buildParsed()
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.DescriptorProtos.FileDescriptorSet result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(
+            result).asInvalidProtocolBufferException();
+        }
+        return result;
+      }
+      
+      public com.google.protobuf.DescriptorProtos.FileDescriptorSet buildPartial() {
+        com.google.protobuf.DescriptorProtos.FileDescriptorSet result = new com.google.protobuf.DescriptorProtos.FileDescriptorSet(this);
+        int from_bitField0_ = bitField0_;
+        if (fileBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) == 0x00000001)) {
+            file_ = java.util.Collections.unmodifiableList(file_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.file_ = file_;
+        } else {
+          result.file_ = fileBuilder_.build();
+        }
+        onBuilt();
+        return result;
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof com.google.protobuf.DescriptorProtos.FileDescriptorSet) {
+          return mergeFrom((com.google.protobuf.DescriptorProtos.FileDescriptorSet)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.DescriptorProtos.FileDescriptorSet other) {
+        if (other == com.google.protobuf.DescriptorProtos.FileDescriptorSet.getDefaultInstance()) return this;
+        if (fileBuilder_ == null) {
+          if (!other.file_.isEmpty()) {
+            if (file_.isEmpty()) {
+              file_ = other.file_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureFileIsMutable();
+              file_.addAll(other.file_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.file_.isEmpty()) {
+            if (fileBuilder_.isEmpty()) {
+              fileBuilder_.dispose();
+              fileBuilder_ = null;
+              file_ = other.file_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              fileBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getFileFieldBuilder() : null;
+            } else {
+              fileBuilder_.addAllMessages(other.file_);
+            }
+          }
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+      
+      public final boolean isInitialized() {
+        for (int i = 0; i < getFileCount(); i++) {
+          if (!getFile(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        return true;
+      }
+      
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder(
+            this.getUnknownFields());
+        while (true) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              this.setUnknownFields(unknownFields.build());
+              onChanged();
+              return this;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              }
+              break;
+            }
+            case 10: {
+              com.google.protobuf.DescriptorProtos.FileDescriptorProto.Builder subBuilder = com.google.protobuf.DescriptorProtos.FileDescriptorProto.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addFile(subBuilder.buildPartial());
+              break;
+            }
+          }
+        }
+      }
+      
+      private int bitField0_;
+      
+      // repeated .google.protobuf.FileDescriptorProto file = 1;
+      private java.util.List<com.google.protobuf.DescriptorProtos.FileDescriptorProto> file_ =
+        java.util.Collections.emptyList();
+      private void ensureFileIsMutable() {
+        if (!((bitField0_ & 0x00000001) == 0x00000001)) {
+          file_ = new java.util.ArrayList<com.google.protobuf.DescriptorProtos.FileDescriptorProto>(file_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.FileDescriptorProto, com.google.protobuf.DescriptorProtos.FileDescriptorProto.Builder, com.google.protobuf.DescriptorProtos.FileDescriptorProtoOrBuilder> fileBuilder_;
+      
+      public java.util.List<com.google.protobuf.DescriptorProtos.FileDescriptorProto> getFileList() {
+        if (fileBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(file_);
+        } else {
+          return fileBuilder_.getMessageList();
+        }
+      }
+      public int getFileCount() {
+        if (fileBuilder_ == null) {
+          return file_.size();
+        } else {
+          return fileBuilder_.getCount();
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.FileDescriptorProto getFile(int index) {
+        if (fileBuilder_ == null) {
+          return file_.get(index);
+        } else {
+          return fileBuilder_.getMessage(index);
+        }
+      }
+      public Builder setFile(
+          int index, com.google.protobuf.DescriptorProtos.FileDescriptorProto value) {
+        if (fileBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureFileIsMutable();
+          file_.set(index, value);
+          onChanged();
+        } else {
+          fileBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setFile(
+          int index, com.google.protobuf.DescriptorProtos.FileDescriptorProto.Builder builderForValue) {
+        if (fileBuilder_ == null) {
+          ensureFileIsMutable();
+          file_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          fileBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addFile(com.google.protobuf.DescriptorProtos.FileDescriptorProto value) {
+        if (fileBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureFileIsMutable();
+          file_.add(value);
+          onChanged();
+        } else {
+          fileBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addFile(
+          int index, com.google.protobuf.DescriptorProtos.FileDescriptorProto value) {
+        if (fileBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureFileIsMutable();
+          file_.add(index, value);
+          onChanged();
+        } else {
+          fileBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addFile(
+          com.google.protobuf.DescriptorProtos.FileDescriptorProto.Builder builderForValue) {
+        if (fileBuilder_ == null) {
+          ensureFileIsMutable();
+          file_.add(builderForValue.build());
+          onChanged();
+        } else {
+          fileBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addFile(
+          int index, com.google.protobuf.DescriptorProtos.FileDescriptorProto.Builder builderForValue) {
+        if (fileBuilder_ == null) {
+          ensureFileIsMutable();
+          file_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          fileBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllFile(
+          java.lang.Iterable<? extends com.google.protobuf.DescriptorProtos.FileDescriptorProto> values) {
+        if (fileBuilder_ == null) {
+          ensureFileIsMutable();
+          super.addAll(values, file_);
+          onChanged();
+        } else {
+          fileBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearFile() {
+        if (fileBuilder_ == null) {
+          file_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
+        } else {
+          fileBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeFile(int index) {
+        if (fileBuilder_ == null) {
+          ensureFileIsMutable();
+          file_.remove(index);
+          onChanged();
+        } else {
+          fileBuilder_.remove(index);
+        }
+        return this;
+      }
+      public com.google.protobuf.DescriptorProtos.FileDescriptorProto.Builder getFileBuilder(
+          int index) {
+        return getFileFieldBuilder().getBuilder(index);
+      }
+      public com.google.protobuf.DescriptorProtos.FileDescriptorProtoOrBuilder getFileOrBuilder(
+          int index) {
+        if (fileBuilder_ == null) {
+          return file_.get(index);  } else {
+          return fileBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends com.google.protobuf.DescriptorProtos.FileDescriptorProtoOrBuilder> 
+           getFileOrBuilderList() {
+        if (fileBuilder_ != null) {
+          return fileBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(file_);
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.FileDescriptorProto.Builder addFileBuilder() {
+        return getFileFieldBuilder().addBuilder(
+            com.google.protobuf.DescriptorProtos.FileDescriptorProto.getDefaultInstance());
+      }
+      public com.google.protobuf.DescriptorProtos.FileDescriptorProto.Builder addFileBuilder(
+          int index) {
+        return getFileFieldBuilder().addBuilder(
+            index, com.google.protobuf.DescriptorProtos.FileDescriptorProto.getDefaultInstance());
+      }
+      public java.util.List<com.google.protobuf.DescriptorProtos.FileDescriptorProto.Builder> 
+           getFileBuilderList() {
+        return getFileFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.FileDescriptorProto, com.google.protobuf.DescriptorProtos.FileDescriptorProto.Builder, com.google.protobuf.DescriptorProtos.FileDescriptorProtoOrBuilder> 
+          getFileFieldBuilder() {
+        if (fileBuilder_ == null) {
+          fileBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              com.google.protobuf.DescriptorProtos.FileDescriptorProto, com.google.protobuf.DescriptorProtos.FileDescriptorProto.Builder, com.google.protobuf.DescriptorProtos.FileDescriptorProtoOrBuilder>(
+                  file_,
+                  ((bitField0_ & 0x00000001) == 0x00000001),
+                  getParentForChildren(),
+                  isClean());
+          file_ = null;
+        }
+        return fileBuilder_;
+      }
+      
+      // @@protoc_insertion_point(builder_scope:google.protobuf.FileDescriptorSet)
+    }
+    
+    static {
+      defaultInstance = new FileDescriptorSet(true);
+      defaultInstance.initFields();
+    }
+    
+    // @@protoc_insertion_point(class_scope:google.protobuf.FileDescriptorSet)
+  }
+  
+  public interface FileDescriptorProtoOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+    
+    // optional string name = 1;
+    boolean hasName();
+    String getName();
+    
+    // optional string package = 2;
+    boolean hasPackage();
+    String getPackage();
+    
+    // repeated string dependency = 3;
+    java.util.List<String> getDependencyList();
+    int getDependencyCount();
+    String getDependency(int index);
+    
+    // repeated .google.protobuf.DescriptorProto message_type = 4;
+    java.util.List<com.google.protobuf.DescriptorProtos.DescriptorProto> 
+        getMessageTypeList();
+    com.google.protobuf.DescriptorProtos.DescriptorProto getMessageType(int index);
+    int getMessageTypeCount();
+    java.util.List<? extends com.google.protobuf.DescriptorProtos.DescriptorProtoOrBuilder> 
+        getMessageTypeOrBuilderList();
+    com.google.protobuf.DescriptorProtos.DescriptorProtoOrBuilder getMessageTypeOrBuilder(
+        int index);
+    
+    // repeated .google.protobuf.EnumDescriptorProto enum_type = 5;
+    java.util.List<com.google.protobuf.DescriptorProtos.EnumDescriptorProto> 
+        getEnumTypeList();
+    com.google.protobuf.DescriptorProtos.EnumDescriptorProto getEnumType(int index);
+    int getEnumTypeCount();
+    java.util.List<? extends com.google.protobuf.DescriptorProtos.EnumDescriptorProtoOrBuilder> 
+        getEnumTypeOrBuilderList();
+    com.google.protobuf.DescriptorProtos.EnumDescriptorProtoOrBuilder getEnumTypeOrBuilder(
+        int index);
+    
+    // repeated .google.protobuf.ServiceDescriptorProto service = 6;
+    java.util.List<com.google.protobuf.DescriptorProtos.ServiceDescriptorProto> 
+        getServiceList();
+    com.google.protobuf.DescriptorProtos.ServiceDescriptorProto getService(int index);
+    int getServiceCount();
+    java.util.List<? extends com.google.protobuf.DescriptorProtos.ServiceDescriptorProtoOrBuilder> 
+        getServiceOrBuilderList();
+    com.google.protobuf.DescriptorProtos.ServiceDescriptorProtoOrBuilder getServiceOrBuilder(
+        int index);
+    
+    // repeated .google.protobuf.FieldDescriptorProto extension = 7;
+    java.util.List<com.google.protobuf.DescriptorProtos.FieldDescriptorProto> 
+        getExtensionList();
+    com.google.protobuf.DescriptorProtos.FieldDescriptorProto getExtension(int index);
+    int getExtensionCount();
+    java.util.List<? extends com.google.protobuf.DescriptorProtos.FieldDescriptorProtoOrBuilder> 
+        getExtensionOrBuilderList();
+    com.google.protobuf.DescriptorProtos.FieldDescriptorProtoOrBuilder getExtensionOrBuilder(
+        int index);
+    
+    // optional .google.protobuf.FileOptions options = 8;
+    boolean hasOptions();
+    com.google.protobuf.DescriptorProtos.FileOptions getOptions();
+    com.google.protobuf.DescriptorProtos.FileOptionsOrBuilder getOptionsOrBuilder();
+    
+    // optional .google.protobuf.SourceCodeInfo source_code_info = 9;
+    boolean hasSourceCodeInfo();
+    com.google.protobuf.DescriptorProtos.SourceCodeInfo getSourceCodeInfo();
+    com.google.protobuf.DescriptorProtos.SourceCodeInfoOrBuilder getSourceCodeInfoOrBuilder();
+  }
+  public static final class FileDescriptorProto extends
+      com.google.protobuf.GeneratedMessage
+      implements FileDescriptorProtoOrBuilder {
+    // Use FileDescriptorProto.newBuilder() to construct.
+    private FileDescriptorProto(Builder builder) {
+      super(builder);
+    }
+    private FileDescriptorProto(boolean noInit) {}
+    
+    private static final FileDescriptorProto defaultInstance;
+    public static FileDescriptorProto getDefaultInstance() {
+      return defaultInstance;
+    }
+    
+    public FileDescriptorProto getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+    
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_FileDescriptorProto_descriptor;
+    }
+    
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_FileDescriptorProto_fieldAccessorTable;
+    }
+    
+    private int bitField0_;
+    // optional string name = 1;
+    public static final int NAME_FIELD_NUMBER = 1;
+    private java.lang.Object name_;
+    public boolean hasName() {
+      return ((bitField0_ & 0x00000001) == 0x00000001);
+    }
+    public String getName() {
+      java.lang.Object ref = name_;
+      if (ref instanceof String) {
+        return (String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        String s = bs.toStringUtf8();
+        if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+          name_ = s;
+        }
+        return s;
+      }
+    }
+    private com.google.protobuf.ByteString getNameBytes() {
+      java.lang.Object ref = name_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+        name_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    
+    // optional string package = 2;
+    public static final int PACKAGE_FIELD_NUMBER = 2;
+    private java.lang.Object package_;
+    public boolean hasPackage() {
+      return ((bitField0_ & 0x00000002) == 0x00000002);
+    }
+    public String getPackage() {
+      java.lang.Object ref = package_;
+      if (ref instanceof String) {
+        return (String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        String s = bs.toStringUtf8();
+        if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+          package_ = s;
+        }
+        return s;
+      }
+    }
+    private com.google.protobuf.ByteString getPackageBytes() {
+      java.lang.Object ref = package_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+        package_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    
+    // repeated string dependency = 3;
+    public static final int DEPENDENCY_FIELD_NUMBER = 3;
+    private com.google.protobuf.LazyStringList dependency_;
+    public java.util.List<String>
+        getDependencyList() {
+      return dependency_;
+    }
+    public int getDependencyCount() {
+      return dependency_.size();
+    }
+    public String getDependency(int index) {
+      return dependency_.get(index);
+    }
+    
+    // repeated .google.protobuf.DescriptorProto message_type = 4;
+    public static final int MESSAGE_TYPE_FIELD_NUMBER = 4;
+    private java.util.List<com.google.protobuf.DescriptorProtos.DescriptorProto> messageType_;
+    public java.util.List<com.google.protobuf.DescriptorProtos.DescriptorProto> getMessageTypeList() {
+      return messageType_;
+    }
+    public java.util.List<? extends com.google.protobuf.DescriptorProtos.DescriptorProtoOrBuilder> 
+        getMessageTypeOrBuilderList() {
+      return messageType_;
+    }
+    public int getMessageTypeCount() {
+      return messageType_.size();
+    }
+    public com.google.protobuf.DescriptorProtos.DescriptorProto getMessageType(int index) {
+      return messageType_.get(index);
+    }
+    public com.google.protobuf.DescriptorProtos.DescriptorProtoOrBuilder getMessageTypeOrBuilder(
+        int index) {
+      return messageType_.get(index);
+    }
+    
+    // repeated .google.protobuf.EnumDescriptorProto enum_type = 5;
+    public static final int ENUM_TYPE_FIELD_NUMBER = 5;
+    private java.util.List<com.google.protobuf.DescriptorProtos.EnumDescriptorProto> enumType_;
+    public java.util.List<com.google.protobuf.DescriptorProtos.EnumDescriptorProto> getEnumTypeList() {
+      return enumType_;
+    }
+    public java.util.List<? extends com.google.protobuf.DescriptorProtos.EnumDescriptorProtoOrBuilder> 
+        getEnumTypeOrBuilderList() {
+      return enumType_;
+    }
+    public int getEnumTypeCount() {
+      return enumType_.size();
+    }
+    public com.google.protobuf.DescriptorProtos.EnumDescriptorProto getEnumType(int index) {
+      return enumType_.get(index);
+    }
+    public com.google.protobuf.DescriptorProtos.EnumDescriptorProtoOrBuilder getEnumTypeOrBuilder(
+        int index) {
+      return enumType_.get(index);
+    }
+    
+    // repeated .google.protobuf.ServiceDescriptorProto service = 6;
+    public static final int SERVICE_FIELD_NUMBER = 6;
+    private java.util.List<com.google.protobuf.DescriptorProtos.ServiceDescriptorProto> service_;
+    public java.util.List<com.google.protobuf.DescriptorProtos.ServiceDescriptorProto> getServiceList() {
+      return service_;
+    }
+    public java.util.List<? extends com.google.protobuf.DescriptorProtos.ServiceDescriptorProtoOrBuilder> 
+        getServiceOrBuilderList() {
+      return service_;
+    }
+    public int getServiceCount() {
+      return service_.size();
+    }
+    public com.google.protobuf.DescriptorProtos.ServiceDescriptorProto getService(int index) {
+      return service_.get(index);
+    }
+    public com.google.protobuf.DescriptorProtos.ServiceDescriptorProtoOrBuilder getServiceOrBuilder(
+        int index) {
+      return service_.get(index);
+    }
+    
+    // repeated .google.protobuf.FieldDescriptorProto extension = 7;
+    public static final int EXTENSION_FIELD_NUMBER = 7;
+    private java.util.List<com.google.protobuf.DescriptorProtos.FieldDescriptorProto> extension_;
+    public java.util.List<com.google.protobuf.DescriptorProtos.FieldDescriptorProto> getExtensionList() {
+      return extension_;
+    }
+    public java.util.List<? extends com.google.protobuf.DescriptorProtos.FieldDescriptorProtoOrBuilder> 
+        getExtensionOrBuilderList() {
+      return extension_;
+    }
+    public int getExtensionCount() {
+      return extension_.size();
+    }
+    public com.google.protobuf.DescriptorProtos.FieldDescriptorProto getExtension(int index) {
+      return extension_.get(index);
+    }
+    public com.google.protobuf.DescriptorProtos.FieldDescriptorProtoOrBuilder getExtensionOrBuilder(
+        int index) {
+      return extension_.get(index);
+    }
+    
+    // optional .google.protobuf.FileOptions options = 8;
+    public static final int OPTIONS_FIELD_NUMBER = 8;
+    private com.google.protobuf.DescriptorProtos.FileOptions options_;
+    public boolean hasOptions() {
+      return ((bitField0_ & 0x00000004) == 0x00000004);
+    }
+    public com.google.protobuf.DescriptorProtos.FileOptions getOptions() {
+      return options_;
+    }
+    public com.google.protobuf.DescriptorProtos.FileOptionsOrBuilder getOptionsOrBuilder() {
+      return options_;
+    }
+    
+    // optional .google.protobuf.SourceCodeInfo source_code_info = 9;
+    public static final int SOURCE_CODE_INFO_FIELD_NUMBER = 9;
+    private com.google.protobuf.DescriptorProtos.SourceCodeInfo sourceCodeInfo_;
+    public boolean hasSourceCodeInfo() {
+      return ((bitField0_ & 0x00000008) == 0x00000008);
+    }
+    public com.google.protobuf.DescriptorProtos.SourceCodeInfo getSourceCodeInfo() {
+      return sourceCodeInfo_;
+    }
+    public com.google.protobuf.DescriptorProtos.SourceCodeInfoOrBuilder getSourceCodeInfoOrBuilder() {
+      return sourceCodeInfo_;
+    }
+    
+    private void initFields() {
+      name_ = "";
+      package_ = "";
+      dependency_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+      messageType_ = java.util.Collections.emptyList();
+      enumType_ = java.util.Collections.emptyList();
+      service_ = java.util.Collections.emptyList();
+      extension_ = java.util.Collections.emptyList();
+      options_ = com.google.protobuf.DescriptorProtos.FileOptions.getDefaultInstance();
+      sourceCodeInfo_ = com.google.protobuf.DescriptorProtos.SourceCodeInfo.getDefaultInstance();
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+      
+      for (int i = 0; i < getMessageTypeCount(); i++) {
+        if (!getMessageType(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      for (int i = 0; i < getEnumTypeCount(); i++) {
+        if (!getEnumType(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      for (int i = 0; i < getServiceCount(); i++) {
+        if (!getService(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      for (int i = 0; i < getExtensionCount(); i++) {
+        if (!getExtension(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      if (hasOptions()) {
+        if (!getOptions().isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+    
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        output.writeBytes(1, getNameBytes());
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        output.writeBytes(2, getPackageBytes());
+      }
+      for (int i = 0; i < dependency_.size(); i++) {
+        output.writeBytes(3, dependency_.getByteString(i));
+      }
+      for (int i = 0; i < messageType_.size(); i++) {
+        output.writeMessage(4, messageType_.get(i));
+      }
+      for (int i = 0; i < enumType_.size(); i++) {
+        output.writeMessage(5, enumType_.get(i));
+      }
+      for (int i = 0; i < service_.size(); i++) {
+        output.writeMessage(6, service_.get(i));
+      }
+      for (int i = 0; i < extension_.size(); i++) {
+        output.writeMessage(7, extension_.get(i));
+      }
+      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+        output.writeMessage(8, options_);
+      }
+      if (((bitField0_ & 0x00000008) == 0x00000008)) {
+        output.writeMessage(9, sourceCodeInfo_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+    
+      size = 0;
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(1, getNameBytes());
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(2, getPackageBytes());
+      }
+      {
+        int dataSize = 0;
+        for (int i = 0; i < dependency_.size(); i++) {
+          dataSize += com.google.protobuf.CodedOutputStream
+            .computeBytesSizeNoTag(dependency_.getByteString(i));
+        }
+        size += dataSize;
+        size += 1 * getDependencyList().size();
+      }
+      for (int i = 0; i < messageType_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(4, messageType_.get(i));
+      }
+      for (int i = 0; i < enumType_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(5, enumType_.get(i));
+      }
+      for (int i = 0; i < service_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(6, service_.get(i));
+      }
+      for (int i = 0; i < extension_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(7, extension_.get(i));
+      }
+      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(8, options_);
+      }
+      if (((bitField0_ & 0x00000008) == 0x00000008)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(9, sourceCodeInfo_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+    
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+    
+    public static com.google.protobuf.DescriptorProtos.FileDescriptorProto parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FileDescriptorProto parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FileDescriptorProto parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FileDescriptorProto parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FileDescriptorProto parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FileDescriptorProto parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FileDescriptorProto parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.FileDescriptorProto parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.FileDescriptorProto parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FileDescriptorProto parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(com.google.protobuf.DescriptorProtos.FileDescriptorProto prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+    
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements com.google.protobuf.DescriptorProtos.FileDescriptorProtoOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_FileDescriptorProto_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_FileDescriptorProto_fieldAccessorTable;
+      }
+      
+      // Construct using com.google.protobuf.DescriptorProtos.FileDescriptorProto.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+      
+      private Builder(BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          getMessageTypeFieldBuilder();
+          getEnumTypeFieldBuilder();
+          getServiceFieldBuilder();
+          getExtensionFieldBuilder();
+          getOptionsFieldBuilder();
+          getSourceCodeInfoFieldBuilder();
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+      
+      public Builder clear() {
+        super.clear();
+        name_ = "";
+        bitField0_ = (bitField0_ & ~0x00000001);
+        package_ = "";
+        bitField0_ = (bitField0_ & ~0x00000002);
+        dependency_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+        bitField0_ = (bitField0_ & ~0x00000004);
+        if (messageTypeBuilder_ == null) {
+          messageType_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000008);
+        } else {
+          messageTypeBuilder_.clear();
+        }
+        if (enumTypeBuilder_ == null) {
+          enumType_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000010);
+        } else {
+          enumTypeBuilder_.clear();
+        }
+        if (serviceBuilder_ == null) {
+          service_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000020);
+        } else {
+          serviceBuilder_.clear();
+        }
+        if (extensionBuilder_ == null) {
+          extension_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000040);
+        } else {
+          extensionBuilder_.clear();
+        }
+        if (optionsBuilder_ == null) {
+          options_ = com.google.protobuf.DescriptorProtos.FileOptions.getDefaultInstance();
+        } else {
+          optionsBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000080);
+        if (sourceCodeInfoBuilder_ == null) {
+          sourceCodeInfo_ = com.google.protobuf.DescriptorProtos.SourceCodeInfo.getDefaultInstance();
+        } else {
+          sourceCodeInfoBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000100);
+        return this;
+      }
+      
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+      
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return com.google.protobuf.DescriptorProtos.FileDescriptorProto.getDescriptor();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.FileDescriptorProto getDefaultInstanceForType() {
+        return com.google.protobuf.DescriptorProtos.FileDescriptorProto.getDefaultInstance();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.FileDescriptorProto build() {
+        com.google.protobuf.DescriptorProtos.FileDescriptorProto result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+      
+      private com.google.protobuf.DescriptorProtos.FileDescriptorProto buildParsed()
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.DescriptorProtos.FileDescriptorProto result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(
+            result).asInvalidProtocolBufferException();
+        }
+        return result;
+      }
+      
+      public com.google.protobuf.DescriptorProtos.FileDescriptorProto buildPartial() {
+        com.google.protobuf.DescriptorProtos.FileDescriptorProto result = new com.google.protobuf.DescriptorProtos.FileDescriptorProto(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+          to_bitField0_ |= 0x00000001;
+        }
+        result.name_ = name_;
+        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+          to_bitField0_ |= 0x00000002;
+        }
+        result.package_ = package_;
+        if (((bitField0_ & 0x00000004) == 0x00000004)) {
+          dependency_ = new com.google.protobuf.UnmodifiableLazyStringList(
+              dependency_);
+          bitField0_ = (bitField0_ & ~0x00000004);
+        }
+        result.dependency_ = dependency_;
+        if (messageTypeBuilder_ == null) {
+          if (((bitField0_ & 0x00000008) == 0x00000008)) {
+            messageType_ = java.util.Collections.unmodifiableList(messageType_);
+            bitField0_ = (bitField0_ & ~0x00000008);
+          }
+          result.messageType_ = messageType_;
+        } else {
+          result.messageType_ = messageTypeBuilder_.build();
+        }
+        if (enumTypeBuilder_ == null) {
+          if (((bitField0_ & 0x00000010) == 0x00000010)) {
+            enumType_ = java.util.Collections.unmodifiableList(enumType_);
+            bitField0_ = (bitField0_ & ~0x00000010);
+          }
+          result.enumType_ = enumType_;
+        } else {
+          result.enumType_ = enumTypeBuilder_.build();
+        }
+        if (serviceBuilder_ == null) {
+          if (((bitField0_ & 0x00000020) == 0x00000020)) {
+            service_ = java.util.Collections.unmodifiableList(service_);
+            bitField0_ = (bitField0_ & ~0x00000020);
+          }
+          result.service_ = service_;
+        } else {
+          result.service_ = serviceBuilder_.build();
+        }
+        if (extensionBuilder_ == null) {
+          if (((bitField0_ & 0x00000040) == 0x00000040)) {
+            extension_ = java.util.Collections.unmodifiableList(extension_);
+            bitField0_ = (bitField0_ & ~0x00000040);
+          }
+          result.extension_ = extension_;
+        } else {
+          result.extension_ = extensionBuilder_.build();
+        }
+        if (((from_bitField0_ & 0x00000080) == 0x00000080)) {
+          to_bitField0_ |= 0x00000004;
+        }
+        if (optionsBuilder_ == null) {
+          result.options_ = options_;
+        } else {
+          result.options_ = optionsBuilder_.build();
+        }
+        if (((from_bitField0_ & 0x00000100) == 0x00000100)) {
+          to_bitField0_ |= 0x00000008;
+        }
+        if (sourceCodeInfoBuilder_ == null) {
+          result.sourceCodeInfo_ = sourceCodeInfo_;
+        } else {
+          result.sourceCodeInfo_ = sourceCodeInfoBuilder_.build();
+        }
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof com.google.protobuf.DescriptorProtos.FileDescriptorProto) {
+          return mergeFrom((com.google.protobuf.DescriptorProtos.FileDescriptorProto)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.DescriptorProtos.FileDescriptorProto other) {
+        if (other == com.google.protobuf.DescriptorProtos.FileDescriptorProto.getDefaultInstance()) return this;
+        if (other.hasName()) {
+          setName(other.getName());
+        }
+        if (other.hasPackage()) {
+          setPackage(other.getPackage());
+        }
+        if (!other.dependency_.isEmpty()) {
+          if (dependency_.isEmpty()) {
+            dependency_ = other.dependency_;
+            bitField0_ = (bitField0_ & ~0x00000004);
+          } else {
+            ensureDependencyIsMutable();
+            dependency_.addAll(other.dependency_);
+          }
+          onChanged();
+        }
+        if (messageTypeBuilder_ == null) {
+          if (!other.messageType_.isEmpty()) {
+            if (messageType_.isEmpty()) {
+              messageType_ = other.messageType_;
+              bitField0_ = (bitField0_ & ~0x00000008);
+            } else {
+              ensureMessageTypeIsMutable();
+              messageType_.addAll(other.messageType_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.messageType_.isEmpty()) {
+            if (messageTypeBuilder_.isEmpty()) {
+              messageTypeBuilder_.dispose();
+              messageTypeBuilder_ = null;
+              messageType_ = other.messageType_;
+              bitField0_ = (bitField0_ & ~0x00000008);
+              messageTypeBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getMessageTypeFieldBuilder() : null;
+            } else {
+              messageTypeBuilder_.addAllMessages(other.messageType_);
+            }
+          }
+        }
+        if (enumTypeBuilder_ == null) {
+          if (!other.enumType_.isEmpty()) {
+            if (enumType_.isEmpty()) {
+              enumType_ = other.enumType_;
+              bitField0_ = (bitField0_ & ~0x00000010);
+            } else {
+              ensureEnumTypeIsMutable();
+              enumType_.addAll(other.enumType_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.enumType_.isEmpty()) {
+            if (enumTypeBuilder_.isEmpty()) {
+              enumTypeBuilder_.dispose();
+              enumTypeBuilder_ = null;
+              enumType_ = other.enumType_;
+              bitField0_ = (bitField0_ & ~0x00000010);
+              enumTypeBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getEnumTypeFieldBuilder() : null;
+            } else {
+              enumTypeBuilder_.addAllMessages(other.enumType_);
+            }
+          }
+        }
+        if (serviceBuilder_ == null) {
+          if (!other.service_.isEmpty()) {
+            if (service_.isEmpty()) {
+              service_ = other.service_;
+              bitField0_ = (bitField0_ & ~0x00000020);
+            } else {
+              ensureServiceIsMutable();
+              service_.addAll(other.service_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.service_.isEmpty()) {
+            if (serviceBuilder_.isEmpty()) {
+              serviceBuilder_.dispose();
+              serviceBuilder_ = null;
+              service_ = other.service_;
+              bitField0_ = (bitField0_ & ~0x00000020);
+              serviceBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getServiceFieldBuilder() : null;
+            } else {
+              serviceBuilder_.addAllMessages(other.service_);
+            }
+          }
+        }
+        if (extensionBuilder_ == null) {
+          if (!other.extension_.isEmpty()) {
+            if (extension_.isEmpty()) {
+              extension_ = other.extension_;
+              bitField0_ = (bitField0_ & ~0x00000040);
+            } else {
+              ensureExtensionIsMutable();
+              extension_.addAll(other.extension_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.extension_.isEmpty()) {
+            if (extensionBuilder_.isEmpty()) {
+              extensionBuilder_.dispose();
+              extensionBuilder_ = null;
+              extension_ = other.extension_;
+              bitField0_ = (bitField0_ & ~0x00000040);
+              extensionBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getExtensionFieldBuilder() : null;
+            } else {
+              extensionBuilder_.addAllMessages(other.extension_);
+            }
+          }
+        }
+        if (other.hasOptions()) {
+          mergeOptions(other.getOptions());
+        }
+        if (other.hasSourceCodeInfo()) {
+          mergeSourceCodeInfo(other.getSourceCodeInfo());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+      
+      public final boolean isInitialized() {
+        for (int i = 0; i < getMessageTypeCount(); i++) {
+          if (!getMessageType(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        for (int i = 0; i < getEnumTypeCount(); i++) {
+          if (!getEnumType(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        for (int i = 0; i < getServiceCount(); i++) {
+          if (!getService(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        for (int i = 0; i < getExtensionCount(); i++) {
+          if (!getExtension(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        if (hasOptions()) {
+          if (!getOptions().isInitialized()) {
+            
+            return false;
+          }
+        }
+        return true;
+      }
+      
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder(
+            this.getUnknownFields());
+        while (true) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              this.setUnknownFields(unknownFields.build());
+              onChanged();
+              return this;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              }
+              break;
+            }
+            case 10: {
+              bitField0_ |= 0x00000001;
+              name_ = input.readBytes();
+              break;
+            }
+            case 18: {
+              bitField0_ |= 0x00000002;
+              package_ = input.readBytes();
+              break;
+            }
+            case 26: {
+              ensureDependencyIsMutable();
+              dependency_.add(input.readBytes());
+              break;
+            }
+            case 34: {
+              com.google.protobuf.DescriptorProtos.DescriptorProto.Builder subBuilder = com.google.protobuf.DescriptorProtos.DescriptorProto.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addMessageType(subBuilder.buildPartial());
+              break;
+            }
+            case 42: {
+              com.google.protobuf.DescriptorProtos.EnumDescriptorProto.Builder subBuilder = com.google.protobuf.DescriptorProtos.EnumDescriptorProto.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addEnumType(subBuilder.buildPartial());
+              break;
+            }
+            case 50: {
+              com.google.protobuf.DescriptorProtos.ServiceDescriptorProto.Builder subBuilder = com.google.protobuf.DescriptorProtos.ServiceDescriptorProto.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addService(subBuilder.buildPartial());
+              break;
+            }
+            case 58: {
+              com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder subBuilder = com.google.protobuf.DescriptorProtos.FieldDescriptorProto.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addExtension(subBuilder.buildPartial());
+              break;
+            }
+            case 66: {
+              com.google.protobuf.DescriptorProtos.FileOptions.Builder subBuilder = com.google.protobuf.DescriptorProtos.FileOptions.newBuilder();
+              if (hasOptions()) {
+                subBuilder.mergeFrom(getOptions());
+              }
+              input.readMessage(subBuilder, extensionRegistry);
+              setOptions(subBuilder.buildPartial());
+              break;
+            }
+            case 74: {
+              com.google.protobuf.DescriptorProtos.SourceCodeInfo.Builder subBuilder = com.google.protobuf.DescriptorProtos.SourceCodeInfo.newBuilder();
+              if (hasSourceCodeInfo()) {
+                subBuilder.mergeFrom(getSourceCodeInfo());
+              }
+              input.readMessage(subBuilder, extensionRegistry);
+              setSourceCodeInfo(subBuilder.buildPartial());
+              break;
+            }
+          }
+        }
+      }
+      
+      private int bitField0_;
+      
+      // optional string name = 1;
+      private java.lang.Object name_ = "";
+      public boolean hasName() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      public String getName() {
+        java.lang.Object ref = name_;
+        if (!(ref instanceof String)) {
+          String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+          name_ = s;
+          return s;
+        } else {
+          return (String) ref;
+        }
+      }
+      public Builder setName(String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+        name_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearName() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        name_ = getDefaultInstance().getName();
+        onChanged();
+        return this;
+      }
+      void setName(com.google.protobuf.ByteString value) {
+        bitField0_ |= 0x00000001;
+        name_ = value;
+        onChanged();
+      }
+      
+      // optional string package = 2;
+      private java.lang.Object package_ = "";
+      public boolean hasPackage() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      public String getPackage() {
+        java.lang.Object ref = package_;
+        if (!(ref instanceof String)) {
+          String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+          package_ = s;
+          return s;
+        } else {
+          return (String) ref;
+        }
+      }
+      public Builder setPackage(String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000002;
+        package_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearPackage() {
+        bitField0_ = (bitField0_ & ~0x00000002);
+        package_ = getDefaultInstance().getPackage();
+        onChanged();
+        return this;
+      }
+      void setPackage(com.google.protobuf.ByteString value) {
+        bitField0_ |= 0x00000002;
+        package_ = value;
+        onChanged();
+      }
+      
+      // repeated string dependency = 3;
+      private com.google.protobuf.LazyStringList dependency_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+      private void ensureDependencyIsMutable() {
+        if (!((bitField0_ & 0x00000004) == 0x00000004)) {
+          dependency_ = new com.google.protobuf.LazyStringArrayList(dependency_);
+          bitField0_ |= 0x00000004;
+         }
+      }
+      public java.util.List<String>
+          getDependencyList() {
+        return java.util.Collections.unmodifiableList(dependency_);
+      }
+      public int getDependencyCount() {
+        return dependency_.size();
+      }
+      public String getDependency(int index) {
+        return dependency_.get(index);
+      }
+      public Builder setDependency(
+          int index, String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  ensureDependencyIsMutable();
+        dependency_.set(index, value);
+        onChanged();
+        return this;
+      }
+      public Builder addDependency(String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  ensureDependencyIsMutable();
+        dependency_.add(value);
+        onChanged();
+        return this;
+      }
+      public Builder addAllDependency(
+          java.lang.Iterable<String> values) {
+        ensureDependencyIsMutable();
+        super.addAll(values, dependency_);
+        onChanged();
+        return this;
+      }
+      public Builder clearDependency() {
+        dependency_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+        bitField0_ = (bitField0_ & ~0x00000004);
+        onChanged();
+        return this;
+      }
+      void addDependency(com.google.protobuf.ByteString value) {
+        ensureDependencyIsMutable();
+        dependency_.add(value);
+        onChanged();
+      }
+      
+      // repeated .google.protobuf.DescriptorProto message_type = 4;
+      private java.util.List<com.google.protobuf.DescriptorProtos.DescriptorProto> messageType_ =
+        java.util.Collections.emptyList();
+      private void ensureMessageTypeIsMutable() {
+        if (!((bitField0_ & 0x00000008) == 0x00000008)) {
+          messageType_ = new java.util.ArrayList<com.google.protobuf.DescriptorProtos.DescriptorProto>(messageType_);
+          bitField0_ |= 0x00000008;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.DescriptorProto, com.google.protobuf.DescriptorProtos.DescriptorProto.Builder, com.google.protobuf.DescriptorProtos.DescriptorProtoOrBuilder> messageTypeBuilder_;
+      
+      public java.util.List<com.google.protobuf.DescriptorProtos.DescriptorProto> getMessageTypeList() {
+        if (messageTypeBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(messageType_);
+        } else {
+          return messageTypeBuilder_.getMessageList();
+        }
+      }
+      public int getMessageTypeCount() {
+        if (messageTypeBuilder_ == null) {
+          return messageType_.size();
+        } else {
+          return messageTypeBuilder_.getCount();
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.DescriptorProto getMessageType(int index) {
+        if (messageTypeBuilder_ == null) {
+          return messageType_.get(index);
+        } else {
+          return messageTypeBuilder_.getMessage(index);
+        }
+      }
+      public Builder setMessageType(
+          int index, com.google.protobuf.DescriptorProtos.DescriptorProto value) {
+        if (messageTypeBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureMessageTypeIsMutable();
+          messageType_.set(index, value);
+          onChanged();
+        } else {
+          messageTypeBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setMessageType(
+          int index, com.google.protobuf.DescriptorProtos.DescriptorProto.Builder builderForValue) {
+        if (messageTypeBuilder_ == null) {
+          ensureMessageTypeIsMutable();
+          messageType_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          messageTypeBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addMessageType(com.google.protobuf.DescriptorProtos.DescriptorProto value) {
+        if (messageTypeBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureMessageTypeIsMutable();
+          messageType_.add(value);
+          onChanged();
+        } else {
+          messageTypeBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addMessageType(
+          int index, com.google.protobuf.DescriptorProtos.DescriptorProto value) {
+        if (messageTypeBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureMessageTypeIsMutable();
+          messageType_.add(index, value);
+          onChanged();
+        } else {
+          messageTypeBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addMessageType(
+          com.google.protobuf.DescriptorProtos.DescriptorProto.Builder builderForValue) {
+        if (messageTypeBuilder_ == null) {
+          ensureMessageTypeIsMutable();
+          messageType_.add(builderForValue.build());
+          onChanged();
+        } else {
+          messageTypeBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addMessageType(
+          int index, com.google.protobuf.DescriptorProtos.DescriptorProto.Builder builderForValue) {
+        if (messageTypeBuilder_ == null) {
+          ensureMessageTypeIsMutable();
+          messageType_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          messageTypeBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllMessageType(
+          java.lang.Iterable<? extends com.google.protobuf.DescriptorProtos.DescriptorProto> values) {
+        if (messageTypeBuilder_ == null) {
+          ensureMessageTypeIsMutable();
+          super.addAll(values, messageType_);
+          onChanged();
+        } else {
+          messageTypeBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearMessageType() {
+        if (messageTypeBuilder_ == null) {
+          messageType_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000008);
+          onChanged();
+        } else {
+          messageTypeBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeMessageType(int index) {
+        if (messageTypeBuilder_ == null) {
+          ensureMessageTypeIsMutable();
+          messageType_.remove(index);
+          onChanged();
+        } else {
+          messageTypeBuilder_.remove(index);
+        }
+        return this;
+      }
+      public com.google.protobuf.DescriptorProtos.DescriptorProto.Builder getMessageTypeBuilder(
+          int index) {
+        return getMessageTypeFieldBuilder().getBuilder(index);
+      }
+      public com.google.protobuf.DescriptorProtos.DescriptorProtoOrBuilder getMessageTypeOrBuilder(
+          int index) {
+        if (messageTypeBuilder_ == null) {
+          return messageType_.get(index);  } else {
+          return messageTypeBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends com.google.protobuf.DescriptorProtos.DescriptorProtoOrBuilder> 
+           getMessageTypeOrBuilderList() {
+        if (messageTypeBuilder_ != null) {
+          return messageTypeBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(messageType_);
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.DescriptorProto.Builder addMessageTypeBuilder() {
+        return getMessageTypeFieldBuilder().addBuilder(
+            com.google.protobuf.DescriptorProtos.DescriptorProto.getDefaultInstance());
+      }
+      public com.google.protobuf.DescriptorProtos.DescriptorProto.Builder addMessageTypeBuilder(
+          int index) {
+        return getMessageTypeFieldBuilder().addBuilder(
+            index, com.google.protobuf.DescriptorProtos.DescriptorProto.getDefaultInstance());
+      }
+      public java.util.List<com.google.protobuf.DescriptorProtos.DescriptorProto.Builder> 
+           getMessageTypeBuilderList() {
+        return getMessageTypeFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.DescriptorProto, com.google.protobuf.DescriptorProtos.DescriptorProto.Builder, com.google.protobuf.DescriptorProtos.DescriptorProtoOrBuilder> 
+          getMessageTypeFieldBuilder() {
+        if (messageTypeBuilder_ == null) {
+          messageTypeBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              com.google.protobuf.DescriptorProtos.DescriptorProto, com.google.protobuf.DescriptorProtos.DescriptorProto.Builder, com.google.protobuf.DescriptorProtos.DescriptorProtoOrBuilder>(
+                  messageType_,
+                  ((bitField0_ & 0x00000008) == 0x00000008),
+                  getParentForChildren(),
+                  isClean());
+          messageType_ = null;
+        }
+        return messageTypeBuilder_;
+      }
+      
+      // repeated .google.protobuf.EnumDescriptorProto enum_type = 5;
+      private java.util.List<com.google.protobuf.DescriptorProtos.EnumDescriptorProto> enumType_ =
+        java.util.Collections.emptyList();
+      private void ensureEnumTypeIsMutable() {
+        if (!((bitField0_ & 0x00000010) == 0x00000010)) {
+          enumType_ = new java.util.ArrayList<com.google.protobuf.DescriptorProtos.EnumDescriptorProto>(enumType_);
+          bitField0_ |= 0x00000010;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.EnumDescriptorProto, com.google.protobuf.DescriptorProtos.EnumDescriptorProto.Builder, com.google.protobuf.DescriptorProtos.EnumDescriptorProtoOrBuilder> enumTypeBuilder_;
+      
+      public java.util.List<com.google.protobuf.DescriptorProtos.EnumDescriptorProto> getEnumTypeList() {
+        if (enumTypeBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(enumType_);
+        } else {
+          return enumTypeBuilder_.getMessageList();
+        }
+      }
+      public int getEnumTypeCount() {
+        if (enumTypeBuilder_ == null) {
+          return enumType_.size();
+        } else {
+          return enumTypeBuilder_.getCount();
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.EnumDescriptorProto getEnumType(int index) {
+        if (enumTypeBuilder_ == null) {
+          return enumType_.get(index);
+        } else {
+          return enumTypeBuilder_.getMessage(index);
+        }
+      }
+      public Builder setEnumType(
+          int index, com.google.protobuf.DescriptorProtos.EnumDescriptorProto value) {
+        if (enumTypeBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureEnumTypeIsMutable();
+          enumType_.set(index, value);
+          onChanged();
+        } else {
+          enumTypeBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setEnumType(
+          int index, com.google.protobuf.DescriptorProtos.EnumDescriptorProto.Builder builderForValue) {
+        if (enumTypeBuilder_ == null) {
+          ensureEnumTypeIsMutable();
+          enumType_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          enumTypeBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addEnumType(com.google.protobuf.DescriptorProtos.EnumDescriptorProto value) {
+        if (enumTypeBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureEnumTypeIsMutable();
+          enumType_.add(value);
+          onChanged();
+        } else {
+          enumTypeBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addEnumType(
+          int index, com.google.protobuf.DescriptorProtos.EnumDescriptorProto value) {
+        if (enumTypeBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureEnumTypeIsMutable();
+          enumType_.add(index, value);
+          onChanged();
+        } else {
+          enumTypeBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addEnumType(
+          com.google.protobuf.DescriptorProtos.EnumDescriptorProto.Builder builderForValue) {
+        if (enumTypeBuilder_ == null) {
+          ensureEnumTypeIsMutable();
+          enumType_.add(builderForValue.build());
+          onChanged();
+        } else {
+          enumTypeBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addEnumType(
+          int index, com.google.protobuf.DescriptorProtos.EnumDescriptorProto.Builder builderForValue) {
+        if (enumTypeBuilder_ == null) {
+          ensureEnumTypeIsMutable();
+          enumType_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          enumTypeBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllEnumType(
+          java.lang.Iterable<? extends com.google.protobuf.DescriptorProtos.EnumDescriptorProto> values) {
+        if (enumTypeBuilder_ == null) {
+          ensureEnumTypeIsMutable();
+          super.addAll(values, enumType_);
+          onChanged();
+        } else {
+          enumTypeBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearEnumType() {
+        if (enumTypeBuilder_ == null) {
+          enumType_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000010);
+          onChanged();
+        } else {
+          enumTypeBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeEnumType(int index) {
+        if (enumTypeBuilder_ == null) {
+          ensureEnumTypeIsMutable();
+          enumType_.remove(index);
+          onChanged();
+        } else {
+          enumTypeBuilder_.remove(index);
+        }
+        return this;
+      }
+      public com.google.protobuf.DescriptorProtos.EnumDescriptorProto.Builder getEnumTypeBuilder(
+          int index) {
+        return getEnumTypeFieldBuilder().getBuilder(index);
+      }
+      public com.google.protobuf.DescriptorProtos.EnumDescriptorProtoOrBuilder getEnumTypeOrBuilder(
+          int index) {
+        if (enumTypeBuilder_ == null) {
+          return enumType_.get(index);  } else {
+          return enumTypeBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends com.google.protobuf.DescriptorProtos.EnumDescriptorProtoOrBuilder> 
+           getEnumTypeOrBuilderList() {
+        if (enumTypeBuilder_ != null) {
+          return enumTypeBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(enumType_);
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.EnumDescriptorProto.Builder addEnumTypeBuilder() {
+        return getEnumTypeFieldBuilder().addBuilder(
+            com.google.protobuf.DescriptorProtos.EnumDescriptorProto.getDefaultInstance());
+      }
+      public com.google.protobuf.DescriptorProtos.EnumDescriptorProto.Builder addEnumTypeBuilder(
+          int index) {
+        return getEnumTypeFieldBuilder().addBuilder(
+            index, com.google.protobuf.DescriptorProtos.EnumDescriptorProto.getDefaultInstance());
+      }
+      public java.util.List<com.google.protobuf.DescriptorProtos.EnumDescriptorProto.Builder> 
+           getEnumTypeBuilderList() {
+        return getEnumTypeFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.EnumDescriptorProto, com.google.protobuf.DescriptorProtos.EnumDescriptorProto.Builder, com.google.protobuf.DescriptorProtos.EnumDescriptorProtoOrBuilder> 
+          getEnumTypeFieldBuilder() {
+        if (enumTypeBuilder_ == null) {
+          enumTypeBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              com.google.protobuf.DescriptorProtos.EnumDescriptorProto, com.google.protobuf.DescriptorProtos.EnumDescriptorProto.Builder, com.google.protobuf.DescriptorProtos.EnumDescriptorProtoOrBuilder>(
+                  enumType_,
+                  ((bitField0_ & 0x00000010) == 0x00000010),
+                  getParentForChildren(),
+                  isClean());
+          enumType_ = null;
+        }
+        return enumTypeBuilder_;
+      }
+      
+      // repeated .google.protobuf.ServiceDescriptorProto service = 6;
+      private java.util.List<com.google.protobuf.DescriptorProtos.ServiceDescriptorProto> service_ =
+        java.util.Collections.emptyList();
+      private void ensureServiceIsMutable() {
+        if (!((bitField0_ & 0x00000020) == 0x00000020)) {
+          service_ = new java.util.ArrayList<com.google.protobuf.DescriptorProtos.ServiceDescriptorProto>(service_);
+          bitField0_ |= 0x00000020;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.ServiceDescriptorProto, com.google.protobuf.DescriptorProtos.ServiceDescriptorProto.Builder, com.google.protobuf.DescriptorProtos.ServiceDescriptorProtoOrBuilder> serviceBuilder_;
+      
+      public java.util.List<com.google.protobuf.DescriptorProtos.ServiceDescriptorProto> getServiceList() {
+        if (serviceBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(service_);
+        } else {
+          return serviceBuilder_.getMessageList();
+        }
+      }
+      public int getServiceCount() {
+        if (serviceBuilder_ == null) {
+          return service_.size();
+        } else {
+          return serviceBuilder_.getCount();
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.ServiceDescriptorProto getService(int index) {
+        if (serviceBuilder_ == null) {
+          return service_.get(index);
+        } else {
+          return serviceBuilder_.getMessage(index);
+        }
+      }
+      public Builder setService(
+          int index, com.google.protobuf.DescriptorProtos.ServiceDescriptorProto value) {
+        if (serviceBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureServiceIsMutable();
+          service_.set(index, value);
+          onChanged();
+        } else {
+          serviceBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setService(
+          int index, com.google.protobuf.DescriptorProtos.ServiceDescriptorProto.Builder builderForValue) {
+        if (serviceBuilder_ == null) {
+          ensureServiceIsMutable();
+          service_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          serviceBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addService(com.google.protobuf.DescriptorProtos.ServiceDescriptorProto value) {
+        if (serviceBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureServiceIsMutable();
+          service_.add(value);
+          onChanged();
+        } else {
+          serviceBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addService(
+          int index, com.google.protobuf.DescriptorProtos.ServiceDescriptorProto value) {
+        if (serviceBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureServiceIsMutable();
+          service_.add(index, value);
+          onChanged();
+        } else {
+          serviceBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addService(
+          com.google.protobuf.DescriptorProtos.ServiceDescriptorProto.Builder builderForValue) {
+        if (serviceBuilder_ == null) {
+          ensureServiceIsMutable();
+          service_.add(builderForValue.build());
+          onChanged();
+        } else {
+          serviceBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addService(
+          int index, com.google.protobuf.DescriptorProtos.ServiceDescriptorProto.Builder builderForValue) {
+        if (serviceBuilder_ == null) {
+          ensureServiceIsMutable();
+          service_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          serviceBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllService(
+          java.lang.Iterable<? extends com.google.protobuf.DescriptorProtos.ServiceDescriptorProto> values) {
+        if (serviceBuilder_ == null) {
+          ensureServiceIsMutable();
+          super.addAll(values, service_);
+          onChanged();
+        } else {
+          serviceBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearService() {
+        if (serviceBuilder_ == null) {
+          service_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000020);
+          onChanged();
+        } else {
+          serviceBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeService(int index) {
+        if (serviceBuilder_ == null) {
+          ensureServiceIsMutable();
+          service_.remove(index);
+          onChanged();
+        } else {
+          serviceBuilder_.remove(index);
+        }
+        return this;
+      }
+      public com.google.protobuf.DescriptorProtos.ServiceDescriptorProto.Builder getServiceBuilder(
+          int index) {
+        return getServiceFieldBuilder().getBuilder(index);
+      }
+      public com.google.protobuf.DescriptorProtos.ServiceDescriptorProtoOrBuilder getServiceOrBuilder(
+          int index) {
+        if (serviceBuilder_ == null) {
+          return service_.get(index);  } else {
+          return serviceBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends com.google.protobuf.DescriptorProtos.ServiceDescriptorProtoOrBuilder> 
+           getServiceOrBuilderList() {
+        if (serviceBuilder_ != null) {
+          return serviceBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(service_);
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.ServiceDescriptorProto.Builder addServiceBuilder() {
+        return getServiceFieldBuilder().addBuilder(
+            com.google.protobuf.DescriptorProtos.ServiceDescriptorProto.getDefaultInstance());
+      }
+      public com.google.protobuf.DescriptorProtos.ServiceDescriptorProto.Builder addServiceBuilder(
+          int index) {
+        return getServiceFieldBuilder().addBuilder(
+            index, com.google.protobuf.DescriptorProtos.ServiceDescriptorProto.getDefaultInstance());
+      }
+      public java.util.List<com.google.protobuf.DescriptorProtos.ServiceDescriptorProto.Builder> 
+           getServiceBuilderList() {
+        return getServiceFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.ServiceDescriptorProto, com.google.protobuf.DescriptorProtos.ServiceDescriptorProto.Builder, com.google.protobuf.DescriptorProtos.ServiceDescriptorProtoOrBuilder> 
+          getServiceFieldBuilder() {
+        if (serviceBuilder_ == null) {
+          serviceBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              com.google.protobuf.DescriptorProtos.ServiceDescriptorProto, com.google.protobuf.DescriptorProtos.ServiceDescriptorProto.Builder, com.google.protobuf.DescriptorProtos.ServiceDescriptorProtoOrBuilder>(
+                  service_,
+                  ((bitField0_ & 0x00000020) == 0x00000020),
+                  getParentForChildren(),
+                  isClean());
+          service_ = null;
+        }
+        return serviceBuilder_;
+      }
+      
+      // repeated .google.protobuf.FieldDescriptorProto extension = 7;
+      private java.util.List<com.google.protobuf.DescriptorProtos.FieldDescriptorProto> extension_ =
+        java.util.Collections.emptyList();
+      private void ensureExtensionIsMutable() {
+        if (!((bitField0_ & 0x00000040) == 0x00000040)) {
+          extension_ = new java.util.ArrayList<com.google.protobuf.DescriptorProtos.FieldDescriptorProto>(extension_);
+          bitField0_ |= 0x00000040;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.FieldDescriptorProto, com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder, com.google.protobuf.DescriptorProtos.FieldDescriptorProtoOrBuilder> extensionBuilder_;
+      
+      public java.util.List<com.google.protobuf.DescriptorProtos.FieldDescriptorProto> getExtensionList() {
+        if (extensionBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(extension_);
+        } else {
+          return extensionBuilder_.getMessageList();
+        }
+      }
+      public int getExtensionCount() {
+        if (extensionBuilder_ == null) {
+          return extension_.size();
+        } else {
+          return extensionBuilder_.getCount();
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.FieldDescriptorProto getExtension(int index) {
+        if (extensionBuilder_ == null) {
+          return extension_.get(index);
+        } else {
+          return extensionBuilder_.getMessage(index);
+        }
+      }
+      public Builder setExtension(
+          int index, com.google.protobuf.DescriptorProtos.FieldDescriptorProto value) {
+        if (extensionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureExtensionIsMutable();
+          extension_.set(index, value);
+          onChanged();
+        } else {
+          extensionBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setExtension(
+          int index, com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder builderForValue) {
+        if (extensionBuilder_ == null) {
+          ensureExtensionIsMutable();
+          extension_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          extensionBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addExtension(com.google.protobuf.DescriptorProtos.FieldDescriptorProto value) {
+        if (extensionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureExtensionIsMutable();
+          extension_.add(value);
+          onChanged();
+        } else {
+          extensionBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addExtension(
+          int index, com.google.protobuf.DescriptorProtos.FieldDescriptorProto value) {
+        if (extensionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureExtensionIsMutable();
+          extension_.add(index, value);
+          onChanged();
+        } else {
+          extensionBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addExtension(
+          com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder builderForValue) {
+        if (extensionBuilder_ == null) {
+          ensureExtensionIsMutable();
+          extension_.add(builderForValue.build());
+          onChanged();
+        } else {
+          extensionBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addExtension(
+          int index, com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder builderForValue) {
+        if (extensionBuilder_ == null) {
+          ensureExtensionIsMutable();
+          extension_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          extensionBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllExtension(
+          java.lang.Iterable<? extends com.google.protobuf.DescriptorProtos.FieldDescriptorProto> values) {
+        if (extensionBuilder_ == null) {
+          ensureExtensionIsMutable();
+          super.addAll(values, extension_);
+          onChanged();
+        } else {
+          extensionBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearExtension() {
+        if (extensionBuilder_ == null) {
+          extension_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000040);
+          onChanged();
+        } else {
+          extensionBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeExtension(int index) {
+        if (extensionBuilder_ == null) {
+          ensureExtensionIsMutable();
+          extension_.remove(index);
+          onChanged();
+        } else {
+          extensionBuilder_.remove(index);
+        }
+        return this;
+      }
+      public com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder getExtensionBuilder(
+          int index) {
+        return getExtensionFieldBuilder().getBuilder(index);
+      }
+      public com.google.protobuf.DescriptorProtos.FieldDescriptorProtoOrBuilder getExtensionOrBuilder(
+          int index) {
+        if (extensionBuilder_ == null) {
+          return extension_.get(index);  } else {
+          return extensionBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends com.google.protobuf.DescriptorProtos.FieldDescriptorProtoOrBuilder> 
+           getExtensionOrBuilderList() {
+        if (extensionBuilder_ != null) {
+          return extensionBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(extension_);
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder addExtensionBuilder() {
+        return getExtensionFieldBuilder().addBuilder(
+            com.google.protobuf.DescriptorProtos.FieldDescriptorProto.getDefaultInstance());
+      }
+      public com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder addExtensionBuilder(
+          int index) {
+        return getExtensionFieldBuilder().addBuilder(
+            index, com.google.protobuf.DescriptorProtos.FieldDescriptorProto.getDefaultInstance());
+      }
+      public java.util.List<com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder> 
+           getExtensionBuilderList() {
+        return getExtensionFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.FieldDescriptorProto, com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder, com.google.protobuf.DescriptorProtos.FieldDescriptorProtoOrBuilder> 
+          getExtensionFieldBuilder() {
+        if (extensionBuilder_ == null) {
+          extensionBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              com.google.protobuf.DescriptorProtos.FieldDescriptorProto, com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder, com.google.protobuf.DescriptorProtos.FieldDescriptorProtoOrBuilder>(
+                  extension_,
+                  ((bitField0_ & 0x00000040) == 0x00000040),
+                  getParentForChildren(),
+                  isClean());
+          extension_ = null;
+        }
+        return extensionBuilder_;
+      }
+      
+      // optional .google.protobuf.FileOptions options = 8;
+      private com.google.protobuf.DescriptorProtos.FileOptions options_ = com.google.protobuf.DescriptorProtos.FileOptions.getDefaultInstance();
+      private com.google.protobuf.SingleFieldBuilder<
+          com.google.protobuf.DescriptorProtos.FileOptions, com.google.protobuf.DescriptorProtos.FileOptions.Builder, com.google.protobuf.DescriptorProtos.FileOptionsOrBuilder> optionsBuilder_;
+      public boolean hasOptions() {
+        return ((bitField0_ & 0x00000080) == 0x00000080);
+      }
+      public com.google.protobuf.DescriptorProtos.FileOptions getOptions() {
+        if (optionsBuilder_ == null) {
+          return options_;
+        } else {
+          return optionsBuilder_.getMessage();
+        }
+      }
+      public Builder setOptions(com.google.protobuf.DescriptorProtos.FileOptions value) {
+        if (optionsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          options_ = value;
+          onChanged();
+        } else {
+          optionsBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000080;
+        return this;
+      }
+      public Builder setOptions(
+          com.google.protobuf.DescriptorProtos.FileOptions.Builder builderForValue) {
+        if (optionsBuilder_ == null) {
+          options_ = builderForValue.build();
+          onChanged();
+        } else {
+          optionsBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000080;
+        return this;
+      }
+      public Builder mergeOptions(com.google.protobuf.DescriptorProtos.FileOptions value) {
+        if (optionsBuilder_ == null) {
+          if (((bitField0_ & 0x00000080) == 0x00000080) &&
+              options_ != com.google.protobuf.DescriptorProtos.FileOptions.getDefaultInstance()) {
+            options_ =
+              com.google.protobuf.DescriptorProtos.FileOptions.newBuilder(options_).mergeFrom(value).buildPartial();
+          } else {
+            options_ = value;
+          }
+          onChanged();
+        } else {
+          optionsBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000080;
+        return this;
+      }
+      public Builder clearOptions() {
+        if (optionsBuilder_ == null) {
+          options_ = com.google.protobuf.DescriptorProtos.FileOptions.getDefaultInstance();
+          onChanged();
+        } else {
+          optionsBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000080);
+        return this;
+      }
+      public com.google.protobuf.DescriptorProtos.FileOptions.Builder getOptionsBuilder() {
+        bitField0_ |= 0x00000080;
+        onChanged();
+        return getOptionsFieldBuilder().getBuilder();
+      }
+      public com.google.protobuf.DescriptorProtos.FileOptionsOrBuilder getOptionsOrBuilder() {
+        if (optionsBuilder_ != null) {
+          return optionsBuilder_.getMessageOrBuilder();
+        } else {
+          return options_;
+        }
+      }
+      private com.google.protobuf.SingleFieldBuilder<
+          com.google.protobuf.DescriptorProtos.FileOptions, com.google.protobuf.DescriptorProtos.FileOptions.Builder, com.google.protobuf.DescriptorProtos.FileOptionsOrBuilder> 
+          getOptionsFieldBuilder() {
+        if (optionsBuilder_ == null) {
+          optionsBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+              com.google.protobuf.DescriptorProtos.FileOptions, com.google.protobuf.DescriptorProtos.FileOptions.Builder, com.google.protobuf.DescriptorProtos.FileOptionsOrBuilder>(
+                  options_,
+                  getParentForChildren(),
+                  isClean());
+          options_ = null;
+        }
+        return optionsBuilder_;
+      }
+      
+      // optional .google.protobuf.SourceCodeInfo source_code_info = 9;
+      private com.google.protobuf.DescriptorProtos.SourceCodeInfo sourceCodeInfo_ = com.google.protobuf.DescriptorProtos.SourceCodeInfo.getDefaultInstance();
+      private com.google.protobuf.SingleFieldBuilder<
+          com.google.protobuf.DescriptorProtos.SourceCodeInfo, com.google.protobuf.DescriptorProtos.SourceCodeInfo.Builder, com.google.protobuf.DescriptorProtos.SourceCodeInfoOrBuilder> sourceCodeInfoBuilder_;
+      public boolean hasSourceCodeInfo() {
+        return ((bitField0_ & 0x00000100) == 0x00000100);
+      }
+      public com.google.protobuf.DescriptorProtos.SourceCodeInfo getSourceCodeInfo() {
+        if (sourceCodeInfoBuilder_ == null) {
+          return sourceCodeInfo_;
+        } else {
+          return sourceCodeInfoBuilder_.getMessage();
+        }
+      }
+      public Builder setSourceCodeInfo(com.google.protobuf.DescriptorProtos.SourceCodeInfo value) {
+        if (sourceCodeInfoBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          sourceCodeInfo_ = value;
+          onChanged();
+        } else {
+          sourceCodeInfoBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000100;
+        return this;
+      }
+      public Builder setSourceCodeInfo(
+          com.google.protobuf.DescriptorProtos.SourceCodeInfo.Builder builderForValue) {
+        if (sourceCodeInfoBuilder_ == null) {
+          sourceCodeInfo_ = builderForValue.build();
+          onChanged();
+        } else {
+          sourceCodeInfoBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000100;
+        return this;
+      }
+      public Builder mergeSourceCodeInfo(com.google.protobuf.DescriptorProtos.SourceCodeInfo value) {
+        if (sourceCodeInfoBuilder_ == null) {
+          if (((bitField0_ & 0x00000100) == 0x00000100) &&
+              sourceCodeInfo_ != com.google.protobuf.DescriptorProtos.SourceCodeInfo.getDefaultInstance()) {
+            sourceCodeInfo_ =
+              com.google.protobuf.DescriptorProtos.SourceCodeInfo.newBuilder(sourceCodeInfo_).mergeFrom(value).buildPartial();
+          } else {
+            sourceCodeInfo_ = value;
+          }
+          onChanged();
+        } else {
+          sourceCodeInfoBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000100;
+        return this;
+      }
+      public Builder clearSourceCodeInfo() {
+        if (sourceCodeInfoBuilder_ == null) {
+          sourceCodeInfo_ = com.google.protobuf.DescriptorProtos.SourceCodeInfo.getDefaultInstance();
+          onChanged();
+        } else {
+          sourceCodeInfoBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000100);
+        return this;
+      }
+      public com.google.protobuf.DescriptorProtos.SourceCodeInfo.Builder getSourceCodeInfoBuilder() {
+        bitField0_ |= 0x00000100;
+        onChanged();
+        return getSourceCodeInfoFieldBuilder().getBuilder();
+      }
+      public com.google.protobuf.DescriptorProtos.SourceCodeInfoOrBuilder getSourceCodeInfoOrBuilder() {
+        if (sourceCodeInfoBuilder_ != null) {
+          return sourceCodeInfoBuilder_.getMessageOrBuilder();
+        } else {
+          return sourceCodeInfo_;
+        }
+      }
+      private com.google.protobuf.SingleFieldBuilder<
+          com.google.protobuf.DescriptorProtos.SourceCodeInfo, com.google.protobuf.DescriptorProtos.SourceCodeInfo.Builder, com.google.protobuf.DescriptorProtos.SourceCodeInfoOrBuilder> 
+          getSourceCodeInfoFieldBuilder() {
+        if (sourceCodeInfoBuilder_ == null) {
+          sourceCodeInfoBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+              com.google.protobuf.DescriptorProtos.SourceCodeInfo, com.google.protobuf.DescriptorProtos.SourceCodeInfo.Builder, com.google.protobuf.DescriptorProtos.SourceCodeInfoOrBuilder>(
+                  sourceCodeInfo_,
+                  getParentForChildren(),
+                  isClean());
+          sourceCodeInfo_ = null;
+        }
+        return sourceCodeInfoBuilder_;
+      }
+      
+      // @@protoc_insertion_point(builder_scope:google.protobuf.FileDescriptorProto)
+    }
+    
+    static {
+      defaultInstance = new FileDescriptorProto(true);
+      defaultInstance.initFields();
+    }
+    
+    // @@protoc_insertion_point(class_scope:google.protobuf.FileDescriptorProto)
+  }
+  
+  public interface DescriptorProtoOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+    
+    // optional string name = 1;
+    boolean hasName();
+    String getName();
+    
+    // repeated .google.protobuf.FieldDescriptorProto field = 2;
+    java.util.List<com.google.protobuf.DescriptorProtos.FieldDescriptorProto> 
+        getFieldList();
+    com.google.protobuf.DescriptorProtos.FieldDescriptorProto getField(int index);
+    int getFieldCount();
+    java.util.List<? extends com.google.protobuf.DescriptorProtos.FieldDescriptorProtoOrBuilder> 
+        getFieldOrBuilderList();
+    com.google.protobuf.DescriptorProtos.FieldDescriptorProtoOrBuilder getFieldOrBuilder(
+        int index);
+    
+    // repeated .google.protobuf.FieldDescriptorProto extension = 6;
+    java.util.List<com.google.protobuf.DescriptorProtos.FieldDescriptorProto> 
+        getExtensionList();
+    com.google.protobuf.DescriptorProtos.FieldDescriptorProto getExtension(int index);
+    int getExtensionCount();
+    java.util.List<? extends com.google.protobuf.DescriptorProtos.FieldDescriptorProtoOrBuilder> 
+        getExtensionOrBuilderList();
+    com.google.protobuf.DescriptorProtos.FieldDescriptorProtoOrBuilder getExtensionOrBuilder(
+        int index);
+    
+    // repeated .google.protobuf.DescriptorProto nested_type = 3;
+    java.util.List<com.google.protobuf.DescriptorProtos.DescriptorProto> 
+        getNestedTypeList();
+    com.google.protobuf.DescriptorProtos.DescriptorProto getNestedType(int index);
+    int getNestedTypeCount();
+    java.util.List<? extends com.google.protobuf.DescriptorProtos.DescriptorProtoOrBuilder> 
+        getNestedTypeOrBuilderList();
+    com.google.protobuf.DescriptorProtos.DescriptorProtoOrBuilder getNestedTypeOrBuilder(
+        int index);
+    
+    // repeated .google.protobuf.EnumDescriptorProto enum_type = 4;
+    java.util.List<com.google.protobuf.DescriptorProtos.EnumDescriptorProto> 
+        getEnumTypeList();
+    com.google.protobuf.DescriptorProtos.EnumDescriptorProto getEnumType(int index);
+    int getEnumTypeCount();
+    java.util.List<? extends com.google.protobuf.DescriptorProtos.EnumDescriptorProtoOrBuilder> 
+        getEnumTypeOrBuilderList();
+    com.google.protobuf.DescriptorProtos.EnumDescriptorProtoOrBuilder getEnumTypeOrBuilder(
+        int index);
+    
+    // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;
+    java.util.List<com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange> 
+        getExtensionRangeList();
+    com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange getExtensionRange(int index);
+    int getExtensionRangeCount();
+    java.util.List<? extends com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRangeOrBuilder> 
+        getExtensionRangeOrBuilderList();
+    com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRangeOrBuilder getExtensionRangeOrBuilder(
+        int index);
+    
+    // optional .google.protobuf.MessageOptions options = 7;
+    boolean hasOptions();
+    com.google.protobuf.DescriptorProtos.MessageOptions getOptions();
+    com.google.protobuf.DescriptorProtos.MessageOptionsOrBuilder getOptionsOrBuilder();
+  }
+  public static final class DescriptorProto extends
+      com.google.protobuf.GeneratedMessage
+      implements DescriptorProtoOrBuilder {
+    // Use DescriptorProto.newBuilder() to construct.
+    private DescriptorProto(Builder builder) {
+      super(builder);
+    }
+    private DescriptorProto(boolean noInit) {}
+    
+    private static final DescriptorProto defaultInstance;
+    public static DescriptorProto getDefaultInstance() {
+      return defaultInstance;
+    }
+    
+    public DescriptorProto getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+    
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_DescriptorProto_descriptor;
+    }
+    
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_DescriptorProto_fieldAccessorTable;
+    }
+    
+    public interface ExtensionRangeOrBuilder
+        extends com.google.protobuf.MessageOrBuilder {
+      
+      // optional int32 start = 1;
+      boolean hasStart();
+      int getStart();
+      
+      // optional int32 end = 2;
+      boolean hasEnd();
+      int getEnd();
+    }
+    public static final class ExtensionRange extends
+        com.google.protobuf.GeneratedMessage
+        implements ExtensionRangeOrBuilder {
+      // Use ExtensionRange.newBuilder() to construct.
+      private ExtensionRange(Builder builder) {
+        super(builder);
+      }
+      private ExtensionRange(boolean noInit) {}
+      
+      private static final ExtensionRange defaultInstance;
+      public static ExtensionRange getDefaultInstance() {
+        return defaultInstance;
+      }
+      
+      public ExtensionRange getDefaultInstanceForType() {
+        return defaultInstance;
+      }
+      
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_DescriptorProto_ExtensionRange_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_DescriptorProto_ExtensionRange_fieldAccessorTable;
+      }
+      
+      private int bitField0_;
+      // optional int32 start = 1;
+      public static final int START_FIELD_NUMBER = 1;
+      private int start_;
+      public boolean hasStart() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      public int getStart() {
+        return start_;
+      }
+      
+      // optional int32 end = 2;
+      public static final int END_FIELD_NUMBER = 2;
+      private int end_;
+      public boolean hasEnd() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      public int getEnd() {
+        return end_;
+      }
+      
+      private void initFields() {
+        start_ = 0;
+        end_ = 0;
+      }
+      private byte memoizedIsInitialized = -1;
+      public final boolean isInitialized() {
+        byte isInitialized = memoizedIsInitialized;
+        if (isInitialized != -1) return isInitialized == 1;
+        
+        memoizedIsInitialized = 1;
+        return true;
+      }
+      
+      public void writeTo(com.google.protobuf.CodedOutputStream output)
+                          throws java.io.IOException {
+        getSerializedSize();
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          output.writeInt32(1, start_);
+        }
+        if (((bitField0_ & 0x00000002) == 0x00000002)) {
+          output.writeInt32(2, end_);
+        }
+        getUnknownFields().writeTo(output);
+      }
+      
+      private int memoizedSerializedSize = -1;
+      public int getSerializedSize() {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+      
+        size = 0;
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeInt32Size(1, start_);
+        }
+        if (((bitField0_ & 0x00000002) == 0x00000002)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeInt32Size(2, end_);
+        }
+        size += getUnknownFields().getSerializedSize();
+        memoizedSerializedSize = size;
+        return size;
+      }
+      
+      private static final long serialVersionUID = 0L;
+      @java.lang.Override
+      protected java.lang.Object writeReplace()
+          throws java.io.ObjectStreamException {
+        return super.writeReplace();
+      }
+      
+      public static com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange parseFrom(
+          com.google.protobuf.ByteString data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange parseFrom(
+          com.google.protobuf.ByteString data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange parseFrom(byte[] data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange parseFrom(
+          byte[] data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange parseFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange parseFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange parseDelimitedFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        Builder builder = newBuilder();
+        if (builder.mergeDelimitedFrom(input)) {
+          return builder.buildParsed();
+        } else {
+          return null;
+        }
+      }
+      public static com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange parseDelimitedFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        Builder builder = newBuilder();
+        if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+          return builder.buildParsed();
+        } else {
+          return null;
+        }
+      }
+      public static com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange parseFrom(
+          com.google.protobuf.CodedInputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange parseFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      
+      public static Builder newBuilder() { return Builder.create(); }
+      public Builder newBuilderForType() { return newBuilder(); }
+      public static Builder newBuilder(com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange prototype) {
+        return newBuilder().mergeFrom(prototype);
+      }
+      public Builder toBuilder() { return newBuilder(this); }
+      
+      @java.lang.Override
+      protected Builder newBuilderForType(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        Builder builder = new Builder(parent);
+        return builder;
+      }
+      public static final class Builder extends
+          com.google.protobuf.GeneratedMessage.Builder<Builder>
+         implements com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRangeOrBuilder {
+        public static final com.google.protobuf.Descriptors.Descriptor
+            getDescriptor() {
+          return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_DescriptorProto_ExtensionRange_descriptor;
+        }
+        
+        protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+            internalGetFieldAccessorTable() {
+          return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_DescriptorProto_ExtensionRange_fieldAccessorTable;
+        }
+        
+        // Construct using com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange.newBuilder()
+        private Builder() {
+          maybeForceBuilderInitialization();
+        }
+        
+        private Builder(BuilderParent parent) {
+          super(parent);
+          maybeForceBuilderInitialization();
+        }
+        private void maybeForceBuilderInitialization() {
+          if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          }
+        }
+        private static Builder create() {
+          return new Builder();
+        }
+        
+        public Builder clear() {
+          super.clear();
+          start_ = 0;
+          bitField0_ = (bitField0_ & ~0x00000001);
+          end_ = 0;
+          bitField0_ = (bitField0_ & ~0x00000002);
+          return this;
+        }
+        
+        public Builder clone() {
+          return create().mergeFrom(buildPartial());
+        }
+        
+        public com.google.protobuf.Descriptors.Descriptor
+            getDescriptorForType() {
+          return com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange.getDescriptor();
+        }
+        
+        public com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange getDefaultInstanceForType() {
+          return com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange.getDefaultInstance();
+        }
+        
+        public com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange build() {
+          com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(result);
+          }
+          return result;
+        }
+        
+        private com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange buildParsed()
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(
+              result).asInvalidProtocolBufferException();
+          }
+          return result;
+        }
+        
+        public com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange buildPartial() {
+          com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange result = new com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange(this);
+          int from_bitField0_ = bitField0_;
+          int to_bitField0_ = 0;
+          if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+            to_bitField0_ |= 0x00000001;
+          }
+          result.start_ = start_;
+          if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+            to_bitField0_ |= 0x00000002;
+          }
+          result.end_ = end_;
+          result.bitField0_ = to_bitField0_;
+          onBuilt();
+          return result;
+        }
+        
+        public Builder mergeFrom(com.google.protobuf.Message other) {
+          if (other instanceof com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange) {
+            return mergeFrom((com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange)other);
+          } else {
+            super.mergeFrom(other);
+            return this;
+          }
+        }
+        
+        public Builder mergeFrom(com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange other) {
+          if (other == com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange.getDefaultInstance()) return this;
+          if (other.hasStart()) {
+            setStart(other.getStart());
+          }
+          if (other.hasEnd()) {
+            setEnd(other.getEnd());
+          }
+          this.mergeUnknownFields(other.getUnknownFields());
+          return this;
+        }
+        
+        public final boolean isInitialized() {
+          return true;
+        }
+        
+        public Builder mergeFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+            com.google.protobuf.UnknownFieldSet.newBuilder(
+              this.getUnknownFields());
+          while (true) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              default: {
+                if (!parseUnknownField(input, unknownFields,
+                                       extensionRegistry, tag)) {
+                  this.setUnknownFields(unknownFields.build());
+                  onChanged();
+                  return this;
+                }
+                break;
+              }
+              case 8: {
+                bitField0_ |= 0x00000001;
+                start_ = input.readInt32();
+                break;
+              }
+              case 16: {
+                bitField0_ |= 0x00000002;
+                end_ = input.readInt32();
+                break;
+              }
+            }
+          }
+        }
+        
+        private int bitField0_;
+        
+        // optional int32 start = 1;
+        private int start_ ;
+        public boolean hasStart() {
+          return ((bitField0_ & 0x00000001) == 0x00000001);
+        }
+        public int getStart() {
+          return start_;
+        }
+        public Builder setStart(int value) {
+          bitField0_ |= 0x00000001;
+          start_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearStart() {
+          bitField0_ = (bitField0_ & ~0x00000001);
+          start_ = 0;
+          onChanged();
+          return this;
+        }
+        
+        // optional int32 end = 2;
+        private int end_ ;
+        public boolean hasEnd() {
+          return ((bitField0_ & 0x00000002) == 0x00000002);
+        }
+        public int getEnd() {
+          return end_;
+        }
+        public Builder setEnd(int value) {
+          bitField0_ |= 0x00000002;
+          end_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearEnd() {
+          bitField0_ = (bitField0_ & ~0x00000002);
+          end_ = 0;
+          onChanged();
+          return this;
+        }
+        
+        // @@protoc_insertion_point(builder_scope:google.protobuf.DescriptorProto.ExtensionRange)
+      }
+      
+      static {
+        defaultInstance = new ExtensionRange(true);
+        defaultInstance.initFields();
+      }
+      
+      // @@protoc_insertion_point(class_scope:google.protobuf.DescriptorProto.ExtensionRange)
+    }
+    
+    private int bitField0_;
+    // optional string name = 1;
+    public static final int NAME_FIELD_NUMBER = 1;
+    private java.lang.Object name_;
+    public boolean hasName() {
+      return ((bitField0_ & 0x00000001) == 0x00000001);
+    }
+    public String getName() {
+      java.lang.Object ref = name_;
+      if (ref instanceof String) {
+        return (String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        String s = bs.toStringUtf8();
+        if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+          name_ = s;
+        }
+        return s;
+      }
+    }
+    private com.google.protobuf.ByteString getNameBytes() {
+      java.lang.Object ref = name_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+        name_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    
+    // repeated .google.protobuf.FieldDescriptorProto field = 2;
+    public static final int FIELD_FIELD_NUMBER = 2;
+    private java.util.List<com.google.protobuf.DescriptorProtos.FieldDescriptorProto> field_;
+    public java.util.List<com.google.protobuf.DescriptorProtos.FieldDescriptorProto> getFieldList() {
+      return field_;
+    }
+    public java.util.List<? extends com.google.protobuf.DescriptorProtos.FieldDescriptorProtoOrBuilder> 
+        getFieldOrBuilderList() {
+      return field_;
+    }
+    public int getFieldCount() {
+      return field_.size();
+    }
+    public com.google.protobuf.DescriptorProtos.FieldDescriptorProto getField(int index) {
+      return field_.get(index);
+    }
+    public com.google.protobuf.DescriptorProtos.FieldDescriptorProtoOrBuilder getFieldOrBuilder(
+        int index) {
+      return field_.get(index);
+    }
+    
+    // repeated .google.protobuf.FieldDescriptorProto extension = 6;
+    public static final int EXTENSION_FIELD_NUMBER = 6;
+    private java.util.List<com.google.protobuf.DescriptorProtos.FieldDescriptorProto> extension_;
+    public java.util.List<com.google.protobuf.DescriptorProtos.FieldDescriptorProto> getExtensionList() {
+      return extension_;
+    }
+    public java.util.List<? extends com.google.protobuf.DescriptorProtos.FieldDescriptorProtoOrBuilder> 
+        getExtensionOrBuilderList() {
+      return extension_;
+    }
+    public int getExtensionCount() {
+      return extension_.size();
+    }
+    public com.google.protobuf.DescriptorProtos.FieldDescriptorProto getExtension(int index) {
+      return extension_.get(index);
+    }
+    public com.google.protobuf.DescriptorProtos.FieldDescriptorProtoOrBuilder getExtensionOrBuilder(
+        int index) {
+      return extension_.get(index);
+    }
+    
+    // repeated .google.protobuf.DescriptorProto nested_type = 3;
+    public static final int NESTED_TYPE_FIELD_NUMBER = 3;
+    private java.util.List<com.google.protobuf.DescriptorProtos.DescriptorProto> nestedType_;
+    public java.util.List<com.google.protobuf.DescriptorProtos.DescriptorProto> getNestedTypeList() {
+      return nestedType_;
+    }
+    public java.util.List<? extends com.google.protobuf.DescriptorProtos.DescriptorProtoOrBuilder> 
+        getNestedTypeOrBuilderList() {
+      return nestedType_;
+    }
+    public int getNestedTypeCount() {
+      return nestedType_.size();
+    }
+    public com.google.protobuf.DescriptorProtos.DescriptorProto getNestedType(int index) {
+      return nestedType_.get(index);
+    }
+    public com.google.protobuf.DescriptorProtos.DescriptorProtoOrBuilder getNestedTypeOrBuilder(
+        int index) {
+      return nestedType_.get(index);
+    }
+    
+    // repeated .google.protobuf.EnumDescriptorProto enum_type = 4;
+    public static final int ENUM_TYPE_FIELD_NUMBER = 4;
+    private java.util.List<com.google.protobuf.DescriptorProtos.EnumDescriptorProto> enumType_;
+    public java.util.List<com.google.protobuf.DescriptorProtos.EnumDescriptorProto> getEnumTypeList() {
+      return enumType_;
+    }
+    public java.util.List<? extends com.google.protobuf.DescriptorProtos.EnumDescriptorProtoOrBuilder> 
+        getEnumTypeOrBuilderList() {
+      return enumType_;
+    }
+    public int getEnumTypeCount() {
+      return enumType_.size();
+    }
+    public com.google.protobuf.DescriptorProtos.EnumDescriptorProto getEnumType(int index) {
+      return enumType_.get(index);
+    }
+    public com.google.protobuf.DescriptorProtos.EnumDescriptorProtoOrBuilder getEnumTypeOrBuilder(
+        int index) {
+      return enumType_.get(index);
+    }
+    
+    // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;
+    public static final int EXTENSION_RANGE_FIELD_NUMBER = 5;
+    private java.util.List<com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange> extensionRange_;
+    public java.util.List<com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange> getExtensionRangeList() {
+      return extensionRange_;
+    }
+    public java.util.List<? extends com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRangeOrBuilder> 
+        getExtensionRangeOrBuilderList() {
+      return extensionRange_;
+    }
+    public int getExtensionRangeCount() {
+      return extensionRange_.size();
+    }
+    public com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange getExtensionRange(int index) {
+      return extensionRange_.get(index);
+    }
+    public com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRangeOrBuilder getExtensionRangeOrBuilder(
+        int index) {
+      return extensionRange_.get(index);
+    }
+    
+    // optional .google.protobuf.MessageOptions options = 7;
+    public static final int OPTIONS_FIELD_NUMBER = 7;
+    private com.google.protobuf.DescriptorProtos.MessageOptions options_;
+    public boolean hasOptions() {
+      return ((bitField0_ & 0x00000002) == 0x00000002);
+    }
+    public com.google.protobuf.DescriptorProtos.MessageOptions getOptions() {
+      return options_;
+    }
+    public com.google.protobuf.DescriptorProtos.MessageOptionsOrBuilder getOptionsOrBuilder() {
+      return options_;
+    }
+    
+    private void initFields() {
+      name_ = "";
+      field_ = java.util.Collections.emptyList();
+      extension_ = java.util.Collections.emptyList();
+      nestedType_ = java.util.Collections.emptyList();
+      enumType_ = java.util.Collections.emptyList();
+      extensionRange_ = java.util.Collections.emptyList();
+      options_ = com.google.protobuf.DescriptorProtos.MessageOptions.getDefaultInstance();
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+      
+      for (int i = 0; i < getFieldCount(); i++) {
+        if (!getField(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      for (int i = 0; i < getExtensionCount(); i++) {
+        if (!getExtension(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      for (int i = 0; i < getNestedTypeCount(); i++) {
+        if (!getNestedType(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      for (int i = 0; i < getEnumTypeCount(); i++) {
+        if (!getEnumType(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      if (hasOptions()) {
+        if (!getOptions().isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+    
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        output.writeBytes(1, getNameBytes());
+      }
+      for (int i = 0; i < field_.size(); i++) {
+        output.writeMessage(2, field_.get(i));
+      }
+      for (int i = 0; i < nestedType_.size(); i++) {
+        output.writeMessage(3, nestedType_.get(i));
+      }
+      for (int i = 0; i < enumType_.size(); i++) {
+        output.writeMessage(4, enumType_.get(i));
+      }
+      for (int i = 0; i < extensionRange_.size(); i++) {
+        output.writeMessage(5, extensionRange_.get(i));
+      }
+      for (int i = 0; i < extension_.size(); i++) {
+        output.writeMessage(6, extension_.get(i));
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        output.writeMessage(7, options_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+    
+      size = 0;
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(1, getNameBytes());
+      }
+      for (int i = 0; i < field_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(2, field_.get(i));
+      }
+      for (int i = 0; i < nestedType_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(3, nestedType_.get(i));
+      }
+      for (int i = 0; i < enumType_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(4, enumType_.get(i));
+      }
+      for (int i = 0; i < extensionRange_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(5, extensionRange_.get(i));
+      }
+      for (int i = 0; i < extension_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(6, extension_.get(i));
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(7, options_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+    
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+    
+    public static com.google.protobuf.DescriptorProtos.DescriptorProto parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.DescriptorProto parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.DescriptorProto parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.DescriptorProto parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.DescriptorProto parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.DescriptorProto parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.DescriptorProto parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.DescriptorProto parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.DescriptorProto parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.DescriptorProto parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(com.google.protobuf.DescriptorProtos.DescriptorProto prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+    
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements com.google.protobuf.DescriptorProtos.DescriptorProtoOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_DescriptorProto_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_DescriptorProto_fieldAccessorTable;
+      }
+      
+      // Construct using com.google.protobuf.DescriptorProtos.DescriptorProto.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+      
+      private Builder(BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          getFieldFieldBuilder();
+          getExtensionFieldBuilder();
+          getNestedTypeFieldBuilder();
+          getEnumTypeFieldBuilder();
+          getExtensionRangeFieldBuilder();
+          getOptionsFieldBuilder();
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+      
+      public Builder clear() {
+        super.clear();
+        name_ = "";
+        bitField0_ = (bitField0_ & ~0x00000001);
+        if (fieldBuilder_ == null) {
+          field_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000002);
+        } else {
+          fieldBuilder_.clear();
+        }
+        if (extensionBuilder_ == null) {
+          extension_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000004);
+        } else {
+          extensionBuilder_.clear();
+        }
+        if (nestedTypeBuilder_ == null) {
+          nestedType_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000008);
+        } else {
+          nestedTypeBuilder_.clear();
+        }
+        if (enumTypeBuilder_ == null) {
+          enumType_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000010);
+        } else {
+          enumTypeBuilder_.clear();
+        }
+        if (extensionRangeBuilder_ == null) {
+          extensionRange_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000020);
+        } else {
+          extensionRangeBuilder_.clear();
+        }
+        if (optionsBuilder_ == null) {
+          options_ = com.google.protobuf.DescriptorProtos.MessageOptions.getDefaultInstance();
+        } else {
+          optionsBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000040);
+        return this;
+      }
+      
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+      
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return com.google.protobuf.DescriptorProtos.DescriptorProto.getDescriptor();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.DescriptorProto getDefaultInstanceForType() {
+        return com.google.protobuf.DescriptorProtos.DescriptorProto.getDefaultInstance();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.DescriptorProto build() {
+        com.google.protobuf.DescriptorProtos.DescriptorProto result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+      
+      private com.google.protobuf.DescriptorProtos.DescriptorProto buildParsed()
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.DescriptorProtos.DescriptorProto result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(
+            result).asInvalidProtocolBufferException();
+        }
+        return result;
+      }
+      
+      public com.google.protobuf.DescriptorProtos.DescriptorProto buildPartial() {
+        com.google.protobuf.DescriptorProtos.DescriptorProto result = new com.google.protobuf.DescriptorProtos.DescriptorProto(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+          to_bitField0_ |= 0x00000001;
+        }
+        result.name_ = name_;
+        if (fieldBuilder_ == null) {
+          if (((bitField0_ & 0x00000002) == 0x00000002)) {
+            field_ = java.util.Collections.unmodifiableList(field_);
+            bitField0_ = (bitField0_ & ~0x00000002);
+          }
+          result.field_ = field_;
+        } else {
+          result.field_ = fieldBuilder_.build();
+        }
+        if (extensionBuilder_ == null) {
+          if (((bitField0_ & 0x00000004) == 0x00000004)) {
+            extension_ = java.util.Collections.unmodifiableList(extension_);
+            bitField0_ = (bitField0_ & ~0x00000004);
+          }
+          result.extension_ = extension_;
+        } else {
+          result.extension_ = extensionBuilder_.build();
+        }
+        if (nestedTypeBuilder_ == null) {
+          if (((bitField0_ & 0x00000008) == 0x00000008)) {
+            nestedType_ = java.util.Collections.unmodifiableList(nestedType_);
+            bitField0_ = (bitField0_ & ~0x00000008);
+          }
+          result.nestedType_ = nestedType_;
+        } else {
+          result.nestedType_ = nestedTypeBuilder_.build();
+        }
+        if (enumTypeBuilder_ == null) {
+          if (((bitField0_ & 0x00000010) == 0x00000010)) {
+            enumType_ = java.util.Collections.unmodifiableList(enumType_);
+            bitField0_ = (bitField0_ & ~0x00000010);
+          }
+          result.enumType_ = enumType_;
+        } else {
+          result.enumType_ = enumTypeBuilder_.build();
+        }
+        if (extensionRangeBuilder_ == null) {
+          if (((bitField0_ & 0x00000020) == 0x00000020)) {
+            extensionRange_ = java.util.Collections.unmodifiableList(extensionRange_);
+            bitField0_ = (bitField0_ & ~0x00000020);
+          }
+          result.extensionRange_ = extensionRange_;
+        } else {
+          result.extensionRange_ = extensionRangeBuilder_.build();
+        }
+        if (((from_bitField0_ & 0x00000040) == 0x00000040)) {
+          to_bitField0_ |= 0x00000002;
+        }
+        if (optionsBuilder_ == null) {
+          result.options_ = options_;
+        } else {
+          result.options_ = optionsBuilder_.build();
+        }
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof com.google.protobuf.DescriptorProtos.DescriptorProto) {
+          return mergeFrom((com.google.protobuf.DescriptorProtos.DescriptorProto)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.DescriptorProtos.DescriptorProto other) {
+        if (other == com.google.protobuf.DescriptorProtos.DescriptorProto.getDefaultInstance()) return this;
+        if (other.hasName()) {
+          setName(other.getName());
+        }
+        if (fieldBuilder_ == null) {
+          if (!other.field_.isEmpty()) {
+            if (field_.isEmpty()) {
+              field_ = other.field_;
+              bitField0_ = (bitField0_ & ~0x00000002);
+            } else {
+              ensureFieldIsMutable();
+              field_.addAll(other.field_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.field_.isEmpty()) {
+            if (fieldBuilder_.isEmpty()) {
+              fieldBuilder_.dispose();
+              fieldBuilder_ = null;
+              field_ = other.field_;
+              bitField0_ = (bitField0_ & ~0x00000002);
+              fieldBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getFieldFieldBuilder() : null;
+            } else {
+              fieldBuilder_.addAllMessages(other.field_);
+            }
+          }
+        }
+        if (extensionBuilder_ == null) {
+          if (!other.extension_.isEmpty()) {
+            if (extension_.isEmpty()) {
+              extension_ = other.extension_;
+              bitField0_ = (bitField0_ & ~0x00000004);
+            } else {
+              ensureExtensionIsMutable();
+              extension_.addAll(other.extension_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.extension_.isEmpty()) {
+            if (extensionBuilder_.isEmpty()) {
+              extensionBuilder_.dispose();
+              extensionBuilder_ = null;
+              extension_ = other.extension_;
+              bitField0_ = (bitField0_ & ~0x00000004);
+              extensionBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getExtensionFieldBuilder() : null;
+            } else {
+              extensionBuilder_.addAllMessages(other.extension_);
+            }
+          }
+        }
+        if (nestedTypeBuilder_ == null) {
+          if (!other.nestedType_.isEmpty()) {
+            if (nestedType_.isEmpty()) {
+              nestedType_ = other.nestedType_;
+              bitField0_ = (bitField0_ & ~0x00000008);
+            } else {
+              ensureNestedTypeIsMutable();
+              nestedType_.addAll(other.nestedType_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.nestedType_.isEmpty()) {
+            if (nestedTypeBuilder_.isEmpty()) {
+              nestedTypeBuilder_.dispose();
+              nestedTypeBuilder_ = null;
+              nestedType_ = other.nestedType_;
+              bitField0_ = (bitField0_ & ~0x00000008);
+              nestedTypeBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getNestedTypeFieldBuilder() : null;
+            } else {
+              nestedTypeBuilder_.addAllMessages(other.nestedType_);
+            }
+          }
+        }
+        if (enumTypeBuilder_ == null) {
+          if (!other.enumType_.isEmpty()) {
+            if (enumType_.isEmpty()) {
+              enumType_ = other.enumType_;
+              bitField0_ = (bitField0_ & ~0x00000010);
+            } else {
+              ensureEnumTypeIsMutable();
+              enumType_.addAll(other.enumType_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.enumType_.isEmpty()) {
+            if (enumTypeBuilder_.isEmpty()) {
+              enumTypeBuilder_.dispose();
+              enumTypeBuilder_ = null;
+              enumType_ = other.enumType_;
+              bitField0_ = (bitField0_ & ~0x00000010);
+              enumTypeBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getEnumTypeFieldBuilder() : null;
+            } else {
+              enumTypeBuilder_.addAllMessages(other.enumType_);
+            }
+          }
+        }
+        if (extensionRangeBuilder_ == null) {
+          if (!other.extensionRange_.isEmpty()) {
+            if (extensionRange_.isEmpty()) {
+              extensionRange_ = other.extensionRange_;
+              bitField0_ = (bitField0_ & ~0x00000020);
+            } else {
+              ensureExtensionRangeIsMutable();
+              extensionRange_.addAll(other.extensionRange_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.extensionRange_.isEmpty()) {
+            if (extensionRangeBuilder_.isEmpty()) {
+              extensionRangeBuilder_.dispose();
+              extensionRangeBuilder_ = null;
+              extensionRange_ = other.extensionRange_;
+              bitField0_ = (bitField0_ & ~0x00000020);
+              extensionRangeBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getExtensionRangeFieldBuilder() : null;
+            } else {
+              extensionRangeBuilder_.addAllMessages(other.extensionRange_);
+            }
+          }
+        }
+        if (other.hasOptions()) {
+          mergeOptions(other.getOptions());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+      
+      public final boolean isInitialized() {
+        for (int i = 0; i < getFieldCount(); i++) {
+          if (!getField(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        for (int i = 0; i < getExtensionCount(); i++) {
+          if (!getExtension(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        for (int i = 0; i < getNestedTypeCount(); i++) {
+          if (!getNestedType(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        for (int i = 0; i < getEnumTypeCount(); i++) {
+          if (!getEnumType(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        if (hasOptions()) {
+          if (!getOptions().isInitialized()) {
+            
+            return false;
+          }
+        }
+        return true;
+      }
+      
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder(
+            this.getUnknownFields());
+        while (true) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              this.setUnknownFields(unknownFields.build());
+              onChanged();
+              return this;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              }
+              break;
+            }
+            case 10: {
+              bitField0_ |= 0x00000001;
+              name_ = input.readBytes();
+              break;
+            }
+            case 18: {
+              com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder subBuilder = com.google.protobuf.DescriptorProtos.FieldDescriptorProto.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addField(subBuilder.buildPartial());
+              break;
+            }
+            case 26: {
+              com.google.protobuf.DescriptorProtos.DescriptorProto.Builder subBuilder = com.google.protobuf.DescriptorProtos.DescriptorProto.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addNestedType(subBuilder.buildPartial());
+              break;
+            }
+            case 34: {
+              com.google.protobuf.DescriptorProtos.EnumDescriptorProto.Builder subBuilder = com.google.protobuf.DescriptorProtos.EnumDescriptorProto.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addEnumType(subBuilder.buildPartial());
+              break;
+            }
+            case 42: {
+              com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange.Builder subBuilder = com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addExtensionRange(subBuilder.buildPartial());
+              break;
+            }
+            case 50: {
+              com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder subBuilder = com.google.protobuf.DescriptorProtos.FieldDescriptorProto.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addExtension(subBuilder.buildPartial());
+              break;
+            }
+            case 58: {
+              com.google.protobuf.DescriptorProtos.MessageOptions.Builder subBuilder = com.google.protobuf.DescriptorProtos.MessageOptions.newBuilder();
+              if (hasOptions()) {
+                subBuilder.mergeFrom(getOptions());
+              }
+              input.readMessage(subBuilder, extensionRegistry);
+              setOptions(subBuilder.buildPartial());
+              break;
+            }
+          }
+        }
+      }
+      
+      private int bitField0_;
+      
+      // optional string name = 1;
+      private java.lang.Object name_ = "";
+      public boolean hasName() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      public String getName() {
+        java.lang.Object ref = name_;
+        if (!(ref instanceof String)) {
+          String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+          name_ = s;
+          return s;
+        } else {
+          return (String) ref;
+        }
+      }
+      public Builder setName(String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+        name_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearName() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        name_ = getDefaultInstance().getName();
+        onChanged();
+        return this;
+      }
+      void setName(com.google.protobuf.ByteString value) {
+        bitField0_ |= 0x00000001;
+        name_ = value;
+        onChanged();
+      }
+      
+      // repeated .google.protobuf.FieldDescriptorProto field = 2;
+      private java.util.List<com.google.protobuf.DescriptorProtos.FieldDescriptorProto> field_ =
+        java.util.Collections.emptyList();
+      private void ensureFieldIsMutable() {
+        if (!((bitField0_ & 0x00000002) == 0x00000002)) {
+          field_ = new java.util.ArrayList<com.google.protobuf.DescriptorProtos.FieldDescriptorProto>(field_);
+          bitField0_ |= 0x00000002;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.FieldDescriptorProto, com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder, com.google.protobuf.DescriptorProtos.FieldDescriptorProtoOrBuilder> fieldBuilder_;
+      
+      public java.util.List<com.google.protobuf.DescriptorProtos.FieldDescriptorProto> getFieldList() {
+        if (fieldBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(field_);
+        } else {
+          return fieldBuilder_.getMessageList();
+        }
+      }
+      public int getFieldCount() {
+        if (fieldBuilder_ == null) {
+          return field_.size();
+        } else {
+          return fieldBuilder_.getCount();
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.FieldDescriptorProto getField(int index) {
+        if (fieldBuilder_ == null) {
+          return field_.get(index);
+        } else {
+          return fieldBuilder_.getMessage(index);
+        }
+      }
+      public Builder setField(
+          int index, com.google.protobuf.DescriptorProtos.FieldDescriptorProto value) {
+        if (fieldBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureFieldIsMutable();
+          field_.set(index, value);
+          onChanged();
+        } else {
+          fieldBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setField(
+          int index, com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder builderForValue) {
+        if (fieldBuilder_ == null) {
+          ensureFieldIsMutable();
+          field_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          fieldBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addField(com.google.protobuf.DescriptorProtos.FieldDescriptorProto value) {
+        if (fieldBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureFieldIsMutable();
+          field_.add(value);
+          onChanged();
+        } else {
+          fieldBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addField(
+          int index, com.google.protobuf.DescriptorProtos.FieldDescriptorProto value) {
+        if (fieldBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureFieldIsMutable();
+          field_.add(index, value);
+          onChanged();
+        } else {
+          fieldBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addField(
+          com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder builderForValue) {
+        if (fieldBuilder_ == null) {
+          ensureFieldIsMutable();
+          field_.add(builderForValue.build());
+          onChanged();
+        } else {
+          fieldBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addField(
+          int index, com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder builderForValue) {
+        if (fieldBuilder_ == null) {
+          ensureFieldIsMutable();
+          field_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          fieldBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllField(
+          java.lang.Iterable<? extends com.google.protobuf.DescriptorProtos.FieldDescriptorProto> values) {
+        if (fieldBuilder_ == null) {
+          ensureFieldIsMutable();
+          super.addAll(values, field_);
+          onChanged();
+        } else {
+          fieldBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearField() {
+        if (fieldBuilder_ == null) {
+          field_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000002);
+          onChanged();
+        } else {
+          fieldBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeField(int index) {
+        if (fieldBuilder_ == null) {
+          ensureFieldIsMutable();
+          field_.remove(index);
+          onChanged();
+        } else {
+          fieldBuilder_.remove(index);
+        }
+        return this;
+      }
+      public com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder getFieldBuilder(
+          int index) {
+        return getFieldFieldBuilder().getBuilder(index);
+      }
+      public com.google.protobuf.DescriptorProtos.FieldDescriptorProtoOrBuilder getFieldOrBuilder(
+          int index) {
+        if (fieldBuilder_ == null) {
+          return field_.get(index);  } else {
+          return fieldBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends com.google.protobuf.DescriptorProtos.FieldDescriptorProtoOrBuilder> 
+           getFieldOrBuilderList() {
+        if (fieldBuilder_ != null) {
+          return fieldBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(field_);
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder addFieldBuilder() {
+        return getFieldFieldBuilder().addBuilder(
+            com.google.protobuf.DescriptorProtos.FieldDescriptorProto.getDefaultInstance());
+      }
+      public com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder addFieldBuilder(
+          int index) {
+        return getFieldFieldBuilder().addBuilder(
+            index, com.google.protobuf.DescriptorProtos.FieldDescriptorProto.getDefaultInstance());
+      }
+      public java.util.List<com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder> 
+           getFieldBuilderList() {
+        return getFieldFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.FieldDescriptorProto, com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder, com.google.protobuf.DescriptorProtos.FieldDescriptorProtoOrBuilder> 
+          getFieldFieldBuilder() {
+        if (fieldBuilder_ == null) {
+          fieldBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              com.google.protobuf.DescriptorProtos.FieldDescriptorProto, com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder, com.google.protobuf.DescriptorProtos.FieldDescriptorProtoOrBuilder>(
+                  field_,
+                  ((bitField0_ & 0x00000002) == 0x00000002),
+                  getParentForChildren(),
+                  isClean());
+          field_ = null;
+        }
+        return fieldBuilder_;
+      }
+      
+      // repeated .google.protobuf.FieldDescriptorProto extension = 6;
+      private java.util.List<com.google.protobuf.DescriptorProtos.FieldDescriptorProto> extension_ =
+        java.util.Collections.emptyList();
+      private void ensureExtensionIsMutable() {
+        if (!((bitField0_ & 0x00000004) == 0x00000004)) {
+          extension_ = new java.util.ArrayList<com.google.protobuf.DescriptorProtos.FieldDescriptorProto>(extension_);
+          bitField0_ |= 0x00000004;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.FieldDescriptorProto, com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder, com.google.protobuf.DescriptorProtos.FieldDescriptorProtoOrBuilder> extensionBuilder_;
+      
+      public java.util.List<com.google.protobuf.DescriptorProtos.FieldDescriptorProto> getExtensionList() {
+        if (extensionBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(extension_);
+        } else {
+          return extensionBuilder_.getMessageList();
+        }
+      }
+      public int getExtensionCount() {
+        if (extensionBuilder_ == null) {
+          return extension_.size();
+        } else {
+          return extensionBuilder_.getCount();
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.FieldDescriptorProto getExtension(int index) {
+        if (extensionBuilder_ == null) {
+          return extension_.get(index);
+        } else {
+          return extensionBuilder_.getMessage(index);
+        }
+      }
+      public Builder setExtension(
+          int index, com.google.protobuf.DescriptorProtos.FieldDescriptorProto value) {
+        if (extensionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureExtensionIsMutable();
+          extension_.set(index, value);
+          onChanged();
+        } else {
+          extensionBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setExtension(
+          int index, com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder builderForValue) {
+        if (extensionBuilder_ == null) {
+          ensureExtensionIsMutable();
+          extension_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          extensionBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addExtension(com.google.protobuf.DescriptorProtos.FieldDescriptorProto value) {
+        if (extensionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureExtensionIsMutable();
+          extension_.add(value);
+          onChanged();
+        } else {
+          extensionBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addExtension(
+          int index, com.google.protobuf.DescriptorProtos.FieldDescriptorProto value) {
+        if (extensionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureExtensionIsMutable();
+          extension_.add(index, value);
+          onChanged();
+        } else {
+          extensionBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addExtension(
+          com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder builderForValue) {
+        if (extensionBuilder_ == null) {
+          ensureExtensionIsMutable();
+          extension_.add(builderForValue.build());
+          onChanged();
+        } else {
+          extensionBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addExtension(
+          int index, com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder builderForValue) {
+        if (extensionBuilder_ == null) {
+          ensureExtensionIsMutable();
+          extension_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          extensionBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllExtension(
+          java.lang.Iterable<? extends com.google.protobuf.DescriptorProtos.FieldDescriptorProto> values) {
+        if (extensionBuilder_ == null) {
+          ensureExtensionIsMutable();
+          super.addAll(values, extension_);
+          onChanged();
+        } else {
+          extensionBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearExtension() {
+        if (extensionBuilder_ == null) {
+          extension_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000004);
+          onChanged();
+        } else {
+          extensionBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeExtension(int index) {
+        if (extensionBuilder_ == null) {
+          ensureExtensionIsMutable();
+          extension_.remove(index);
+          onChanged();
+        } else {
+          extensionBuilder_.remove(index);
+        }
+        return this;
+      }
+      public com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder getExtensionBuilder(
+          int index) {
+        return getExtensionFieldBuilder().getBuilder(index);
+      }
+      public com.google.protobuf.DescriptorProtos.FieldDescriptorProtoOrBuilder getExtensionOrBuilder(
+          int index) {
+        if (extensionBuilder_ == null) {
+          return extension_.get(index);  } else {
+          return extensionBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends com.google.protobuf.DescriptorProtos.FieldDescriptorProtoOrBuilder> 
+           getExtensionOrBuilderList() {
+        if (extensionBuilder_ != null) {
+          return extensionBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(extension_);
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder addExtensionBuilder() {
+        return getExtensionFieldBuilder().addBuilder(
+            com.google.protobuf.DescriptorProtos.FieldDescriptorProto.getDefaultInstance());
+      }
+      public com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder addExtensionBuilder(
+          int index) {
+        return getExtensionFieldBuilder().addBuilder(
+            index, com.google.protobuf.DescriptorProtos.FieldDescriptorProto.getDefaultInstance());
+      }
+      public java.util.List<com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder> 
+           getExtensionBuilderList() {
+        return getExtensionFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.FieldDescriptorProto, com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder, com.google.protobuf.DescriptorProtos.FieldDescriptorProtoOrBuilder> 
+          getExtensionFieldBuilder() {
+        if (extensionBuilder_ == null) {
+          extensionBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              com.google.protobuf.DescriptorProtos.FieldDescriptorProto, com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder, com.google.protobuf.DescriptorProtos.FieldDescriptorProtoOrBuilder>(
+                  extension_,
+                  ((bitField0_ & 0x00000004) == 0x00000004),
+                  getParentForChildren(),
+                  isClean());
+          extension_ = null;
+        }
+        return extensionBuilder_;
+      }
+      
+      // repeated .google.protobuf.DescriptorProto nested_type = 3;
+      private java.util.List<com.google.protobuf.DescriptorProtos.DescriptorProto> nestedType_ =
+        java.util.Collections.emptyList();
+      private void ensureNestedTypeIsMutable() {
+        if (!((bitField0_ & 0x00000008) == 0x00000008)) {
+          nestedType_ = new java.util.ArrayList<com.google.protobuf.DescriptorProtos.DescriptorProto>(nestedType_);
+          bitField0_ |= 0x00000008;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.DescriptorProto, com.google.protobuf.DescriptorProtos.DescriptorProto.Builder, com.google.protobuf.DescriptorProtos.DescriptorProtoOrBuilder> nestedTypeBuilder_;
+      
+      public java.util.List<com.google.protobuf.DescriptorProtos.DescriptorProto> getNestedTypeList() {
+        if (nestedTypeBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(nestedType_);
+        } else {
+          return nestedTypeBuilder_.getMessageList();
+        }
+      }
+      public int getNestedTypeCount() {
+        if (nestedTypeBuilder_ == null) {
+          return nestedType_.size();
+        } else {
+          return nestedTypeBuilder_.getCount();
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.DescriptorProto getNestedType(int index) {
+        if (nestedTypeBuilder_ == null) {
+          return nestedType_.get(index);
+        } else {
+          return nestedTypeBuilder_.getMessage(index);
+        }
+      }
+      public Builder setNestedType(
+          int index, com.google.protobuf.DescriptorProtos.DescriptorProto value) {
+        if (nestedTypeBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureNestedTypeIsMutable();
+          nestedType_.set(index, value);
+          onChanged();
+        } else {
+          nestedTypeBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setNestedType(
+          int index, com.google.protobuf.DescriptorProtos.DescriptorProto.Builder builderForValue) {
+        if (nestedTypeBuilder_ == null) {
+          ensureNestedTypeIsMutable();
+          nestedType_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          nestedTypeBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addNestedType(com.google.protobuf.DescriptorProtos.DescriptorProto value) {
+        if (nestedTypeBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureNestedTypeIsMutable();
+          nestedType_.add(value);
+          onChanged();
+        } else {
+          nestedTypeBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addNestedType(
+          int index, com.google.protobuf.DescriptorProtos.DescriptorProto value) {
+        if (nestedTypeBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureNestedTypeIsMutable();
+          nestedType_.add(index, value);
+          onChanged();
+        } else {
+          nestedTypeBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addNestedType(
+          com.google.protobuf.DescriptorProtos.DescriptorProto.Builder builderForValue) {
+        if (nestedTypeBuilder_ == null) {
+          ensureNestedTypeIsMutable();
+          nestedType_.add(builderForValue.build());
+          onChanged();
+        } else {
+          nestedTypeBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addNestedType(
+          int index, com.google.protobuf.DescriptorProtos.DescriptorProto.Builder builderForValue) {
+        if (nestedTypeBuilder_ == null) {
+          ensureNestedTypeIsMutable();
+          nestedType_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          nestedTypeBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllNestedType(
+          java.lang.Iterable<? extends com.google.protobuf.DescriptorProtos.DescriptorProto> values) {
+        if (nestedTypeBuilder_ == null) {
+          ensureNestedTypeIsMutable();
+          super.addAll(values, nestedType_);
+          onChanged();
+        } else {
+          nestedTypeBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearNestedType() {
+        if (nestedTypeBuilder_ == null) {
+          nestedType_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000008);
+          onChanged();
+        } else {
+          nestedTypeBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeNestedType(int index) {
+        if (nestedTypeBuilder_ == null) {
+          ensureNestedTypeIsMutable();
+          nestedType_.remove(index);
+          onChanged();
+        } else {
+          nestedTypeBuilder_.remove(index);
+        }
+        return this;
+      }
+      public com.google.protobuf.DescriptorProtos.DescriptorProto.Builder getNestedTypeBuilder(
+          int index) {
+        return getNestedTypeFieldBuilder().getBuilder(index);
+      }
+      public com.google.protobuf.DescriptorProtos.DescriptorProtoOrBuilder getNestedTypeOrBuilder(
+          int index) {
+        if (nestedTypeBuilder_ == null) {
+          return nestedType_.get(index);  } else {
+          return nestedTypeBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends com.google.protobuf.DescriptorProtos.DescriptorProtoOrBuilder> 
+           getNestedTypeOrBuilderList() {
+        if (nestedTypeBuilder_ != null) {
+          return nestedTypeBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(nestedType_);
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.DescriptorProto.Builder addNestedTypeBuilder() {
+        return getNestedTypeFieldBuilder().addBuilder(
+            com.google.protobuf.DescriptorProtos.DescriptorProto.getDefaultInstance());
+      }
+      public com.google.protobuf.DescriptorProtos.DescriptorProto.Builder addNestedTypeBuilder(
+          int index) {
+        return getNestedTypeFieldBuilder().addBuilder(
+            index, com.google.protobuf.DescriptorProtos.DescriptorProto.getDefaultInstance());
+      }
+      public java.util.List<com.google.protobuf.DescriptorProtos.DescriptorProto.Builder> 
+           getNestedTypeBuilderList() {
+        return getNestedTypeFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.DescriptorProto, com.google.protobuf.DescriptorProtos.DescriptorProto.Builder, com.google.protobuf.DescriptorProtos.DescriptorProtoOrBuilder> 
+          getNestedTypeFieldBuilder() {
+        if (nestedTypeBuilder_ == null) {
+          nestedTypeBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              com.google.protobuf.DescriptorProtos.DescriptorProto, com.google.protobuf.DescriptorProtos.DescriptorProto.Builder, com.google.protobuf.DescriptorProtos.DescriptorProtoOrBuilder>(
+                  nestedType_,
+                  ((bitField0_ & 0x00000008) == 0x00000008),
+                  getParentForChildren(),
+                  isClean());
+          nestedType_ = null;
+        }
+        return nestedTypeBuilder_;
+      }
+      
+      // repeated .google.protobuf.EnumDescriptorProto enum_type = 4;
+      private java.util.List<com.google.protobuf.DescriptorProtos.EnumDescriptorProto> enumType_ =
+        java.util.Collections.emptyList();
+      private void ensureEnumTypeIsMutable() {
+        if (!((bitField0_ & 0x00000010) == 0x00000010)) {
+          enumType_ = new java.util.ArrayList<com.google.protobuf.DescriptorProtos.EnumDescriptorProto>(enumType_);
+          bitField0_ |= 0x00000010;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.EnumDescriptorProto, com.google.protobuf.DescriptorProtos.EnumDescriptorProto.Builder, com.google.protobuf.DescriptorProtos.EnumDescriptorProtoOrBuilder> enumTypeBuilder_;
+      
+      public java.util.List<com.google.protobuf.DescriptorProtos.EnumDescriptorProto> getEnumTypeList() {
+        if (enumTypeBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(enumType_);
+        } else {
+          return enumTypeBuilder_.getMessageList();
+        }
+      }
+      public int getEnumTypeCount() {
+        if (enumTypeBuilder_ == null) {
+          return enumType_.size();
+        } else {
+          return enumTypeBuilder_.getCount();
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.EnumDescriptorProto getEnumType(int index) {
+        if (enumTypeBuilder_ == null) {
+          return enumType_.get(index);
+        } else {
+          return enumTypeBuilder_.getMessage(index);
+        }
+      }
+      public Builder setEnumType(
+          int index, com.google.protobuf.DescriptorProtos.EnumDescriptorProto value) {
+        if (enumTypeBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureEnumTypeIsMutable();
+          enumType_.set(index, value);
+          onChanged();
+        } else {
+          enumTypeBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setEnumType(
+          int index, com.google.protobuf.DescriptorProtos.EnumDescriptorProto.Builder builderForValue) {
+        if (enumTypeBuilder_ == null) {
+          ensureEnumTypeIsMutable();
+          enumType_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          enumTypeBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addEnumType(com.google.protobuf.DescriptorProtos.EnumDescriptorProto value) {
+        if (enumTypeBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureEnumTypeIsMutable();
+          enumType_.add(value);
+          onChanged();
+        } else {
+          enumTypeBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addEnumType(
+          int index, com.google.protobuf.DescriptorProtos.EnumDescriptorProto value) {
+        if (enumTypeBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureEnumTypeIsMutable();
+          enumType_.add(index, value);
+          onChanged();
+        } else {
+          enumTypeBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addEnumType(
+          com.google.protobuf.DescriptorProtos.EnumDescriptorProto.Builder builderForValue) {
+        if (enumTypeBuilder_ == null) {
+          ensureEnumTypeIsMutable();
+          enumType_.add(builderForValue.build());
+          onChanged();
+        } else {
+          enumTypeBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addEnumType(
+          int index, com.google.protobuf.DescriptorProtos.EnumDescriptorProto.Builder builderForValue) {
+        if (enumTypeBuilder_ == null) {
+          ensureEnumTypeIsMutable();
+          enumType_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          enumTypeBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllEnumType(
+          java.lang.Iterable<? extends com.google.protobuf.DescriptorProtos.EnumDescriptorProto> values) {
+        if (enumTypeBuilder_ == null) {
+          ensureEnumTypeIsMutable();
+          super.addAll(values, enumType_);
+          onChanged();
+        } else {
+          enumTypeBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearEnumType() {
+        if (enumTypeBuilder_ == null) {
+          enumType_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000010);
+          onChanged();
+        } else {
+          enumTypeBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeEnumType(int index) {
+        if (enumTypeBuilder_ == null) {
+          ensureEnumTypeIsMutable();
+          enumType_.remove(index);
+          onChanged();
+        } else {
+          enumTypeBuilder_.remove(index);
+        }
+        return this;
+      }
+      public com.google.protobuf.DescriptorProtos.EnumDescriptorProto.Builder getEnumTypeBuilder(
+          int index) {
+        return getEnumTypeFieldBuilder().getBuilder(index);
+      }
+      public com.google.protobuf.DescriptorProtos.EnumDescriptorProtoOrBuilder getEnumTypeOrBuilder(
+          int index) {
+        if (enumTypeBuilder_ == null) {
+          return enumType_.get(index);  } else {
+          return enumTypeBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends com.google.protobuf.DescriptorProtos.EnumDescriptorProtoOrBuilder> 
+           getEnumTypeOrBuilderList() {
+        if (enumTypeBuilder_ != null) {
+          return enumTypeBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(enumType_);
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.EnumDescriptorProto.Builder addEnumTypeBuilder() {
+        return getEnumTypeFieldBuilder().addBuilder(
+            com.google.protobuf.DescriptorProtos.EnumDescriptorProto.getDefaultInstance());
+      }
+      public com.google.protobuf.DescriptorProtos.EnumDescriptorProto.Builder addEnumTypeBuilder(
+          int index) {
+        return getEnumTypeFieldBuilder().addBuilder(
+            index, com.google.protobuf.DescriptorProtos.EnumDescriptorProto.getDefaultInstance());
+      }
+      public java.util.List<com.google.protobuf.DescriptorProtos.EnumDescriptorProto.Builder> 
+           getEnumTypeBuilderList() {
+        return getEnumTypeFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.EnumDescriptorProto, com.google.protobuf.DescriptorProtos.EnumDescriptorProto.Builder, com.google.protobuf.DescriptorProtos.EnumDescriptorProtoOrBuilder> 
+          getEnumTypeFieldBuilder() {
+        if (enumTypeBuilder_ == null) {
+          enumTypeBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              com.google.protobuf.DescriptorProtos.EnumDescriptorProto, com.google.protobuf.DescriptorProtos.EnumDescriptorProto.Builder, com.google.protobuf.DescriptorProtos.EnumDescriptorProtoOrBuilder>(
+                  enumType_,
+                  ((bitField0_ & 0x00000010) == 0x00000010),
+                  getParentForChildren(),
+                  isClean());
+          enumType_ = null;
+        }
+        return enumTypeBuilder_;
+      }
+      
+      // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;
+      private java.util.List<com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange> extensionRange_ =
+        java.util.Collections.emptyList();
+      private void ensureExtensionRangeIsMutable() {
+        if (!((bitField0_ & 0x00000020) == 0x00000020)) {
+          extensionRange_ = new java.util.ArrayList<com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange>(extensionRange_);
+          bitField0_ |= 0x00000020;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange, com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange.Builder, com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRangeOrBuilder> extensionRangeBuilder_;
+      
+      public java.util.List<com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange> getExtensionRangeList() {
+        if (extensionRangeBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(extensionRange_);
+        } else {
+          return extensionRangeBuilder_.getMessageList();
+        }
+      }
+      public int getExtensionRangeCount() {
+        if (extensionRangeBuilder_ == null) {
+          return extensionRange_.size();
+        } else {
+          return extensionRangeBuilder_.getCount();
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange getExtensionRange(int index) {
+        if (extensionRangeBuilder_ == null) {
+          return extensionRange_.get(index);
+        } else {
+          return extensionRangeBuilder_.getMessage(index);
+        }
+      }
+      public Builder setExtensionRange(
+          int index, com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange value) {
+        if (extensionRangeBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureExtensionRangeIsMutable();
+          extensionRange_.set(index, value);
+          onChanged();
+        } else {
+          extensionRangeBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setExtensionRange(
+          int index, com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange.Builder builderForValue) {
+        if (extensionRangeBuilder_ == null) {
+          ensureExtensionRangeIsMutable();
+          extensionRange_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          extensionRangeBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addExtensionRange(com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange value) {
+        if (extensionRangeBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureExtensionRangeIsMutable();
+          extensionRange_.add(value);
+          onChanged();
+        } else {
+          extensionRangeBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addExtensionRange(
+          int index, com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange value) {
+        if (extensionRangeBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureExtensionRangeIsMutable();
+          extensionRange_.add(index, value);
+          onChanged();
+        } else {
+          extensionRangeBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addExtensionRange(
+          com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange.Builder builderForValue) {
+        if (extensionRangeBuilder_ == null) {
+          ensureExtensionRangeIsMutable();
+          extensionRange_.add(builderForValue.build());
+          onChanged();
+        } else {
+          extensionRangeBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addExtensionRange(
+          int index, com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange.Builder builderForValue) {
+        if (extensionRangeBuilder_ == null) {
+          ensureExtensionRangeIsMutable();
+          extensionRange_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          extensionRangeBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllExtensionRange(
+          java.lang.Iterable<? extends com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange> values) {
+        if (extensionRangeBuilder_ == null) {
+          ensureExtensionRangeIsMutable();
+          super.addAll(values, extensionRange_);
+          onChanged();
+        } else {
+          extensionRangeBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearExtensionRange() {
+        if (extensionRangeBuilder_ == null) {
+          extensionRange_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000020);
+          onChanged();
+        } else {
+          extensionRangeBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeExtensionRange(int index) {
+        if (extensionRangeBuilder_ == null) {
+          ensureExtensionRangeIsMutable();
+          extensionRange_.remove(index);
+          onChanged();
+        } else {
+          extensionRangeBuilder_.remove(index);
+        }
+        return this;
+      }
+      public com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange.Builder getExtensionRangeBuilder(
+          int index) {
+        return getExtensionRangeFieldBuilder().getBuilder(index);
+      }
+      public com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRangeOrBuilder getExtensionRangeOrBuilder(
+          int index) {
+        if (extensionRangeBuilder_ == null) {
+          return extensionRange_.get(index);  } else {
+          return extensionRangeBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRangeOrBuilder> 
+           getExtensionRangeOrBuilderList() {
+        if (extensionRangeBuilder_ != null) {
+          return extensionRangeBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(extensionRange_);
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange.Builder addExtensionRangeBuilder() {
+        return getExtensionRangeFieldBuilder().addBuilder(
+            com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange.getDefaultInstance());
+      }
+      public com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange.Builder addExtensionRangeBuilder(
+          int index) {
+        return getExtensionRangeFieldBuilder().addBuilder(
+            index, com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange.getDefaultInstance());
+      }
+      public java.util.List<com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange.Builder> 
+           getExtensionRangeBuilderList() {
+        return getExtensionRangeFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange, com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange.Builder, com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRangeOrBuilder> 
+          getExtensionRangeFieldBuilder() {
+        if (extensionRangeBuilder_ == null) {
+          extensionRangeBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange, com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange.Builder, com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRangeOrBuilder>(
+                  extensionRange_,
+                  ((bitField0_ & 0x00000020) == 0x00000020),
+                  getParentForChildren(),
+                  isClean());
+          extensionRange_ = null;
+        }
+        return extensionRangeBuilder_;
+      }
+      
+      // optional .google.protobuf.MessageOptions options = 7;
+      private com.google.protobuf.DescriptorProtos.MessageOptions options_ = com.google.protobuf.DescriptorProtos.MessageOptions.getDefaultInstance();
+      private com.google.protobuf.SingleFieldBuilder<
+          com.google.protobuf.DescriptorProtos.MessageOptions, com.google.protobuf.DescriptorProtos.MessageOptions.Builder, com.google.protobuf.DescriptorProtos.MessageOptionsOrBuilder> optionsBuilder_;
+      public boolean hasOptions() {
+        return ((bitField0_ & 0x00000040) == 0x00000040);
+      }
+      public com.google.protobuf.DescriptorProtos.MessageOptions getOptions() {
+        if (optionsBuilder_ == null) {
+          return options_;
+        } else {
+          return optionsBuilder_.getMessage();
+        }
+      }
+      public Builder setOptions(com.google.protobuf.DescriptorProtos.MessageOptions value) {
+        if (optionsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          options_ = value;
+          onChanged();
+        } else {
+          optionsBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000040;
+        return this;
+      }
+      public Builder setOptions(
+          com.google.protobuf.DescriptorProtos.MessageOptions.Builder builderForValue) {
+        if (optionsBuilder_ == null) {
+          options_ = builderForValue.build();
+          onChanged();
+        } else {
+          optionsBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000040;
+        return this;
+      }
+      public Builder mergeOptions(com.google.protobuf.DescriptorProtos.MessageOptions value) {
+        if (optionsBuilder_ == null) {
+          if (((bitField0_ & 0x00000040) == 0x00000040) &&
+              options_ != com.google.protobuf.DescriptorProtos.MessageOptions.getDefaultInstance()) {
+            options_ =
+              com.google.protobuf.DescriptorProtos.MessageOptions.newBuilder(options_).mergeFrom(value).buildPartial();
+          } else {
+            options_ = value;
+          }
+          onChanged();
+        } else {
+          optionsBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000040;
+        return this;
+      }
+      public Builder clearOptions() {
+        if (optionsBuilder_ == null) {
+          options_ = com.google.protobuf.DescriptorProtos.MessageOptions.getDefaultInstance();
+          onChanged();
+        } else {
+          optionsBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000040);
+        return this;
+      }
+      public com.google.protobuf.DescriptorProtos.MessageOptions.Builder getOptionsBuilder() {
+        bitField0_ |= 0x00000040;
+        onChanged();
+        return getOptionsFieldBuilder().getBuilder();
+      }
+      public com.google.protobuf.DescriptorProtos.MessageOptionsOrBuilder getOptionsOrBuilder() {
+        if (optionsBuilder_ != null) {
+          return optionsBuilder_.getMessageOrBuilder();
+        } else {
+          return options_;
+        }
+      }
+      private com.google.protobuf.SingleFieldBuilder<
+          com.google.protobuf.DescriptorProtos.MessageOptions, com.google.protobuf.DescriptorProtos.MessageOptions.Builder, com.google.protobuf.DescriptorProtos.MessageOptionsOrBuilder> 
+          getOptionsFieldBuilder() {
+        if (optionsBuilder_ == null) {
+          optionsBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+              com.google.protobuf.DescriptorProtos.MessageOptions, com.google.protobuf.DescriptorProtos.MessageOptions.Builder, com.google.protobuf.DescriptorProtos.MessageOptionsOrBuilder>(
+                  options_,
+                  getParentForChildren(),
+                  isClean());
+          options_ = null;
+        }
+        return optionsBuilder_;
+      }
+      
+      // @@protoc_insertion_point(builder_scope:google.protobuf.DescriptorProto)
+    }
+    
+    static {
+      defaultInstance = new DescriptorProto(true);
+      defaultInstance.initFields();
+    }
+    
+    // @@protoc_insertion_point(class_scope:google.protobuf.DescriptorProto)
+  }
+  
+  public interface FieldDescriptorProtoOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+    
+    // optional string name = 1;
+    boolean hasName();
+    String getName();
+    
+    // optional int32 number = 3;
+    boolean hasNumber();
+    int getNumber();
+    
+    // optional .google.protobuf.FieldDescriptorProto.Label label = 4;
+    boolean hasLabel();
+    com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Label getLabel();
+    
+    // optional .google.protobuf.FieldDescriptorProto.Type type = 5;
+    boolean hasType();
+    com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Type getType();
+    
+    // optional string type_name = 6;
+    boolean hasTypeName();
+    String getTypeName();
+    
+    // optional string extendee = 2;
+    boolean hasExtendee();
+    String getExtendee();
+    
+    // optional string default_value = 7;
+    boolean hasDefaultValue();
+    String getDefaultValue();
+    
+    // optional .google.protobuf.FieldOptions options = 8;
+    boolean hasOptions();
+    com.google.protobuf.DescriptorProtos.FieldOptions getOptions();
+    com.google.protobuf.DescriptorProtos.FieldOptionsOrBuilder getOptionsOrBuilder();
+  }
+  public static final class FieldDescriptorProto extends
+      com.google.protobuf.GeneratedMessage
+      implements FieldDescriptorProtoOrBuilder {
+    // Use FieldDescriptorProto.newBuilder() to construct.
+    private FieldDescriptorProto(Builder builder) {
+      super(builder);
+    }
+    private FieldDescriptorProto(boolean noInit) {}
+    
+    private static final FieldDescriptorProto defaultInstance;
+    public static FieldDescriptorProto getDefaultInstance() {
+      return defaultInstance;
+    }
+    
+    public FieldDescriptorProto getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+    
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_FieldDescriptorProto_descriptor;
+    }
+    
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_FieldDescriptorProto_fieldAccessorTable;
+    }
+    
+    public enum Type
+        implements com.google.protobuf.ProtocolMessageEnum {
+      TYPE_DOUBLE(0, 1),
+      TYPE_FLOAT(1, 2),
+      TYPE_INT64(2, 3),
+      TYPE_UINT64(3, 4),
+      TYPE_INT32(4, 5),
+      TYPE_FIXED64(5, 6),
+      TYPE_FIXED32(6, 7),
+      TYPE_BOOL(7, 8),
+      TYPE_STRING(8, 9),
+      TYPE_GROUP(9, 10),
+      TYPE_MESSAGE(10, 11),
+      TYPE_BYTES(11, 12),
+      TYPE_UINT32(12, 13),
+      TYPE_ENUM(13, 14),
+      TYPE_SFIXED32(14, 15),
+      TYPE_SFIXED64(15, 16),
+      TYPE_SINT32(16, 17),
+      TYPE_SINT64(17, 18),
+      ;
+      
+      public static final int TYPE_DOUBLE_VALUE = 1;
+      public static final int TYPE_FLOAT_VALUE = 2;
+      public static final int TYPE_INT64_VALUE = 3;
+      public static final int TYPE_UINT64_VALUE = 4;
+      public static final int TYPE_INT32_VALUE = 5;
+      public static final int TYPE_FIXED64_VALUE = 6;
+      public static final int TYPE_FIXED32_VALUE = 7;
+      public static final int TYPE_BOOL_VALUE = 8;
+      public static final int TYPE_STRING_VALUE = 9;
+      public static final int TYPE_GROUP_VALUE = 10;
+      public static final int TYPE_MESSAGE_VALUE = 11;
+      public static final int TYPE_BYTES_VALUE = 12;
+      public static final int TYPE_UINT32_VALUE = 13;
+      public static final int TYPE_ENUM_VALUE = 14;
+      public static final int TYPE_SFIXED32_VALUE = 15;
+      public static final int TYPE_SFIXED64_VALUE = 16;
+      public static final int TYPE_SINT32_VALUE = 17;
+      public static final int TYPE_SINT64_VALUE = 18;
+      
+      
+      public final int getNumber() { return value; }
+      
+      public static Type valueOf(int value) {
+        switch (value) {
+          case 1: return TYPE_DOUBLE;
+          case 2: return TYPE_FLOAT;
+          case 3: return TYPE_INT64;
+          case 4: return TYPE_UINT64;
+          case 5: return TYPE_INT32;
+          case 6: return TYPE_FIXED64;
+          case 7: return TYPE_FIXED32;
+          case 8: return TYPE_BOOL;
+          case 9: return TYPE_STRING;
+          case 10: return TYPE_GROUP;
+          case 11: return TYPE_MESSAGE;
+          case 12: return TYPE_BYTES;
+          case 13: return TYPE_UINT32;
+          case 14: return TYPE_ENUM;
+          case 15: return TYPE_SFIXED32;
+          case 16: return TYPE_SFIXED64;
+          case 17: return TYPE_SINT32;
+          case 18: return TYPE_SINT64;
+          default: return null;
+        }
+      }
+      
+      public static com.google.protobuf.Internal.EnumLiteMap<Type>
+          internalGetValueMap() {
+        return internalValueMap;
+      }
+      private static com.google.protobuf.Internal.EnumLiteMap<Type>
+          internalValueMap =
+            new com.google.protobuf.Internal.EnumLiteMap<Type>() {
+              public Type findValueByNumber(int number) {
+                return Type.valueOf(number);
+              }
+            };
+      
+      public final com.google.protobuf.Descriptors.EnumValueDescriptor
+          getValueDescriptor() {
+        return getDescriptor().getValues().get(index);
+      }
+      public final com.google.protobuf.Descriptors.EnumDescriptor
+          getDescriptorForType() {
+        return getDescriptor();
+      }
+      public static final com.google.protobuf.Descriptors.EnumDescriptor
+          getDescriptor() {
+        return com.google.protobuf.DescriptorProtos.FieldDescriptorProto.getDescriptor().getEnumTypes().get(0);
+      }
+      
+      private static final Type[] VALUES = {
+        TYPE_DOUBLE, TYPE_FLOAT, TYPE_INT64, TYPE_UINT64, TYPE_INT32, TYPE_FIXED64, TYPE_FIXED32, TYPE_BOOL, TYPE_STRING, TYPE_GROUP, TYPE_MESSAGE, TYPE_BYTES, TYPE_UINT32, TYPE_ENUM, TYPE_SFIXED32, TYPE_SFIXED64, TYPE_SINT32, TYPE_SINT64, 
+      };
+      
+      public static Type valueOf(
+          com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+        if (desc.getType() != getDescriptor()) {
+          throw new java.lang.IllegalArgumentException(
+            "EnumValueDescriptor is not for this type.");
+        }
+        return VALUES[desc.getIndex()];
+      }
+      
+      private final int index;
+      private final int value;
+      
+      private Type(int index, int value) {
+        this.index = index;
+        this.value = value;
+      }
+      
+      // @@protoc_insertion_point(enum_scope:google.protobuf.FieldDescriptorProto.Type)
+    }
+    
+    public enum Label
+        implements com.google.protobuf.ProtocolMessageEnum {
+      LABEL_OPTIONAL(0, 1),
+      LABEL_REQUIRED(1, 2),
+      LABEL_REPEATED(2, 3),
+      ;
+      
+      public static final int LABEL_OPTIONAL_VALUE = 1;
+      public static final int LABEL_REQUIRED_VALUE = 2;
+      public static final int LABEL_REPEATED_VALUE = 3;
+      
+      
+      public final int getNumber() { return value; }
+      
+      public static Label valueOf(int value) {
+        switch (value) {
+          case 1: return LABEL_OPTIONAL;
+          case 2: return LABEL_REQUIRED;
+          case 3: return LABEL_REPEATED;
+          default: return null;
+        }
+      }
+      
+      public static com.google.protobuf.Internal.EnumLiteMap<Label>
+          internalGetValueMap() {
+        return internalValueMap;
+      }
+      private static com.google.protobuf.Internal.EnumLiteMap<Label>
+          internalValueMap =
+            new com.google.protobuf.Internal.EnumLiteMap<Label>() {
+              public Label findValueByNumber(int number) {
+                return Label.valueOf(number);
+              }
+            };
+      
+      public final com.google.protobuf.Descriptors.EnumValueDescriptor
+          getValueDescriptor() {
+        return getDescriptor().getValues().get(index);
+      }
+      public final com.google.protobuf.Descriptors.EnumDescriptor
+          getDescriptorForType() {
+        return getDescriptor();
+      }
+      public static final com.google.protobuf.Descriptors.EnumDescriptor
+          getDescriptor() {
+        return com.google.protobuf.DescriptorProtos.FieldDescriptorProto.getDescriptor().getEnumTypes().get(1);
+      }
+      
+      private static final Label[] VALUES = {
+        LABEL_OPTIONAL, LABEL_REQUIRED, LABEL_REPEATED, 
+      };
+      
+      public static Label valueOf(
+          com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+        if (desc.getType() != getDescriptor()) {
+          throw new java.lang.IllegalArgumentException(
+            "EnumValueDescriptor is not for this type.");
+        }
+        return VALUES[desc.getIndex()];
+      }
+      
+      private final int index;
+      private final int value;
+      
+      private Label(int index, int value) {
+        this.index = index;
+        this.value = value;
+      }
+      
+      // @@protoc_insertion_point(enum_scope:google.protobuf.FieldDescriptorProto.Label)
+    }
+    
+    private int bitField0_;
+    // optional string name = 1;
+    public static final int NAME_FIELD_NUMBER = 1;
+    private java.lang.Object name_;
+    public boolean hasName() {
+      return ((bitField0_ & 0x00000001) == 0x00000001);
+    }
+    public String getName() {
+      java.lang.Object ref = name_;
+      if (ref instanceof String) {
+        return (String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        String s = bs.toStringUtf8();
+        if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+          name_ = s;
+        }
+        return s;
+      }
+    }
+    private com.google.protobuf.ByteString getNameBytes() {
+      java.lang.Object ref = name_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+        name_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    
+    // optional int32 number = 3;
+    public static final int NUMBER_FIELD_NUMBER = 3;
+    private int number_;
+    public boolean hasNumber() {
+      return ((bitField0_ & 0x00000002) == 0x00000002);
+    }
+    public int getNumber() {
+      return number_;
+    }
+    
+    // optional .google.protobuf.FieldDescriptorProto.Label label = 4;
+    public static final int LABEL_FIELD_NUMBER = 4;
+    private com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Label label_;
+    public boolean hasLabel() {
+      return ((bitField0_ & 0x00000004) == 0x00000004);
+    }
+    public com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Label getLabel() {
+      return label_;
+    }
+    
+    // optional .google.protobuf.FieldDescriptorProto.Type type = 5;
+    public static final int TYPE_FIELD_NUMBER = 5;
+    private com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Type type_;
+    public boolean hasType() {
+      return ((bitField0_ & 0x00000008) == 0x00000008);
+    }
+    public com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Type getType() {
+      return type_;
+    }
+    
+    // optional string type_name = 6;
+    public static final int TYPE_NAME_FIELD_NUMBER = 6;
+    private java.lang.Object typeName_;
+    public boolean hasTypeName() {
+      return ((bitField0_ & 0x00000010) == 0x00000010);
+    }
+    public String getTypeName() {
+      java.lang.Object ref = typeName_;
+      if (ref instanceof String) {
+        return (String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        String s = bs.toStringUtf8();
+        if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+          typeName_ = s;
+        }
+        return s;
+      }
+    }
+    private com.google.protobuf.ByteString getTypeNameBytes() {
+      java.lang.Object ref = typeName_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+        typeName_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    
+    // optional string extendee = 2;
+    public static final int EXTENDEE_FIELD_NUMBER = 2;
+    private java.lang.Object extendee_;
+    public boolean hasExtendee() {
+      return ((bitField0_ & 0x00000020) == 0x00000020);
+    }
+    public String getExtendee() {
+      java.lang.Object ref = extendee_;
+      if (ref instanceof String) {
+        return (String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        String s = bs.toStringUtf8();
+        if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+          extendee_ = s;
+        }
+        return s;
+      }
+    }
+    private com.google.protobuf.ByteString getExtendeeBytes() {
+      java.lang.Object ref = extendee_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+        extendee_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    
+    // optional string default_value = 7;
+    public static final int DEFAULT_VALUE_FIELD_NUMBER = 7;
+    private java.lang.Object defaultValue_;
+    public boolean hasDefaultValue() {
+      return ((bitField0_ & 0x00000040) == 0x00000040);
+    }
+    public String getDefaultValue() {
+      java.lang.Object ref = defaultValue_;
+      if (ref instanceof String) {
+        return (String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        String s = bs.toStringUtf8();
+        if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+          defaultValue_ = s;
+        }
+        return s;
+      }
+    }
+    private com.google.protobuf.ByteString getDefaultValueBytes() {
+      java.lang.Object ref = defaultValue_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+        defaultValue_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    
+    // optional .google.protobuf.FieldOptions options = 8;
+    public static final int OPTIONS_FIELD_NUMBER = 8;
+    private com.google.protobuf.DescriptorProtos.FieldOptions options_;
+    public boolean hasOptions() {
+      return ((bitField0_ & 0x00000080) == 0x00000080);
+    }
+    public com.google.protobuf.DescriptorProtos.FieldOptions getOptions() {
+      return options_;
+    }
+    public com.google.protobuf.DescriptorProtos.FieldOptionsOrBuilder getOptionsOrBuilder() {
+      return options_;
+    }
+    
+    private void initFields() {
+      name_ = "";
+      number_ = 0;
+      label_ = com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Label.LABEL_OPTIONAL;
+      type_ = com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Type.TYPE_DOUBLE;
+      typeName_ = "";
+      extendee_ = "";
+      defaultValue_ = "";
+      options_ = com.google.protobuf.DescriptorProtos.FieldOptions.getDefaultInstance();
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+      
+      if (hasOptions()) {
+        if (!getOptions().isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+    
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        output.writeBytes(1, getNameBytes());
+      }
+      if (((bitField0_ & 0x00000020) == 0x00000020)) {
+        output.writeBytes(2, getExtendeeBytes());
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        output.writeInt32(3, number_);
+      }
+      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+        output.writeEnum(4, label_.getNumber());
+      }
+      if (((bitField0_ & 0x00000008) == 0x00000008)) {
+        output.writeEnum(5, type_.getNumber());
+      }
+      if (((bitField0_ & 0x00000010) == 0x00000010)) {
+        output.writeBytes(6, getTypeNameBytes());
+      }
+      if (((bitField0_ & 0x00000040) == 0x00000040)) {
+        output.writeBytes(7, getDefaultValueBytes());
+      }
+      if (((bitField0_ & 0x00000080) == 0x00000080)) {
+        output.writeMessage(8, options_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+    
+      size = 0;
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(1, getNameBytes());
+      }
+      if (((bitField0_ & 0x00000020) == 0x00000020)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(2, getExtendeeBytes());
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeInt32Size(3, number_);
+      }
+      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeEnumSize(4, label_.getNumber());
+      }
+      if (((bitField0_ & 0x00000008) == 0x00000008)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeEnumSize(5, type_.getNumber());
+      }
+      if (((bitField0_ & 0x00000010) == 0x00000010)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(6, getTypeNameBytes());
+      }
+      if (((bitField0_ & 0x00000040) == 0x00000040)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(7, getDefaultValueBytes());
+      }
+      if (((bitField0_ & 0x00000080) == 0x00000080)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(8, options_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+    
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+    
+    public static com.google.protobuf.DescriptorProtos.FieldDescriptorProto parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FieldDescriptorProto parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FieldDescriptorProto parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FieldDescriptorProto parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FieldDescriptorProto parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FieldDescriptorProto parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FieldDescriptorProto parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.FieldDescriptorProto parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.FieldDescriptorProto parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FieldDescriptorProto parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(com.google.protobuf.DescriptorProtos.FieldDescriptorProto prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+    
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements com.google.protobuf.DescriptorProtos.FieldDescriptorProtoOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_FieldDescriptorProto_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_FieldDescriptorProto_fieldAccessorTable;
+      }
+      
+      // Construct using com.google.protobuf.DescriptorProtos.FieldDescriptorProto.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+      
+      private Builder(BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          getOptionsFieldBuilder();
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+      
+      public Builder clear() {
+        super.clear();
+        name_ = "";
+        bitField0_ = (bitField0_ & ~0x00000001);
+        number_ = 0;
+        bitField0_ = (bitField0_ & ~0x00000002);
+        label_ = com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Label.LABEL_OPTIONAL;
+        bitField0_ = (bitField0_ & ~0x00000004);
+        type_ = com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Type.TYPE_DOUBLE;
+        bitField0_ = (bitField0_ & ~0x00000008);
+        typeName_ = "";
+        bitField0_ = (bitField0_ & ~0x00000010);
+        extendee_ = "";
+        bitField0_ = (bitField0_ & ~0x00000020);
+        defaultValue_ = "";
+        bitField0_ = (bitField0_ & ~0x00000040);
+        if (optionsBuilder_ == null) {
+          options_ = com.google.protobuf.DescriptorProtos.FieldOptions.getDefaultInstance();
+        } else {
+          optionsBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000080);
+        return this;
+      }
+      
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+      
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return com.google.protobuf.DescriptorProtos.FieldDescriptorProto.getDescriptor();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.FieldDescriptorProto getDefaultInstanceForType() {
+        return com.google.protobuf.DescriptorProtos.FieldDescriptorProto.getDefaultInstance();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.FieldDescriptorProto build() {
+        com.google.protobuf.DescriptorProtos.FieldDescriptorProto result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+      
+      private com.google.protobuf.DescriptorProtos.FieldDescriptorProto buildParsed()
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.DescriptorProtos.FieldDescriptorProto result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(
+            result).asInvalidProtocolBufferException();
+        }
+        return result;
+      }
+      
+      public com.google.protobuf.DescriptorProtos.FieldDescriptorProto buildPartial() {
+        com.google.protobuf.DescriptorProtos.FieldDescriptorProto result = new com.google.protobuf.DescriptorProtos.FieldDescriptorProto(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+          to_bitField0_ |= 0x00000001;
+        }
+        result.name_ = name_;
+        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+          to_bitField0_ |= 0x00000002;
+        }
+        result.number_ = number_;
+        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
+          to_bitField0_ |= 0x00000004;
+        }
+        result.label_ = label_;
+        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
+          to_bitField0_ |= 0x00000008;
+        }
+        result.type_ = type_;
+        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
+          to_bitField0_ |= 0x00000010;
+        }
+        result.typeName_ = typeName_;
+        if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
+          to_bitField0_ |= 0x00000020;
+        }
+        result.extendee_ = extendee_;
+        if (((from_bitField0_ & 0x00000040) == 0x00000040)) {
+          to_bitField0_ |= 0x00000040;
+        }
+        result.defaultValue_ = defaultValue_;
+        if (((from_bitField0_ & 0x00000080) == 0x00000080)) {
+          to_bitField0_ |= 0x00000080;
+        }
+        if (optionsBuilder_ == null) {
+          result.options_ = options_;
+        } else {
+          result.options_ = optionsBuilder_.build();
+        }
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof com.google.protobuf.DescriptorProtos.FieldDescriptorProto) {
+          return mergeFrom((com.google.protobuf.DescriptorProtos.FieldDescriptorProto)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.DescriptorProtos.FieldDescriptorProto other) {
+        if (other == com.google.protobuf.DescriptorProtos.FieldDescriptorProto.getDefaultInstance()) return this;
+        if (other.hasName()) {
+          setName(other.getName());
+        }
+        if (other.hasNumber()) {
+          setNumber(other.getNumber());
+        }
+        if (other.hasLabel()) {
+          setLabel(other.getLabel());
+        }
+        if (other.hasType()) {
+          setType(other.getType());
+        }
+        if (other.hasTypeName()) {
+          setTypeName(other.getTypeName());
+        }
+        if (other.hasExtendee()) {
+          setExtendee(other.getExtendee());
+        }
+        if (other.hasDefaultValue()) {
+          setDefaultValue(other.getDefaultValue());
+        }
+        if (other.hasOptions()) {
+          mergeOptions(other.getOptions());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+      
+      public final boolean isInitialized() {
+        if (hasOptions()) {
+          if (!getOptions().isInitialized()) {
+            
+            return false;
+          }
+        }
+        return true;
+      }
+      
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder(
+            this.getUnknownFields());
+        while (true) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              this.setUnknownFields(unknownFields.build());
+              onChanged();
+              return this;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              }
+              break;
+            }
+            case 10: {
+              bitField0_ |= 0x00000001;
+              name_ = input.readBytes();
+              break;
+            }
+            case 18: {
+              bitField0_ |= 0x00000020;
+              extendee_ = input.readBytes();
+              break;
+            }
+            case 24: {
+              bitField0_ |= 0x00000002;
+              number_ = input.readInt32();
+              break;
+            }
+            case 32: {
+              int rawValue = input.readEnum();
+              com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Label value = com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Label.valueOf(rawValue);
+              if (value == null) {
+                unknownFields.mergeVarintField(4, rawValue);
+              } else {
+                bitField0_ |= 0x00000004;
+                label_ = value;
+              }
+              break;
+            }
+            case 40: {
+              int rawValue = input.readEnum();
+              com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Type value = com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Type.valueOf(rawValue);
+              if (value == null) {
+                unknownFields.mergeVarintField(5, rawValue);
+              } else {
+                bitField0_ |= 0x00000008;
+                type_ = value;
+              }
+              break;
+            }
+            case 50: {
+              bitField0_ |= 0x00000010;
+              typeName_ = input.readBytes();
+              break;
+            }
+            case 58: {
+              bitField0_ |= 0x00000040;
+              defaultValue_ = input.readBytes();
+              break;
+            }
+            case 66: {
+              com.google.protobuf.DescriptorProtos.FieldOptions.Builder subBuilder = com.google.protobuf.DescriptorProtos.FieldOptions.newBuilder();
+              if (hasOptions()) {
+                subBuilder.mergeFrom(getOptions());
+              }
+              input.readMessage(subBuilder, extensionRegistry);
+              setOptions(subBuilder.buildPartial());
+              break;
+            }
+          }
+        }
+      }
+      
+      private int bitField0_;
+      
+      // optional string name = 1;
+      private java.lang.Object name_ = "";
+      public boolean hasName() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      public String getName() {
+        java.lang.Object ref = name_;
+        if (!(ref instanceof String)) {
+          String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+          name_ = s;
+          return s;
+        } else {
+          return (String) ref;
+        }
+      }
+      public Builder setName(String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+        name_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearName() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        name_ = getDefaultInstance().getName();
+        onChanged();
+        return this;
+      }
+      void setName(com.google.protobuf.ByteString value) {
+        bitField0_ |= 0x00000001;
+        name_ = value;
+        onChanged();
+      }
+      
+      // optional int32 number = 3;
+      private int number_ ;
+      public boolean hasNumber() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      public int getNumber() {
+        return number_;
+      }
+      public Builder setNumber(int value) {
+        bitField0_ |= 0x00000002;
+        number_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearNumber() {
+        bitField0_ = (bitField0_ & ~0x00000002);
+        number_ = 0;
+        onChanged();
+        return this;
+      }
+      
+      // optional .google.protobuf.FieldDescriptorProto.Label label = 4;
+      private com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Label label_ = com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Label.LABEL_OPTIONAL;
+      public boolean hasLabel() {
+        return ((bitField0_ & 0x00000004) == 0x00000004);
+      }
+      public com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Label getLabel() {
+        return label_;
+      }
+      public Builder setLabel(com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Label value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        bitField0_ |= 0x00000004;
+        label_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearLabel() {
+        bitField0_ = (bitField0_ & ~0x00000004);
+        label_ = com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Label.LABEL_OPTIONAL;
+        onChanged();
+        return this;
+      }
+      
+      // optional .google.protobuf.FieldDescriptorProto.Type type = 5;
+      private com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Type type_ = com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Type.TYPE_DOUBLE;
+      public boolean hasType() {
+        return ((bitField0_ & 0x00000008) == 0x00000008);
+      }
+      public com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Type getType() {
+        return type_;
+      }
+      public Builder setType(com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Type value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        bitField0_ |= 0x00000008;
+        type_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearType() {
+        bitField0_ = (bitField0_ & ~0x00000008);
+        type_ = com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Type.TYPE_DOUBLE;
+        onChanged();
+        return this;
+      }
+      
+      // optional string type_name = 6;
+      private java.lang.Object typeName_ = "";
+      public boolean hasTypeName() {
+        return ((bitField0_ & 0x00000010) == 0x00000010);
+      }
+      public String getTypeName() {
+        java.lang.Object ref = typeName_;
+        if (!(ref instanceof String)) {
+          String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+          typeName_ = s;
+          return s;
+        } else {
+          return (String) ref;
+        }
+      }
+      public Builder setTypeName(String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000010;
+        typeName_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearTypeName() {
+        bitField0_ = (bitField0_ & ~0x00000010);
+        typeName_ = getDefaultInstance().getTypeName();
+        onChanged();
+        return this;
+      }
+      void setTypeName(com.google.protobuf.ByteString value) {
+        bitField0_ |= 0x00000010;
+        typeName_ = value;
+        onChanged();
+      }
+      
+      // optional string extendee = 2;
+      private java.lang.Object extendee_ = "";
+      public boolean hasExtendee() {
+        return ((bitField0_ & 0x00000020) == 0x00000020);
+      }
+      public String getExtendee() {
+        java.lang.Object ref = extendee_;
+        if (!(ref instanceof String)) {
+          String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+          extendee_ = s;
+          return s;
+        } else {
+          return (String) ref;
+        }
+      }
+      public Builder setExtendee(String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000020;
+        extendee_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearExtendee() {
+        bitField0_ = (bitField0_ & ~0x00000020);
+        extendee_ = getDefaultInstance().getExtendee();
+        onChanged();
+        return this;
+      }
+      void setExtendee(com.google.protobuf.ByteString value) {
+        bitField0_ |= 0x00000020;
+        extendee_ = value;
+        onChanged();
+      }
+      
+      // optional string default_value = 7;
+      private java.lang.Object defaultValue_ = "";
+      public boolean hasDefaultValue() {
+        return ((bitField0_ & 0x00000040) == 0x00000040);
+      }
+      public String getDefaultValue() {
+        java.lang.Object ref = defaultValue_;
+        if (!(ref instanceof String)) {
+          String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+          defaultValue_ = s;
+          return s;
+        } else {
+          return (String) ref;
+        }
+      }
+      public Builder setDefaultValue(String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000040;
+        defaultValue_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearDefaultValue() {
+        bitField0_ = (bitField0_ & ~0x00000040);
+        defaultValue_ = getDefaultInstance().getDefaultValue();
+        onChanged();
+        return this;
+      }
+      void setDefaultValue(com.google.protobuf.ByteString value) {
+        bitField0_ |= 0x00000040;
+        defaultValue_ = value;
+        onChanged();
+      }
+      
+      // optional .google.protobuf.FieldOptions options = 8;
+      private com.google.protobuf.DescriptorProtos.FieldOptions options_ = com.google.protobuf.DescriptorProtos.FieldOptions.getDefaultInstance();
+      private com.google.protobuf.SingleFieldBuilder<
+          com.google.protobuf.DescriptorProtos.FieldOptions, com.google.protobuf.DescriptorProtos.FieldOptions.Builder, com.google.protobuf.DescriptorProtos.FieldOptionsOrBuilder> optionsBuilder_;
+      public boolean hasOptions() {
+        return ((bitField0_ & 0x00000080) == 0x00000080);
+      }
+      public com.google.protobuf.DescriptorProtos.FieldOptions getOptions() {
+        if (optionsBuilder_ == null) {
+          return options_;
+        } else {
+          return optionsBuilder_.getMessage();
+        }
+      }
+      public Builder setOptions(com.google.protobuf.DescriptorProtos.FieldOptions value) {
+        if (optionsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          options_ = value;
+          onChanged();
+        } else {
+          optionsBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000080;
+        return this;
+      }
+      public Builder setOptions(
+          com.google.protobuf.DescriptorProtos.FieldOptions.Builder builderForValue) {
+        if (optionsBuilder_ == null) {
+          options_ = builderForValue.build();
+          onChanged();
+        } else {
+          optionsBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000080;
+        return this;
+      }
+      public Builder mergeOptions(com.google.protobuf.DescriptorProtos.FieldOptions value) {
+        if (optionsBuilder_ == null) {
+          if (((bitField0_ & 0x00000080) == 0x00000080) &&
+              options_ != com.google.protobuf.DescriptorProtos.FieldOptions.getDefaultInstance()) {
+            options_ =
+              com.google.protobuf.DescriptorProtos.FieldOptions.newBuilder(options_).mergeFrom(value).buildPartial();
+          } else {
+            options_ = value;
+          }
+          onChanged();
+        } else {
+          optionsBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000080;
+        return this;
+      }
+      public Builder clearOptions() {
+        if (optionsBuilder_ == null) {
+          options_ = com.google.protobuf.DescriptorProtos.FieldOptions.getDefaultInstance();
+          onChanged();
+        } else {
+          optionsBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000080);
+        return this;
+      }
+      public com.google.protobuf.DescriptorProtos.FieldOptions.Builder getOptionsBuilder() {
+        bitField0_ |= 0x00000080;
+        onChanged();
+        return getOptionsFieldBuilder().getBuilder();
+      }
+      public com.google.protobuf.DescriptorProtos.FieldOptionsOrBuilder getOptionsOrBuilder() {
+        if (optionsBuilder_ != null) {
+          return optionsBuilder_.getMessageOrBuilder();
+        } else {
+          return options_;
+        }
+      }
+      private com.google.protobuf.SingleFieldBuilder<
+          com.google.protobuf.DescriptorProtos.FieldOptions, com.google.protobuf.DescriptorProtos.FieldOptions.Builder, com.google.protobuf.DescriptorProtos.FieldOptionsOrBuilder> 
+          getOptionsFieldBuilder() {
+        if (optionsBuilder_ == null) {
+          optionsBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+              com.google.protobuf.DescriptorProtos.FieldOptions, com.google.protobuf.DescriptorProtos.FieldOptions.Builder, com.google.protobuf.DescriptorProtos.FieldOptionsOrBuilder>(
+                  options_,
+                  getParentForChildren(),
+                  isClean());
+          options_ = null;
+        }
+        return optionsBuilder_;
+      }
+      
+      // @@protoc_insertion_point(builder_scope:google.protobuf.FieldDescriptorProto)
+    }
+    
+    static {
+      defaultInstance = new FieldDescriptorProto(true);
+      defaultInstance.initFields();
+    }
+    
+    // @@protoc_insertion_point(class_scope:google.protobuf.FieldDescriptorProto)
+  }
+  
+  public interface EnumDescriptorProtoOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+    
+    // optional string name = 1;
+    boolean hasName();
+    String getName();
+    
+    // repeated .google.protobuf.EnumValueDescriptorProto value = 2;
+    java.util.List<com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto> 
+        getValueList();
+    com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto getValue(int index);
+    int getValueCount();
+    java.util.List<? extends com.google.protobuf.DescriptorProtos.EnumValueDescriptorProtoOrBuilder> 
+        getValueOrBuilderList();
+    com.google.protobuf.DescriptorProtos.EnumValueDescriptorProtoOrBuilder getValueOrBuilder(
+        int index);
+    
+    // optional .google.protobuf.EnumOptions options = 3;
+    boolean hasOptions();
+    com.google.protobuf.DescriptorProtos.EnumOptions getOptions();
+    com.google.protobuf.DescriptorProtos.EnumOptionsOrBuilder getOptionsOrBuilder();
+  }
+  public static final class EnumDescriptorProto extends
+      com.google.protobuf.GeneratedMessage
+      implements EnumDescriptorProtoOrBuilder {
+    // Use EnumDescriptorProto.newBuilder() to construct.
+    private EnumDescriptorProto(Builder builder) {
+      super(builder);
+    }
+    private EnumDescriptorProto(boolean noInit) {}
+    
+    private static final EnumDescriptorProto defaultInstance;
+    public static EnumDescriptorProto getDefaultInstance() {
+      return defaultInstance;
+    }
+    
+    public EnumDescriptorProto getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+    
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_EnumDescriptorProto_descriptor;
+    }
+    
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_EnumDescriptorProto_fieldAccessorTable;
+    }
+    
+    private int bitField0_;
+    // optional string name = 1;
+    public static final int NAME_FIELD_NUMBER = 1;
+    private java.lang.Object name_;
+    public boolean hasName() {
+      return ((bitField0_ & 0x00000001) == 0x00000001);
+    }
+    public String getName() {
+      java.lang.Object ref = name_;
+      if (ref instanceof String) {
+        return (String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        String s = bs.toStringUtf8();
+        if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+          name_ = s;
+        }
+        return s;
+      }
+    }
+    private com.google.protobuf.ByteString getNameBytes() {
+      java.lang.Object ref = name_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+        name_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    
+    // repeated .google.protobuf.EnumValueDescriptorProto value = 2;
+    public static final int VALUE_FIELD_NUMBER = 2;
+    private java.util.List<com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto> value_;
+    public java.util.List<com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto> getValueList() {
+      return value_;
+    }
+    public java.util.List<? extends com.google.protobuf.DescriptorProtos.EnumValueDescriptorProtoOrBuilder> 
+        getValueOrBuilderList() {
+      return value_;
+    }
+    public int getValueCount() {
+      return value_.size();
+    }
+    public com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto getValue(int index) {
+      return value_.get(index);
+    }
+    public com.google.protobuf.DescriptorProtos.EnumValueDescriptorProtoOrBuilder getValueOrBuilder(
+        int index) {
+      return value_.get(index);
+    }
+    
+    // optional .google.protobuf.EnumOptions options = 3;
+    public static final int OPTIONS_FIELD_NUMBER = 3;
+    private com.google.protobuf.DescriptorProtos.EnumOptions options_;
+    public boolean hasOptions() {
+      return ((bitField0_ & 0x00000002) == 0x00000002);
+    }
+    public com.google.protobuf.DescriptorProtos.EnumOptions getOptions() {
+      return options_;
+    }
+    public com.google.protobuf.DescriptorProtos.EnumOptionsOrBuilder getOptionsOrBuilder() {
+      return options_;
+    }
+    
+    private void initFields() {
+      name_ = "";
+      value_ = java.util.Collections.emptyList();
+      options_ = com.google.protobuf.DescriptorProtos.EnumOptions.getDefaultInstance();
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+      
+      for (int i = 0; i < getValueCount(); i++) {
+        if (!getValue(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      if (hasOptions()) {
+        if (!getOptions().isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+    
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        output.writeBytes(1, getNameBytes());
+      }
+      for (int i = 0; i < value_.size(); i++) {
+        output.writeMessage(2, value_.get(i));
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        output.writeMessage(3, options_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+    
+      size = 0;
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(1, getNameBytes());
+      }
+      for (int i = 0; i < value_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(2, value_.get(i));
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(3, options_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+    
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+    
+    public static com.google.protobuf.DescriptorProtos.EnumDescriptorProto parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumDescriptorProto parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumDescriptorProto parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumDescriptorProto parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumDescriptorProto parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumDescriptorProto parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumDescriptorProto parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumDescriptorProto parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumDescriptorProto parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumDescriptorProto parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(com.google.protobuf.DescriptorProtos.EnumDescriptorProto prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+    
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements com.google.protobuf.DescriptorProtos.EnumDescriptorProtoOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_EnumDescriptorProto_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_EnumDescriptorProto_fieldAccessorTable;
+      }
+      
+      // Construct using com.google.protobuf.DescriptorProtos.EnumDescriptorProto.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+      
+      private Builder(BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          getValueFieldBuilder();
+          getOptionsFieldBuilder();
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+      
+      public Builder clear() {
+        super.clear();
+        name_ = "";
+        bitField0_ = (bitField0_ & ~0x00000001);
+        if (valueBuilder_ == null) {
+          value_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000002);
+        } else {
+          valueBuilder_.clear();
+        }
+        if (optionsBuilder_ == null) {
+          options_ = com.google.protobuf.DescriptorProtos.EnumOptions.getDefaultInstance();
+        } else {
+          optionsBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000004);
+        return this;
+      }
+      
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+      
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return com.google.protobuf.DescriptorProtos.EnumDescriptorProto.getDescriptor();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.EnumDescriptorProto getDefaultInstanceForType() {
+        return com.google.protobuf.DescriptorProtos.EnumDescriptorProto.getDefaultInstance();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.EnumDescriptorProto build() {
+        com.google.protobuf.DescriptorProtos.EnumDescriptorProto result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+      
+      private com.google.protobuf.DescriptorProtos.EnumDescriptorProto buildParsed()
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.DescriptorProtos.EnumDescriptorProto result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(
+            result).asInvalidProtocolBufferException();
+        }
+        return result;
+      }
+      
+      public com.google.protobuf.DescriptorProtos.EnumDescriptorProto buildPartial() {
+        com.google.protobuf.DescriptorProtos.EnumDescriptorProto result = new com.google.protobuf.DescriptorProtos.EnumDescriptorProto(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+          to_bitField0_ |= 0x00000001;
+        }
+        result.name_ = name_;
+        if (valueBuilder_ == null) {
+          if (((bitField0_ & 0x00000002) == 0x00000002)) {
+            value_ = java.util.Collections.unmodifiableList(value_);
+            bitField0_ = (bitField0_ & ~0x00000002);
+          }
+          result.value_ = value_;
+        } else {
+          result.value_ = valueBuilder_.build();
+        }
+        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
+          to_bitField0_ |= 0x00000002;
+        }
+        if (optionsBuilder_ == null) {
+          result.options_ = options_;
+        } else {
+          result.options_ = optionsBuilder_.build();
+        }
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof com.google.protobuf.DescriptorProtos.EnumDescriptorProto) {
+          return mergeFrom((com.google.protobuf.DescriptorProtos.EnumDescriptorProto)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.DescriptorProtos.EnumDescriptorProto other) {
+        if (other == com.google.protobuf.DescriptorProtos.EnumDescriptorProto.getDefaultInstance()) return this;
+        if (other.hasName()) {
+          setName(other.getName());
+        }
+        if (valueBuilder_ == null) {
+          if (!other.value_.isEmpty()) {
+            if (value_.isEmpty()) {
+              value_ = other.value_;
+              bitField0_ = (bitField0_ & ~0x00000002);
+            } else {
+              ensureValueIsMutable();
+              value_.addAll(other.value_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.value_.isEmpty()) {
+            if (valueBuilder_.isEmpty()) {
+              valueBuilder_.dispose();
+              valueBuilder_ = null;
+              value_ = other.value_;
+              bitField0_ = (bitField0_ & ~0x00000002);
+              valueBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getValueFieldBuilder() : null;
+            } else {
+              valueBuilder_.addAllMessages(other.value_);
+            }
+          }
+        }
+        if (other.hasOptions()) {
+          mergeOptions(other.getOptions());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+      
+      public final boolean isInitialized() {
+        for (int i = 0; i < getValueCount(); i++) {
+          if (!getValue(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        if (hasOptions()) {
+          if (!getOptions().isInitialized()) {
+            
+            return false;
+          }
+        }
+        return true;
+      }
+      
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder(
+            this.getUnknownFields());
+        while (true) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              this.setUnknownFields(unknownFields.build());
+              onChanged();
+              return this;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              }
+              break;
+            }
+            case 10: {
+              bitField0_ |= 0x00000001;
+              name_ = input.readBytes();
+              break;
+            }
+            case 18: {
+              com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto.Builder subBuilder = com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addValue(subBuilder.buildPartial());
+              break;
+            }
+            case 26: {
+              com.google.protobuf.DescriptorProtos.EnumOptions.Builder subBuilder = com.google.protobuf.DescriptorProtos.EnumOptions.newBuilder();
+              if (hasOptions()) {
+                subBuilder.mergeFrom(getOptions());
+              }
+              input.readMessage(subBuilder, extensionRegistry);
+              setOptions(subBuilder.buildPartial());
+              break;
+            }
+          }
+        }
+      }
+      
+      private int bitField0_;
+      
+      // optional string name = 1;
+      private java.lang.Object name_ = "";
+      public boolean hasName() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      public String getName() {
+        java.lang.Object ref = name_;
+        if (!(ref instanceof String)) {
+          String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+          name_ = s;
+          return s;
+        } else {
+          return (String) ref;
+        }
+      }
+      public Builder setName(String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+        name_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearName() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        name_ = getDefaultInstance().getName();
+        onChanged();
+        return this;
+      }
+      void setName(com.google.protobuf.ByteString value) {
+        bitField0_ |= 0x00000001;
+        name_ = value;
+        onChanged();
+      }
+      
+      // repeated .google.protobuf.EnumValueDescriptorProto value = 2;
+      private java.util.List<com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto> value_ =
+        java.util.Collections.emptyList();
+      private void ensureValueIsMutable() {
+        if (!((bitField0_ & 0x00000002) == 0x00000002)) {
+          value_ = new java.util.ArrayList<com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto>(value_);
+          bitField0_ |= 0x00000002;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto, com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto.Builder, com.google.protobuf.DescriptorProtos.EnumValueDescriptorProtoOrBuilder> valueBuilder_;
+      
+      public java.util.List<com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto> getValueList() {
+        if (valueBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(value_);
+        } else {
+          return valueBuilder_.getMessageList();
+        }
+      }
+      public int getValueCount() {
+        if (valueBuilder_ == null) {
+          return value_.size();
+        } else {
+          return valueBuilder_.getCount();
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto getValue(int index) {
+        if (valueBuilder_ == null) {
+          return value_.get(index);
+        } else {
+          return valueBuilder_.getMessage(index);
+        }
+      }
+      public Builder setValue(
+          int index, com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto value) {
+        if (valueBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureValueIsMutable();
+          value_.set(index, value);
+          onChanged();
+        } else {
+          valueBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setValue(
+          int index, com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto.Builder builderForValue) {
+        if (valueBuilder_ == null) {
+          ensureValueIsMutable();
+          value_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          valueBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addValue(com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto value) {
+        if (valueBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureValueIsMutable();
+          value_.add(value);
+          onChanged();
+        } else {
+          valueBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addValue(
+          int index, com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto value) {
+        if (valueBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureValueIsMutable();
+          value_.add(index, value);
+          onChanged();
+        } else {
+          valueBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addValue(
+          com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto.Builder builderForValue) {
+        if (valueBuilder_ == null) {
+          ensureValueIsMutable();
+          value_.add(builderForValue.build());
+          onChanged();
+        } else {
+          valueBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addValue(
+          int index, com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto.Builder builderForValue) {
+        if (valueBuilder_ == null) {
+          ensureValueIsMutable();
+          value_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          valueBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllValue(
+          java.lang.Iterable<? extends com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto> values) {
+        if (valueBuilder_ == null) {
+          ensureValueIsMutable();
+          super.addAll(values, value_);
+          onChanged();
+        } else {
+          valueBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearValue() {
+        if (valueBuilder_ == null) {
+          value_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000002);
+          onChanged();
+        } else {
+          valueBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeValue(int index) {
+        if (valueBuilder_ == null) {
+          ensureValueIsMutable();
+          value_.remove(index);
+          onChanged();
+        } else {
+          valueBuilder_.remove(index);
+        }
+        return this;
+      }
+      public com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto.Builder getValueBuilder(
+          int index) {
+        return getValueFieldBuilder().getBuilder(index);
+      }
+      public com.google.protobuf.DescriptorProtos.EnumValueDescriptorProtoOrBuilder getValueOrBuilder(
+          int index) {
+        if (valueBuilder_ == null) {
+          return value_.get(index);  } else {
+          return valueBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends com.google.protobuf.DescriptorProtos.EnumValueDescriptorProtoOrBuilder> 
+           getValueOrBuilderList() {
+        if (valueBuilder_ != null) {
+          return valueBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(value_);
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto.Builder addValueBuilder() {
+        return getValueFieldBuilder().addBuilder(
+            com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto.getDefaultInstance());
+      }
+      public com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto.Builder addValueBuilder(
+          int index) {
+        return getValueFieldBuilder().addBuilder(
+            index, com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto.getDefaultInstance());
+      }
+      public java.util.List<com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto.Builder> 
+           getValueBuilderList() {
+        return getValueFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto, com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto.Builder, com.google.protobuf.DescriptorProtos.EnumValueDescriptorProtoOrBuilder> 
+          getValueFieldBuilder() {
+        if (valueBuilder_ == null) {
+          valueBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto, com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto.Builder, com.google.protobuf.DescriptorProtos.EnumValueDescriptorProtoOrBuilder>(
+                  value_,
+                  ((bitField0_ & 0x00000002) == 0x00000002),
+                  getParentForChildren(),
+                  isClean());
+          value_ = null;
+        }
+        return valueBuilder_;
+      }
+      
+      // optional .google.protobuf.EnumOptions options = 3;
+      private com.google.protobuf.DescriptorProtos.EnumOptions options_ = com.google.protobuf.DescriptorProtos.EnumOptions.getDefaultInstance();
+      private com.google.protobuf.SingleFieldBuilder<
+          com.google.protobuf.DescriptorProtos.EnumOptions, com.google.protobuf.DescriptorProtos.EnumOptions.Builder, com.google.protobuf.DescriptorProtos.EnumOptionsOrBuilder> optionsBuilder_;
+      public boolean hasOptions() {
+        return ((bitField0_ & 0x00000004) == 0x00000004);
+      }
+      public com.google.protobuf.DescriptorProtos.EnumOptions getOptions() {
+        if (optionsBuilder_ == null) {
+          return options_;
+        } else {
+          return optionsBuilder_.getMessage();
+        }
+      }
+      public Builder setOptions(com.google.protobuf.DescriptorProtos.EnumOptions value) {
+        if (optionsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          options_ = value;
+          onChanged();
+        } else {
+          optionsBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000004;
+        return this;
+      }
+      public Builder setOptions(
+          com.google.protobuf.DescriptorProtos.EnumOptions.Builder builderForValue) {
+        if (optionsBuilder_ == null) {
+          options_ = builderForValue.build();
+          onChanged();
+        } else {
+          optionsBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000004;
+        return this;
+      }
+      public Builder mergeOptions(com.google.protobuf.DescriptorProtos.EnumOptions value) {
+        if (optionsBuilder_ == null) {
+          if (((bitField0_ & 0x00000004) == 0x00000004) &&
+              options_ != com.google.protobuf.DescriptorProtos.EnumOptions.getDefaultInstance()) {
+            options_ =
+              com.google.protobuf.DescriptorProtos.EnumOptions.newBuilder(options_).mergeFrom(value).buildPartial();
+          } else {
+            options_ = value;
+          }
+          onChanged();
+        } else {
+          optionsBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000004;
+        return this;
+      }
+      public Builder clearOptions() {
+        if (optionsBuilder_ == null) {
+          options_ = com.google.protobuf.DescriptorProtos.EnumOptions.getDefaultInstance();
+          onChanged();
+        } else {
+          optionsBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000004);
+        return this;
+      }
+      public com.google.protobuf.DescriptorProtos.EnumOptions.Builder getOptionsBuilder() {
+        bitField0_ |= 0x00000004;
+        onChanged();
+        return getOptionsFieldBuilder().getBuilder();
+      }
+      public com.google.protobuf.DescriptorProtos.EnumOptionsOrBuilder getOptionsOrBuilder() {
+        if (optionsBuilder_ != null) {
+          return optionsBuilder_.getMessageOrBuilder();
+        } else {
+          return options_;
+        }
+      }
+      private com.google.protobuf.SingleFieldBuilder<
+          com.google.protobuf.DescriptorProtos.EnumOptions, com.google.protobuf.DescriptorProtos.EnumOptions.Builder, com.google.protobuf.DescriptorProtos.EnumOptionsOrBuilder> 
+          getOptionsFieldBuilder() {
+        if (optionsBuilder_ == null) {
+          optionsBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+              com.google.protobuf.DescriptorProtos.EnumOptions, com.google.protobuf.DescriptorProtos.EnumOptions.Builder, com.google.protobuf.DescriptorProtos.EnumOptionsOrBuilder>(
+                  options_,
+                  getParentForChildren(),
+                  isClean());
+          options_ = null;
+        }
+        return optionsBuilder_;
+      }
+      
+      // @@protoc_insertion_point(builder_scope:google.protobuf.EnumDescriptorProto)
+    }
+    
+    static {
+      defaultInstance = new EnumDescriptorProto(true);
+      defaultInstance.initFields();
+    }
+    
+    // @@protoc_insertion_point(class_scope:google.protobuf.EnumDescriptorProto)
+  }
+  
+  public interface EnumValueDescriptorProtoOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+    
+    // optional string name = 1;
+    boolean hasName();
+    String getName();
+    
+    // optional int32 number = 2;
+    boolean hasNumber();
+    int getNumber();
+    
+    // optional .google.protobuf.EnumValueOptions options = 3;
+    boolean hasOptions();
+    com.google.protobuf.DescriptorProtos.EnumValueOptions getOptions();
+    com.google.protobuf.DescriptorProtos.EnumValueOptionsOrBuilder getOptionsOrBuilder();
+  }
+  public static final class EnumValueDescriptorProto extends
+      com.google.protobuf.GeneratedMessage
+      implements EnumValueDescriptorProtoOrBuilder {
+    // Use EnumValueDescriptorProto.newBuilder() to construct.
+    private EnumValueDescriptorProto(Builder builder) {
+      super(builder);
+    }
+    private EnumValueDescriptorProto(boolean noInit) {}
+    
+    private static final EnumValueDescriptorProto defaultInstance;
+    public static EnumValueDescriptorProto getDefaultInstance() {
+      return defaultInstance;
+    }
+    
+    public EnumValueDescriptorProto getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+    
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_EnumValueDescriptorProto_descriptor;
+    }
+    
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_EnumValueDescriptorProto_fieldAccessorTable;
+    }
+    
+    private int bitField0_;
+    // optional string name = 1;
+    public static final int NAME_FIELD_NUMBER = 1;
+    private java.lang.Object name_;
+    public boolean hasName() {
+      return ((bitField0_ & 0x00000001) == 0x00000001);
+    }
+    public String getName() {
+      java.lang.Object ref = name_;
+      if (ref instanceof String) {
+        return (String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        String s = bs.toStringUtf8();
+        if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+          name_ = s;
+        }
+        return s;
+      }
+    }
+    private com.google.protobuf.ByteString getNameBytes() {
+      java.lang.Object ref = name_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+        name_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    
+    // optional int32 number = 2;
+    public static final int NUMBER_FIELD_NUMBER = 2;
+    private int number_;
+    public boolean hasNumber() {
+      return ((bitField0_ & 0x00000002) == 0x00000002);
+    }
+    public int getNumber() {
+      return number_;
+    }
+    
+    // optional .google.protobuf.EnumValueOptions options = 3;
+    public static final int OPTIONS_FIELD_NUMBER = 3;
+    private com.google.protobuf.DescriptorProtos.EnumValueOptions options_;
+    public boolean hasOptions() {
+      return ((bitField0_ & 0x00000004) == 0x00000004);
+    }
+    public com.google.protobuf.DescriptorProtos.EnumValueOptions getOptions() {
+      return options_;
+    }
+    public com.google.protobuf.DescriptorProtos.EnumValueOptionsOrBuilder getOptionsOrBuilder() {
+      return options_;
+    }
+    
+    private void initFields() {
+      name_ = "";
+      number_ = 0;
+      options_ = com.google.protobuf.DescriptorProtos.EnumValueOptions.getDefaultInstance();
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+      
+      if (hasOptions()) {
+        if (!getOptions().isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+    
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        output.writeBytes(1, getNameBytes());
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        output.writeInt32(2, number_);
+      }
+      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+        output.writeMessage(3, options_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+    
+      size = 0;
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(1, getNameBytes());
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeInt32Size(2, number_);
+      }
+      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(3, options_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+    
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+    
+    public static com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+    
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements com.google.protobuf.DescriptorProtos.EnumValueDescriptorProtoOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_EnumValueDescriptorProto_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_EnumValueDescriptorProto_fieldAccessorTable;
+      }
+      
+      // Construct using com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+      
+      private Builder(BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          getOptionsFieldBuilder();
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+      
+      public Builder clear() {
+        super.clear();
+        name_ = "";
+        bitField0_ = (bitField0_ & ~0x00000001);
+        number_ = 0;
+        bitField0_ = (bitField0_ & ~0x00000002);
+        if (optionsBuilder_ == null) {
+          options_ = com.google.protobuf.DescriptorProtos.EnumValueOptions.getDefaultInstance();
+        } else {
+          optionsBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000004);
+        return this;
+      }
+      
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+      
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto.getDescriptor();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto getDefaultInstanceForType() {
+        return com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto.getDefaultInstance();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto build() {
+        com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+      
+      private com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto buildParsed()
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(
+            result).asInvalidProtocolBufferException();
+        }
+        return result;
+      }
+      
+      public com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto buildPartial() {
+        com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto result = new com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+          to_bitField0_ |= 0x00000001;
+        }
+        result.name_ = name_;
+        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+          to_bitField0_ |= 0x00000002;
+        }
+        result.number_ = number_;
+        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
+          to_bitField0_ |= 0x00000004;
+        }
+        if (optionsBuilder_ == null) {
+          result.options_ = options_;
+        } else {
+          result.options_ = optionsBuilder_.build();
+        }
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto) {
+          return mergeFrom((com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto other) {
+        if (other == com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto.getDefaultInstance()) return this;
+        if (other.hasName()) {
+          setName(other.getName());
+        }
+        if (other.hasNumber()) {
+          setNumber(other.getNumber());
+        }
+        if (other.hasOptions()) {
+          mergeOptions(other.getOptions());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+      
+      public final boolean isInitialized() {
+        if (hasOptions()) {
+          if (!getOptions().isInitialized()) {
+            
+            return false;
+          }
+        }
+        return true;
+      }
+      
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder(
+            this.getUnknownFields());
+        while (true) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              this.setUnknownFields(unknownFields.build());
+              onChanged();
+              return this;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              }
+              break;
+            }
+            case 10: {
+              bitField0_ |= 0x00000001;
+              name_ = input.readBytes();
+              break;
+            }
+            case 16: {
+              bitField0_ |= 0x00000002;
+              number_ = input.readInt32();
+              break;
+            }
+            case 26: {
+              com.google.protobuf.DescriptorProtos.EnumValueOptions.Builder subBuilder = com.google.protobuf.DescriptorProtos.EnumValueOptions.newBuilder();
+              if (hasOptions()) {
+                subBuilder.mergeFrom(getOptions());
+              }
+              input.readMessage(subBuilder, extensionRegistry);
+              setOptions(subBuilder.buildPartial());
+              break;
+            }
+          }
+        }
+      }
+      
+      private int bitField0_;
+      
+      // optional string name = 1;
+      private java.lang.Object name_ = "";
+      public boolean hasName() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      public String getName() {
+        java.lang.Object ref = name_;
+        if (!(ref instanceof String)) {
+          String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+          name_ = s;
+          return s;
+        } else {
+          return (String) ref;
+        }
+      }
+      public Builder setName(String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+        name_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearName() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        name_ = getDefaultInstance().getName();
+        onChanged();
+        return this;
+      }
+      void setName(com.google.protobuf.ByteString value) {
+        bitField0_ |= 0x00000001;
+        name_ = value;
+        onChanged();
+      }
+      
+      // optional int32 number = 2;
+      private int number_ ;
+      public boolean hasNumber() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      public int getNumber() {
+        return number_;
+      }
+      public Builder setNumber(int value) {
+        bitField0_ |= 0x00000002;
+        number_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearNumber() {
+        bitField0_ = (bitField0_ & ~0x00000002);
+        number_ = 0;
+        onChanged();
+        return this;
+      }
+      
+      // optional .google.protobuf.EnumValueOptions options = 3;
+      private com.google.protobuf.DescriptorProtos.EnumValueOptions options_ = com.google.protobuf.DescriptorProtos.EnumValueOptions.getDefaultInstance();
+      private com.google.protobuf.SingleFieldBuilder<
+          com.google.protobuf.DescriptorProtos.EnumValueOptions, com.google.protobuf.DescriptorProtos.EnumValueOptions.Builder, com.google.protobuf.DescriptorProtos.EnumValueOptionsOrBuilder> optionsBuilder_;
+      public boolean hasOptions() {
+        return ((bitField0_ & 0x00000004) == 0x00000004);
+      }
+      public com.google.protobuf.DescriptorProtos.EnumValueOptions getOptions() {
+        if (optionsBuilder_ == null) {
+          return options_;
+        } else {
+          return optionsBuilder_.getMessage();
+        }
+      }
+      public Builder setOptions(com.google.protobuf.DescriptorProtos.EnumValueOptions value) {
+        if (optionsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          options_ = value;
+          onChanged();
+        } else {
+          optionsBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000004;
+        return this;
+      }
+      public Builder setOptions(
+          com.google.protobuf.DescriptorProtos.EnumValueOptions.Builder builderForValue) {
+        if (optionsBuilder_ == null) {
+          options_ = builderForValue.build();
+          onChanged();
+        } else {
+          optionsBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000004;
+        return this;
+      }
+      public Builder mergeOptions(com.google.protobuf.DescriptorProtos.EnumValueOptions value) {
+        if (optionsBuilder_ == null) {
+          if (((bitField0_ & 0x00000004) == 0x00000004) &&
+              options_ != com.google.protobuf.DescriptorProtos.EnumValueOptions.getDefaultInstance()) {
+            options_ =
+              com.google.protobuf.DescriptorProtos.EnumValueOptions.newBuilder(options_).mergeFrom(value).buildPartial();
+          } else {
+            options_ = value;
+          }
+          onChanged();
+        } else {
+          optionsBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000004;
+        return this;
+      }
+      public Builder clearOptions() {
+        if (optionsBuilder_ == null) {
+          options_ = com.google.protobuf.DescriptorProtos.EnumValueOptions.getDefaultInstance();
+          onChanged();
+        } else {
+          optionsBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000004);
+        return this;
+      }
+      public com.google.protobuf.DescriptorProtos.EnumValueOptions.Builder getOptionsBuilder() {
+        bitField0_ |= 0x00000004;
+        onChanged();
+        return getOptionsFieldBuilder().getBuilder();
+      }
+      public com.google.protobuf.DescriptorProtos.EnumValueOptionsOrBuilder getOptionsOrBuilder() {
+        if (optionsBuilder_ != null) {
+          return optionsBuilder_.getMessageOrBuilder();
+        } else {
+          return options_;
+        }
+      }
+      private com.google.protobuf.SingleFieldBuilder<
+          com.google.protobuf.DescriptorProtos.EnumValueOptions, com.google.protobuf.DescriptorProtos.EnumValueOptions.Builder, com.google.protobuf.DescriptorProtos.EnumValueOptionsOrBuilder> 
+          getOptionsFieldBuilder() {
+        if (optionsBuilder_ == null) {
+          optionsBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+              com.google.protobuf.DescriptorProtos.EnumValueOptions, com.google.protobuf.DescriptorProtos.EnumValueOptions.Builder, com.google.protobuf.DescriptorProtos.EnumValueOptionsOrBuilder>(
+                  options_,
+                  getParentForChildren(),
+                  isClean());
+          options_ = null;
+        }
+        return optionsBuilder_;
+      }
+      
+      // @@protoc_insertion_point(builder_scope:google.protobuf.EnumValueDescriptorProto)
+    }
+    
+    static {
+      defaultInstance = new EnumValueDescriptorProto(true);
+      defaultInstance.initFields();
+    }
+    
+    // @@protoc_insertion_point(class_scope:google.protobuf.EnumValueDescriptorProto)
+  }
+  
+  public interface ServiceDescriptorProtoOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+    
+    // optional string name = 1;
+    boolean hasName();
+    String getName();
+    
+    // repeated .google.protobuf.MethodDescriptorProto method = 2;
+    java.util.List<com.google.protobuf.DescriptorProtos.MethodDescriptorProto> 
+        getMethodList();
+    com.google.protobuf.DescriptorProtos.MethodDescriptorProto getMethod(int index);
+    int getMethodCount();
+    java.util.List<? extends com.google.protobuf.DescriptorProtos.MethodDescriptorProtoOrBuilder> 
+        getMethodOrBuilderList();
+    com.google.protobuf.DescriptorProtos.MethodDescriptorProtoOrBuilder getMethodOrBuilder(
+        int index);
+    
+    // optional .google.protobuf.ServiceOptions options = 3;
+    boolean hasOptions();
+    com.google.protobuf.DescriptorProtos.ServiceOptions getOptions();
+    com.google.protobuf.DescriptorProtos.ServiceOptionsOrBuilder getOptionsOrBuilder();
+  }
+  public static final class ServiceDescriptorProto extends
+      com.google.protobuf.GeneratedMessage
+      implements ServiceDescriptorProtoOrBuilder {
+    // Use ServiceDescriptorProto.newBuilder() to construct.
+    private ServiceDescriptorProto(Builder builder) {
+      super(builder);
+    }
+    private ServiceDescriptorProto(boolean noInit) {}
+    
+    private static final ServiceDescriptorProto defaultInstance;
+    public static ServiceDescriptorProto getDefaultInstance() {
+      return defaultInstance;
+    }
+    
+    public ServiceDescriptorProto getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+    
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_ServiceDescriptorProto_descriptor;
+    }
+    
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_ServiceDescriptorProto_fieldAccessorTable;
+    }
+    
+    private int bitField0_;
+    // optional string name = 1;
+    public static final int NAME_FIELD_NUMBER = 1;
+    private java.lang.Object name_;
+    public boolean hasName() {
+      return ((bitField0_ & 0x00000001) == 0x00000001);
+    }
+    public String getName() {
+      java.lang.Object ref = name_;
+      if (ref instanceof String) {
+        return (String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        String s = bs.toStringUtf8();
+        if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+          name_ = s;
+        }
+        return s;
+      }
+    }
+    private com.google.protobuf.ByteString getNameBytes() {
+      java.lang.Object ref = name_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+        name_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    
+    // repeated .google.protobuf.MethodDescriptorProto method = 2;
+    public static final int METHOD_FIELD_NUMBER = 2;
+    private java.util.List<com.google.protobuf.DescriptorProtos.MethodDescriptorProto> method_;
+    public java.util.List<com.google.protobuf.DescriptorProtos.MethodDescriptorProto> getMethodList() {
+      return method_;
+    }
+    public java.util.List<? extends com.google.protobuf.DescriptorProtos.MethodDescriptorProtoOrBuilder> 
+        getMethodOrBuilderList() {
+      return method_;
+    }
+    public int getMethodCount() {
+      return method_.size();
+    }
+    public com.google.protobuf.DescriptorProtos.MethodDescriptorProto getMethod(int index) {
+      return method_.get(index);
+    }
+    public com.google.protobuf.DescriptorProtos.MethodDescriptorProtoOrBuilder getMethodOrBuilder(
+        int index) {
+      return method_.get(index);
+    }
+    
+    // optional .google.protobuf.ServiceOptions options = 3;
+    public static final int OPTIONS_FIELD_NUMBER = 3;
+    private com.google.protobuf.DescriptorProtos.ServiceOptions options_;
+    public boolean hasOptions() {
+      return ((bitField0_ & 0x00000002) == 0x00000002);
+    }
+    public com.google.protobuf.DescriptorProtos.ServiceOptions getOptions() {
+      return options_;
+    }
+    public com.google.protobuf.DescriptorProtos.ServiceOptionsOrBuilder getOptionsOrBuilder() {
+      return options_;
+    }
+    
+    private void initFields() {
+      name_ = "";
+      method_ = java.util.Collections.emptyList();
+      options_ = com.google.protobuf.DescriptorProtos.ServiceOptions.getDefaultInstance();
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+      
+      for (int i = 0; i < getMethodCount(); i++) {
+        if (!getMethod(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      if (hasOptions()) {
+        if (!getOptions().isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+    
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        output.writeBytes(1, getNameBytes());
+      }
+      for (int i = 0; i < method_.size(); i++) {
+        output.writeMessage(2, method_.get(i));
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        output.writeMessage(3, options_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+    
+      size = 0;
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(1, getNameBytes());
+      }
+      for (int i = 0; i < method_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(2, method_.get(i));
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(3, options_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+    
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+    
+    public static com.google.protobuf.DescriptorProtos.ServiceDescriptorProto parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.ServiceDescriptorProto parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.ServiceDescriptorProto parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.ServiceDescriptorProto parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.ServiceDescriptorProto parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.ServiceDescriptorProto parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.ServiceDescriptorProto parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.ServiceDescriptorProto parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.ServiceDescriptorProto parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.ServiceDescriptorProto parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(com.google.protobuf.DescriptorProtos.ServiceDescriptorProto prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+    
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements com.google.protobuf.DescriptorProtos.ServiceDescriptorProtoOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_ServiceDescriptorProto_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_ServiceDescriptorProto_fieldAccessorTable;
+      }
+      
+      // Construct using com.google.protobuf.DescriptorProtos.ServiceDescriptorProto.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+      
+      private Builder(BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          getMethodFieldBuilder();
+          getOptionsFieldBuilder();
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+      
+      public Builder clear() {
+        super.clear();
+        name_ = "";
+        bitField0_ = (bitField0_ & ~0x00000001);
+        if (methodBuilder_ == null) {
+          method_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000002);
+        } else {
+          methodBuilder_.clear();
+        }
+        if (optionsBuilder_ == null) {
+          options_ = com.google.protobuf.DescriptorProtos.ServiceOptions.getDefaultInstance();
+        } else {
+          optionsBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000004);
+        return this;
+      }
+      
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+      
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return com.google.protobuf.DescriptorProtos.ServiceDescriptorProto.getDescriptor();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.ServiceDescriptorProto getDefaultInstanceForType() {
+        return com.google.protobuf.DescriptorProtos.ServiceDescriptorProto.getDefaultInstance();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.ServiceDescriptorProto build() {
+        com.google.protobuf.DescriptorProtos.ServiceDescriptorProto result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+      
+      private com.google.protobuf.DescriptorProtos.ServiceDescriptorProto buildParsed()
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.DescriptorProtos.ServiceDescriptorProto result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(
+            result).asInvalidProtocolBufferException();
+        }
+        return result;
+      }
+      
+      public com.google.protobuf.DescriptorProtos.ServiceDescriptorProto buildPartial() {
+        com.google.protobuf.DescriptorProtos.ServiceDescriptorProto result = new com.google.protobuf.DescriptorProtos.ServiceDescriptorProto(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+          to_bitField0_ |= 0x00000001;
+        }
+        result.name_ = name_;
+        if (methodBuilder_ == null) {
+          if (((bitField0_ & 0x00000002) == 0x00000002)) {
+            method_ = java.util.Collections.unmodifiableList(method_);
+            bitField0_ = (bitField0_ & ~0x00000002);
+          }
+          result.method_ = method_;
+        } else {
+          result.method_ = methodBuilder_.build();
+        }
+        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
+          to_bitField0_ |= 0x00000002;
+        }
+        if (optionsBuilder_ == null) {
+          result.options_ = options_;
+        } else {
+          result.options_ = optionsBuilder_.build();
+        }
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof com.google.protobuf.DescriptorProtos.ServiceDescriptorProto) {
+          return mergeFrom((com.google.protobuf.DescriptorProtos.ServiceDescriptorProto)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.DescriptorProtos.ServiceDescriptorProto other) {
+        if (other == com.google.protobuf.DescriptorProtos.ServiceDescriptorProto.getDefaultInstance()) return this;
+        if (other.hasName()) {
+          setName(other.getName());
+        }
+        if (methodBuilder_ == null) {
+          if (!other.method_.isEmpty()) {
+            if (method_.isEmpty()) {
+              method_ = other.method_;
+              bitField0_ = (bitField0_ & ~0x00000002);
+            } else {
+              ensureMethodIsMutable();
+              method_.addAll(other.method_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.method_.isEmpty()) {
+            if (methodBuilder_.isEmpty()) {
+              methodBuilder_.dispose();
+              methodBuilder_ = null;
+              method_ = other.method_;
+              bitField0_ = (bitField0_ & ~0x00000002);
+              methodBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getMethodFieldBuilder() : null;
+            } else {
+              methodBuilder_.addAllMessages(other.method_);
+            }
+          }
+        }
+        if (other.hasOptions()) {
+          mergeOptions(other.getOptions());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+      
+      public final boolean isInitialized() {
+        for (int i = 0; i < getMethodCount(); i++) {
+          if (!getMethod(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        if (hasOptions()) {
+          if (!getOptions().isInitialized()) {
+            
+            return false;
+          }
+        }
+        return true;
+      }
+      
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder(
+            this.getUnknownFields());
+        while (true) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              this.setUnknownFields(unknownFields.build());
+              onChanged();
+              return this;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              }
+              break;
+            }
+            case 10: {
+              bitField0_ |= 0x00000001;
+              name_ = input.readBytes();
+              break;
+            }
+            case 18: {
+              com.google.protobuf.DescriptorProtos.MethodDescriptorProto.Builder subBuilder = com.google.protobuf.DescriptorProtos.MethodDescriptorProto.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addMethod(subBuilder.buildPartial());
+              break;
+            }
+            case 26: {
+              com.google.protobuf.DescriptorProtos.ServiceOptions.Builder subBuilder = com.google.protobuf.DescriptorProtos.ServiceOptions.newBuilder();
+              if (hasOptions()) {
+                subBuilder.mergeFrom(getOptions());
+              }
+              input.readMessage(subBuilder, extensionRegistry);
+              setOptions(subBuilder.buildPartial());
+              break;
+            }
+          }
+        }
+      }
+      
+      private int bitField0_;
+      
+      // optional string name = 1;
+      private java.lang.Object name_ = "";
+      public boolean hasName() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      public String getName() {
+        java.lang.Object ref = name_;
+        if (!(ref instanceof String)) {
+          String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+          name_ = s;
+          return s;
+        } else {
+          return (String) ref;
+        }
+      }
+      public Builder setName(String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+        name_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearName() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        name_ = getDefaultInstance().getName();
+        onChanged();
+        return this;
+      }
+      void setName(com.google.protobuf.ByteString value) {
+        bitField0_ |= 0x00000001;
+        name_ = value;
+        onChanged();
+      }
+      
+      // repeated .google.protobuf.MethodDescriptorProto method = 2;
+      private java.util.List<com.google.protobuf.DescriptorProtos.MethodDescriptorProto> method_ =
+        java.util.Collections.emptyList();
+      private void ensureMethodIsMutable() {
+        if (!((bitField0_ & 0x00000002) == 0x00000002)) {
+          method_ = new java.util.ArrayList<com.google.protobuf.DescriptorProtos.MethodDescriptorProto>(method_);
+          bitField0_ |= 0x00000002;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.MethodDescriptorProto, com.google.protobuf.DescriptorProtos.MethodDescriptorProto.Builder, com.google.protobuf.DescriptorProtos.MethodDescriptorProtoOrBuilder> methodBuilder_;
+      
+      public java.util.List<com.google.protobuf.DescriptorProtos.MethodDescriptorProto> getMethodList() {
+        if (methodBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(method_);
+        } else {
+          return methodBuilder_.getMessageList();
+        }
+      }
+      public int getMethodCount() {
+        if (methodBuilder_ == null) {
+          return method_.size();
+        } else {
+          return methodBuilder_.getCount();
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.MethodDescriptorProto getMethod(int index) {
+        if (methodBuilder_ == null) {
+          return method_.get(index);
+        } else {
+          return methodBuilder_.getMessage(index);
+        }
+      }
+      public Builder setMethod(
+          int index, com.google.protobuf.DescriptorProtos.MethodDescriptorProto value) {
+        if (methodBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureMethodIsMutable();
+          method_.set(index, value);
+          onChanged();
+        } else {
+          methodBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setMethod(
+          int index, com.google.protobuf.DescriptorProtos.MethodDescriptorProto.Builder builderForValue) {
+        if (methodBuilder_ == null) {
+          ensureMethodIsMutable();
+          method_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          methodBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addMethod(com.google.protobuf.DescriptorProtos.MethodDescriptorProto value) {
+        if (methodBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureMethodIsMutable();
+          method_.add(value);
+          onChanged();
+        } else {
+          methodBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addMethod(
+          int index, com.google.protobuf.DescriptorProtos.MethodDescriptorProto value) {
+        if (methodBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureMethodIsMutable();
+          method_.add(index, value);
+          onChanged();
+        } else {
+          methodBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addMethod(
+          com.google.protobuf.DescriptorProtos.MethodDescriptorProto.Builder builderForValue) {
+        if (methodBuilder_ == null) {
+          ensureMethodIsMutable();
+          method_.add(builderForValue.build());
+          onChanged();
+        } else {
+          methodBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addMethod(
+          int index, com.google.protobuf.DescriptorProtos.MethodDescriptorProto.Builder builderForValue) {
+        if (methodBuilder_ == null) {
+          ensureMethodIsMutable();
+          method_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          methodBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllMethod(
+          java.lang.Iterable<? extends com.google.protobuf.DescriptorProtos.MethodDescriptorProto> values) {
+        if (methodBuilder_ == null) {
+          ensureMethodIsMutable();
+          super.addAll(values, method_);
+          onChanged();
+        } else {
+          methodBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearMethod() {
+        if (methodBuilder_ == null) {
+          method_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000002);
+          onChanged();
+        } else {
+          methodBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeMethod(int index) {
+        if (methodBuilder_ == null) {
+          ensureMethodIsMutable();
+          method_.remove(index);
+          onChanged();
+        } else {
+          methodBuilder_.remove(index);
+        }
+        return this;
+      }
+      public com.google.protobuf.DescriptorProtos.MethodDescriptorProto.Builder getMethodBuilder(
+          int index) {
+        return getMethodFieldBuilder().getBuilder(index);
+      }
+      public com.google.protobuf.DescriptorProtos.MethodDescriptorProtoOrBuilder getMethodOrBuilder(
+          int index) {
+        if (methodBuilder_ == null) {
+          return method_.get(index);  } else {
+          return methodBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends com.google.protobuf.DescriptorProtos.MethodDescriptorProtoOrBuilder> 
+           getMethodOrBuilderList() {
+        if (methodBuilder_ != null) {
+          return methodBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(method_);
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.MethodDescriptorProto.Builder addMethodBuilder() {
+        return getMethodFieldBuilder().addBuilder(
+            com.google.protobuf.DescriptorProtos.MethodDescriptorProto.getDefaultInstance());
+      }
+      public com.google.protobuf.DescriptorProtos.MethodDescriptorProto.Builder addMethodBuilder(
+          int index) {
+        return getMethodFieldBuilder().addBuilder(
+            index, com.google.protobuf.DescriptorProtos.MethodDescriptorProto.getDefaultInstance());
+      }
+      public java.util.List<com.google.protobuf.DescriptorProtos.MethodDescriptorProto.Builder> 
+           getMethodBuilderList() {
+        return getMethodFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.MethodDescriptorProto, com.google.protobuf.DescriptorProtos.MethodDescriptorProto.Builder, com.google.protobuf.DescriptorProtos.MethodDescriptorProtoOrBuilder> 
+          getMethodFieldBuilder() {
+        if (methodBuilder_ == null) {
+          methodBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              com.google.protobuf.DescriptorProtos.MethodDescriptorProto, com.google.protobuf.DescriptorProtos.MethodDescriptorProto.Builder, com.google.protobuf.DescriptorProtos.MethodDescriptorProtoOrBuilder>(
+                  method_,
+                  ((bitField0_ & 0x00000002) == 0x00000002),
+                  getParentForChildren(),
+                  isClean());
+          method_ = null;
+        }
+        return methodBuilder_;
+      }
+      
+      // optional .google.protobuf.ServiceOptions options = 3;
+      private com.google.protobuf.DescriptorProtos.ServiceOptions options_ = com.google.protobuf.DescriptorProtos.ServiceOptions.getDefaultInstance();
+      private com.google.protobuf.SingleFieldBuilder<
+          com.google.protobuf.DescriptorProtos.ServiceOptions, com.google.protobuf.DescriptorProtos.ServiceOptions.Builder, com.google.protobuf.DescriptorProtos.ServiceOptionsOrBuilder> optionsBuilder_;
+      public boolean hasOptions() {
+        return ((bitField0_ & 0x00000004) == 0x00000004);
+      }
+      public com.google.protobuf.DescriptorProtos.ServiceOptions getOptions() {
+        if (optionsBuilder_ == null) {
+          return options_;
+        } else {
+          return optionsBuilder_.getMessage();
+        }
+      }
+      public Builder setOptions(com.google.protobuf.DescriptorProtos.ServiceOptions value) {
+        if (optionsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          options_ = value;
+          onChanged();
+        } else {
+          optionsBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000004;
+        return this;
+      }
+      public Builder setOptions(
+          com.google.protobuf.DescriptorProtos.ServiceOptions.Builder builderForValue) {
+        if (optionsBuilder_ == null) {
+          options_ = builderForValue.build();
+          onChanged();
+        } else {
+          optionsBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000004;
+        return this;
+      }
+      public Builder mergeOptions(com.google.protobuf.DescriptorProtos.ServiceOptions value) {
+        if (optionsBuilder_ == null) {
+          if (((bitField0_ & 0x00000004) == 0x00000004) &&
+              options_ != com.google.protobuf.DescriptorProtos.ServiceOptions.getDefaultInstance()) {
+            options_ =
+              com.google.protobuf.DescriptorProtos.ServiceOptions.newBuilder(options_).mergeFrom(value).buildPartial();
+          } else {
+            options_ = value;
+          }
+          onChanged();
+        } else {
+          optionsBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000004;
+        return this;
+      }
+      public Builder clearOptions() {
+        if (optionsBuilder_ == null) {
+          options_ = com.google.protobuf.DescriptorProtos.ServiceOptions.getDefaultInstance();
+          onChanged();
+        } else {
+          optionsBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000004);
+        return this;
+      }
+      public com.google.protobuf.DescriptorProtos.ServiceOptions.Builder getOptionsBuilder() {
+        bitField0_ |= 0x00000004;
+        onChanged();
+        return getOptionsFieldBuilder().getBuilder();
+      }
+      public com.google.protobuf.DescriptorProtos.ServiceOptionsOrBuilder getOptionsOrBuilder() {
+        if (optionsBuilder_ != null) {
+          return optionsBuilder_.getMessageOrBuilder();
+        } else {
+          return options_;
+        }
+      }
+      private com.google.protobuf.SingleFieldBuilder<
+          com.google.protobuf.DescriptorProtos.ServiceOptions, com.google.protobuf.DescriptorProtos.ServiceOptions.Builder, com.google.protobuf.DescriptorProtos.ServiceOptionsOrBuilder> 
+          getOptionsFieldBuilder() {
+        if (optionsBuilder_ == null) {
+          optionsBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+              com.google.protobuf.DescriptorProtos.ServiceOptions, com.google.protobuf.DescriptorProtos.ServiceOptions.Builder, com.google.protobuf.DescriptorProtos.ServiceOptionsOrBuilder>(
+                  options_,
+                  getParentForChildren(),
+                  isClean());
+          options_ = null;
+        }
+        return optionsBuilder_;
+      }
+      
+      // @@protoc_insertion_point(builder_scope:google.protobuf.ServiceDescriptorProto)
+    }
+    
+    static {
+      defaultInstance = new ServiceDescriptorProto(true);
+      defaultInstance.initFields();
+    }
+    
+    // @@protoc_insertion_point(class_scope:google.protobuf.ServiceDescriptorProto)
+  }
+  
+  public interface MethodDescriptorProtoOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+    
+    // optional string name = 1;
+    boolean hasName();
+    String getName();
+    
+    // optional string input_type = 2;
+    boolean hasInputType();
+    String getInputType();
+    
+    // optional string output_type = 3;
+    boolean hasOutputType();
+    String getOutputType();
+    
+    // optional .google.protobuf.MethodOptions options = 4;
+    boolean hasOptions();
+    com.google.protobuf.DescriptorProtos.MethodOptions getOptions();
+    com.google.protobuf.DescriptorProtos.MethodOptionsOrBuilder getOptionsOrBuilder();
+  }
+  public static final class MethodDescriptorProto extends
+      com.google.protobuf.GeneratedMessage
+      implements MethodDescriptorProtoOrBuilder {
+    // Use MethodDescriptorProto.newBuilder() to construct.
+    private MethodDescriptorProto(Builder builder) {
+      super(builder);
+    }
+    private MethodDescriptorProto(boolean noInit) {}
+    
+    private static final MethodDescriptorProto defaultInstance;
+    public static MethodDescriptorProto getDefaultInstance() {
+      return defaultInstance;
+    }
+    
+    public MethodDescriptorProto getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+    
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_MethodDescriptorProto_descriptor;
+    }
+    
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_MethodDescriptorProto_fieldAccessorTable;
+    }
+    
+    private int bitField0_;
+    // optional string name = 1;
+    public static final int NAME_FIELD_NUMBER = 1;
+    private java.lang.Object name_;
+    public boolean hasName() {
+      return ((bitField0_ & 0x00000001) == 0x00000001);
+    }
+    public String getName() {
+      java.lang.Object ref = name_;
+      if (ref instanceof String) {
+        return (String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        String s = bs.toStringUtf8();
+        if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+          name_ = s;
+        }
+        return s;
+      }
+    }
+    private com.google.protobuf.ByteString getNameBytes() {
+      java.lang.Object ref = name_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+        name_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    
+    // optional string input_type = 2;
+    public static final int INPUT_TYPE_FIELD_NUMBER = 2;
+    private java.lang.Object inputType_;
+    public boolean hasInputType() {
+      return ((bitField0_ & 0x00000002) == 0x00000002);
+    }
+    public String getInputType() {
+      java.lang.Object ref = inputType_;
+      if (ref instanceof String) {
+        return (String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        String s = bs.toStringUtf8();
+        if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+          inputType_ = s;
+        }
+        return s;
+      }
+    }
+    private com.google.protobuf.ByteString getInputTypeBytes() {
+      java.lang.Object ref = inputType_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+        inputType_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    
+    // optional string output_type = 3;
+    public static final int OUTPUT_TYPE_FIELD_NUMBER = 3;
+    private java.lang.Object outputType_;
+    public boolean hasOutputType() {
+      return ((bitField0_ & 0x00000004) == 0x00000004);
+    }
+    public String getOutputType() {
+      java.lang.Object ref = outputType_;
+      if (ref instanceof String) {
+        return (String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        String s = bs.toStringUtf8();
+        if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+          outputType_ = s;
+        }
+        return s;
+      }
+    }
+    private com.google.protobuf.ByteString getOutputTypeBytes() {
+      java.lang.Object ref = outputType_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+        outputType_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    
+    // optional .google.protobuf.MethodOptions options = 4;
+    public static final int OPTIONS_FIELD_NUMBER = 4;
+    private com.google.protobuf.DescriptorProtos.MethodOptions options_;
+    public boolean hasOptions() {
+      return ((bitField0_ & 0x00000008) == 0x00000008);
+    }
+    public com.google.protobuf.DescriptorProtos.MethodOptions getOptions() {
+      return options_;
+    }
+    public com.google.protobuf.DescriptorProtos.MethodOptionsOrBuilder getOptionsOrBuilder() {
+      return options_;
+    }
+    
+    private void initFields() {
+      name_ = "";
+      inputType_ = "";
+      outputType_ = "";
+      options_ = com.google.protobuf.DescriptorProtos.MethodOptions.getDefaultInstance();
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+      
+      if (hasOptions()) {
+        if (!getOptions().isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+    
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        output.writeBytes(1, getNameBytes());
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        output.writeBytes(2, getInputTypeBytes());
+      }
+      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+        output.writeBytes(3, getOutputTypeBytes());
+      }
+      if (((bitField0_ & 0x00000008) == 0x00000008)) {
+        output.writeMessage(4, options_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+    
+      size = 0;
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(1, getNameBytes());
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(2, getInputTypeBytes());
+      }
+      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(3, getOutputTypeBytes());
+      }
+      if (((bitField0_ & 0x00000008) == 0x00000008)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(4, options_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+    
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+    
+    public static com.google.protobuf.DescriptorProtos.MethodDescriptorProto parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.MethodDescriptorProto parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.MethodDescriptorProto parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.MethodDescriptorProto parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.MethodDescriptorProto parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.MethodDescriptorProto parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.MethodDescriptorProto parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.MethodDescriptorProto parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.MethodDescriptorProto parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.MethodDescriptorProto parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(com.google.protobuf.DescriptorProtos.MethodDescriptorProto prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+    
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements com.google.protobuf.DescriptorProtos.MethodDescriptorProtoOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_MethodDescriptorProto_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_MethodDescriptorProto_fieldAccessorTable;
+      }
+      
+      // Construct using com.google.protobuf.DescriptorProtos.MethodDescriptorProto.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+      
+      private Builder(BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          getOptionsFieldBuilder();
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+      
+      public Builder clear() {
+        super.clear();
+        name_ = "";
+        bitField0_ = (bitField0_ & ~0x00000001);
+        inputType_ = "";
+        bitField0_ = (bitField0_ & ~0x00000002);
+        outputType_ = "";
+        bitField0_ = (bitField0_ & ~0x00000004);
+        if (optionsBuilder_ == null) {
+          options_ = com.google.protobuf.DescriptorProtos.MethodOptions.getDefaultInstance();
+        } else {
+          optionsBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000008);
+        return this;
+      }
+      
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+      
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return com.google.protobuf.DescriptorProtos.MethodDescriptorProto.getDescriptor();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.MethodDescriptorProto getDefaultInstanceForType() {
+        return com.google.protobuf.DescriptorProtos.MethodDescriptorProto.getDefaultInstance();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.MethodDescriptorProto build() {
+        com.google.protobuf.DescriptorProtos.MethodDescriptorProto result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+      
+      private com.google.protobuf.DescriptorProtos.MethodDescriptorProto buildParsed()
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.DescriptorProtos.MethodDescriptorProto result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(
+            result).asInvalidProtocolBufferException();
+        }
+        return result;
+      }
+      
+      public com.google.protobuf.DescriptorProtos.MethodDescriptorProto buildPartial() {
+        com.google.protobuf.DescriptorProtos.MethodDescriptorProto result = new com.google.protobuf.DescriptorProtos.MethodDescriptorProto(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+          to_bitField0_ |= 0x00000001;
+        }
+        result.name_ = name_;
+        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+          to_bitField0_ |= 0x00000002;
+        }
+        result.inputType_ = inputType_;
+        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
+          to_bitField0_ |= 0x00000004;
+        }
+        result.outputType_ = outputType_;
+        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
+          to_bitField0_ |= 0x00000008;
+        }
+        if (optionsBuilder_ == null) {
+          result.options_ = options_;
+        } else {
+          result.options_ = optionsBuilder_.build();
+        }
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof com.google.protobuf.DescriptorProtos.MethodDescriptorProto) {
+          return mergeFrom((com.google.protobuf.DescriptorProtos.MethodDescriptorProto)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.DescriptorProtos.MethodDescriptorProto other) {
+        if (other == com.google.protobuf.DescriptorProtos.MethodDescriptorProto.getDefaultInstance()) return this;
+        if (other.hasName()) {
+          setName(other.getName());
+        }
+        if (other.hasInputType()) {
+          setInputType(other.getInputType());
+        }
+        if (other.hasOutputType()) {
+          setOutputType(other.getOutputType());
+        }
+        if (other.hasOptions()) {
+          mergeOptions(other.getOptions());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+      
+      public final boolean isInitialized() {
+        if (hasOptions()) {
+          if (!getOptions().isInitialized()) {
+            
+            return false;
+          }
+        }
+        return true;
+      }
+      
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder(
+            this.getUnknownFields());
+        while (true) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              this.setUnknownFields(unknownFields.build());
+              onChanged();
+              return this;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              }
+              break;
+            }
+            case 10: {
+              bitField0_ |= 0x00000001;
+              name_ = input.readBytes();
+              break;
+            }
+            case 18: {
+              bitField0_ |= 0x00000002;
+              inputType_ = input.readBytes();
+              break;
+            }
+            case 26: {
+              bitField0_ |= 0x00000004;
+              outputType_ = input.readBytes();
+              break;
+            }
+            case 34: {
+              com.google.protobuf.DescriptorProtos.MethodOptions.Builder subBuilder = com.google.protobuf.DescriptorProtos.MethodOptions.newBuilder();
+              if (hasOptions()) {
+                subBuilder.mergeFrom(getOptions());
+              }
+              input.readMessage(subBuilder, extensionRegistry);
+              setOptions(subBuilder.buildPartial());
+              break;
+            }
+          }
+        }
+      }
+      
+      private int bitField0_;
+      
+      // optional string name = 1;
+      private java.lang.Object name_ = "";
+      public boolean hasName() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      public String getName() {
+        java.lang.Object ref = name_;
+        if (!(ref instanceof String)) {
+          String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+          name_ = s;
+          return s;
+        } else {
+          return (String) ref;
+        }
+      }
+      public Builder setName(String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+        name_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearName() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        name_ = getDefaultInstance().getName();
+        onChanged();
+        return this;
+      }
+      void setName(com.google.protobuf.ByteString value) {
+        bitField0_ |= 0x00000001;
+        name_ = value;
+        onChanged();
+      }
+      
+      // optional string input_type = 2;
+      private java.lang.Object inputType_ = "";
+      public boolean hasInputType() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      public String getInputType() {
+        java.lang.Object ref = inputType_;
+        if (!(ref instanceof String)) {
+          String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+          inputType_ = s;
+          return s;
+        } else {
+          return (String) ref;
+        }
+      }
+      public Builder setInputType(String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000002;
+        inputType_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearInputType() {
+        bitField0_ = (bitField0_ & ~0x00000002);
+        inputType_ = getDefaultInstance().getInputType();
+        onChanged();
+        return this;
+      }
+      void setInputType(com.google.protobuf.ByteString value) {
+        bitField0_ |= 0x00000002;
+        inputType_ = value;
+        onChanged();
+      }
+      
+      // optional string output_type = 3;
+      private java.lang.Object outputType_ = "";
+      public boolean hasOutputType() {
+        return ((bitField0_ & 0x00000004) == 0x00000004);
+      }
+      public String getOutputType() {
+        java.lang.Object ref = outputType_;
+        if (!(ref instanceof String)) {
+          String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+          outputType_ = s;
+          return s;
+        } else {
+          return (String) ref;
+        }
+      }
+      public Builder setOutputType(String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000004;
+        outputType_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearOutputType() {
+        bitField0_ = (bitField0_ & ~0x00000004);
+        outputType_ = getDefaultInstance().getOutputType();
+        onChanged();
+        return this;
+      }
+      void setOutputType(com.google.protobuf.ByteString value) {
+        bitField0_ |= 0x00000004;
+        outputType_ = value;
+        onChanged();
+      }
+      
+      // optional .google.protobuf.MethodOptions options = 4;
+      private com.google.protobuf.DescriptorProtos.MethodOptions options_ = com.google.protobuf.DescriptorProtos.MethodOptions.getDefaultInstance();
+      private com.google.protobuf.SingleFieldBuilder<
+          com.google.protobuf.DescriptorProtos.MethodOptions, com.google.protobuf.DescriptorProtos.MethodOptions.Builder, com.google.protobuf.DescriptorProtos.MethodOptionsOrBuilder> optionsBuilder_;
+      public boolean hasOptions() {
+        return ((bitField0_ & 0x00000008) == 0x00000008);
+      }
+      public com.google.protobuf.DescriptorProtos.MethodOptions getOptions() {
+        if (optionsBuilder_ == null) {
+          return options_;
+        } else {
+          return optionsBuilder_.getMessage();
+        }
+      }
+      public Builder setOptions(com.google.protobuf.DescriptorProtos.MethodOptions value) {
+        if (optionsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          options_ = value;
+          onChanged();
+        } else {
+          optionsBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000008;
+        return this;
+      }
+      public Builder setOptions(
+          com.google.protobuf.DescriptorProtos.MethodOptions.Builder builderForValue) {
+        if (optionsBuilder_ == null) {
+          options_ = builderForValue.build();
+          onChanged();
+        } else {
+          optionsBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000008;
+        return this;
+      }
+      public Builder mergeOptions(com.google.protobuf.DescriptorProtos.MethodOptions value) {
+        if (optionsBuilder_ == null) {
+          if (((bitField0_ & 0x00000008) == 0x00000008) &&
+              options_ != com.google.protobuf.DescriptorProtos.MethodOptions.getDefaultInstance()) {
+            options_ =
+              com.google.protobuf.DescriptorProtos.MethodOptions.newBuilder(options_).mergeFrom(value).buildPartial();
+          } else {
+            options_ = value;
+          }
+          onChanged();
+        } else {
+          optionsBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000008;
+        return this;
+      }
+      public Builder clearOptions() {
+        if (optionsBuilder_ == null) {
+          options_ = com.google.protobuf.DescriptorProtos.MethodOptions.getDefaultInstance();
+          onChanged();
+        } else {
+          optionsBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000008);
+        return this;
+      }
+      public com.google.protobuf.DescriptorProtos.MethodOptions.Builder getOptionsBuilder() {
+        bitField0_ |= 0x00000008;
+        onChanged();
+        return getOptionsFieldBuilder().getBuilder();
+      }
+      public com.google.protobuf.DescriptorProtos.MethodOptionsOrBuilder getOptionsOrBuilder() {
+        if (optionsBuilder_ != null) {
+          return optionsBuilder_.getMessageOrBuilder();
+        } else {
+          return options_;
+        }
+      }
+      private com.google.protobuf.SingleFieldBuilder<
+          com.google.protobuf.DescriptorProtos.MethodOptions, com.google.protobuf.DescriptorProtos.MethodOptions.Builder, com.google.protobuf.DescriptorProtos.MethodOptionsOrBuilder> 
+          getOptionsFieldBuilder() {
+        if (optionsBuilder_ == null) {
+          optionsBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+              com.google.protobuf.DescriptorProtos.MethodOptions, com.google.protobuf.DescriptorProtos.MethodOptions.Builder, com.google.protobuf.DescriptorProtos.MethodOptionsOrBuilder>(
+                  options_,
+                  getParentForChildren(),
+                  isClean());
+          options_ = null;
+        }
+        return optionsBuilder_;
+      }
+      
+      // @@protoc_insertion_point(builder_scope:google.protobuf.MethodDescriptorProto)
+    }
+    
+    static {
+      defaultInstance = new MethodDescriptorProto(true);
+      defaultInstance.initFields();
+    }
+    
+    // @@protoc_insertion_point(class_scope:google.protobuf.MethodDescriptorProto)
+  }
+  
+  public interface FileOptionsOrBuilder extends
+      com.google.protobuf.GeneratedMessage.
+          ExtendableMessageOrBuilder<FileOptions> {
+    
+    // optional string java_package = 1;
+    boolean hasJavaPackage();
+    String getJavaPackage();
+    
+    // optional string java_outer_classname = 8;
+    boolean hasJavaOuterClassname();
+    String getJavaOuterClassname();
+    
+    // optional bool java_multiple_files = 10 [default = false];
+    boolean hasJavaMultipleFiles();
+    boolean getJavaMultipleFiles();
+    
+    // optional bool java_generate_equals_and_hash = 20 [default = false];
+    boolean hasJavaGenerateEqualsAndHash();
+    boolean getJavaGenerateEqualsAndHash();
+    
+    // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];
+    boolean hasOptimizeFor();
+    com.google.protobuf.DescriptorProtos.FileOptions.OptimizeMode getOptimizeFor();
+    
+    // optional bool cc_generic_services = 16 [default = false];
+    boolean hasCcGenericServices();
+    boolean getCcGenericServices();
+    
+    // optional bool java_generic_services = 17 [default = false];
+    boolean hasJavaGenericServices();
+    boolean getJavaGenericServices();
+    
+    // optional bool py_generic_services = 18 [default = false];
+    boolean hasPyGenericServices();
+    boolean getPyGenericServices();
+    
+    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+    java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> 
+        getUninterpretedOptionList();
+    com.google.protobuf.DescriptorProtos.UninterpretedOption getUninterpretedOption(int index);
+    int getUninterpretedOptionCount();
+    java.util.List<? extends com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> 
+        getUninterpretedOptionOrBuilderList();
+    com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder getUninterpretedOptionOrBuilder(
+        int index);
+  }
+  public static final class FileOptions extends
+      com.google.protobuf.GeneratedMessage.ExtendableMessage<
+        FileOptions> implements FileOptionsOrBuilder {
+    // Use FileOptions.newBuilder() to construct.
+    private FileOptions(Builder builder) {
+      super(builder);
+    }
+    private FileOptions(boolean noInit) {}
+    
+    private static final FileOptions defaultInstance;
+    public static FileOptions getDefaultInstance() {
+      return defaultInstance;
+    }
+    
+    public FileOptions getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+    
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_FileOptions_descriptor;
+    }
+    
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_FileOptions_fieldAccessorTable;
+    }
+    
+    public enum OptimizeMode
+        implements com.google.protobuf.ProtocolMessageEnum {
+      SPEED(0, 1),
+      CODE_SIZE(1, 2),
+      LITE_RUNTIME(2, 3),
+      ;
+      
+      public static final int SPEED_VALUE = 1;
+      public static final int CODE_SIZE_VALUE = 2;
+      public static final int LITE_RUNTIME_VALUE = 3;
+      
+      
+      public final int getNumber() { return value; }
+      
+      public static OptimizeMode valueOf(int value) {
+        switch (value) {
+          case 1: return SPEED;
+          case 2: return CODE_SIZE;
+          case 3: return LITE_RUNTIME;
+          default: return null;
+        }
+      }
+      
+      public static com.google.protobuf.Internal.EnumLiteMap<OptimizeMode>
+          internalGetValueMap() {
+        return internalValueMap;
+      }
+      private static com.google.protobuf.Internal.EnumLiteMap<OptimizeMode>
+          internalValueMap =
+            new com.google.protobuf.Internal.EnumLiteMap<OptimizeMode>() {
+              public OptimizeMode findValueByNumber(int number) {
+                return OptimizeMode.valueOf(number);
+              }
+            };
+      
+      public final com.google.protobuf.Descriptors.EnumValueDescriptor
+          getValueDescriptor() {
+        return getDescriptor().getValues().get(index);
+      }
+      public final com.google.protobuf.Descriptors.EnumDescriptor
+          getDescriptorForType() {
+        return getDescriptor();
+      }
+      public static final com.google.protobuf.Descriptors.EnumDescriptor
+          getDescriptor() {
+        return com.google.protobuf.DescriptorProtos.FileOptions.getDescriptor().getEnumTypes().get(0);
+      }
+      
+      private static final OptimizeMode[] VALUES = {
+        SPEED, CODE_SIZE, LITE_RUNTIME, 
+      };
+      
+      public static OptimizeMode valueOf(
+          com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+        if (desc.getType() != getDescriptor()) {
+          throw new java.lang.IllegalArgumentException(
+            "EnumValueDescriptor is not for this type.");
+        }
+        return VALUES[desc.getIndex()];
+      }
+      
+      private final int index;
+      private final int value;
+      
+      private OptimizeMode(int index, int value) {
+        this.index = index;
+        this.value = value;
+      }
+      
+      // @@protoc_insertion_point(enum_scope:google.protobuf.FileOptions.OptimizeMode)
+    }
+    
+    private int bitField0_;
+    // optional string java_package = 1;
+    public static final int JAVA_PACKAGE_FIELD_NUMBER = 1;
+    private java.lang.Object javaPackage_;
+    public boolean hasJavaPackage() {
+      return ((bitField0_ & 0x00000001) == 0x00000001);
+    }
+    public String getJavaPackage() {
+      java.lang.Object ref = javaPackage_;
+      if (ref instanceof String) {
+        return (String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        String s = bs.toStringUtf8();
+        if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+          javaPackage_ = s;
+        }
+        return s;
+      }
+    }
+    private com.google.protobuf.ByteString getJavaPackageBytes() {
+      java.lang.Object ref = javaPackage_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+        javaPackage_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    
+    // optional string java_outer_classname = 8;
+    public static final int JAVA_OUTER_CLASSNAME_FIELD_NUMBER = 8;
+    private java.lang.Object javaOuterClassname_;
+    public boolean hasJavaOuterClassname() {
+      return ((bitField0_ & 0x00000002) == 0x00000002);
+    }
+    public String getJavaOuterClassname() {
+      java.lang.Object ref = javaOuterClassname_;
+      if (ref instanceof String) {
+        return (String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        String s = bs.toStringUtf8();
+        if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+          javaOuterClassname_ = s;
+        }
+        return s;
+      }
+    }
+    private com.google.protobuf.ByteString getJavaOuterClassnameBytes() {
+      java.lang.Object ref = javaOuterClassname_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+        javaOuterClassname_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    
+    // optional bool java_multiple_files = 10 [default = false];
+    public static final int JAVA_MULTIPLE_FILES_FIELD_NUMBER = 10;
+    private boolean javaMultipleFiles_;
+    public boolean hasJavaMultipleFiles() {
+      return ((bitField0_ & 0x00000004) == 0x00000004);
+    }
+    public boolean getJavaMultipleFiles() {
+      return javaMultipleFiles_;
+    }
+    
+    // optional bool java_generate_equals_and_hash = 20 [default = false];
+    public static final int JAVA_GENERATE_EQUALS_AND_HASH_FIELD_NUMBER = 20;
+    private boolean javaGenerateEqualsAndHash_;
+    public boolean hasJavaGenerateEqualsAndHash() {
+      return ((bitField0_ & 0x00000008) == 0x00000008);
+    }
+    public boolean getJavaGenerateEqualsAndHash() {
+      return javaGenerateEqualsAndHash_;
+    }
+    
+    // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];
+    public static final int OPTIMIZE_FOR_FIELD_NUMBER = 9;
+    private com.google.protobuf.DescriptorProtos.FileOptions.OptimizeMode optimizeFor_;
+    public boolean hasOptimizeFor() {
+      return ((bitField0_ & 0x00000010) == 0x00000010);
+    }
+    public com.google.protobuf.DescriptorProtos.FileOptions.OptimizeMode getOptimizeFor() {
+      return optimizeFor_;
+    }
+    
+    // optional bool cc_generic_services = 16 [default = false];
+    public static final int CC_GENERIC_SERVICES_FIELD_NUMBER = 16;
+    private boolean ccGenericServices_;
+    public boolean hasCcGenericServices() {
+      return ((bitField0_ & 0x00000020) == 0x00000020);
+    }
+    public boolean getCcGenericServices() {
+      return ccGenericServices_;
+    }
+    
+    // optional bool java_generic_services = 17 [default = false];
+    public static final int JAVA_GENERIC_SERVICES_FIELD_NUMBER = 17;
+    private boolean javaGenericServices_;
+    public boolean hasJavaGenericServices() {
+      return ((bitField0_ & 0x00000040) == 0x00000040);
+    }
+    public boolean getJavaGenericServices() {
+      return javaGenericServices_;
+    }
+    
+    // optional bool py_generic_services = 18 [default = false];
+    public static final int PY_GENERIC_SERVICES_FIELD_NUMBER = 18;
+    private boolean pyGenericServices_;
+    public boolean hasPyGenericServices() {
+      return ((bitField0_ & 0x00000080) == 0x00000080);
+    }
+    public boolean getPyGenericServices() {
+      return pyGenericServices_;
+    }
+    
+    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+    public static final int UNINTERPRETED_OPTION_FIELD_NUMBER = 999;
+    private java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> uninterpretedOption_;
+    public java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> getUninterpretedOptionList() {
+      return uninterpretedOption_;
+    }
+    public java.util.List<? extends com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> 
+        getUninterpretedOptionOrBuilderList() {
+      return uninterpretedOption_;
+    }
+    public int getUninterpretedOptionCount() {
+      return uninterpretedOption_.size();
+    }
+    public com.google.protobuf.DescriptorProtos.UninterpretedOption getUninterpretedOption(int index) {
+      return uninterpretedOption_.get(index);
+    }
+    public com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder getUninterpretedOptionOrBuilder(
+        int index) {
+      return uninterpretedOption_.get(index);
+    }
+    
+    private void initFields() {
+      javaPackage_ = "";
+      javaOuterClassname_ = "";
+      javaMultipleFiles_ = false;
+      javaGenerateEqualsAndHash_ = false;
+      optimizeFor_ = com.google.protobuf.DescriptorProtos.FileOptions.OptimizeMode.SPEED;
+      ccGenericServices_ = false;
+      javaGenericServices_ = false;
+      pyGenericServices_ = false;
+      uninterpretedOption_ = java.util.Collections.emptyList();
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+      
+      for (int i = 0; i < getUninterpretedOptionCount(); i++) {
+        if (!getUninterpretedOption(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      if (!extensionsAreInitialized()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+    
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      com.google.protobuf.GeneratedMessage
+        .ExtendableMessage<com.google.protobuf.DescriptorProtos.FileOptions>.ExtensionWriter extensionWriter =
+          newExtensionWriter();
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        output.writeBytes(1, getJavaPackageBytes());
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        output.writeBytes(8, getJavaOuterClassnameBytes());
+      }
+      if (((bitField0_ & 0x00000010) == 0x00000010)) {
+        output.writeEnum(9, optimizeFor_.getNumber());
+      }
+      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+        output.writeBool(10, javaMultipleFiles_);
+      }
+      if (((bitField0_ & 0x00000020) == 0x00000020)) {
+        output.writeBool(16, ccGenericServices_);
+      }
+      if (((bitField0_ & 0x00000040) == 0x00000040)) {
+        output.writeBool(17, javaGenericServices_);
+      }
+      if (((bitField0_ & 0x00000080) == 0x00000080)) {
+        output.writeBool(18, pyGenericServices_);
+      }
+      if (((bitField0_ & 0x00000008) == 0x00000008)) {
+        output.writeBool(20, javaGenerateEqualsAndHash_);
+      }
+      for (int i = 0; i < uninterpretedOption_.size(); i++) {
+        output.writeMessage(999, uninterpretedOption_.get(i));
+      }
+      extensionWriter.writeUntil(536870912, output);
+      getUnknownFields().writeTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+    
+      size = 0;
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(1, getJavaPackageBytes());
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(8, getJavaOuterClassnameBytes());
+      }
+      if (((bitField0_ & 0x00000010) == 0x00000010)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeEnumSize(9, optimizeFor_.getNumber());
+      }
+      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBoolSize(10, javaMultipleFiles_);
+      }
+      if (((bitField0_ & 0x00000020) == 0x00000020)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBoolSize(16, ccGenericServices_);
+      }
+      if (((bitField0_ & 0x00000040) == 0x00000040)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBoolSize(17, javaGenericServices_);
+      }
+      if (((bitField0_ & 0x00000080) == 0x00000080)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBoolSize(18, pyGenericServices_);
+      }
+      if (((bitField0_ & 0x00000008) == 0x00000008)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBoolSize(20, javaGenerateEqualsAndHash_);
+      }
+      for (int i = 0; i < uninterpretedOption_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(999, uninterpretedOption_.get(i));
+      }
+      size += extensionsSerializedSize();
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+    
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+    
+    public static com.google.protobuf.DescriptorProtos.FileOptions parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FileOptions parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FileOptions parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FileOptions parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FileOptions parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FileOptions parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FileOptions parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.FileOptions parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.FileOptions parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FileOptions parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(com.google.protobuf.DescriptorProtos.FileOptions prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+    
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.ExtendableBuilder<
+          com.google.protobuf.DescriptorProtos.FileOptions, Builder> implements com.google.protobuf.DescriptorProtos.FileOptionsOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_FileOptions_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_FileOptions_fieldAccessorTable;
+      }
+      
+      // Construct using com.google.protobuf.DescriptorProtos.FileOptions.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+      
+      private Builder(BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          getUninterpretedOptionFieldBuilder();
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+      
+      public Builder clear() {
+        super.clear();
+        javaPackage_ = "";
+        bitField0_ = (bitField0_ & ~0x00000001);
+        javaOuterClassname_ = "";
+        bitField0_ = (bitField0_ & ~0x00000002);
+        javaMultipleFiles_ = false;
+        bitField0_ = (bitField0_ & ~0x00000004);
+        javaGenerateEqualsAndHash_ = false;
+        bitField0_ = (bitField0_ & ~0x00000008);
+        optimizeFor_ = com.google.protobuf.DescriptorProtos.FileOptions.OptimizeMode.SPEED;
+        bitField0_ = (bitField0_ & ~0x00000010);
+        ccGenericServices_ = false;
+        bitField0_ = (bitField0_ & ~0x00000020);
+        javaGenericServices_ = false;
+        bitField0_ = (bitField0_ & ~0x00000040);
+        pyGenericServices_ = false;
+        bitField0_ = (bitField0_ & ~0x00000080);
+        if (uninterpretedOptionBuilder_ == null) {
+          uninterpretedOption_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000100);
+        } else {
+          uninterpretedOptionBuilder_.clear();
+        }
+        return this;
+      }
+      
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+      
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return com.google.protobuf.DescriptorProtos.FileOptions.getDescriptor();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.FileOptions getDefaultInstanceForType() {
+        return com.google.protobuf.DescriptorProtos.FileOptions.getDefaultInstance();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.FileOptions build() {
+        com.google.protobuf.DescriptorProtos.FileOptions result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+      
+      private com.google.protobuf.DescriptorProtos.FileOptions buildParsed()
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.DescriptorProtos.FileOptions result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(
+            result).asInvalidProtocolBufferException();
+        }
+        return result;
+      }
+      
+      public com.google.protobuf.DescriptorProtos.FileOptions buildPartial() {
+        com.google.protobuf.DescriptorProtos.FileOptions result = new com.google.protobuf.DescriptorProtos.FileOptions(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+          to_bitField0_ |= 0x00000001;
+        }
+        result.javaPackage_ = javaPackage_;
+        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+          to_bitField0_ |= 0x00000002;
+        }
+        result.javaOuterClassname_ = javaOuterClassname_;
+        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
+          to_bitField0_ |= 0x00000004;
+        }
+        result.javaMultipleFiles_ = javaMultipleFiles_;
+        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
+          to_bitField0_ |= 0x00000008;
+        }
+        result.javaGenerateEqualsAndHash_ = javaGenerateEqualsAndHash_;
+        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
+          to_bitField0_ |= 0x00000010;
+        }
+        result.optimizeFor_ = optimizeFor_;
+        if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
+          to_bitField0_ |= 0x00000020;
+        }
+        result.ccGenericServices_ = ccGenericServices_;
+        if (((from_bitField0_ & 0x00000040) == 0x00000040)) {
+          to_bitField0_ |= 0x00000040;
+        }
+        result.javaGenericServices_ = javaGenericServices_;
+        if (((from_bitField0_ & 0x00000080) == 0x00000080)) {
+          to_bitField0_ |= 0x00000080;
+        }
+        result.pyGenericServices_ = pyGenericServices_;
+        if (uninterpretedOptionBuilder_ == null) {
+          if (((bitField0_ & 0x00000100) == 0x00000100)) {
+            uninterpretedOption_ = java.util.Collections.unmodifiableList(uninterpretedOption_);
+            bitField0_ = (bitField0_ & ~0x00000100);
+          }
+          result.uninterpretedOption_ = uninterpretedOption_;
+        } else {
+          result.uninterpretedOption_ = uninterpretedOptionBuilder_.build();
+        }
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof com.google.protobuf.DescriptorProtos.FileOptions) {
+          return mergeFrom((com.google.protobuf.DescriptorProtos.FileOptions)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.DescriptorProtos.FileOptions other) {
+        if (other == com.google.protobuf.DescriptorProtos.FileOptions.getDefaultInstance()) return this;
+        if (other.hasJavaPackage()) {
+          setJavaPackage(other.getJavaPackage());
+        }
+        if (other.hasJavaOuterClassname()) {
+          setJavaOuterClassname(other.getJavaOuterClassname());
+        }
+        if (other.hasJavaMultipleFiles()) {
+          setJavaMultipleFiles(other.getJavaMultipleFiles());
+        }
+        if (other.hasJavaGenerateEqualsAndHash()) {
+          setJavaGenerateEqualsAndHash(other.getJavaGenerateEqualsAndHash());
+        }
+        if (other.hasOptimizeFor()) {
+          setOptimizeFor(other.getOptimizeFor());
+        }
+        if (other.hasCcGenericServices()) {
+          setCcGenericServices(other.getCcGenericServices());
+        }
+        if (other.hasJavaGenericServices()) {
+          setJavaGenericServices(other.getJavaGenericServices());
+        }
+        if (other.hasPyGenericServices()) {
+          setPyGenericServices(other.getPyGenericServices());
+        }
+        if (uninterpretedOptionBuilder_ == null) {
+          if (!other.uninterpretedOption_.isEmpty()) {
+            if (uninterpretedOption_.isEmpty()) {
+              uninterpretedOption_ = other.uninterpretedOption_;
+              bitField0_ = (bitField0_ & ~0x00000100);
+            } else {
+              ensureUninterpretedOptionIsMutable();
+              uninterpretedOption_.addAll(other.uninterpretedOption_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.uninterpretedOption_.isEmpty()) {
+            if (uninterpretedOptionBuilder_.isEmpty()) {
+              uninterpretedOptionBuilder_.dispose();
+              uninterpretedOptionBuilder_ = null;
+              uninterpretedOption_ = other.uninterpretedOption_;
+              bitField0_ = (bitField0_ & ~0x00000100);
+              uninterpretedOptionBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getUninterpretedOptionFieldBuilder() : null;
+            } else {
+              uninterpretedOptionBuilder_.addAllMessages(other.uninterpretedOption_);
+            }
+          }
+        }
+        this.mergeExtensionFields(other);
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+      
+      public final boolean isInitialized() {
+        for (int i = 0; i < getUninterpretedOptionCount(); i++) {
+          if (!getUninterpretedOption(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        if (!extensionsAreInitialized()) {
+          
+          return false;
+        }
+        return true;
+      }
+      
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder(
+            this.getUnknownFields());
+        while (true) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              this.setUnknownFields(unknownFields.build());
+              onChanged();
+              return this;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              }
+              break;
+            }
+            case 10: {
+              bitField0_ |= 0x00000001;
+              javaPackage_ = input.readBytes();
+              break;
+            }
+            case 66: {
+              bitField0_ |= 0x00000002;
+              javaOuterClassname_ = input.readBytes();
+              break;
+            }
+            case 72: {
+              int rawValue = input.readEnum();
+              com.google.protobuf.DescriptorProtos.FileOptions.OptimizeMode value = com.google.protobuf.DescriptorProtos.FileOptions.OptimizeMode.valueOf(rawValue);
+              if (value == null) {
+                unknownFields.mergeVarintField(9, rawValue);
+              } else {
+                bitField0_ |= 0x00000010;
+                optimizeFor_ = value;
+              }
+              break;
+            }
+            case 80: {
+              bitField0_ |= 0x00000004;
+              javaMultipleFiles_ = input.readBool();
+              break;
+            }
+            case 128: {
+              bitField0_ |= 0x00000020;
+              ccGenericServices_ = input.readBool();
+              break;
+            }
+            case 136: {
+              bitField0_ |= 0x00000040;
+              javaGenericServices_ = input.readBool();
+              break;
+            }
+            case 144: {
+              bitField0_ |= 0x00000080;
+              pyGenericServices_ = input.readBool();
+              break;
+            }
+            case 160: {
+              bitField0_ |= 0x00000008;
+              javaGenerateEqualsAndHash_ = input.readBool();
+              break;
+            }
+            case 7994: {
+              com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder subBuilder = com.google.protobuf.DescriptorProtos.UninterpretedOption.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addUninterpretedOption(subBuilder.buildPartial());
+              break;
+            }
+          }
+        }
+      }
+      
+      private int bitField0_;
+      
+      // optional string java_package = 1;
+      private java.lang.Object javaPackage_ = "";
+      public boolean hasJavaPackage() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      public String getJavaPackage() {
+        java.lang.Object ref = javaPackage_;
+        if (!(ref instanceof String)) {
+          String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+          javaPackage_ = s;
+          return s;
+        } else {
+          return (String) ref;
+        }
+      }
+      public Builder setJavaPackage(String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+        javaPackage_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearJavaPackage() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        javaPackage_ = getDefaultInstance().getJavaPackage();
+        onChanged();
+        return this;
+      }
+      void setJavaPackage(com.google.protobuf.ByteString value) {
+        bitField0_ |= 0x00000001;
+        javaPackage_ = value;
+        onChanged();
+      }
+      
+      // optional string java_outer_classname = 8;
+      private java.lang.Object javaOuterClassname_ = "";
+      public boolean hasJavaOuterClassname() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      public String getJavaOuterClassname() {
+        java.lang.Object ref = javaOuterClassname_;
+        if (!(ref instanceof String)) {
+          String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+          javaOuterClassname_ = s;
+          return s;
+        } else {
+          return (String) ref;
+        }
+      }
+      public Builder setJavaOuterClassname(String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000002;
+        javaOuterClassname_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearJavaOuterClassname() {
+        bitField0_ = (bitField0_ & ~0x00000002);
+        javaOuterClassname_ = getDefaultInstance().getJavaOuterClassname();
+        onChanged();
+        return this;
+      }
+      void setJavaOuterClassname(com.google.protobuf.ByteString value) {
+        bitField0_ |= 0x00000002;
+        javaOuterClassname_ = value;
+        onChanged();
+      }
+      
+      // optional bool java_multiple_files = 10 [default = false];
+      private boolean javaMultipleFiles_ ;
+      public boolean hasJavaMultipleFiles() {
+        return ((bitField0_ & 0x00000004) == 0x00000004);
+      }
+      public boolean getJavaMultipleFiles() {
+        return javaMultipleFiles_;
+      }
+      public Builder setJavaMultipleFiles(boolean value) {
+        bitField0_ |= 0x00000004;
+        javaMultipleFiles_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearJavaMultipleFiles() {
+        bitField0_ = (bitField0_ & ~0x00000004);
+        javaMultipleFiles_ = false;
+        onChanged();
+        return this;
+      }
+      
+      // optional bool java_generate_equals_and_hash = 20 [default = false];
+      private boolean javaGenerateEqualsAndHash_ ;
+      public boolean hasJavaGenerateEqualsAndHash() {
+        return ((bitField0_ & 0x00000008) == 0x00000008);
+      }
+      public boolean getJavaGenerateEqualsAndHash() {
+        return javaGenerateEqualsAndHash_;
+      }
+      public Builder setJavaGenerateEqualsAndHash(boolean value) {
+        bitField0_ |= 0x00000008;
+        javaGenerateEqualsAndHash_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearJavaGenerateEqualsAndHash() {
+        bitField0_ = (bitField0_ & ~0x00000008);
+        javaGenerateEqualsAndHash_ = false;
+        onChanged();
+        return this;
+      }
+      
+      // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];
+      private com.google.protobuf.DescriptorProtos.FileOptions.OptimizeMode optimizeFor_ = com.google.protobuf.DescriptorProtos.FileOptions.OptimizeMode.SPEED;
+      public boolean hasOptimizeFor() {
+        return ((bitField0_ & 0x00000010) == 0x00000010);
+      }
+      public com.google.protobuf.DescriptorProtos.FileOptions.OptimizeMode getOptimizeFor() {
+        return optimizeFor_;
+      }
+      public Builder setOptimizeFor(com.google.protobuf.DescriptorProtos.FileOptions.OptimizeMode value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        bitField0_ |= 0x00000010;
+        optimizeFor_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearOptimizeFor() {
+        bitField0_ = (bitField0_ & ~0x00000010);
+        optimizeFor_ = com.google.protobuf.DescriptorProtos.FileOptions.OptimizeMode.SPEED;
+        onChanged();
+        return this;
+      }
+      
+      // optional bool cc_generic_services = 16 [default = false];
+      private boolean ccGenericServices_ ;
+      public boolean hasCcGenericServices() {
+        return ((bitField0_ & 0x00000020) == 0x00000020);
+      }
+      public boolean getCcGenericServices() {
+        return ccGenericServices_;
+      }
+      public Builder setCcGenericServices(boolean value) {
+        bitField0_ |= 0x00000020;
+        ccGenericServices_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearCcGenericServices() {
+        bitField0_ = (bitField0_ & ~0x00000020);
+        ccGenericServices_ = false;
+        onChanged();
+        return this;
+      }
+      
+      // optional bool java_generic_services = 17 [default = false];
+      private boolean javaGenericServices_ ;
+      public boolean hasJavaGenericServices() {
+        return ((bitField0_ & 0x00000040) == 0x00000040);
+      }
+      public boolean getJavaGenericServices() {
+        return javaGenericServices_;
+      }
+      public Builder setJavaGenericServices(boolean value) {
+        bitField0_ |= 0x00000040;
+        javaGenericServices_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearJavaGenericServices() {
+        bitField0_ = (bitField0_ & ~0x00000040);
+        javaGenericServices_ = false;
+        onChanged();
+        return this;
+      }
+      
+      // optional bool py_generic_services = 18 [default = false];
+      private boolean pyGenericServices_ ;
+      public boolean hasPyGenericServices() {
+        return ((bitField0_ & 0x00000080) == 0x00000080);
+      }
+      public boolean getPyGenericServices() {
+        return pyGenericServices_;
+      }
+      public Builder setPyGenericServices(boolean value) {
+        bitField0_ |= 0x00000080;
+        pyGenericServices_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearPyGenericServices() {
+        bitField0_ = (bitField0_ & ~0x00000080);
+        pyGenericServices_ = false;
+        onChanged();
+        return this;
+      }
+      
+      // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+      private java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> uninterpretedOption_ =
+        java.util.Collections.emptyList();
+      private void ensureUninterpretedOptionIsMutable() {
+        if (!((bitField0_ & 0x00000100) == 0x00000100)) {
+          uninterpretedOption_ = new java.util.ArrayList<com.google.protobuf.DescriptorProtos.UninterpretedOption>(uninterpretedOption_);
+          bitField0_ |= 0x00000100;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.UninterpretedOption, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder, com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> uninterpretedOptionBuilder_;
+      
+      public java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> getUninterpretedOptionList() {
+        if (uninterpretedOptionBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(uninterpretedOption_);
+        } else {
+          return uninterpretedOptionBuilder_.getMessageList();
+        }
+      }
+      public int getUninterpretedOptionCount() {
+        if (uninterpretedOptionBuilder_ == null) {
+          return uninterpretedOption_.size();
+        } else {
+          return uninterpretedOptionBuilder_.getCount();
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption getUninterpretedOption(int index) {
+        if (uninterpretedOptionBuilder_ == null) {
+          return uninterpretedOption_.get(index);
+        } else {
+          return uninterpretedOptionBuilder_.getMessage(index);
+        }
+      }
+      public Builder setUninterpretedOption(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption value) {
+        if (uninterpretedOptionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.set(index, value);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setUninterpretedOption(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder builderForValue) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addUninterpretedOption(com.google.protobuf.DescriptorProtos.UninterpretedOption value) {
+        if (uninterpretedOptionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.add(value);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addUninterpretedOption(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption value) {
+        if (uninterpretedOptionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.add(index, value);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addUninterpretedOption(
+          com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder builderForValue) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.add(builderForValue.build());
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addUninterpretedOption(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder builderForValue) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllUninterpretedOption(
+          java.lang.Iterable<? extends com.google.protobuf.DescriptorProtos.UninterpretedOption> values) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          super.addAll(values, uninterpretedOption_);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearUninterpretedOption() {
+        if (uninterpretedOptionBuilder_ == null) {
+          uninterpretedOption_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000100);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeUninterpretedOption(int index) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.remove(index);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.remove(index);
+        }
+        return this;
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder getUninterpretedOptionBuilder(
+          int index) {
+        return getUninterpretedOptionFieldBuilder().getBuilder(index);
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder getUninterpretedOptionOrBuilder(
+          int index) {
+        if (uninterpretedOptionBuilder_ == null) {
+          return uninterpretedOption_.get(index);  } else {
+          return uninterpretedOptionBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> 
+           getUninterpretedOptionOrBuilderList() {
+        if (uninterpretedOptionBuilder_ != null) {
+          return uninterpretedOptionBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(uninterpretedOption_);
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder addUninterpretedOptionBuilder() {
+        return getUninterpretedOptionFieldBuilder().addBuilder(
+            com.google.protobuf.DescriptorProtos.UninterpretedOption.getDefaultInstance());
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder addUninterpretedOptionBuilder(
+          int index) {
+        return getUninterpretedOptionFieldBuilder().addBuilder(
+            index, com.google.protobuf.DescriptorProtos.UninterpretedOption.getDefaultInstance());
+      }
+      public java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder> 
+           getUninterpretedOptionBuilderList() {
+        return getUninterpretedOptionFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.UninterpretedOption, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder, com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> 
+          getUninterpretedOptionFieldBuilder() {
+        if (uninterpretedOptionBuilder_ == null) {
+          uninterpretedOptionBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              com.google.protobuf.DescriptorProtos.UninterpretedOption, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder, com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder>(
+                  uninterpretedOption_,
+                  ((bitField0_ & 0x00000100) == 0x00000100),
+                  getParentForChildren(),
+                  isClean());
+          uninterpretedOption_ = null;
+        }
+        return uninterpretedOptionBuilder_;
+      }
+      
+      // @@protoc_insertion_point(builder_scope:google.protobuf.FileOptions)
+    }
+    
+    static {
+      defaultInstance = new FileOptions(true);
+      defaultInstance.initFields();
+    }
+    
+    // @@protoc_insertion_point(class_scope:google.protobuf.FileOptions)
+  }
+  
+  public interface MessageOptionsOrBuilder extends
+      com.google.protobuf.GeneratedMessage.
+          ExtendableMessageOrBuilder<MessageOptions> {
+    
+    // optional bool message_set_wire_format = 1 [default = false];
+    boolean hasMessageSetWireFormat();
+    boolean getMessageSetWireFormat();
+    
+    // optional bool no_standard_descriptor_accessor = 2 [default = false];
+    boolean hasNoStandardDescriptorAccessor();
+    boolean getNoStandardDescriptorAccessor();
+    
+    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+    java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> 
+        getUninterpretedOptionList();
+    com.google.protobuf.DescriptorProtos.UninterpretedOption getUninterpretedOption(int index);
+    int getUninterpretedOptionCount();
+    java.util.List<? extends com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> 
+        getUninterpretedOptionOrBuilderList();
+    com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder getUninterpretedOptionOrBuilder(
+        int index);
+  }
+  public static final class MessageOptions extends
+      com.google.protobuf.GeneratedMessage.ExtendableMessage<
+        MessageOptions> implements MessageOptionsOrBuilder {
+    // Use MessageOptions.newBuilder() to construct.
+    private MessageOptions(Builder builder) {
+      super(builder);
+    }
+    private MessageOptions(boolean noInit) {}
+    
+    private static final MessageOptions defaultInstance;
+    public static MessageOptions getDefaultInstance() {
+      return defaultInstance;
+    }
+    
+    public MessageOptions getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+    
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_MessageOptions_descriptor;
+    }
+    
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_MessageOptions_fieldAccessorTable;
+    }
+    
+    private int bitField0_;
+    // optional bool message_set_wire_format = 1 [default = false];
+    public static final int MESSAGE_SET_WIRE_FORMAT_FIELD_NUMBER = 1;
+    private boolean messageSetWireFormat_;
+    public boolean hasMessageSetWireFormat() {
+      return ((bitField0_ & 0x00000001) == 0x00000001);
+    }
+    public boolean getMessageSetWireFormat() {
+      return messageSetWireFormat_;
+    }
+    
+    // optional bool no_standard_descriptor_accessor = 2 [default = false];
+    public static final int NO_STANDARD_DESCRIPTOR_ACCESSOR_FIELD_NUMBER = 2;
+    private boolean noStandardDescriptorAccessor_;
+    public boolean hasNoStandardDescriptorAccessor() {
+      return ((bitField0_ & 0x00000002) == 0x00000002);
+    }
+    public boolean getNoStandardDescriptorAccessor() {
+      return noStandardDescriptorAccessor_;
+    }
+    
+    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+    public static final int UNINTERPRETED_OPTION_FIELD_NUMBER = 999;
+    private java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> uninterpretedOption_;
+    public java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> getUninterpretedOptionList() {
+      return uninterpretedOption_;
+    }
+    public java.util.List<? extends com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> 
+        getUninterpretedOptionOrBuilderList() {
+      return uninterpretedOption_;
+    }
+    public int getUninterpretedOptionCount() {
+      return uninterpretedOption_.size();
+    }
+    public com.google.protobuf.DescriptorProtos.UninterpretedOption getUninterpretedOption(int index) {
+      return uninterpretedOption_.get(index);
+    }
+    public com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder getUninterpretedOptionOrBuilder(
+        int index) {
+      return uninterpretedOption_.get(index);
+    }
+    
+    private void initFields() {
+      messageSetWireFormat_ = false;
+      noStandardDescriptorAccessor_ = false;
+      uninterpretedOption_ = java.util.Collections.emptyList();
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+      
+      for (int i = 0; i < getUninterpretedOptionCount(); i++) {
+        if (!getUninterpretedOption(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      if (!extensionsAreInitialized()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+    
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      com.google.protobuf.GeneratedMessage
+        .ExtendableMessage<com.google.protobuf.DescriptorProtos.MessageOptions>.ExtensionWriter extensionWriter =
+          newExtensionWriter();
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        output.writeBool(1, messageSetWireFormat_);
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        output.writeBool(2, noStandardDescriptorAccessor_);
+      }
+      for (int i = 0; i < uninterpretedOption_.size(); i++) {
+        output.writeMessage(999, uninterpretedOption_.get(i));
+      }
+      extensionWriter.writeUntil(536870912, output);
+      getUnknownFields().writeTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+    
+      size = 0;
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBoolSize(1, messageSetWireFormat_);
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBoolSize(2, noStandardDescriptorAccessor_);
+      }
+      for (int i = 0; i < uninterpretedOption_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(999, uninterpretedOption_.get(i));
+      }
+      size += extensionsSerializedSize();
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+    
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+    
+    public static com.google.protobuf.DescriptorProtos.MessageOptions parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.MessageOptions parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.MessageOptions parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.MessageOptions parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.MessageOptions parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.MessageOptions parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.MessageOptions parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.MessageOptions parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.MessageOptions parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.MessageOptions parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(com.google.protobuf.DescriptorProtos.MessageOptions prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+    
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.ExtendableBuilder<
+          com.google.protobuf.DescriptorProtos.MessageOptions, Builder> implements com.google.protobuf.DescriptorProtos.MessageOptionsOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_MessageOptions_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_MessageOptions_fieldAccessorTable;
+      }
+      
+      // Construct using com.google.protobuf.DescriptorProtos.MessageOptions.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+      
+      private Builder(BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          getUninterpretedOptionFieldBuilder();
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+      
+      public Builder clear() {
+        super.clear();
+        messageSetWireFormat_ = false;
+        bitField0_ = (bitField0_ & ~0x00000001);
+        noStandardDescriptorAccessor_ = false;
+        bitField0_ = (bitField0_ & ~0x00000002);
+        if (uninterpretedOptionBuilder_ == null) {
+          uninterpretedOption_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000004);
+        } else {
+          uninterpretedOptionBuilder_.clear();
+        }
+        return this;
+      }
+      
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+      
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return com.google.protobuf.DescriptorProtos.MessageOptions.getDescriptor();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.MessageOptions getDefaultInstanceForType() {
+        return com.google.protobuf.DescriptorProtos.MessageOptions.getDefaultInstance();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.MessageOptions build() {
+        com.google.protobuf.DescriptorProtos.MessageOptions result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+      
+      private com.google.protobuf.DescriptorProtos.MessageOptions buildParsed()
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.DescriptorProtos.MessageOptions result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(
+            result).asInvalidProtocolBufferException();
+        }
+        return result;
+      }
+      
+      public com.google.protobuf.DescriptorProtos.MessageOptions buildPartial() {
+        com.google.protobuf.DescriptorProtos.MessageOptions result = new com.google.protobuf.DescriptorProtos.MessageOptions(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+          to_bitField0_ |= 0x00000001;
+        }
+        result.messageSetWireFormat_ = messageSetWireFormat_;
+        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+          to_bitField0_ |= 0x00000002;
+        }
+        result.noStandardDescriptorAccessor_ = noStandardDescriptorAccessor_;
+        if (uninterpretedOptionBuilder_ == null) {
+          if (((bitField0_ & 0x00000004) == 0x00000004)) {
+            uninterpretedOption_ = java.util.Collections.unmodifiableList(uninterpretedOption_);
+            bitField0_ = (bitField0_ & ~0x00000004);
+          }
+          result.uninterpretedOption_ = uninterpretedOption_;
+        } else {
+          result.uninterpretedOption_ = uninterpretedOptionBuilder_.build();
+        }
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof com.google.protobuf.DescriptorProtos.MessageOptions) {
+          return mergeFrom((com.google.protobuf.DescriptorProtos.MessageOptions)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.DescriptorProtos.MessageOptions other) {
+        if (other == com.google.protobuf.DescriptorProtos.MessageOptions.getDefaultInstance()) return this;
+        if (other.hasMessageSetWireFormat()) {
+          setMessageSetWireFormat(other.getMessageSetWireFormat());
+        }
+        if (other.hasNoStandardDescriptorAccessor()) {
+          setNoStandardDescriptorAccessor(other.getNoStandardDescriptorAccessor());
+        }
+        if (uninterpretedOptionBuilder_ == null) {
+          if (!other.uninterpretedOption_.isEmpty()) {
+            if (uninterpretedOption_.isEmpty()) {
+              uninterpretedOption_ = other.uninterpretedOption_;
+              bitField0_ = (bitField0_ & ~0x00000004);
+            } else {
+              ensureUninterpretedOptionIsMutable();
+              uninterpretedOption_.addAll(other.uninterpretedOption_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.uninterpretedOption_.isEmpty()) {
+            if (uninterpretedOptionBuilder_.isEmpty()) {
+              uninterpretedOptionBuilder_.dispose();
+              uninterpretedOptionBuilder_ = null;
+              uninterpretedOption_ = other.uninterpretedOption_;
+              bitField0_ = (bitField0_ & ~0x00000004);
+              uninterpretedOptionBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getUninterpretedOptionFieldBuilder() : null;
+            } else {
+              uninterpretedOptionBuilder_.addAllMessages(other.uninterpretedOption_);
+            }
+          }
+        }
+        this.mergeExtensionFields(other);
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+      
+      public final boolean isInitialized() {
+        for (int i = 0; i < getUninterpretedOptionCount(); i++) {
+          if (!getUninterpretedOption(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        if (!extensionsAreInitialized()) {
+          
+          return false;
+        }
+        return true;
+      }
+      
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder(
+            this.getUnknownFields());
+        while (true) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              this.setUnknownFields(unknownFields.build());
+              onChanged();
+              return this;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              }
+              break;
+            }
+            case 8: {
+              bitField0_ |= 0x00000001;
+              messageSetWireFormat_ = input.readBool();
+              break;
+            }
+            case 16: {
+              bitField0_ |= 0x00000002;
+              noStandardDescriptorAccessor_ = input.readBool();
+              break;
+            }
+            case 7994: {
+              com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder subBuilder = com.google.protobuf.DescriptorProtos.UninterpretedOption.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addUninterpretedOption(subBuilder.buildPartial());
+              break;
+            }
+          }
+        }
+      }
+      
+      private int bitField0_;
+      
+      // optional bool message_set_wire_format = 1 [default = false];
+      private boolean messageSetWireFormat_ ;
+      public boolean hasMessageSetWireFormat() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      public boolean getMessageSetWireFormat() {
+        return messageSetWireFormat_;
+      }
+      public Builder setMessageSetWireFormat(boolean value) {
+        bitField0_ |= 0x00000001;
+        messageSetWireFormat_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearMessageSetWireFormat() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        messageSetWireFormat_ = false;
+        onChanged();
+        return this;
+      }
+      
+      // optional bool no_standard_descriptor_accessor = 2 [default = false];
+      private boolean noStandardDescriptorAccessor_ ;
+      public boolean hasNoStandardDescriptorAccessor() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      public boolean getNoStandardDescriptorAccessor() {
+        return noStandardDescriptorAccessor_;
+      }
+      public Builder setNoStandardDescriptorAccessor(boolean value) {
+        bitField0_ |= 0x00000002;
+        noStandardDescriptorAccessor_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearNoStandardDescriptorAccessor() {
+        bitField0_ = (bitField0_ & ~0x00000002);
+        noStandardDescriptorAccessor_ = false;
+        onChanged();
+        return this;
+      }
+      
+      // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+      private java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> uninterpretedOption_ =
+        java.util.Collections.emptyList();
+      private void ensureUninterpretedOptionIsMutable() {
+        if (!((bitField0_ & 0x00000004) == 0x00000004)) {
+          uninterpretedOption_ = new java.util.ArrayList<com.google.protobuf.DescriptorProtos.UninterpretedOption>(uninterpretedOption_);
+          bitField0_ |= 0x00000004;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.UninterpretedOption, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder, com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> uninterpretedOptionBuilder_;
+      
+      public java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> getUninterpretedOptionList() {
+        if (uninterpretedOptionBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(uninterpretedOption_);
+        } else {
+          return uninterpretedOptionBuilder_.getMessageList();
+        }
+      }
+      public int getUninterpretedOptionCount() {
+        if (uninterpretedOptionBuilder_ == null) {
+          return uninterpretedOption_.size();
+        } else {
+          return uninterpretedOptionBuilder_.getCount();
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption getUninterpretedOption(int index) {
+        if (uninterpretedOptionBuilder_ == null) {
+          return uninterpretedOption_.get(index);
+        } else {
+          return uninterpretedOptionBuilder_.getMessage(index);
+        }
+      }
+      public Builder setUninterpretedOption(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption value) {
+        if (uninterpretedOptionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.set(index, value);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setUninterpretedOption(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder builderForValue) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addUninterpretedOption(com.google.protobuf.DescriptorProtos.UninterpretedOption value) {
+        if (uninterpretedOptionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.add(value);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addUninterpretedOption(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption value) {
+        if (uninterpretedOptionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.add(index, value);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addUninterpretedOption(
+          com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder builderForValue) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.add(builderForValue.build());
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addUninterpretedOption(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder builderForValue) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllUninterpretedOption(
+          java.lang.Iterable<? extends com.google.protobuf.DescriptorProtos.UninterpretedOption> values) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          super.addAll(values, uninterpretedOption_);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearUninterpretedOption() {
+        if (uninterpretedOptionBuilder_ == null) {
+          uninterpretedOption_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000004);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeUninterpretedOption(int index) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.remove(index);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.remove(index);
+        }
+        return this;
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder getUninterpretedOptionBuilder(
+          int index) {
+        return getUninterpretedOptionFieldBuilder().getBuilder(index);
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder getUninterpretedOptionOrBuilder(
+          int index) {
+        if (uninterpretedOptionBuilder_ == null) {
+          return uninterpretedOption_.get(index);  } else {
+          return uninterpretedOptionBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> 
+           getUninterpretedOptionOrBuilderList() {
+        if (uninterpretedOptionBuilder_ != null) {
+          return uninterpretedOptionBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(uninterpretedOption_);
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder addUninterpretedOptionBuilder() {
+        return getUninterpretedOptionFieldBuilder().addBuilder(
+            com.google.protobuf.DescriptorProtos.UninterpretedOption.getDefaultInstance());
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder addUninterpretedOptionBuilder(
+          int index) {
+        return getUninterpretedOptionFieldBuilder().addBuilder(
+            index, com.google.protobuf.DescriptorProtos.UninterpretedOption.getDefaultInstance());
+      }
+      public java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder> 
+           getUninterpretedOptionBuilderList() {
+        return getUninterpretedOptionFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.UninterpretedOption, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder, com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> 
+          getUninterpretedOptionFieldBuilder() {
+        if (uninterpretedOptionBuilder_ == null) {
+          uninterpretedOptionBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              com.google.protobuf.DescriptorProtos.UninterpretedOption, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder, com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder>(
+                  uninterpretedOption_,
+                  ((bitField0_ & 0x00000004) == 0x00000004),
+                  getParentForChildren(),
+                  isClean());
+          uninterpretedOption_ = null;
+        }
+        return uninterpretedOptionBuilder_;
+      }
+      
+      // @@protoc_insertion_point(builder_scope:google.protobuf.MessageOptions)
+    }
+    
+    static {
+      defaultInstance = new MessageOptions(true);
+      defaultInstance.initFields();
+    }
+    
+    // @@protoc_insertion_point(class_scope:google.protobuf.MessageOptions)
+  }
+  
+  public interface FieldOptionsOrBuilder extends
+      com.google.protobuf.GeneratedMessage.
+          ExtendableMessageOrBuilder<FieldOptions> {
+    
+    // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];
+    boolean hasCtype();
+    com.google.protobuf.DescriptorProtos.FieldOptions.CType getCtype();
+    
+    // optional bool packed = 2;
+    boolean hasPacked();
+    boolean getPacked();
+    
+    // optional bool deprecated = 3 [default = false];
+    boolean hasDeprecated();
+    boolean getDeprecated();
+    
+    // optional string experimental_map_key = 9;
+    boolean hasExperimentalMapKey();
+    String getExperimentalMapKey();
+    
+    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+    java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> 
+        getUninterpretedOptionList();
+    com.google.protobuf.DescriptorProtos.UninterpretedOption getUninterpretedOption(int index);
+    int getUninterpretedOptionCount();
+    java.util.List<? extends com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> 
+        getUninterpretedOptionOrBuilderList();
+    com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder getUninterpretedOptionOrBuilder(
+        int index);
+  }
+  public static final class FieldOptions extends
+      com.google.protobuf.GeneratedMessage.ExtendableMessage<
+        FieldOptions> implements FieldOptionsOrBuilder {
+    // Use FieldOptions.newBuilder() to construct.
+    private FieldOptions(Builder builder) {
+      super(builder);
+    }
+    private FieldOptions(boolean noInit) {}
+    
+    private static final FieldOptions defaultInstance;
+    public static FieldOptions getDefaultInstance() {
+      return defaultInstance;
+    }
+    
+    public FieldOptions getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+    
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_FieldOptions_descriptor;
+    }
+    
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_FieldOptions_fieldAccessorTable;
+    }
+    
+    public enum CType
+        implements com.google.protobuf.ProtocolMessageEnum {
+      STRING(0, 0),
+      CORD(1, 1),
+      STRING_PIECE(2, 2),
+      ;
+      
+      public static final int STRING_VALUE = 0;
+      public static final int CORD_VALUE = 1;
+      public static final int STRING_PIECE_VALUE = 2;
+      
+      
+      public final int getNumber() { return value; }
+      
+      public static CType valueOf(int value) {
+        switch (value) {
+          case 0: return STRING;
+          case 1: return CORD;
+          case 2: return STRING_PIECE;
+          default: return null;
+        }
+      }
+      
+      public static com.google.protobuf.Internal.EnumLiteMap<CType>
+          internalGetValueMap() {
+        return internalValueMap;
+      }
+      private static com.google.protobuf.Internal.EnumLiteMap<CType>
+          internalValueMap =
+            new com.google.protobuf.Internal.EnumLiteMap<CType>() {
+              public CType findValueByNumber(int number) {
+                return CType.valueOf(number);
+              }
+            };
+      
+      public final com.google.protobuf.Descriptors.EnumValueDescriptor
+          getValueDescriptor() {
+        return getDescriptor().getValues().get(index);
+      }
+      public final com.google.protobuf.Descriptors.EnumDescriptor
+          getDescriptorForType() {
+        return getDescriptor();
+      }
+      public static final com.google.protobuf.Descriptors.EnumDescriptor
+          getDescriptor() {
+        return com.google.protobuf.DescriptorProtos.FieldOptions.getDescriptor().getEnumTypes().get(0);
+      }
+      
+      private static final CType[] VALUES = {
+        STRING, CORD, STRING_PIECE, 
+      };
+      
+      public static CType valueOf(
+          com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+        if (desc.getType() != getDescriptor()) {
+          throw new java.lang.IllegalArgumentException(
+            "EnumValueDescriptor is not for this type.");
+        }
+        return VALUES[desc.getIndex()];
+      }
+      
+      private final int index;
+      private final int value;
+      
+      private CType(int index, int value) {
+        this.index = index;
+        this.value = value;
+      }
+      
+      // @@protoc_insertion_point(enum_scope:google.protobuf.FieldOptions.CType)
+    }
+    
+    private int bitField0_;
+    // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];
+    public static final int CTYPE_FIELD_NUMBER = 1;
+    private com.google.protobuf.DescriptorProtos.FieldOptions.CType ctype_;
+    public boolean hasCtype() {
+      return ((bitField0_ & 0x00000001) == 0x00000001);
+    }
+    public com.google.protobuf.DescriptorProtos.FieldOptions.CType getCtype() {
+      return ctype_;
+    }
+    
+    // optional bool packed = 2;
+    public static final int PACKED_FIELD_NUMBER = 2;
+    private boolean packed_;
+    public boolean hasPacked() {
+      return ((bitField0_ & 0x00000002) == 0x00000002);
+    }
+    public boolean getPacked() {
+      return packed_;
+    }
+    
+    // optional bool deprecated = 3 [default = false];
+    public static final int DEPRECATED_FIELD_NUMBER = 3;
+    private boolean deprecated_;
+    public boolean hasDeprecated() {
+      return ((bitField0_ & 0x00000004) == 0x00000004);
+    }
+    public boolean getDeprecated() {
+      return deprecated_;
+    }
+    
+    // optional string experimental_map_key = 9;
+    public static final int EXPERIMENTAL_MAP_KEY_FIELD_NUMBER = 9;
+    private java.lang.Object experimentalMapKey_;
+    public boolean hasExperimentalMapKey() {
+      return ((bitField0_ & 0x00000008) == 0x00000008);
+    }
+    public String getExperimentalMapKey() {
+      java.lang.Object ref = experimentalMapKey_;
+      if (ref instanceof String) {
+        return (String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        String s = bs.toStringUtf8();
+        if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+          experimentalMapKey_ = s;
+        }
+        return s;
+      }
+    }
+    private com.google.protobuf.ByteString getExperimentalMapKeyBytes() {
+      java.lang.Object ref = experimentalMapKey_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+        experimentalMapKey_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    
+    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+    public static final int UNINTERPRETED_OPTION_FIELD_NUMBER = 999;
+    private java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> uninterpretedOption_;
+    public java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> getUninterpretedOptionList() {
+      return uninterpretedOption_;
+    }
+    public java.util.List<? extends com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> 
+        getUninterpretedOptionOrBuilderList() {
+      return uninterpretedOption_;
+    }
+    public int getUninterpretedOptionCount() {
+      return uninterpretedOption_.size();
+    }
+    public com.google.protobuf.DescriptorProtos.UninterpretedOption getUninterpretedOption(int index) {
+      return uninterpretedOption_.get(index);
+    }
+    public com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder getUninterpretedOptionOrBuilder(
+        int index) {
+      return uninterpretedOption_.get(index);
+    }
+    
+    private void initFields() {
+      ctype_ = com.google.protobuf.DescriptorProtos.FieldOptions.CType.STRING;
+      packed_ = false;
+      deprecated_ = false;
+      experimentalMapKey_ = "";
+      uninterpretedOption_ = java.util.Collections.emptyList();
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+      
+      for (int i = 0; i < getUninterpretedOptionCount(); i++) {
+        if (!getUninterpretedOption(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      if (!extensionsAreInitialized()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+    
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      com.google.protobuf.GeneratedMessage
+        .ExtendableMessage<com.google.protobuf.DescriptorProtos.FieldOptions>.ExtensionWriter extensionWriter =
+          newExtensionWriter();
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        output.writeEnum(1, ctype_.getNumber());
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        output.writeBool(2, packed_);
+      }
+      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+        output.writeBool(3, deprecated_);
+      }
+      if (((bitField0_ & 0x00000008) == 0x00000008)) {
+        output.writeBytes(9, getExperimentalMapKeyBytes());
+      }
+      for (int i = 0; i < uninterpretedOption_.size(); i++) {
+        output.writeMessage(999, uninterpretedOption_.get(i));
+      }
+      extensionWriter.writeUntil(536870912, output);
+      getUnknownFields().writeTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+    
+      size = 0;
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeEnumSize(1, ctype_.getNumber());
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBoolSize(2, packed_);
+      }
+      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBoolSize(3, deprecated_);
+      }
+      if (((bitField0_ & 0x00000008) == 0x00000008)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(9, getExperimentalMapKeyBytes());
+      }
+      for (int i = 0; i < uninterpretedOption_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(999, uninterpretedOption_.get(i));
+      }
+      size += extensionsSerializedSize();
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+    
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+    
+    public static com.google.protobuf.DescriptorProtos.FieldOptions parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FieldOptions parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FieldOptions parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FieldOptions parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FieldOptions parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FieldOptions parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FieldOptions parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.FieldOptions parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.FieldOptions parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.FieldOptions parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(com.google.protobuf.DescriptorProtos.FieldOptions prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+    
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.ExtendableBuilder<
+          com.google.protobuf.DescriptorProtos.FieldOptions, Builder> implements com.google.protobuf.DescriptorProtos.FieldOptionsOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_FieldOptions_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_FieldOptions_fieldAccessorTable;
+      }
+      
+      // Construct using com.google.protobuf.DescriptorProtos.FieldOptions.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+      
+      private Builder(BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          getUninterpretedOptionFieldBuilder();
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+      
+      public Builder clear() {
+        super.clear();
+        ctype_ = com.google.protobuf.DescriptorProtos.FieldOptions.CType.STRING;
+        bitField0_ = (bitField0_ & ~0x00000001);
+        packed_ = false;
+        bitField0_ = (bitField0_ & ~0x00000002);
+        deprecated_ = false;
+        bitField0_ = (bitField0_ & ~0x00000004);
+        experimentalMapKey_ = "";
+        bitField0_ = (bitField0_ & ~0x00000008);
+        if (uninterpretedOptionBuilder_ == null) {
+          uninterpretedOption_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000010);
+        } else {
+          uninterpretedOptionBuilder_.clear();
+        }
+        return this;
+      }
+      
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+      
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return com.google.protobuf.DescriptorProtos.FieldOptions.getDescriptor();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.FieldOptions getDefaultInstanceForType() {
+        return com.google.protobuf.DescriptorProtos.FieldOptions.getDefaultInstance();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.FieldOptions build() {
+        com.google.protobuf.DescriptorProtos.FieldOptions result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+      
+      private com.google.protobuf.DescriptorProtos.FieldOptions buildParsed()
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.DescriptorProtos.FieldOptions result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(
+            result).asInvalidProtocolBufferException();
+        }
+        return result;
+      }
+      
+      public com.google.protobuf.DescriptorProtos.FieldOptions buildPartial() {
+        com.google.protobuf.DescriptorProtos.FieldOptions result = new com.google.protobuf.DescriptorProtos.FieldOptions(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+          to_bitField0_ |= 0x00000001;
+        }
+        result.ctype_ = ctype_;
+        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+          to_bitField0_ |= 0x00000002;
+        }
+        result.packed_ = packed_;
+        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
+          to_bitField0_ |= 0x00000004;
+        }
+        result.deprecated_ = deprecated_;
+        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
+          to_bitField0_ |= 0x00000008;
+        }
+        result.experimentalMapKey_ = experimentalMapKey_;
+        if (uninterpretedOptionBuilder_ == null) {
+          if (((bitField0_ & 0x00000010) == 0x00000010)) {
+            uninterpretedOption_ = java.util.Collections.unmodifiableList(uninterpretedOption_);
+            bitField0_ = (bitField0_ & ~0x00000010);
+          }
+          result.uninterpretedOption_ = uninterpretedOption_;
+        } else {
+          result.uninterpretedOption_ = uninterpretedOptionBuilder_.build();
+        }
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof com.google.protobuf.DescriptorProtos.FieldOptions) {
+          return mergeFrom((com.google.protobuf.DescriptorProtos.FieldOptions)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.DescriptorProtos.FieldOptions other) {
+        if (other == com.google.protobuf.DescriptorProtos.FieldOptions.getDefaultInstance()) return this;
+        if (other.hasCtype()) {
+          setCtype(other.getCtype());
+        }
+        if (other.hasPacked()) {
+          setPacked(other.getPacked());
+        }
+        if (other.hasDeprecated()) {
+          setDeprecated(other.getDeprecated());
+        }
+        if (other.hasExperimentalMapKey()) {
+          setExperimentalMapKey(other.getExperimentalMapKey());
+        }
+        if (uninterpretedOptionBuilder_ == null) {
+          if (!other.uninterpretedOption_.isEmpty()) {
+            if (uninterpretedOption_.isEmpty()) {
+              uninterpretedOption_ = other.uninterpretedOption_;
+              bitField0_ = (bitField0_ & ~0x00000010);
+            } else {
+              ensureUninterpretedOptionIsMutable();
+              uninterpretedOption_.addAll(other.uninterpretedOption_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.uninterpretedOption_.isEmpty()) {
+            if (uninterpretedOptionBuilder_.isEmpty()) {
+              uninterpretedOptionBuilder_.dispose();
+              uninterpretedOptionBuilder_ = null;
+              uninterpretedOption_ = other.uninterpretedOption_;
+              bitField0_ = (bitField0_ & ~0x00000010);
+              uninterpretedOptionBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getUninterpretedOptionFieldBuilder() : null;
+            } else {
+              uninterpretedOptionBuilder_.addAllMessages(other.uninterpretedOption_);
+            }
+          }
+        }
+        this.mergeExtensionFields(other);
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+      
+      public final boolean isInitialized() {
+        for (int i = 0; i < getUninterpretedOptionCount(); i++) {
+          if (!getUninterpretedOption(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        if (!extensionsAreInitialized()) {
+          
+          return false;
+        }
+        return true;
+      }
+      
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder(
+            this.getUnknownFields());
+        while (true) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              this.setUnknownFields(unknownFields.build());
+              onChanged();
+              return this;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              }
+              break;
+            }
+            case 8: {
+              int rawValue = input.readEnum();
+              com.google.protobuf.DescriptorProtos.FieldOptions.CType value = com.google.protobuf.DescriptorProtos.FieldOptions.CType.valueOf(rawValue);
+              if (value == null) {
+                unknownFields.mergeVarintField(1, rawValue);
+              } else {
+                bitField0_ |= 0x00000001;
+                ctype_ = value;
+              }
+              break;
+            }
+            case 16: {
+              bitField0_ |= 0x00000002;
+              packed_ = input.readBool();
+              break;
+            }
+            case 24: {
+              bitField0_ |= 0x00000004;
+              deprecated_ = input.readBool();
+              break;
+            }
+            case 74: {
+              bitField0_ |= 0x00000008;
+              experimentalMapKey_ = input.readBytes();
+              break;
+            }
+            case 7994: {
+              com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder subBuilder = com.google.protobuf.DescriptorProtos.UninterpretedOption.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addUninterpretedOption(subBuilder.buildPartial());
+              break;
+            }
+          }
+        }
+      }
+      
+      private int bitField0_;
+      
+      // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];
+      private com.google.protobuf.DescriptorProtos.FieldOptions.CType ctype_ = com.google.protobuf.DescriptorProtos.FieldOptions.CType.STRING;
+      public boolean hasCtype() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      public com.google.protobuf.DescriptorProtos.FieldOptions.CType getCtype() {
+        return ctype_;
+      }
+      public Builder setCtype(com.google.protobuf.DescriptorProtos.FieldOptions.CType value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        bitField0_ |= 0x00000001;
+        ctype_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearCtype() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        ctype_ = com.google.protobuf.DescriptorProtos.FieldOptions.CType.STRING;
+        onChanged();
+        return this;
+      }
+      
+      // optional bool packed = 2;
+      private boolean packed_ ;
+      public boolean hasPacked() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      public boolean getPacked() {
+        return packed_;
+      }
+      public Builder setPacked(boolean value) {
+        bitField0_ |= 0x00000002;
+        packed_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearPacked() {
+        bitField0_ = (bitField0_ & ~0x00000002);
+        packed_ = false;
+        onChanged();
+        return this;
+      }
+      
+      // optional bool deprecated = 3 [default = false];
+      private boolean deprecated_ ;
+      public boolean hasDeprecated() {
+        return ((bitField0_ & 0x00000004) == 0x00000004);
+      }
+      public boolean getDeprecated() {
+        return deprecated_;
+      }
+      public Builder setDeprecated(boolean value) {
+        bitField0_ |= 0x00000004;
+        deprecated_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearDeprecated() {
+        bitField0_ = (bitField0_ & ~0x00000004);
+        deprecated_ = false;
+        onChanged();
+        return this;
+      }
+      
+      // optional string experimental_map_key = 9;
+      private java.lang.Object experimentalMapKey_ = "";
+      public boolean hasExperimentalMapKey() {
+        return ((bitField0_ & 0x00000008) == 0x00000008);
+      }
+      public String getExperimentalMapKey() {
+        java.lang.Object ref = experimentalMapKey_;
+        if (!(ref instanceof String)) {
+          String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+          experimentalMapKey_ = s;
+          return s;
+        } else {
+          return (String) ref;
+        }
+      }
+      public Builder setExperimentalMapKey(String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000008;
+        experimentalMapKey_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearExperimentalMapKey() {
+        bitField0_ = (bitField0_ & ~0x00000008);
+        experimentalMapKey_ = getDefaultInstance().getExperimentalMapKey();
+        onChanged();
+        return this;
+      }
+      void setExperimentalMapKey(com.google.protobuf.ByteString value) {
+        bitField0_ |= 0x00000008;
+        experimentalMapKey_ = value;
+        onChanged();
+      }
+      
+      // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+      private java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> uninterpretedOption_ =
+        java.util.Collections.emptyList();
+      private void ensureUninterpretedOptionIsMutable() {
+        if (!((bitField0_ & 0x00000010) == 0x00000010)) {
+          uninterpretedOption_ = new java.util.ArrayList<com.google.protobuf.DescriptorProtos.UninterpretedOption>(uninterpretedOption_);
+          bitField0_ |= 0x00000010;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.UninterpretedOption, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder, com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> uninterpretedOptionBuilder_;
+      
+      public java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> getUninterpretedOptionList() {
+        if (uninterpretedOptionBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(uninterpretedOption_);
+        } else {
+          return uninterpretedOptionBuilder_.getMessageList();
+        }
+      }
+      public int getUninterpretedOptionCount() {
+        if (uninterpretedOptionBuilder_ == null) {
+          return uninterpretedOption_.size();
+        } else {
+          return uninterpretedOptionBuilder_.getCount();
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption getUninterpretedOption(int index) {
+        if (uninterpretedOptionBuilder_ == null) {
+          return uninterpretedOption_.get(index);
+        } else {
+          return uninterpretedOptionBuilder_.getMessage(index);
+        }
+      }
+      public Builder setUninterpretedOption(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption value) {
+        if (uninterpretedOptionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.set(index, value);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setUninterpretedOption(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder builderForValue) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addUninterpretedOption(com.google.protobuf.DescriptorProtos.UninterpretedOption value) {
+        if (uninterpretedOptionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.add(value);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addUninterpretedOption(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption value) {
+        if (uninterpretedOptionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.add(index, value);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addUninterpretedOption(
+          com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder builderForValue) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.add(builderForValue.build());
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addUninterpretedOption(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder builderForValue) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllUninterpretedOption(
+          java.lang.Iterable<? extends com.google.protobuf.DescriptorProtos.UninterpretedOption> values) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          super.addAll(values, uninterpretedOption_);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearUninterpretedOption() {
+        if (uninterpretedOptionBuilder_ == null) {
+          uninterpretedOption_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000010);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeUninterpretedOption(int index) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.remove(index);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.remove(index);
+        }
+        return this;
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder getUninterpretedOptionBuilder(
+          int index) {
+        return getUninterpretedOptionFieldBuilder().getBuilder(index);
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder getUninterpretedOptionOrBuilder(
+          int index) {
+        if (uninterpretedOptionBuilder_ == null) {
+          return uninterpretedOption_.get(index);  } else {
+          return uninterpretedOptionBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> 
+           getUninterpretedOptionOrBuilderList() {
+        if (uninterpretedOptionBuilder_ != null) {
+          return uninterpretedOptionBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(uninterpretedOption_);
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder addUninterpretedOptionBuilder() {
+        return getUninterpretedOptionFieldBuilder().addBuilder(
+            com.google.protobuf.DescriptorProtos.UninterpretedOption.getDefaultInstance());
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder addUninterpretedOptionBuilder(
+          int index) {
+        return getUninterpretedOptionFieldBuilder().addBuilder(
+            index, com.google.protobuf.DescriptorProtos.UninterpretedOption.getDefaultInstance());
+      }
+      public java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder> 
+           getUninterpretedOptionBuilderList() {
+        return getUninterpretedOptionFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.UninterpretedOption, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder, com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> 
+          getUninterpretedOptionFieldBuilder() {
+        if (uninterpretedOptionBuilder_ == null) {
+          uninterpretedOptionBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              com.google.protobuf.DescriptorProtos.UninterpretedOption, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder, com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder>(
+                  uninterpretedOption_,
+                  ((bitField0_ & 0x00000010) == 0x00000010),
+                  getParentForChildren(),
+                  isClean());
+          uninterpretedOption_ = null;
+        }
+        return uninterpretedOptionBuilder_;
+      }
+      
+      // @@protoc_insertion_point(builder_scope:google.protobuf.FieldOptions)
+    }
+    
+    static {
+      defaultInstance = new FieldOptions(true);
+      defaultInstance.initFields();
+    }
+    
+    // @@protoc_insertion_point(class_scope:google.protobuf.FieldOptions)
+  }
+  
+  public interface EnumOptionsOrBuilder extends
+      com.google.protobuf.GeneratedMessage.
+          ExtendableMessageOrBuilder<EnumOptions> {
+    
+    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+    java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> 
+        getUninterpretedOptionList();
+    com.google.protobuf.DescriptorProtos.UninterpretedOption getUninterpretedOption(int index);
+    int getUninterpretedOptionCount();
+    java.util.List<? extends com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> 
+        getUninterpretedOptionOrBuilderList();
+    com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder getUninterpretedOptionOrBuilder(
+        int index);
+  }
+  public static final class EnumOptions extends
+      com.google.protobuf.GeneratedMessage.ExtendableMessage<
+        EnumOptions> implements EnumOptionsOrBuilder {
+    // Use EnumOptions.newBuilder() to construct.
+    private EnumOptions(Builder builder) {
+      super(builder);
+    }
+    private EnumOptions(boolean noInit) {}
+    
+    private static final EnumOptions defaultInstance;
+    public static EnumOptions getDefaultInstance() {
+      return defaultInstance;
+    }
+    
+    public EnumOptions getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+    
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_EnumOptions_descriptor;
+    }
+    
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_EnumOptions_fieldAccessorTable;
+    }
+    
+    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+    public static final int UNINTERPRETED_OPTION_FIELD_NUMBER = 999;
+    private java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> uninterpretedOption_;
+    public java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> getUninterpretedOptionList() {
+      return uninterpretedOption_;
+    }
+    public java.util.List<? extends com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> 
+        getUninterpretedOptionOrBuilderList() {
+      return uninterpretedOption_;
+    }
+    public int getUninterpretedOptionCount() {
+      return uninterpretedOption_.size();
+    }
+    public com.google.protobuf.DescriptorProtos.UninterpretedOption getUninterpretedOption(int index) {
+      return uninterpretedOption_.get(index);
+    }
+    public com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder getUninterpretedOptionOrBuilder(
+        int index) {
+      return uninterpretedOption_.get(index);
+    }
+    
+    private void initFields() {
+      uninterpretedOption_ = java.util.Collections.emptyList();
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+      
+      for (int i = 0; i < getUninterpretedOptionCount(); i++) {
+        if (!getUninterpretedOption(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      if (!extensionsAreInitialized()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+    
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      com.google.protobuf.GeneratedMessage
+        .ExtendableMessage<com.google.protobuf.DescriptorProtos.EnumOptions>.ExtensionWriter extensionWriter =
+          newExtensionWriter();
+      for (int i = 0; i < uninterpretedOption_.size(); i++) {
+        output.writeMessage(999, uninterpretedOption_.get(i));
+      }
+      extensionWriter.writeUntil(536870912, output);
+      getUnknownFields().writeTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+    
+      size = 0;
+      for (int i = 0; i < uninterpretedOption_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(999, uninterpretedOption_.get(i));
+      }
+      size += extensionsSerializedSize();
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+    
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+    
+    public static com.google.protobuf.DescriptorProtos.EnumOptions parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumOptions parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumOptions parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumOptions parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumOptions parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumOptions parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumOptions parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumOptions parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumOptions parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumOptions parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(com.google.protobuf.DescriptorProtos.EnumOptions prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+    
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.ExtendableBuilder<
+          com.google.protobuf.DescriptorProtos.EnumOptions, Builder> implements com.google.protobuf.DescriptorProtos.EnumOptionsOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_EnumOptions_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_EnumOptions_fieldAccessorTable;
+      }
+      
+      // Construct using com.google.protobuf.DescriptorProtos.EnumOptions.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+      
+      private Builder(BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          getUninterpretedOptionFieldBuilder();
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+      
+      public Builder clear() {
+        super.clear();
+        if (uninterpretedOptionBuilder_ == null) {
+          uninterpretedOption_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+        } else {
+          uninterpretedOptionBuilder_.clear();
+        }
+        return this;
+      }
+      
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+      
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return com.google.protobuf.DescriptorProtos.EnumOptions.getDescriptor();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.EnumOptions getDefaultInstanceForType() {
+        return com.google.protobuf.DescriptorProtos.EnumOptions.getDefaultInstance();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.EnumOptions build() {
+        com.google.protobuf.DescriptorProtos.EnumOptions result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+      
+      private com.google.protobuf.DescriptorProtos.EnumOptions buildParsed()
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.DescriptorProtos.EnumOptions result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(
+            result).asInvalidProtocolBufferException();
+        }
+        return result;
+      }
+      
+      public com.google.protobuf.DescriptorProtos.EnumOptions buildPartial() {
+        com.google.protobuf.DescriptorProtos.EnumOptions result = new com.google.protobuf.DescriptorProtos.EnumOptions(this);
+        int from_bitField0_ = bitField0_;
+        if (uninterpretedOptionBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) == 0x00000001)) {
+            uninterpretedOption_ = java.util.Collections.unmodifiableList(uninterpretedOption_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.uninterpretedOption_ = uninterpretedOption_;
+        } else {
+          result.uninterpretedOption_ = uninterpretedOptionBuilder_.build();
+        }
+        onBuilt();
+        return result;
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof com.google.protobuf.DescriptorProtos.EnumOptions) {
+          return mergeFrom((com.google.protobuf.DescriptorProtos.EnumOptions)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.DescriptorProtos.EnumOptions other) {
+        if (other == com.google.protobuf.DescriptorProtos.EnumOptions.getDefaultInstance()) return this;
+        if (uninterpretedOptionBuilder_ == null) {
+          if (!other.uninterpretedOption_.isEmpty()) {
+            if (uninterpretedOption_.isEmpty()) {
+              uninterpretedOption_ = other.uninterpretedOption_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureUninterpretedOptionIsMutable();
+              uninterpretedOption_.addAll(other.uninterpretedOption_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.uninterpretedOption_.isEmpty()) {
+            if (uninterpretedOptionBuilder_.isEmpty()) {
+              uninterpretedOptionBuilder_.dispose();
+              uninterpretedOptionBuilder_ = null;
+              uninterpretedOption_ = other.uninterpretedOption_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              uninterpretedOptionBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getUninterpretedOptionFieldBuilder() : null;
+            } else {
+              uninterpretedOptionBuilder_.addAllMessages(other.uninterpretedOption_);
+            }
+          }
+        }
+        this.mergeExtensionFields(other);
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+      
+      public final boolean isInitialized() {
+        for (int i = 0; i < getUninterpretedOptionCount(); i++) {
+          if (!getUninterpretedOption(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        if (!extensionsAreInitialized()) {
+          
+          return false;
+        }
+        return true;
+      }
+      
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder(
+            this.getUnknownFields());
+        while (true) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              this.setUnknownFields(unknownFields.build());
+              onChanged();
+              return this;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              }
+              break;
+            }
+            case 7994: {
+              com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder subBuilder = com.google.protobuf.DescriptorProtos.UninterpretedOption.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addUninterpretedOption(subBuilder.buildPartial());
+              break;
+            }
+          }
+        }
+      }
+      
+      private int bitField0_;
+      
+      // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+      private java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> uninterpretedOption_ =
+        java.util.Collections.emptyList();
+      private void ensureUninterpretedOptionIsMutable() {
+        if (!((bitField0_ & 0x00000001) == 0x00000001)) {
+          uninterpretedOption_ = new java.util.ArrayList<com.google.protobuf.DescriptorProtos.UninterpretedOption>(uninterpretedOption_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.UninterpretedOption, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder, com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> uninterpretedOptionBuilder_;
+      
+      public java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> getUninterpretedOptionList() {
+        if (uninterpretedOptionBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(uninterpretedOption_);
+        } else {
+          return uninterpretedOptionBuilder_.getMessageList();
+        }
+      }
+      public int getUninterpretedOptionCount() {
+        if (uninterpretedOptionBuilder_ == null) {
+          return uninterpretedOption_.size();
+        } else {
+          return uninterpretedOptionBuilder_.getCount();
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption getUninterpretedOption(int index) {
+        if (uninterpretedOptionBuilder_ == null) {
+          return uninterpretedOption_.get(index);
+        } else {
+          return uninterpretedOptionBuilder_.getMessage(index);
+        }
+      }
+      public Builder setUninterpretedOption(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption value) {
+        if (uninterpretedOptionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.set(index, value);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setUninterpretedOption(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder builderForValue) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addUninterpretedOption(com.google.protobuf.DescriptorProtos.UninterpretedOption value) {
+        if (uninterpretedOptionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.add(value);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addUninterpretedOption(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption value) {
+        if (uninterpretedOptionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.add(index, value);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addUninterpretedOption(
+          com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder builderForValue) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.add(builderForValue.build());
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addUninterpretedOption(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder builderForValue) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllUninterpretedOption(
+          java.lang.Iterable<? extends com.google.protobuf.DescriptorProtos.UninterpretedOption> values) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          super.addAll(values, uninterpretedOption_);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearUninterpretedOption() {
+        if (uninterpretedOptionBuilder_ == null) {
+          uninterpretedOption_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeUninterpretedOption(int index) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.remove(index);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.remove(index);
+        }
+        return this;
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder getUninterpretedOptionBuilder(
+          int index) {
+        return getUninterpretedOptionFieldBuilder().getBuilder(index);
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder getUninterpretedOptionOrBuilder(
+          int index) {
+        if (uninterpretedOptionBuilder_ == null) {
+          return uninterpretedOption_.get(index);  } else {
+          return uninterpretedOptionBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> 
+           getUninterpretedOptionOrBuilderList() {
+        if (uninterpretedOptionBuilder_ != null) {
+          return uninterpretedOptionBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(uninterpretedOption_);
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder addUninterpretedOptionBuilder() {
+        return getUninterpretedOptionFieldBuilder().addBuilder(
+            com.google.protobuf.DescriptorProtos.UninterpretedOption.getDefaultInstance());
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder addUninterpretedOptionBuilder(
+          int index) {
+        return getUninterpretedOptionFieldBuilder().addBuilder(
+            index, com.google.protobuf.DescriptorProtos.UninterpretedOption.getDefaultInstance());
+      }
+      public java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder> 
+           getUninterpretedOptionBuilderList() {
+        return getUninterpretedOptionFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.UninterpretedOption, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder, com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> 
+          getUninterpretedOptionFieldBuilder() {
+        if (uninterpretedOptionBuilder_ == null) {
+          uninterpretedOptionBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              com.google.protobuf.DescriptorProtos.UninterpretedOption, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder, com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder>(
+                  uninterpretedOption_,
+                  ((bitField0_ & 0x00000001) == 0x00000001),
+                  getParentForChildren(),
+                  isClean());
+          uninterpretedOption_ = null;
+        }
+        return uninterpretedOptionBuilder_;
+      }
+      
+      // @@protoc_insertion_point(builder_scope:google.protobuf.EnumOptions)
+    }
+    
+    static {
+      defaultInstance = new EnumOptions(true);
+      defaultInstance.initFields();
+    }
+    
+    // @@protoc_insertion_point(class_scope:google.protobuf.EnumOptions)
+  }
+  
+  public interface EnumValueOptionsOrBuilder extends
+      com.google.protobuf.GeneratedMessage.
+          ExtendableMessageOrBuilder<EnumValueOptions> {
+    
+    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+    java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> 
+        getUninterpretedOptionList();
+    com.google.protobuf.DescriptorProtos.UninterpretedOption getUninterpretedOption(int index);
+    int getUninterpretedOptionCount();
+    java.util.List<? extends com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> 
+        getUninterpretedOptionOrBuilderList();
+    com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder getUninterpretedOptionOrBuilder(
+        int index);
+  }
+  public static final class EnumValueOptions extends
+      com.google.protobuf.GeneratedMessage.ExtendableMessage<
+        EnumValueOptions> implements EnumValueOptionsOrBuilder {
+    // Use EnumValueOptions.newBuilder() to construct.
+    private EnumValueOptions(Builder builder) {
+      super(builder);
+    }
+    private EnumValueOptions(boolean noInit) {}
+    
+    private static final EnumValueOptions defaultInstance;
+    public static EnumValueOptions getDefaultInstance() {
+      return defaultInstance;
+    }
+    
+    public EnumValueOptions getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+    
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_EnumValueOptions_descriptor;
+    }
+    
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_EnumValueOptions_fieldAccessorTable;
+    }
+    
+    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+    public static final int UNINTERPRETED_OPTION_FIELD_NUMBER = 999;
+    private java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> uninterpretedOption_;
+    public java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> getUninterpretedOptionList() {
+      return uninterpretedOption_;
+    }
+    public java.util.List<? extends com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> 
+        getUninterpretedOptionOrBuilderList() {
+      return uninterpretedOption_;
+    }
+    public int getUninterpretedOptionCount() {
+      return uninterpretedOption_.size();
+    }
+    public com.google.protobuf.DescriptorProtos.UninterpretedOption getUninterpretedOption(int index) {
+      return uninterpretedOption_.get(index);
+    }
+    public com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder getUninterpretedOptionOrBuilder(
+        int index) {
+      return uninterpretedOption_.get(index);
+    }
+    
+    private void initFields() {
+      uninterpretedOption_ = java.util.Collections.emptyList();
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+      
+      for (int i = 0; i < getUninterpretedOptionCount(); i++) {
+        if (!getUninterpretedOption(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      if (!extensionsAreInitialized()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+    
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      com.google.protobuf.GeneratedMessage
+        .ExtendableMessage<com.google.protobuf.DescriptorProtos.EnumValueOptions>.ExtensionWriter extensionWriter =
+          newExtensionWriter();
+      for (int i = 0; i < uninterpretedOption_.size(); i++) {
+        output.writeMessage(999, uninterpretedOption_.get(i));
+      }
+      extensionWriter.writeUntil(536870912, output);
+      getUnknownFields().writeTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+    
+      size = 0;
+      for (int i = 0; i < uninterpretedOption_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(999, uninterpretedOption_.get(i));
+      }
+      size += extensionsSerializedSize();
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+    
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+    
+    public static com.google.protobuf.DescriptorProtos.EnumValueOptions parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumValueOptions parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumValueOptions parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumValueOptions parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumValueOptions parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumValueOptions parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumValueOptions parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumValueOptions parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumValueOptions parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.EnumValueOptions parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(com.google.protobuf.DescriptorProtos.EnumValueOptions prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+    
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.ExtendableBuilder<
+          com.google.protobuf.DescriptorProtos.EnumValueOptions, Builder> implements com.google.protobuf.DescriptorProtos.EnumValueOptionsOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_EnumValueOptions_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_EnumValueOptions_fieldAccessorTable;
+      }
+      
+      // Construct using com.google.protobuf.DescriptorProtos.EnumValueOptions.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+      
+      private Builder(BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          getUninterpretedOptionFieldBuilder();
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+      
+      public Builder clear() {
+        super.clear();
+        if (uninterpretedOptionBuilder_ == null) {
+          uninterpretedOption_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+        } else {
+          uninterpretedOptionBuilder_.clear();
+        }
+        return this;
+      }
+      
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+      
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return com.google.protobuf.DescriptorProtos.EnumValueOptions.getDescriptor();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.EnumValueOptions getDefaultInstanceForType() {
+        return com.google.protobuf.DescriptorProtos.EnumValueOptions.getDefaultInstance();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.EnumValueOptions build() {
+        com.google.protobuf.DescriptorProtos.EnumValueOptions result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+      
+      private com.google.protobuf.DescriptorProtos.EnumValueOptions buildParsed()
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.DescriptorProtos.EnumValueOptions result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(
+            result).asInvalidProtocolBufferException();
+        }
+        return result;
+      }
+      
+      public com.google.protobuf.DescriptorProtos.EnumValueOptions buildPartial() {
+        com.google.protobuf.DescriptorProtos.EnumValueOptions result = new com.google.protobuf.DescriptorProtos.EnumValueOptions(this);
+        int from_bitField0_ = bitField0_;
+        if (uninterpretedOptionBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) == 0x00000001)) {
+            uninterpretedOption_ = java.util.Collections.unmodifiableList(uninterpretedOption_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.uninterpretedOption_ = uninterpretedOption_;
+        } else {
+          result.uninterpretedOption_ = uninterpretedOptionBuilder_.build();
+        }
+        onBuilt();
+        return result;
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof com.google.protobuf.DescriptorProtos.EnumValueOptions) {
+          return mergeFrom((com.google.protobuf.DescriptorProtos.EnumValueOptions)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.DescriptorProtos.EnumValueOptions other) {
+        if (other == com.google.protobuf.DescriptorProtos.EnumValueOptions.getDefaultInstance()) return this;
+        if (uninterpretedOptionBuilder_ == null) {
+          if (!other.uninterpretedOption_.isEmpty()) {
+            if (uninterpretedOption_.isEmpty()) {
+              uninterpretedOption_ = other.uninterpretedOption_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureUninterpretedOptionIsMutable();
+              uninterpretedOption_.addAll(other.uninterpretedOption_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.uninterpretedOption_.isEmpty()) {
+            if (uninterpretedOptionBuilder_.isEmpty()) {
+              uninterpretedOptionBuilder_.dispose();
+              uninterpretedOptionBuilder_ = null;
+              uninterpretedOption_ = other.uninterpretedOption_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              uninterpretedOptionBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getUninterpretedOptionFieldBuilder() : null;
+            } else {
+              uninterpretedOptionBuilder_.addAllMessages(other.uninterpretedOption_);
+            }
+          }
+        }
+        this.mergeExtensionFields(other);
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+      
+      public final boolean isInitialized() {
+        for (int i = 0; i < getUninterpretedOptionCount(); i++) {
+          if (!getUninterpretedOption(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        if (!extensionsAreInitialized()) {
+          
+          return false;
+        }
+        return true;
+      }
+      
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder(
+            this.getUnknownFields());
+        while (true) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              this.setUnknownFields(unknownFields.build());
+              onChanged();
+              return this;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              }
+              break;
+            }
+            case 7994: {
+              com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder subBuilder = com.google.protobuf.DescriptorProtos.UninterpretedOption.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addUninterpretedOption(subBuilder.buildPartial());
+              break;
+            }
+          }
+        }
+      }
+      
+      private int bitField0_;
+      
+      // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+      private java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> uninterpretedOption_ =
+        java.util.Collections.emptyList();
+      private void ensureUninterpretedOptionIsMutable() {
+        if (!((bitField0_ & 0x00000001) == 0x00000001)) {
+          uninterpretedOption_ = new java.util.ArrayList<com.google.protobuf.DescriptorProtos.UninterpretedOption>(uninterpretedOption_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.UninterpretedOption, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder, com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> uninterpretedOptionBuilder_;
+      
+      public java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> getUninterpretedOptionList() {
+        if (uninterpretedOptionBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(uninterpretedOption_);
+        } else {
+          return uninterpretedOptionBuilder_.getMessageList();
+        }
+      }
+      public int getUninterpretedOptionCount() {
+        if (uninterpretedOptionBuilder_ == null) {
+          return uninterpretedOption_.size();
+        } else {
+          return uninterpretedOptionBuilder_.getCount();
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption getUninterpretedOption(int index) {
+        if (uninterpretedOptionBuilder_ == null) {
+          return uninterpretedOption_.get(index);
+        } else {
+          return uninterpretedOptionBuilder_.getMessage(index);
+        }
+      }
+      public Builder setUninterpretedOption(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption value) {
+        if (uninterpretedOptionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.set(index, value);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setUninterpretedOption(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder builderForValue) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addUninterpretedOption(com.google.protobuf.DescriptorProtos.UninterpretedOption value) {
+        if (uninterpretedOptionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.add(value);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addUninterpretedOption(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption value) {
+        if (uninterpretedOptionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.add(index, value);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addUninterpretedOption(
+          com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder builderForValue) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.add(builderForValue.build());
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addUninterpretedOption(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder builderForValue) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllUninterpretedOption(
+          java.lang.Iterable<? extends com.google.protobuf.DescriptorProtos.UninterpretedOption> values) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          super.addAll(values, uninterpretedOption_);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearUninterpretedOption() {
+        if (uninterpretedOptionBuilder_ == null) {
+          uninterpretedOption_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeUninterpretedOption(int index) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.remove(index);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.remove(index);
+        }
+        return this;
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder getUninterpretedOptionBuilder(
+          int index) {
+        return getUninterpretedOptionFieldBuilder().getBuilder(index);
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder getUninterpretedOptionOrBuilder(
+          int index) {
+        if (uninterpretedOptionBuilder_ == null) {
+          return uninterpretedOption_.get(index);  } else {
+          return uninterpretedOptionBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> 
+           getUninterpretedOptionOrBuilderList() {
+        if (uninterpretedOptionBuilder_ != null) {
+          return uninterpretedOptionBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(uninterpretedOption_);
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder addUninterpretedOptionBuilder() {
+        return getUninterpretedOptionFieldBuilder().addBuilder(
+            com.google.protobuf.DescriptorProtos.UninterpretedOption.getDefaultInstance());
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder addUninterpretedOptionBuilder(
+          int index) {
+        return getUninterpretedOptionFieldBuilder().addBuilder(
+            index, com.google.protobuf.DescriptorProtos.UninterpretedOption.getDefaultInstance());
+      }
+      public java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder> 
+           getUninterpretedOptionBuilderList() {
+        return getUninterpretedOptionFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.UninterpretedOption, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder, com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> 
+          getUninterpretedOptionFieldBuilder() {
+        if (uninterpretedOptionBuilder_ == null) {
+          uninterpretedOptionBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              com.google.protobuf.DescriptorProtos.UninterpretedOption, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder, com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder>(
+                  uninterpretedOption_,
+                  ((bitField0_ & 0x00000001) == 0x00000001),
+                  getParentForChildren(),
+                  isClean());
+          uninterpretedOption_ = null;
+        }
+        return uninterpretedOptionBuilder_;
+      }
+      
+      // @@protoc_insertion_point(builder_scope:google.protobuf.EnumValueOptions)
+    }
+    
+    static {
+      defaultInstance = new EnumValueOptions(true);
+      defaultInstance.initFields();
+    }
+    
+    // @@protoc_insertion_point(class_scope:google.protobuf.EnumValueOptions)
+  }
+  
+  public interface ServiceOptionsOrBuilder extends
+      com.google.protobuf.GeneratedMessage.
+          ExtendableMessageOrBuilder<ServiceOptions> {
+    
+    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+    java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> 
+        getUninterpretedOptionList();
+    com.google.protobuf.DescriptorProtos.UninterpretedOption getUninterpretedOption(int index);
+    int getUninterpretedOptionCount();
+    java.util.List<? extends com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> 
+        getUninterpretedOptionOrBuilderList();
+    com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder getUninterpretedOptionOrBuilder(
+        int index);
+  }
+  public static final class ServiceOptions extends
+      com.google.protobuf.GeneratedMessage.ExtendableMessage<
+        ServiceOptions> implements ServiceOptionsOrBuilder {
+    // Use ServiceOptions.newBuilder() to construct.
+    private ServiceOptions(Builder builder) {
+      super(builder);
+    }
+    private ServiceOptions(boolean noInit) {}
+    
+    private static final ServiceOptions defaultInstance;
+    public static ServiceOptions getDefaultInstance() {
+      return defaultInstance;
+    }
+    
+    public ServiceOptions getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+    
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_ServiceOptions_descriptor;
+    }
+    
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_ServiceOptions_fieldAccessorTable;
+    }
+    
+    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+    public static final int UNINTERPRETED_OPTION_FIELD_NUMBER = 999;
+    private java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> uninterpretedOption_;
+    public java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> getUninterpretedOptionList() {
+      return uninterpretedOption_;
+    }
+    public java.util.List<? extends com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> 
+        getUninterpretedOptionOrBuilderList() {
+      return uninterpretedOption_;
+    }
+    public int getUninterpretedOptionCount() {
+      return uninterpretedOption_.size();
+    }
+    public com.google.protobuf.DescriptorProtos.UninterpretedOption getUninterpretedOption(int index) {
+      return uninterpretedOption_.get(index);
+    }
+    public com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder getUninterpretedOptionOrBuilder(
+        int index) {
+      return uninterpretedOption_.get(index);
+    }
+    
+    private void initFields() {
+      uninterpretedOption_ = java.util.Collections.emptyList();
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+      
+      for (int i = 0; i < getUninterpretedOptionCount(); i++) {
+        if (!getUninterpretedOption(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      if (!extensionsAreInitialized()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+    
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      com.google.protobuf.GeneratedMessage
+        .ExtendableMessage<com.google.protobuf.DescriptorProtos.ServiceOptions>.ExtensionWriter extensionWriter =
+          newExtensionWriter();
+      for (int i = 0; i < uninterpretedOption_.size(); i++) {
+        output.writeMessage(999, uninterpretedOption_.get(i));
+      }
+      extensionWriter.writeUntil(536870912, output);
+      getUnknownFields().writeTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+    
+      size = 0;
+      for (int i = 0; i < uninterpretedOption_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(999, uninterpretedOption_.get(i));
+      }
+      size += extensionsSerializedSize();
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+    
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+    
+    public static com.google.protobuf.DescriptorProtos.ServiceOptions parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.ServiceOptions parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.ServiceOptions parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.ServiceOptions parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.ServiceOptions parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.ServiceOptions parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.ServiceOptions parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.ServiceOptions parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.ServiceOptions parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.ServiceOptions parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(com.google.protobuf.DescriptorProtos.ServiceOptions prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+    
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.ExtendableBuilder<
+          com.google.protobuf.DescriptorProtos.ServiceOptions, Builder> implements com.google.protobuf.DescriptorProtos.ServiceOptionsOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_ServiceOptions_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_ServiceOptions_fieldAccessorTable;
+      }
+      
+      // Construct using com.google.protobuf.DescriptorProtos.ServiceOptions.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+      
+      private Builder(BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          getUninterpretedOptionFieldBuilder();
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+      
+      public Builder clear() {
+        super.clear();
+        if (uninterpretedOptionBuilder_ == null) {
+          uninterpretedOption_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+        } else {
+          uninterpretedOptionBuilder_.clear();
+        }
+        return this;
+      }
+      
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+      
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return com.google.protobuf.DescriptorProtos.ServiceOptions.getDescriptor();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.ServiceOptions getDefaultInstanceForType() {
+        return com.google.protobuf.DescriptorProtos.ServiceOptions.getDefaultInstance();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.ServiceOptions build() {
+        com.google.protobuf.DescriptorProtos.ServiceOptions result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+      
+      private com.google.protobuf.DescriptorProtos.ServiceOptions buildParsed()
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.DescriptorProtos.ServiceOptions result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(
+            result).asInvalidProtocolBufferException();
+        }
+        return result;
+      }
+      
+      public com.google.protobuf.DescriptorProtos.ServiceOptions buildPartial() {
+        com.google.protobuf.DescriptorProtos.ServiceOptions result = new com.google.protobuf.DescriptorProtos.ServiceOptions(this);
+        int from_bitField0_ = bitField0_;
+        if (uninterpretedOptionBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) == 0x00000001)) {
+            uninterpretedOption_ = java.util.Collections.unmodifiableList(uninterpretedOption_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.uninterpretedOption_ = uninterpretedOption_;
+        } else {
+          result.uninterpretedOption_ = uninterpretedOptionBuilder_.build();
+        }
+        onBuilt();
+        return result;
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof com.google.protobuf.DescriptorProtos.ServiceOptions) {
+          return mergeFrom((com.google.protobuf.DescriptorProtos.ServiceOptions)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.DescriptorProtos.ServiceOptions other) {
+        if (other == com.google.protobuf.DescriptorProtos.ServiceOptions.getDefaultInstance()) return this;
+        if (uninterpretedOptionBuilder_ == null) {
+          if (!other.uninterpretedOption_.isEmpty()) {
+            if (uninterpretedOption_.isEmpty()) {
+              uninterpretedOption_ = other.uninterpretedOption_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureUninterpretedOptionIsMutable();
+              uninterpretedOption_.addAll(other.uninterpretedOption_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.uninterpretedOption_.isEmpty()) {
+            if (uninterpretedOptionBuilder_.isEmpty()) {
+              uninterpretedOptionBuilder_.dispose();
+              uninterpretedOptionBuilder_ = null;
+              uninterpretedOption_ = other.uninterpretedOption_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              uninterpretedOptionBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getUninterpretedOptionFieldBuilder() : null;
+            } else {
+              uninterpretedOptionBuilder_.addAllMessages(other.uninterpretedOption_);
+            }
+          }
+        }
+        this.mergeExtensionFields(other);
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+      
+      public final boolean isInitialized() {
+        for (int i = 0; i < getUninterpretedOptionCount(); i++) {
+          if (!getUninterpretedOption(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        if (!extensionsAreInitialized()) {
+          
+          return false;
+        }
+        return true;
+      }
+      
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder(
+            this.getUnknownFields());
+        while (true) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              this.setUnknownFields(unknownFields.build());
+              onChanged();
+              return this;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              }
+              break;
+            }
+            case 7994: {
+              com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder subBuilder = com.google.protobuf.DescriptorProtos.UninterpretedOption.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addUninterpretedOption(subBuilder.buildPartial());
+              break;
+            }
+          }
+        }
+      }
+      
+      private int bitField0_;
+      
+      // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+      private java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> uninterpretedOption_ =
+        java.util.Collections.emptyList();
+      private void ensureUninterpretedOptionIsMutable() {
+        if (!((bitField0_ & 0x00000001) == 0x00000001)) {
+          uninterpretedOption_ = new java.util.ArrayList<com.google.protobuf.DescriptorProtos.UninterpretedOption>(uninterpretedOption_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.UninterpretedOption, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder, com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> uninterpretedOptionBuilder_;
+      
+      public java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> getUninterpretedOptionList() {
+        if (uninterpretedOptionBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(uninterpretedOption_);
+        } else {
+          return uninterpretedOptionBuilder_.getMessageList();
+        }
+      }
+      public int getUninterpretedOptionCount() {
+        if (uninterpretedOptionBuilder_ == null) {
+          return uninterpretedOption_.size();
+        } else {
+          return uninterpretedOptionBuilder_.getCount();
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption getUninterpretedOption(int index) {
+        if (uninterpretedOptionBuilder_ == null) {
+          return uninterpretedOption_.get(index);
+        } else {
+          return uninterpretedOptionBuilder_.getMessage(index);
+        }
+      }
+      public Builder setUninterpretedOption(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption value) {
+        if (uninterpretedOptionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.set(index, value);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setUninterpretedOption(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder builderForValue) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addUninterpretedOption(com.google.protobuf.DescriptorProtos.UninterpretedOption value) {
+        if (uninterpretedOptionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.add(value);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addUninterpretedOption(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption value) {
+        if (uninterpretedOptionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.add(index, value);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addUninterpretedOption(
+          com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder builderForValue) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.add(builderForValue.build());
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addUninterpretedOption(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder builderForValue) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllUninterpretedOption(
+          java.lang.Iterable<? extends com.google.protobuf.DescriptorProtos.UninterpretedOption> values) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          super.addAll(values, uninterpretedOption_);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearUninterpretedOption() {
+        if (uninterpretedOptionBuilder_ == null) {
+          uninterpretedOption_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeUninterpretedOption(int index) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.remove(index);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.remove(index);
+        }
+        return this;
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder getUninterpretedOptionBuilder(
+          int index) {
+        return getUninterpretedOptionFieldBuilder().getBuilder(index);
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder getUninterpretedOptionOrBuilder(
+          int index) {
+        if (uninterpretedOptionBuilder_ == null) {
+          return uninterpretedOption_.get(index);  } else {
+          return uninterpretedOptionBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> 
+           getUninterpretedOptionOrBuilderList() {
+        if (uninterpretedOptionBuilder_ != null) {
+          return uninterpretedOptionBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(uninterpretedOption_);
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder addUninterpretedOptionBuilder() {
+        return getUninterpretedOptionFieldBuilder().addBuilder(
+            com.google.protobuf.DescriptorProtos.UninterpretedOption.getDefaultInstance());
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder addUninterpretedOptionBuilder(
+          int index) {
+        return getUninterpretedOptionFieldBuilder().addBuilder(
+            index, com.google.protobuf.DescriptorProtos.UninterpretedOption.getDefaultInstance());
+      }
+      public java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder> 
+           getUninterpretedOptionBuilderList() {
+        return getUninterpretedOptionFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.UninterpretedOption, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder, com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> 
+          getUninterpretedOptionFieldBuilder() {
+        if (uninterpretedOptionBuilder_ == null) {
+          uninterpretedOptionBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              com.google.protobuf.DescriptorProtos.UninterpretedOption, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder, com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder>(
+                  uninterpretedOption_,
+                  ((bitField0_ & 0x00000001) == 0x00000001),
+                  getParentForChildren(),
+                  isClean());
+          uninterpretedOption_ = null;
+        }
+        return uninterpretedOptionBuilder_;
+      }
+      
+      // @@protoc_insertion_point(builder_scope:google.protobuf.ServiceOptions)
+    }
+    
+    static {
+      defaultInstance = new ServiceOptions(true);
+      defaultInstance.initFields();
+    }
+    
+    // @@protoc_insertion_point(class_scope:google.protobuf.ServiceOptions)
+  }
+  
+  public interface MethodOptionsOrBuilder extends
+      com.google.protobuf.GeneratedMessage.
+          ExtendableMessageOrBuilder<MethodOptions> {
+    
+    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+    java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> 
+        getUninterpretedOptionList();
+    com.google.protobuf.DescriptorProtos.UninterpretedOption getUninterpretedOption(int index);
+    int getUninterpretedOptionCount();
+    java.util.List<? extends com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> 
+        getUninterpretedOptionOrBuilderList();
+    com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder getUninterpretedOptionOrBuilder(
+        int index);
+  }
+  public static final class MethodOptions extends
+      com.google.protobuf.GeneratedMessage.ExtendableMessage<
+        MethodOptions> implements MethodOptionsOrBuilder {
+    // Use MethodOptions.newBuilder() to construct.
+    private MethodOptions(Builder builder) {
+      super(builder);
+    }
+    private MethodOptions(boolean noInit) {}
+    
+    private static final MethodOptions defaultInstance;
+    public static MethodOptions getDefaultInstance() {
+      return defaultInstance;
+    }
+    
+    public MethodOptions getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+    
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_MethodOptions_descriptor;
+    }
+    
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_MethodOptions_fieldAccessorTable;
+    }
+    
+    // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+    public static final int UNINTERPRETED_OPTION_FIELD_NUMBER = 999;
+    private java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> uninterpretedOption_;
+    public java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> getUninterpretedOptionList() {
+      return uninterpretedOption_;
+    }
+    public java.util.List<? extends com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> 
+        getUninterpretedOptionOrBuilderList() {
+      return uninterpretedOption_;
+    }
+    public int getUninterpretedOptionCount() {
+      return uninterpretedOption_.size();
+    }
+    public com.google.protobuf.DescriptorProtos.UninterpretedOption getUninterpretedOption(int index) {
+      return uninterpretedOption_.get(index);
+    }
+    public com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder getUninterpretedOptionOrBuilder(
+        int index) {
+      return uninterpretedOption_.get(index);
+    }
+    
+    private void initFields() {
+      uninterpretedOption_ = java.util.Collections.emptyList();
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+      
+      for (int i = 0; i < getUninterpretedOptionCount(); i++) {
+        if (!getUninterpretedOption(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      if (!extensionsAreInitialized()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+    
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      com.google.protobuf.GeneratedMessage
+        .ExtendableMessage<com.google.protobuf.DescriptorProtos.MethodOptions>.ExtensionWriter extensionWriter =
+          newExtensionWriter();
+      for (int i = 0; i < uninterpretedOption_.size(); i++) {
+        output.writeMessage(999, uninterpretedOption_.get(i));
+      }
+      extensionWriter.writeUntil(536870912, output);
+      getUnknownFields().writeTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+    
+      size = 0;
+      for (int i = 0; i < uninterpretedOption_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(999, uninterpretedOption_.get(i));
+      }
+      size += extensionsSerializedSize();
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+    
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+    
+    public static com.google.protobuf.DescriptorProtos.MethodOptions parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.MethodOptions parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.MethodOptions parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.MethodOptions parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.MethodOptions parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.MethodOptions parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.MethodOptions parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.MethodOptions parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.MethodOptions parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.MethodOptions parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(com.google.protobuf.DescriptorProtos.MethodOptions prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+    
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.ExtendableBuilder<
+          com.google.protobuf.DescriptorProtos.MethodOptions, Builder> implements com.google.protobuf.DescriptorProtos.MethodOptionsOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_MethodOptions_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_MethodOptions_fieldAccessorTable;
+      }
+      
+      // Construct using com.google.protobuf.DescriptorProtos.MethodOptions.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+      
+      private Builder(BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          getUninterpretedOptionFieldBuilder();
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+      
+      public Builder clear() {
+        super.clear();
+        if (uninterpretedOptionBuilder_ == null) {
+          uninterpretedOption_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+        } else {
+          uninterpretedOptionBuilder_.clear();
+        }
+        return this;
+      }
+      
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+      
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return com.google.protobuf.DescriptorProtos.MethodOptions.getDescriptor();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.MethodOptions getDefaultInstanceForType() {
+        return com.google.protobuf.DescriptorProtos.MethodOptions.getDefaultInstance();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.MethodOptions build() {
+        com.google.protobuf.DescriptorProtos.MethodOptions result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+      
+      private com.google.protobuf.DescriptorProtos.MethodOptions buildParsed()
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.DescriptorProtos.MethodOptions result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(
+            result).asInvalidProtocolBufferException();
+        }
+        return result;
+      }
+      
+      public com.google.protobuf.DescriptorProtos.MethodOptions buildPartial() {
+        com.google.protobuf.DescriptorProtos.MethodOptions result = new com.google.protobuf.DescriptorProtos.MethodOptions(this);
+        int from_bitField0_ = bitField0_;
+        if (uninterpretedOptionBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) == 0x00000001)) {
+            uninterpretedOption_ = java.util.Collections.unmodifiableList(uninterpretedOption_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.uninterpretedOption_ = uninterpretedOption_;
+        } else {
+          result.uninterpretedOption_ = uninterpretedOptionBuilder_.build();
+        }
+        onBuilt();
+        return result;
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof com.google.protobuf.DescriptorProtos.MethodOptions) {
+          return mergeFrom((com.google.protobuf.DescriptorProtos.MethodOptions)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.DescriptorProtos.MethodOptions other) {
+        if (other == com.google.protobuf.DescriptorProtos.MethodOptions.getDefaultInstance()) return this;
+        if (uninterpretedOptionBuilder_ == null) {
+          if (!other.uninterpretedOption_.isEmpty()) {
+            if (uninterpretedOption_.isEmpty()) {
+              uninterpretedOption_ = other.uninterpretedOption_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureUninterpretedOptionIsMutable();
+              uninterpretedOption_.addAll(other.uninterpretedOption_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.uninterpretedOption_.isEmpty()) {
+            if (uninterpretedOptionBuilder_.isEmpty()) {
+              uninterpretedOptionBuilder_.dispose();
+              uninterpretedOptionBuilder_ = null;
+              uninterpretedOption_ = other.uninterpretedOption_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              uninterpretedOptionBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getUninterpretedOptionFieldBuilder() : null;
+            } else {
+              uninterpretedOptionBuilder_.addAllMessages(other.uninterpretedOption_);
+            }
+          }
+        }
+        this.mergeExtensionFields(other);
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+      
+      public final boolean isInitialized() {
+        for (int i = 0; i < getUninterpretedOptionCount(); i++) {
+          if (!getUninterpretedOption(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        if (!extensionsAreInitialized()) {
+          
+          return false;
+        }
+        return true;
+      }
+      
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder(
+            this.getUnknownFields());
+        while (true) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              this.setUnknownFields(unknownFields.build());
+              onChanged();
+              return this;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              }
+              break;
+            }
+            case 7994: {
+              com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder subBuilder = com.google.protobuf.DescriptorProtos.UninterpretedOption.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addUninterpretedOption(subBuilder.buildPartial());
+              break;
+            }
+          }
+        }
+      }
+      
+      private int bitField0_;
+      
+      // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
+      private java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> uninterpretedOption_ =
+        java.util.Collections.emptyList();
+      private void ensureUninterpretedOptionIsMutable() {
+        if (!((bitField0_ & 0x00000001) == 0x00000001)) {
+          uninterpretedOption_ = new java.util.ArrayList<com.google.protobuf.DescriptorProtos.UninterpretedOption>(uninterpretedOption_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.UninterpretedOption, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder, com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> uninterpretedOptionBuilder_;
+      
+      public java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption> getUninterpretedOptionList() {
+        if (uninterpretedOptionBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(uninterpretedOption_);
+        } else {
+          return uninterpretedOptionBuilder_.getMessageList();
+        }
+      }
+      public int getUninterpretedOptionCount() {
+        if (uninterpretedOptionBuilder_ == null) {
+          return uninterpretedOption_.size();
+        } else {
+          return uninterpretedOptionBuilder_.getCount();
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption getUninterpretedOption(int index) {
+        if (uninterpretedOptionBuilder_ == null) {
+          return uninterpretedOption_.get(index);
+        } else {
+          return uninterpretedOptionBuilder_.getMessage(index);
+        }
+      }
+      public Builder setUninterpretedOption(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption value) {
+        if (uninterpretedOptionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.set(index, value);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setUninterpretedOption(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder builderForValue) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addUninterpretedOption(com.google.protobuf.DescriptorProtos.UninterpretedOption value) {
+        if (uninterpretedOptionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.add(value);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addUninterpretedOption(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption value) {
+        if (uninterpretedOptionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.add(index, value);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addUninterpretedOption(
+          com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder builderForValue) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.add(builderForValue.build());
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addUninterpretedOption(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder builderForValue) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllUninterpretedOption(
+          java.lang.Iterable<? extends com.google.protobuf.DescriptorProtos.UninterpretedOption> values) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          super.addAll(values, uninterpretedOption_);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearUninterpretedOption() {
+        if (uninterpretedOptionBuilder_ == null) {
+          uninterpretedOption_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeUninterpretedOption(int index) {
+        if (uninterpretedOptionBuilder_ == null) {
+          ensureUninterpretedOptionIsMutable();
+          uninterpretedOption_.remove(index);
+          onChanged();
+        } else {
+          uninterpretedOptionBuilder_.remove(index);
+        }
+        return this;
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder getUninterpretedOptionBuilder(
+          int index) {
+        return getUninterpretedOptionFieldBuilder().getBuilder(index);
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder getUninterpretedOptionOrBuilder(
+          int index) {
+        if (uninterpretedOptionBuilder_ == null) {
+          return uninterpretedOption_.get(index);  } else {
+          return uninterpretedOptionBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> 
+           getUninterpretedOptionOrBuilderList() {
+        if (uninterpretedOptionBuilder_ != null) {
+          return uninterpretedOptionBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(uninterpretedOption_);
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder addUninterpretedOptionBuilder() {
+        return getUninterpretedOptionFieldBuilder().addBuilder(
+            com.google.protobuf.DescriptorProtos.UninterpretedOption.getDefaultInstance());
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder addUninterpretedOptionBuilder(
+          int index) {
+        return getUninterpretedOptionFieldBuilder().addBuilder(
+            index, com.google.protobuf.DescriptorProtos.UninterpretedOption.getDefaultInstance());
+      }
+      public java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder> 
+           getUninterpretedOptionBuilderList() {
+        return getUninterpretedOptionFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.UninterpretedOption, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder, com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder> 
+          getUninterpretedOptionFieldBuilder() {
+        if (uninterpretedOptionBuilder_ == null) {
+          uninterpretedOptionBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              com.google.protobuf.DescriptorProtos.UninterpretedOption, com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder, com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder>(
+                  uninterpretedOption_,
+                  ((bitField0_ & 0x00000001) == 0x00000001),
+                  getParentForChildren(),
+                  isClean());
+          uninterpretedOption_ = null;
+        }
+        return uninterpretedOptionBuilder_;
+      }
+      
+      // @@protoc_insertion_point(builder_scope:google.protobuf.MethodOptions)
+    }
+    
+    static {
+      defaultInstance = new MethodOptions(true);
+      defaultInstance.initFields();
+    }
+    
+    // @@protoc_insertion_point(class_scope:google.protobuf.MethodOptions)
+  }
+  
+  public interface UninterpretedOptionOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+    
+    // repeated .google.protobuf.UninterpretedOption.NamePart name = 2;
+    java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart> 
+        getNameList();
+    com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart getName(int index);
+    int getNameCount();
+    java.util.List<? extends com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePartOrBuilder> 
+        getNameOrBuilderList();
+    com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePartOrBuilder getNameOrBuilder(
+        int index);
+    
+    // optional string identifier_value = 3;
+    boolean hasIdentifierValue();
+    String getIdentifierValue();
+    
+    // optional uint64 positive_int_value = 4;
+    boolean hasPositiveIntValue();
+    long getPositiveIntValue();
+    
+    // optional int64 negative_int_value = 5;
+    boolean hasNegativeIntValue();
+    long getNegativeIntValue();
+    
+    // optional double double_value = 6;
+    boolean hasDoubleValue();
+    double getDoubleValue();
+    
+    // optional bytes string_value = 7;
+    boolean hasStringValue();
+    com.google.protobuf.ByteString getStringValue();
+    
+    // optional string aggregate_value = 8;
+    boolean hasAggregateValue();
+    String getAggregateValue();
+  }
+  public static final class UninterpretedOption extends
+      com.google.protobuf.GeneratedMessage
+      implements UninterpretedOptionOrBuilder {
+    // Use UninterpretedOption.newBuilder() to construct.
+    private UninterpretedOption(Builder builder) {
+      super(builder);
+    }
+    private UninterpretedOption(boolean noInit) {}
+    
+    private static final UninterpretedOption defaultInstance;
+    public static UninterpretedOption getDefaultInstance() {
+      return defaultInstance;
+    }
+    
+    public UninterpretedOption getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+    
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_UninterpretedOption_descriptor;
+    }
+    
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_UninterpretedOption_fieldAccessorTable;
+    }
+    
+    public interface NamePartOrBuilder
+        extends com.google.protobuf.MessageOrBuilder {
+      
+      // required string name_part = 1;
+      boolean hasNamePart();
+      String getNamePart();
+      
+      // required bool is_extension = 2;
+      boolean hasIsExtension();
+      boolean getIsExtension();
+    }
+    public static final class NamePart extends
+        com.google.protobuf.GeneratedMessage
+        implements NamePartOrBuilder {
+      // Use NamePart.newBuilder() to construct.
+      private NamePart(Builder builder) {
+        super(builder);
+      }
+      private NamePart(boolean noInit) {}
+      
+      private static final NamePart defaultInstance;
+      public static NamePart getDefaultInstance() {
+        return defaultInstance;
+      }
+      
+      public NamePart getDefaultInstanceForType() {
+        return defaultInstance;
+      }
+      
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_UninterpretedOption_NamePart_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_UninterpretedOption_NamePart_fieldAccessorTable;
+      }
+      
+      private int bitField0_;
+      // required string name_part = 1;
+      public static final int NAME_PART_FIELD_NUMBER = 1;
+      private java.lang.Object namePart_;
+      public boolean hasNamePart() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      public String getNamePart() {
+        java.lang.Object ref = namePart_;
+        if (ref instanceof String) {
+          return (String) ref;
+        } else {
+          com.google.protobuf.ByteString bs = 
+              (com.google.protobuf.ByteString) ref;
+          String s = bs.toStringUtf8();
+          if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+            namePart_ = s;
+          }
+          return s;
+        }
+      }
+      private com.google.protobuf.ByteString getNamePartBytes() {
+        java.lang.Object ref = namePart_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+          namePart_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      
+      // required bool is_extension = 2;
+      public static final int IS_EXTENSION_FIELD_NUMBER = 2;
+      private boolean isExtension_;
+      public boolean hasIsExtension() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      public boolean getIsExtension() {
+        return isExtension_;
+      }
+      
+      private void initFields() {
+        namePart_ = "";
+        isExtension_ = false;
+      }
+      private byte memoizedIsInitialized = -1;
+      public final boolean isInitialized() {
+        byte isInitialized = memoizedIsInitialized;
+        if (isInitialized != -1) return isInitialized == 1;
+        
+        if (!hasNamePart()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+        if (!hasIsExtension()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+        memoizedIsInitialized = 1;
+        return true;
+      }
+      
+      public void writeTo(com.google.protobuf.CodedOutputStream output)
+                          throws java.io.IOException {
+        getSerializedSize();
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          output.writeBytes(1, getNamePartBytes());
+        }
+        if (((bitField0_ & 0x00000002) == 0x00000002)) {
+          output.writeBool(2, isExtension_);
+        }
+        getUnknownFields().writeTo(output);
+      }
+      
+      private int memoizedSerializedSize = -1;
+      public int getSerializedSize() {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+      
+        size = 0;
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeBytesSize(1, getNamePartBytes());
+        }
+        if (((bitField0_ & 0x00000002) == 0x00000002)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeBoolSize(2, isExtension_);
+        }
+        size += getUnknownFields().getSerializedSize();
+        memoizedSerializedSize = size;
+        return size;
+      }
+      
+      private static final long serialVersionUID = 0L;
+      @java.lang.Override
+      protected java.lang.Object writeReplace()
+          throws java.io.ObjectStreamException {
+        return super.writeReplace();
+      }
+      
+      public static com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart parseFrom(
+          com.google.protobuf.ByteString data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart parseFrom(
+          com.google.protobuf.ByteString data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart parseFrom(byte[] data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart parseFrom(
+          byte[] data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart parseFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart parseFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart parseDelimitedFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        Builder builder = newBuilder();
+        if (builder.mergeDelimitedFrom(input)) {
+          return builder.buildParsed();
+        } else {
+          return null;
+        }
+      }
+      public static com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart parseDelimitedFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        Builder builder = newBuilder();
+        if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+          return builder.buildParsed();
+        } else {
+          return null;
+        }
+      }
+      public static com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart parseFrom(
+          com.google.protobuf.CodedInputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart parseFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      
+      public static Builder newBuilder() { return Builder.create(); }
+      public Builder newBuilderForType() { return newBuilder(); }
+      public static Builder newBuilder(com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart prototype) {
+        return newBuilder().mergeFrom(prototype);
+      }
+      public Builder toBuilder() { return newBuilder(this); }
+      
+      @java.lang.Override
+      protected Builder newBuilderForType(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        Builder builder = new Builder(parent);
+        return builder;
+      }
+      public static final class Builder extends
+          com.google.protobuf.GeneratedMessage.Builder<Builder>
+         implements com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePartOrBuilder {
+        public static final com.google.protobuf.Descriptors.Descriptor
+            getDescriptor() {
+          return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_UninterpretedOption_NamePart_descriptor;
+        }
+        
+        protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+            internalGetFieldAccessorTable() {
+          return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_UninterpretedOption_NamePart_fieldAccessorTable;
+        }
+        
+        // Construct using com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart.newBuilder()
+        private Builder() {
+          maybeForceBuilderInitialization();
+        }
+        
+        private Builder(BuilderParent parent) {
+          super(parent);
+          maybeForceBuilderInitialization();
+        }
+        private void maybeForceBuilderInitialization() {
+          if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          }
+        }
+        private static Builder create() {
+          return new Builder();
+        }
+        
+        public Builder clear() {
+          super.clear();
+          namePart_ = "";
+          bitField0_ = (bitField0_ & ~0x00000001);
+          isExtension_ = false;
+          bitField0_ = (bitField0_ & ~0x00000002);
+          return this;
+        }
+        
+        public Builder clone() {
+          return create().mergeFrom(buildPartial());
+        }
+        
+        public com.google.protobuf.Descriptors.Descriptor
+            getDescriptorForType() {
+          return com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart.getDescriptor();
+        }
+        
+        public com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart getDefaultInstanceForType() {
+          return com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart.getDefaultInstance();
+        }
+        
+        public com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart build() {
+          com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(result);
+          }
+          return result;
+        }
+        
+        private com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart buildParsed()
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(
+              result).asInvalidProtocolBufferException();
+          }
+          return result;
+        }
+        
+        public com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart buildPartial() {
+          com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart result = new com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart(this);
+          int from_bitField0_ = bitField0_;
+          int to_bitField0_ = 0;
+          if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+            to_bitField0_ |= 0x00000001;
+          }
+          result.namePart_ = namePart_;
+          if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+            to_bitField0_ |= 0x00000002;
+          }
+          result.isExtension_ = isExtension_;
+          result.bitField0_ = to_bitField0_;
+          onBuilt();
+          return result;
+        }
+        
+        public Builder mergeFrom(com.google.protobuf.Message other) {
+          if (other instanceof com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart) {
+            return mergeFrom((com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart)other);
+          } else {
+            super.mergeFrom(other);
+            return this;
+          }
+        }
+        
+        public Builder mergeFrom(com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart other) {
+          if (other == com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart.getDefaultInstance()) return this;
+          if (other.hasNamePart()) {
+            setNamePart(other.getNamePart());
+          }
+          if (other.hasIsExtension()) {
+            setIsExtension(other.getIsExtension());
+          }
+          this.mergeUnknownFields(other.getUnknownFields());
+          return this;
+        }
+        
+        public final boolean isInitialized() {
+          if (!hasNamePart()) {
+            
+            return false;
+          }
+          if (!hasIsExtension()) {
+            
+            return false;
+          }
+          return true;
+        }
+        
+        public Builder mergeFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+            com.google.protobuf.UnknownFieldSet.newBuilder(
+              this.getUnknownFields());
+          while (true) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              default: {
+                if (!parseUnknownField(input, unknownFields,
+                                       extensionRegistry, tag)) {
+                  this.setUnknownFields(unknownFields.build());
+                  onChanged();
+                  return this;
+                }
+                break;
+              }
+              case 10: {
+                bitField0_ |= 0x00000001;
+                namePart_ = input.readBytes();
+                break;
+              }
+              case 16: {
+                bitField0_ |= 0x00000002;
+                isExtension_ = input.readBool();
+                break;
+              }
+            }
+          }
+        }
+        
+        private int bitField0_;
+        
+        // required string name_part = 1;
+        private java.lang.Object namePart_ = "";
+        public boolean hasNamePart() {
+          return ((bitField0_ & 0x00000001) == 0x00000001);
+        }
+        public String getNamePart() {
+          java.lang.Object ref = namePart_;
+          if (!(ref instanceof String)) {
+            String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+            namePart_ = s;
+            return s;
+          } else {
+            return (String) ref;
+          }
+        }
+        public Builder setNamePart(String value) {
+          if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+          namePart_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearNamePart() {
+          bitField0_ = (bitField0_ & ~0x00000001);
+          namePart_ = getDefaultInstance().getNamePart();
+          onChanged();
+          return this;
+        }
+        void setNamePart(com.google.protobuf.ByteString value) {
+          bitField0_ |= 0x00000001;
+          namePart_ = value;
+          onChanged();
+        }
+        
+        // required bool is_extension = 2;
+        private boolean isExtension_ ;
+        public boolean hasIsExtension() {
+          return ((bitField0_ & 0x00000002) == 0x00000002);
+        }
+        public boolean getIsExtension() {
+          return isExtension_;
+        }
+        public Builder setIsExtension(boolean value) {
+          bitField0_ |= 0x00000002;
+          isExtension_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearIsExtension() {
+          bitField0_ = (bitField0_ & ~0x00000002);
+          isExtension_ = false;
+          onChanged();
+          return this;
+        }
+        
+        // @@protoc_insertion_point(builder_scope:google.protobuf.UninterpretedOption.NamePart)
+      }
+      
+      static {
+        defaultInstance = new NamePart(true);
+        defaultInstance.initFields();
+      }
+      
+      // @@protoc_insertion_point(class_scope:google.protobuf.UninterpretedOption.NamePart)
+    }
+    
+    private int bitField0_;
+    // repeated .google.protobuf.UninterpretedOption.NamePart name = 2;
+    public static final int NAME_FIELD_NUMBER = 2;
+    private java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart> name_;
+    public java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart> getNameList() {
+      return name_;
+    }
+    public java.util.List<? extends com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePartOrBuilder> 
+        getNameOrBuilderList() {
+      return name_;
+    }
+    public int getNameCount() {
+      return name_.size();
+    }
+    public com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart getName(int index) {
+      return name_.get(index);
+    }
+    public com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePartOrBuilder getNameOrBuilder(
+        int index) {
+      return name_.get(index);
+    }
+    
+    // optional string identifier_value = 3;
+    public static final int IDENTIFIER_VALUE_FIELD_NUMBER = 3;
+    private java.lang.Object identifierValue_;
+    public boolean hasIdentifierValue() {
+      return ((bitField0_ & 0x00000001) == 0x00000001);
+    }
+    public String getIdentifierValue() {
+      java.lang.Object ref = identifierValue_;
+      if (ref instanceof String) {
+        return (String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        String s = bs.toStringUtf8();
+        if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+          identifierValue_ = s;
+        }
+        return s;
+      }
+    }
+    private com.google.protobuf.ByteString getIdentifierValueBytes() {
+      java.lang.Object ref = identifierValue_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+        identifierValue_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    
+    // optional uint64 positive_int_value = 4;
+    public static final int POSITIVE_INT_VALUE_FIELD_NUMBER = 4;
+    private long positiveIntValue_;
+    public boolean hasPositiveIntValue() {
+      return ((bitField0_ & 0x00000002) == 0x00000002);
+    }
+    public long getPositiveIntValue() {
+      return positiveIntValue_;
+    }
+    
+    // optional int64 negative_int_value = 5;
+    public static final int NEGATIVE_INT_VALUE_FIELD_NUMBER = 5;
+    private long negativeIntValue_;
+    public boolean hasNegativeIntValue() {
+      return ((bitField0_ & 0x00000004) == 0x00000004);
+    }
+    public long getNegativeIntValue() {
+      return negativeIntValue_;
+    }
+    
+    // optional double double_value = 6;
+    public static final int DOUBLE_VALUE_FIELD_NUMBER = 6;
+    private double doubleValue_;
+    public boolean hasDoubleValue() {
+      return ((bitField0_ & 0x00000008) == 0x00000008);
+    }
+    public double getDoubleValue() {
+      return doubleValue_;
+    }
+    
+    // optional bytes string_value = 7;
+    public static final int STRING_VALUE_FIELD_NUMBER = 7;
+    private com.google.protobuf.ByteString stringValue_;
+    public boolean hasStringValue() {
+      return ((bitField0_ & 0x00000010) == 0x00000010);
+    }
+    public com.google.protobuf.ByteString getStringValue() {
+      return stringValue_;
+    }
+    
+    // optional string aggregate_value = 8;
+    public static final int AGGREGATE_VALUE_FIELD_NUMBER = 8;
+    private java.lang.Object aggregateValue_;
+    public boolean hasAggregateValue() {
+      return ((bitField0_ & 0x00000020) == 0x00000020);
+    }
+    public String getAggregateValue() {
+      java.lang.Object ref = aggregateValue_;
+      if (ref instanceof String) {
+        return (String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        String s = bs.toStringUtf8();
+        if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+          aggregateValue_ = s;
+        }
+        return s;
+      }
+    }
+    private com.google.protobuf.ByteString getAggregateValueBytes() {
+      java.lang.Object ref = aggregateValue_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+        aggregateValue_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    
+    private void initFields() {
+      name_ = java.util.Collections.emptyList();
+      identifierValue_ = "";
+      positiveIntValue_ = 0L;
+      negativeIntValue_ = 0L;
+      doubleValue_ = 0D;
+      stringValue_ = com.google.protobuf.ByteString.EMPTY;
+      aggregateValue_ = "";
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+      
+      for (int i = 0; i < getNameCount(); i++) {
+        if (!getName(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+    
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      for (int i = 0; i < name_.size(); i++) {
+        output.writeMessage(2, name_.get(i));
+      }
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        output.writeBytes(3, getIdentifierValueBytes());
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        output.writeUInt64(4, positiveIntValue_);
+      }
+      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+        output.writeInt64(5, negativeIntValue_);
+      }
+      if (((bitField0_ & 0x00000008) == 0x00000008)) {
+        output.writeDouble(6, doubleValue_);
+      }
+      if (((bitField0_ & 0x00000010) == 0x00000010)) {
+        output.writeBytes(7, stringValue_);
+      }
+      if (((bitField0_ & 0x00000020) == 0x00000020)) {
+        output.writeBytes(8, getAggregateValueBytes());
+      }
+      getUnknownFields().writeTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+    
+      size = 0;
+      for (int i = 0; i < name_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(2, name_.get(i));
+      }
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(3, getIdentifierValueBytes());
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeUInt64Size(4, positiveIntValue_);
+      }
+      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeInt64Size(5, negativeIntValue_);
+      }
+      if (((bitField0_ & 0x00000008) == 0x00000008)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeDoubleSize(6, doubleValue_);
+      }
+      if (((bitField0_ & 0x00000010) == 0x00000010)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(7, stringValue_);
+      }
+      if (((bitField0_ & 0x00000020) == 0x00000020)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(8, getAggregateValueBytes());
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+    
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+    
+    public static com.google.protobuf.DescriptorProtos.UninterpretedOption parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.UninterpretedOption parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.UninterpretedOption parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.UninterpretedOption parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.UninterpretedOption parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.UninterpretedOption parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.UninterpretedOption parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.UninterpretedOption parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.UninterpretedOption parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.UninterpretedOption parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(com.google.protobuf.DescriptorProtos.UninterpretedOption prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+    
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements com.google.protobuf.DescriptorProtos.UninterpretedOptionOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_UninterpretedOption_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_UninterpretedOption_fieldAccessorTable;
+      }
+      
+      // Construct using com.google.protobuf.DescriptorProtos.UninterpretedOption.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+      
+      private Builder(BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          getNameFieldBuilder();
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+      
+      public Builder clear() {
+        super.clear();
+        if (nameBuilder_ == null) {
+          name_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+        } else {
+          nameBuilder_.clear();
+        }
+        identifierValue_ = "";
+        bitField0_ = (bitField0_ & ~0x00000002);
+        positiveIntValue_ = 0L;
+        bitField0_ = (bitField0_ & ~0x00000004);
+        negativeIntValue_ = 0L;
+        bitField0_ = (bitField0_ & ~0x00000008);
+        doubleValue_ = 0D;
+        bitField0_ = (bitField0_ & ~0x00000010);
+        stringValue_ = com.google.protobuf.ByteString.EMPTY;
+        bitField0_ = (bitField0_ & ~0x00000020);
+        aggregateValue_ = "";
+        bitField0_ = (bitField0_ & ~0x00000040);
+        return this;
+      }
+      
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+      
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return com.google.protobuf.DescriptorProtos.UninterpretedOption.getDescriptor();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption getDefaultInstanceForType() {
+        return com.google.protobuf.DescriptorProtos.UninterpretedOption.getDefaultInstance();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption build() {
+        com.google.protobuf.DescriptorProtos.UninterpretedOption result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+      
+      private com.google.protobuf.DescriptorProtos.UninterpretedOption buildParsed()
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.DescriptorProtos.UninterpretedOption result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(
+            result).asInvalidProtocolBufferException();
+        }
+        return result;
+      }
+      
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption buildPartial() {
+        com.google.protobuf.DescriptorProtos.UninterpretedOption result = new com.google.protobuf.DescriptorProtos.UninterpretedOption(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (nameBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) == 0x00000001)) {
+            name_ = java.util.Collections.unmodifiableList(name_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.name_ = name_;
+        } else {
+          result.name_ = nameBuilder_.build();
+        }
+        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+          to_bitField0_ |= 0x00000001;
+        }
+        result.identifierValue_ = identifierValue_;
+        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
+          to_bitField0_ |= 0x00000002;
+        }
+        result.positiveIntValue_ = positiveIntValue_;
+        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
+          to_bitField0_ |= 0x00000004;
+        }
+        result.negativeIntValue_ = negativeIntValue_;
+        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
+          to_bitField0_ |= 0x00000008;
+        }
+        result.doubleValue_ = doubleValue_;
+        if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
+          to_bitField0_ |= 0x00000010;
+        }
+        result.stringValue_ = stringValue_;
+        if (((from_bitField0_ & 0x00000040) == 0x00000040)) {
+          to_bitField0_ |= 0x00000020;
+        }
+        result.aggregateValue_ = aggregateValue_;
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof com.google.protobuf.DescriptorProtos.UninterpretedOption) {
+          return mergeFrom((com.google.protobuf.DescriptorProtos.UninterpretedOption)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.DescriptorProtos.UninterpretedOption other) {
+        if (other == com.google.protobuf.DescriptorProtos.UninterpretedOption.getDefaultInstance()) return this;
+        if (nameBuilder_ == null) {
+          if (!other.name_.isEmpty()) {
+            if (name_.isEmpty()) {
+              name_ = other.name_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureNameIsMutable();
+              name_.addAll(other.name_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.name_.isEmpty()) {
+            if (nameBuilder_.isEmpty()) {
+              nameBuilder_.dispose();
+              nameBuilder_ = null;
+              name_ = other.name_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              nameBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getNameFieldBuilder() : null;
+            } else {
+              nameBuilder_.addAllMessages(other.name_);
+            }
+          }
+        }
+        if (other.hasIdentifierValue()) {
+          setIdentifierValue(other.getIdentifierValue());
+        }
+        if (other.hasPositiveIntValue()) {
+          setPositiveIntValue(other.getPositiveIntValue());
+        }
+        if (other.hasNegativeIntValue()) {
+          setNegativeIntValue(other.getNegativeIntValue());
+        }
+        if (other.hasDoubleValue()) {
+          setDoubleValue(other.getDoubleValue());
+        }
+        if (other.hasStringValue()) {
+          setStringValue(other.getStringValue());
+        }
+        if (other.hasAggregateValue()) {
+          setAggregateValue(other.getAggregateValue());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+      
+      public final boolean isInitialized() {
+        for (int i = 0; i < getNameCount(); i++) {
+          if (!getName(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        return true;
+      }
+      
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder(
+            this.getUnknownFields());
+        while (true) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              this.setUnknownFields(unknownFields.build());
+              onChanged();
+              return this;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              }
+              break;
+            }
+            case 18: {
+              com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart.Builder subBuilder = com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addName(subBuilder.buildPartial());
+              break;
+            }
+            case 26: {
+              bitField0_ |= 0x00000002;
+              identifierValue_ = input.readBytes();
+              break;
+            }
+            case 32: {
+              bitField0_ |= 0x00000004;
+              positiveIntValue_ = input.readUInt64();
+              break;
+            }
+            case 40: {
+              bitField0_ |= 0x00000008;
+              negativeIntValue_ = input.readInt64();
+              break;
+            }
+            case 49: {
+              bitField0_ |= 0x00000010;
+              doubleValue_ = input.readDouble();
+              break;
+            }
+            case 58: {
+              bitField0_ |= 0x00000020;
+              stringValue_ = input.readBytes();
+              break;
+            }
+            case 66: {
+              bitField0_ |= 0x00000040;
+              aggregateValue_ = input.readBytes();
+              break;
+            }
+          }
+        }
+      }
+      
+      private int bitField0_;
+      
+      // repeated .google.protobuf.UninterpretedOption.NamePart name = 2;
+      private java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart> name_ =
+        java.util.Collections.emptyList();
+      private void ensureNameIsMutable() {
+        if (!((bitField0_ & 0x00000001) == 0x00000001)) {
+          name_ = new java.util.ArrayList<com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart>(name_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart, com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart.Builder, com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePartOrBuilder> nameBuilder_;
+      
+      public java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart> getNameList() {
+        if (nameBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(name_);
+        } else {
+          return nameBuilder_.getMessageList();
+        }
+      }
+      public int getNameCount() {
+        if (nameBuilder_ == null) {
+          return name_.size();
+        } else {
+          return nameBuilder_.getCount();
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart getName(int index) {
+        if (nameBuilder_ == null) {
+          return name_.get(index);
+        } else {
+          return nameBuilder_.getMessage(index);
+        }
+      }
+      public Builder setName(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart value) {
+        if (nameBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureNameIsMutable();
+          name_.set(index, value);
+          onChanged();
+        } else {
+          nameBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setName(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart.Builder builderForValue) {
+        if (nameBuilder_ == null) {
+          ensureNameIsMutable();
+          name_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          nameBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addName(com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart value) {
+        if (nameBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureNameIsMutable();
+          name_.add(value);
+          onChanged();
+        } else {
+          nameBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addName(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart value) {
+        if (nameBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureNameIsMutable();
+          name_.add(index, value);
+          onChanged();
+        } else {
+          nameBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addName(
+          com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart.Builder builderForValue) {
+        if (nameBuilder_ == null) {
+          ensureNameIsMutable();
+          name_.add(builderForValue.build());
+          onChanged();
+        } else {
+          nameBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addName(
+          int index, com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart.Builder builderForValue) {
+        if (nameBuilder_ == null) {
+          ensureNameIsMutable();
+          name_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          nameBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllName(
+          java.lang.Iterable<? extends com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart> values) {
+        if (nameBuilder_ == null) {
+          ensureNameIsMutable();
+          super.addAll(values, name_);
+          onChanged();
+        } else {
+          nameBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearName() {
+        if (nameBuilder_ == null) {
+          name_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
+        } else {
+          nameBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeName(int index) {
+        if (nameBuilder_ == null) {
+          ensureNameIsMutable();
+          name_.remove(index);
+          onChanged();
+        } else {
+          nameBuilder_.remove(index);
+        }
+        return this;
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart.Builder getNameBuilder(
+          int index) {
+        return getNameFieldBuilder().getBuilder(index);
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePartOrBuilder getNameOrBuilder(
+          int index) {
+        if (nameBuilder_ == null) {
+          return name_.get(index);  } else {
+          return nameBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePartOrBuilder> 
+           getNameOrBuilderList() {
+        if (nameBuilder_ != null) {
+          return nameBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(name_);
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart.Builder addNameBuilder() {
+        return getNameFieldBuilder().addBuilder(
+            com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart.getDefaultInstance());
+      }
+      public com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart.Builder addNameBuilder(
+          int index) {
+        return getNameFieldBuilder().addBuilder(
+            index, com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart.getDefaultInstance());
+      }
+      public java.util.List<com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart.Builder> 
+           getNameBuilderList() {
+        return getNameFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart, com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart.Builder, com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePartOrBuilder> 
+          getNameFieldBuilder() {
+        if (nameBuilder_ == null) {
+          nameBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart, com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart.Builder, com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePartOrBuilder>(
+                  name_,
+                  ((bitField0_ & 0x00000001) == 0x00000001),
+                  getParentForChildren(),
+                  isClean());
+          name_ = null;
+        }
+        return nameBuilder_;
+      }
+      
+      // optional string identifier_value = 3;
+      private java.lang.Object identifierValue_ = "";
+      public boolean hasIdentifierValue() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      public String getIdentifierValue() {
+        java.lang.Object ref = identifierValue_;
+        if (!(ref instanceof String)) {
+          String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+          identifierValue_ = s;
+          return s;
+        } else {
+          return (String) ref;
+        }
+      }
+      public Builder setIdentifierValue(String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000002;
+        identifierValue_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearIdentifierValue() {
+        bitField0_ = (bitField0_ & ~0x00000002);
+        identifierValue_ = getDefaultInstance().getIdentifierValue();
+        onChanged();
+        return this;
+      }
+      void setIdentifierValue(com.google.protobuf.ByteString value) {
+        bitField0_ |= 0x00000002;
+        identifierValue_ = value;
+        onChanged();
+      }
+      
+      // optional uint64 positive_int_value = 4;
+      private long positiveIntValue_ ;
+      public boolean hasPositiveIntValue() {
+        return ((bitField0_ & 0x00000004) == 0x00000004);
+      }
+      public long getPositiveIntValue() {
+        return positiveIntValue_;
+      }
+      public Builder setPositiveIntValue(long value) {
+        bitField0_ |= 0x00000004;
+        positiveIntValue_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearPositiveIntValue() {
+        bitField0_ = (bitField0_ & ~0x00000004);
+        positiveIntValue_ = 0L;
+        onChanged();
+        return this;
+      }
+      
+      // optional int64 negative_int_value = 5;
+      private long negativeIntValue_ ;
+      public boolean hasNegativeIntValue() {
+        return ((bitField0_ & 0x00000008) == 0x00000008);
+      }
+      public long getNegativeIntValue() {
+        return negativeIntValue_;
+      }
+      public Builder setNegativeIntValue(long value) {
+        bitField0_ |= 0x00000008;
+        negativeIntValue_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearNegativeIntValue() {
+        bitField0_ = (bitField0_ & ~0x00000008);
+        negativeIntValue_ = 0L;
+        onChanged();
+        return this;
+      }
+      
+      // optional double double_value = 6;
+      private double doubleValue_ ;
+      public boolean hasDoubleValue() {
+        return ((bitField0_ & 0x00000010) == 0x00000010);
+      }
+      public double getDoubleValue() {
+        return doubleValue_;
+      }
+      public Builder setDoubleValue(double value) {
+        bitField0_ |= 0x00000010;
+        doubleValue_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearDoubleValue() {
+        bitField0_ = (bitField0_ & ~0x00000010);
+        doubleValue_ = 0D;
+        onChanged();
+        return this;
+      }
+      
+      // optional bytes string_value = 7;
+      private com.google.protobuf.ByteString stringValue_ = com.google.protobuf.ByteString.EMPTY;
+      public boolean hasStringValue() {
+        return ((bitField0_ & 0x00000020) == 0x00000020);
+      }
+      public com.google.protobuf.ByteString getStringValue() {
+        return stringValue_;
+      }
+      public Builder setStringValue(com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000020;
+        stringValue_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearStringValue() {
+        bitField0_ = (bitField0_ & ~0x00000020);
+        stringValue_ = getDefaultInstance().getStringValue();
+        onChanged();
+        return this;
+      }
+      
+      // optional string aggregate_value = 8;
+      private java.lang.Object aggregateValue_ = "";
+      public boolean hasAggregateValue() {
+        return ((bitField0_ & 0x00000040) == 0x00000040);
+      }
+      public String getAggregateValue() {
+        java.lang.Object ref = aggregateValue_;
+        if (!(ref instanceof String)) {
+          String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+          aggregateValue_ = s;
+          return s;
+        } else {
+          return (String) ref;
+        }
+      }
+      public Builder setAggregateValue(String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000040;
+        aggregateValue_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearAggregateValue() {
+        bitField0_ = (bitField0_ & ~0x00000040);
+        aggregateValue_ = getDefaultInstance().getAggregateValue();
+        onChanged();
+        return this;
+      }
+      void setAggregateValue(com.google.protobuf.ByteString value) {
+        bitField0_ |= 0x00000040;
+        aggregateValue_ = value;
+        onChanged();
+      }
+      
+      // @@protoc_insertion_point(builder_scope:google.protobuf.UninterpretedOption)
+    }
+    
+    static {
+      defaultInstance = new UninterpretedOption(true);
+      defaultInstance.initFields();
+    }
+    
+    // @@protoc_insertion_point(class_scope:google.protobuf.UninterpretedOption)
+  }
+  
+  public interface SourceCodeInfoOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+    
+    // repeated .google.protobuf.SourceCodeInfo.Location location = 1;
+    java.util.List<com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location> 
+        getLocationList();
+    com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location getLocation(int index);
+    int getLocationCount();
+    java.util.List<? extends com.google.protobuf.DescriptorProtos.SourceCodeInfo.LocationOrBuilder> 
+        getLocationOrBuilderList();
+    com.google.protobuf.DescriptorProtos.SourceCodeInfo.LocationOrBuilder getLocationOrBuilder(
+        int index);
+  }
+  public static final class SourceCodeInfo extends
+      com.google.protobuf.GeneratedMessage
+      implements SourceCodeInfoOrBuilder {
+    // Use SourceCodeInfo.newBuilder() to construct.
+    private SourceCodeInfo(Builder builder) {
+      super(builder);
+    }
+    private SourceCodeInfo(boolean noInit) {}
+    
+    private static final SourceCodeInfo defaultInstance;
+    public static SourceCodeInfo getDefaultInstance() {
+      return defaultInstance;
+    }
+    
+    public SourceCodeInfo getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+    
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_SourceCodeInfo_descriptor;
+    }
+    
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_SourceCodeInfo_fieldAccessorTable;
+    }
+    
+    public interface LocationOrBuilder
+        extends com.google.protobuf.MessageOrBuilder {
+      
+      // repeated int32 path = 1 [packed = true];
+      java.util.List<java.lang.Integer> getPathList();
+      int getPathCount();
+      int getPath(int index);
+      
+      // repeated int32 span = 2 [packed = true];
+      java.util.List<java.lang.Integer> getSpanList();
+      int getSpanCount();
+      int getSpan(int index);
+    }
+    public static final class Location extends
+        com.google.protobuf.GeneratedMessage
+        implements LocationOrBuilder {
+      // Use Location.newBuilder() to construct.
+      private Location(Builder builder) {
+        super(builder);
+      }
+      private Location(boolean noInit) {}
+      
+      private static final Location defaultInstance;
+      public static Location getDefaultInstance() {
+        return defaultInstance;
+      }
+      
+      public Location getDefaultInstanceForType() {
+        return defaultInstance;
+      }
+      
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_SourceCodeInfo_Location_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_SourceCodeInfo_Location_fieldAccessorTable;
+      }
+      
+      // repeated int32 path = 1 [packed = true];
+      public static final int PATH_FIELD_NUMBER = 1;
+      private java.util.List<java.lang.Integer> path_;
+      public java.util.List<java.lang.Integer>
+          getPathList() {
+        return path_;
+      }
+      public int getPathCount() {
+        return path_.size();
+      }
+      public int getPath(int index) {
+        return path_.get(index);
+      }
+      private int pathMemoizedSerializedSize = -1;
+      
+      // repeated int32 span = 2 [packed = true];
+      public static final int SPAN_FIELD_NUMBER = 2;
+      private java.util.List<java.lang.Integer> span_;
+      public java.util.List<java.lang.Integer>
+          getSpanList() {
+        return span_;
+      }
+      public int getSpanCount() {
+        return span_.size();
+      }
+      public int getSpan(int index) {
+        return span_.get(index);
+      }
+      private int spanMemoizedSerializedSize = -1;
+      
+      private void initFields() {
+        path_ = java.util.Collections.emptyList();;
+        span_ = java.util.Collections.emptyList();;
+      }
+      private byte memoizedIsInitialized = -1;
+      public final boolean isInitialized() {
+        byte isInitialized = memoizedIsInitialized;
+        if (isInitialized != -1) return isInitialized == 1;
+        
+        memoizedIsInitialized = 1;
+        return true;
+      }
+      
+      public void writeTo(com.google.protobuf.CodedOutputStream output)
+                          throws java.io.IOException {
+        getSerializedSize();
+        if (getPathList().size() > 0) {
+          output.writeRawVarint32(10);
+          output.writeRawVarint32(pathMemoizedSerializedSize);
+        }
+        for (int i = 0; i < path_.size(); i++) {
+          output.writeInt32NoTag(path_.get(i));
+        }
+        if (getSpanList().size() > 0) {
+          output.writeRawVarint32(18);
+          output.writeRawVarint32(spanMemoizedSerializedSize);
+        }
+        for (int i = 0; i < span_.size(); i++) {
+          output.writeInt32NoTag(span_.get(i));
+        }
+        getUnknownFields().writeTo(output);
+      }
+      
+      private int memoizedSerializedSize = -1;
+      public int getSerializedSize() {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+      
+        size = 0;
+        {
+          int dataSize = 0;
+          for (int i = 0; i < path_.size(); i++) {
+            dataSize += com.google.protobuf.CodedOutputStream
+              .computeInt32SizeNoTag(path_.get(i));
+          }
+          size += dataSize;
+          if (!getPathList().isEmpty()) {
+            size += 1;
+            size += com.google.protobuf.CodedOutputStream
+                .computeInt32SizeNoTag(dataSize);
+          }
+          pathMemoizedSerializedSize = dataSize;
+        }
+        {
+          int dataSize = 0;
+          for (int i = 0; i < span_.size(); i++) {
+            dataSize += com.google.protobuf.CodedOutputStream
+              .computeInt32SizeNoTag(span_.get(i));
+          }
+          size += dataSize;
+          if (!getSpanList().isEmpty()) {
+            size += 1;
+            size += com.google.protobuf.CodedOutputStream
+                .computeInt32SizeNoTag(dataSize);
+          }
+          spanMemoizedSerializedSize = dataSize;
+        }
+        size += getUnknownFields().getSerializedSize();
+        memoizedSerializedSize = size;
+        return size;
+      }
+      
+      private static final long serialVersionUID = 0L;
+      @java.lang.Override
+      protected java.lang.Object writeReplace()
+          throws java.io.ObjectStreamException {
+        return super.writeReplace();
+      }
+      
+      public static com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location parseFrom(
+          com.google.protobuf.ByteString data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location parseFrom(
+          com.google.protobuf.ByteString data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location parseFrom(byte[] data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location parseFrom(
+          byte[] data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location parseFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location parseFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location parseDelimitedFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        Builder builder = newBuilder();
+        if (builder.mergeDelimitedFrom(input)) {
+          return builder.buildParsed();
+        } else {
+          return null;
+        }
+      }
+      public static com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location parseDelimitedFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        Builder builder = newBuilder();
+        if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+          return builder.buildParsed();
+        } else {
+          return null;
+        }
+      }
+      public static com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location parseFrom(
+          com.google.protobuf.CodedInputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location parseFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      
+      public static Builder newBuilder() { return Builder.create(); }
+      public Builder newBuilderForType() { return newBuilder(); }
+      public static Builder newBuilder(com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location prototype) {
+        return newBuilder().mergeFrom(prototype);
+      }
+      public Builder toBuilder() { return newBuilder(this); }
+      
+      @java.lang.Override
+      protected Builder newBuilderForType(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        Builder builder = new Builder(parent);
+        return builder;
+      }
+      public static final class Builder extends
+          com.google.protobuf.GeneratedMessage.Builder<Builder>
+         implements com.google.protobuf.DescriptorProtos.SourceCodeInfo.LocationOrBuilder {
+        public static final com.google.protobuf.Descriptors.Descriptor
+            getDescriptor() {
+          return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_SourceCodeInfo_Location_descriptor;
+        }
+        
+        protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+            internalGetFieldAccessorTable() {
+          return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_SourceCodeInfo_Location_fieldAccessorTable;
+        }
+        
+        // Construct using com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location.newBuilder()
+        private Builder() {
+          maybeForceBuilderInitialization();
+        }
+        
+        private Builder(BuilderParent parent) {
+          super(parent);
+          maybeForceBuilderInitialization();
+        }
+        private void maybeForceBuilderInitialization() {
+          if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          }
+        }
+        private static Builder create() {
+          return new Builder();
+        }
+        
+        public Builder clear() {
+          super.clear();
+          path_ = java.util.Collections.emptyList();;
+          bitField0_ = (bitField0_ & ~0x00000001);
+          span_ = java.util.Collections.emptyList();;
+          bitField0_ = (bitField0_ & ~0x00000002);
+          return this;
+        }
+        
+        public Builder clone() {
+          return create().mergeFrom(buildPartial());
+        }
+        
+        public com.google.protobuf.Descriptors.Descriptor
+            getDescriptorForType() {
+          return com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location.getDescriptor();
+        }
+        
+        public com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location getDefaultInstanceForType() {
+          return com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location.getDefaultInstance();
+        }
+        
+        public com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location build() {
+          com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(result);
+          }
+          return result;
+        }
+        
+        private com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location buildParsed()
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(
+              result).asInvalidProtocolBufferException();
+          }
+          return result;
+        }
+        
+        public com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location buildPartial() {
+          com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location result = new com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location(this);
+          int from_bitField0_ = bitField0_;
+          if (((bitField0_ & 0x00000001) == 0x00000001)) {
+            path_ = java.util.Collections.unmodifiableList(path_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.path_ = path_;
+          if (((bitField0_ & 0x00000002) == 0x00000002)) {
+            span_ = java.util.Collections.unmodifiableList(span_);
+            bitField0_ = (bitField0_ & ~0x00000002);
+          }
+          result.span_ = span_;
+          onBuilt();
+          return result;
+        }
+        
+        public Builder mergeFrom(com.google.protobuf.Message other) {
+          if (other instanceof com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location) {
+            return mergeFrom((com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location)other);
+          } else {
+            super.mergeFrom(other);
+            return this;
+          }
+        }
+        
+        public Builder mergeFrom(com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location other) {
+          if (other == com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location.getDefaultInstance()) return this;
+          if (!other.path_.isEmpty()) {
+            if (path_.isEmpty()) {
+              path_ = other.path_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensurePathIsMutable();
+              path_.addAll(other.path_);
+            }
+            onChanged();
+          }
+          if (!other.span_.isEmpty()) {
+            if (span_.isEmpty()) {
+              span_ = other.span_;
+              bitField0_ = (bitField0_ & ~0x00000002);
+            } else {
+              ensureSpanIsMutable();
+              span_.addAll(other.span_);
+            }
+            onChanged();
+          }
+          this.mergeUnknownFields(other.getUnknownFields());
+          return this;
+        }
+        
+        public final boolean isInitialized() {
+          return true;
+        }
+        
+        public Builder mergeFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+            com.google.protobuf.UnknownFieldSet.newBuilder(
+              this.getUnknownFields());
+          while (true) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              default: {
+                if (!parseUnknownField(input, unknownFields,
+                                       extensionRegistry, tag)) {
+                  this.setUnknownFields(unknownFields.build());
+                  onChanged();
+                  return this;
+                }
+                break;
+              }
+              case 8: {
+                ensurePathIsMutable();
+                path_.add(input.readInt32());
+                break;
+              }
+              case 10: {
+                int length = input.readRawVarint32();
+                int limit = input.pushLimit(length);
+                while (input.getBytesUntilLimit() > 0) {
+                  addPath(input.readInt32());
+                }
+                input.popLimit(limit);
+                break;
+              }
+              case 16: {
+                ensureSpanIsMutable();
+                span_.add(input.readInt32());
+                break;
+              }
+              case 18: {
+                int length = input.readRawVarint32();
+                int limit = input.pushLimit(length);
+                while (input.getBytesUntilLimit() > 0) {
+                  addSpan(input.readInt32());
+                }
+                input.popLimit(limit);
+                break;
+              }
+            }
+          }
+        }
+        
+        private int bitField0_;
+        
+        // repeated int32 path = 1 [packed = true];
+        private java.util.List<java.lang.Integer> path_ = java.util.Collections.emptyList();;
+        private void ensurePathIsMutable() {
+          if (!((bitField0_ & 0x00000001) == 0x00000001)) {
+            path_ = new java.util.ArrayList<java.lang.Integer>(path_);
+            bitField0_ |= 0x00000001;
+           }
+        }
+        public java.util.List<java.lang.Integer>
+            getPathList() {
+          return java.util.Collections.unmodifiableList(path_);
+        }
+        public int getPathCount() {
+          return path_.size();
+        }
+        public int getPath(int index) {
+          return path_.get(index);
+        }
+        public Builder setPath(
+            int index, int value) {
+          ensurePathIsMutable();
+          path_.set(index, value);
+          onChanged();
+          return this;
+        }
+        public Builder addPath(int value) {
+          ensurePathIsMutable();
+          path_.add(value);
+          onChanged();
+          return this;
+        }
+        public Builder addAllPath(
+            java.lang.Iterable<? extends java.lang.Integer> values) {
+          ensurePathIsMutable();
+          super.addAll(values, path_);
+          onChanged();
+          return this;
+        }
+        public Builder clearPath() {
+          path_ = java.util.Collections.emptyList();;
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
+          return this;
+        }
+        
+        // repeated int32 span = 2 [packed = true];
+        private java.util.List<java.lang.Integer> span_ = java.util.Collections.emptyList();;
+        private void ensureSpanIsMutable() {
+          if (!((bitField0_ & 0x00000002) == 0x00000002)) {
+            span_ = new java.util.ArrayList<java.lang.Integer>(span_);
+            bitField0_ |= 0x00000002;
+           }
+        }
+        public java.util.List<java.lang.Integer>
+            getSpanList() {
+          return java.util.Collections.unmodifiableList(span_);
+        }
+        public int getSpanCount() {
+          return span_.size();
+        }
+        public int getSpan(int index) {
+          return span_.get(index);
+        }
+        public Builder setSpan(
+            int index, int value) {
+          ensureSpanIsMutable();
+          span_.set(index, value);
+          onChanged();
+          return this;
+        }
+        public Builder addSpan(int value) {
+          ensureSpanIsMutable();
+          span_.add(value);
+          onChanged();
+          return this;
+        }
+        public Builder addAllSpan(
+            java.lang.Iterable<? extends java.lang.Integer> values) {
+          ensureSpanIsMutable();
+          super.addAll(values, span_);
+          onChanged();
+          return this;
+        }
+        public Builder clearSpan() {
+          span_ = java.util.Collections.emptyList();;
+          bitField0_ = (bitField0_ & ~0x00000002);
+          onChanged();
+          return this;
+        }
+        
+        // @@protoc_insertion_point(builder_scope:google.protobuf.SourceCodeInfo.Location)
+      }
+      
+      static {
+        defaultInstance = new Location(true);
+        defaultInstance.initFields();
+      }
+      
+      // @@protoc_insertion_point(class_scope:google.protobuf.SourceCodeInfo.Location)
+    }
+    
+    // repeated .google.protobuf.SourceCodeInfo.Location location = 1;
+    public static final int LOCATION_FIELD_NUMBER = 1;
+    private java.util.List<com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location> location_;
+    public java.util.List<com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location> getLocationList() {
+      return location_;
+    }
+    public java.util.List<? extends com.google.protobuf.DescriptorProtos.SourceCodeInfo.LocationOrBuilder> 
+        getLocationOrBuilderList() {
+      return location_;
+    }
+    public int getLocationCount() {
+      return location_.size();
+    }
+    public com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location getLocation(int index) {
+      return location_.get(index);
+    }
+    public com.google.protobuf.DescriptorProtos.SourceCodeInfo.LocationOrBuilder getLocationOrBuilder(
+        int index) {
+      return location_.get(index);
+    }
+    
+    private void initFields() {
+      location_ = java.util.Collections.emptyList();
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+      
+      memoizedIsInitialized = 1;
+      return true;
+    }
+    
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      for (int i = 0; i < location_.size(); i++) {
+        output.writeMessage(1, location_.get(i));
+      }
+      getUnknownFields().writeTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+    
+      size = 0;
+      for (int i = 0; i < location_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, location_.get(i));
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+    
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+    
+    public static com.google.protobuf.DescriptorProtos.SourceCodeInfo parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.SourceCodeInfo parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.SourceCodeInfo parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.SourceCodeInfo parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.SourceCodeInfo parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.SourceCodeInfo parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.SourceCodeInfo parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.SourceCodeInfo parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.google.protobuf.DescriptorProtos.SourceCodeInfo parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.google.protobuf.DescriptorProtos.SourceCodeInfo parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(com.google.protobuf.DescriptorProtos.SourceCodeInfo prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+    
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements com.google.protobuf.DescriptorProtos.SourceCodeInfoOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_SourceCodeInfo_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.google.protobuf.DescriptorProtos.internal_static_google_protobuf_SourceCodeInfo_fieldAccessorTable;
+      }
+      
+      // Construct using com.google.protobuf.DescriptorProtos.SourceCodeInfo.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+      
+      private Builder(BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          getLocationFieldBuilder();
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+      
+      public Builder clear() {
+        super.clear();
+        if (locationBuilder_ == null) {
+          location_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+        } else {
+          locationBuilder_.clear();
+        }
+        return this;
+      }
+      
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+      
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return com.google.protobuf.DescriptorProtos.SourceCodeInfo.getDescriptor();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.SourceCodeInfo getDefaultInstanceForType() {
+        return com.google.protobuf.DescriptorProtos.SourceCodeInfo.getDefaultInstance();
+      }
+      
+      public com.google.protobuf.DescriptorProtos.SourceCodeInfo build() {
+        com.google.protobuf.DescriptorProtos.SourceCodeInfo result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+      
+      private com.google.protobuf.DescriptorProtos.SourceCodeInfo buildParsed()
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        com.google.protobuf.DescriptorProtos.SourceCodeInfo result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(
+            result).asInvalidProtocolBufferException();
+        }
+        return result;
+      }
+      
+      public com.google.protobuf.DescriptorProtos.SourceCodeInfo buildPartial() {
+        com.google.protobuf.DescriptorProtos.SourceCodeInfo result = new com.google.protobuf.DescriptorProtos.SourceCodeInfo(this);
+        int from_bitField0_ = bitField0_;
+        if (locationBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) == 0x00000001)) {
+            location_ = java.util.Collections.unmodifiableList(location_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.location_ = location_;
+        } else {
+          result.location_ = locationBuilder_.build();
+        }
+        onBuilt();
+        return result;
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof com.google.protobuf.DescriptorProtos.SourceCodeInfo) {
+          return mergeFrom((com.google.protobuf.DescriptorProtos.SourceCodeInfo)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.DescriptorProtos.SourceCodeInfo other) {
+        if (other == com.google.protobuf.DescriptorProtos.SourceCodeInfo.getDefaultInstance()) return this;
+        if (locationBuilder_ == null) {
+          if (!other.location_.isEmpty()) {
+            if (location_.isEmpty()) {
+              location_ = other.location_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureLocationIsMutable();
+              location_.addAll(other.location_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.location_.isEmpty()) {
+            if (locationBuilder_.isEmpty()) {
+              locationBuilder_.dispose();
+              locationBuilder_ = null;
+              location_ = other.location_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              locationBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getLocationFieldBuilder() : null;
+            } else {
+              locationBuilder_.addAllMessages(other.location_);
+            }
+          }
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+      
+      public final boolean isInitialized() {
+        return true;
+      }
+      
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder(
+            this.getUnknownFields());
+        while (true) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              this.setUnknownFields(unknownFields.build());
+              onChanged();
+              return this;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              }
+              break;
+            }
+            case 10: {
+              com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location.Builder subBuilder = com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addLocation(subBuilder.buildPartial());
+              break;
+            }
+          }
+        }
+      }
+      
+      private int bitField0_;
+      
+      // repeated .google.protobuf.SourceCodeInfo.Location location = 1;
+      private java.util.List<com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location> location_ =
+        java.util.Collections.emptyList();
+      private void ensureLocationIsMutable() {
+        if (!((bitField0_ & 0x00000001) == 0x00000001)) {
+          location_ = new java.util.ArrayList<com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location>(location_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location, com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location.Builder, com.google.protobuf.DescriptorProtos.SourceCodeInfo.LocationOrBuilder> locationBuilder_;
+      
+      public java.util.List<com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location> getLocationList() {
+        if (locationBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(location_);
+        } else {
+          return locationBuilder_.getMessageList();
+        }
+      }
+      public int getLocationCount() {
+        if (locationBuilder_ == null) {
+          return location_.size();
+        } else {
+          return locationBuilder_.getCount();
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location getLocation(int index) {
+        if (locationBuilder_ == null) {
+          return location_.get(index);
+        } else {
+          return locationBuilder_.getMessage(index);
+        }
+      }
+      public Builder setLocation(
+          int index, com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location value) {
+        if (locationBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureLocationIsMutable();
+          location_.set(index, value);
+          onChanged();
+        } else {
+          locationBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setLocation(
+          int index, com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location.Builder builderForValue) {
+        if (locationBuilder_ == null) {
+          ensureLocationIsMutable();
+          location_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          locationBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addLocation(com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location value) {
+        if (locationBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureLocationIsMutable();
+          location_.add(value);
+          onChanged();
+        } else {
+          locationBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addLocation(
+          int index, com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location value) {
+        if (locationBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureLocationIsMutable();
+          location_.add(index, value);
+          onChanged();
+        } else {
+          locationBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addLocation(
+          com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location.Builder builderForValue) {
+        if (locationBuilder_ == null) {
+          ensureLocationIsMutable();
+          location_.add(builderForValue.build());
+          onChanged();
+        } else {
+          locationBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addLocation(
+          int index, com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location.Builder builderForValue) {
+        if (locationBuilder_ == null) {
+          ensureLocationIsMutable();
+          location_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          locationBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllLocation(
+          java.lang.Iterable<? extends com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location> values) {
+        if (locationBuilder_ == null) {
+          ensureLocationIsMutable();
+          super.addAll(values, location_);
+          onChanged();
+        } else {
+          locationBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearLocation() {
+        if (locationBuilder_ == null) {
+          location_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
+        } else {
+          locationBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeLocation(int index) {
+        if (locationBuilder_ == null) {
+          ensureLocationIsMutable();
+          location_.remove(index);
+          onChanged();
+        } else {
+          locationBuilder_.remove(index);
+        }
+        return this;
+      }
+      public com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location.Builder getLocationBuilder(
+          int index) {
+        return getLocationFieldBuilder().getBuilder(index);
+      }
+      public com.google.protobuf.DescriptorProtos.SourceCodeInfo.LocationOrBuilder getLocationOrBuilder(
+          int index) {
+        if (locationBuilder_ == null) {
+          return location_.get(index);  } else {
+          return locationBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends com.google.protobuf.DescriptorProtos.SourceCodeInfo.LocationOrBuilder> 
+           getLocationOrBuilderList() {
+        if (locationBuilder_ != null) {
+          return locationBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(location_);
+        }
+      }
+      public com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location.Builder addLocationBuilder() {
+        return getLocationFieldBuilder().addBuilder(
+            com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location.getDefaultInstance());
+      }
+      public com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location.Builder addLocationBuilder(
+          int index) {
+        return getLocationFieldBuilder().addBuilder(
+            index, com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location.getDefaultInstance());
+      }
+      public java.util.List<com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location.Builder> 
+           getLocationBuilderList() {
+        return getLocationFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location, com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location.Builder, com.google.protobuf.DescriptorProtos.SourceCodeInfo.LocationOrBuilder> 
+          getLocationFieldBuilder() {
+        if (locationBuilder_ == null) {
+          locationBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location, com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location.Builder, com.google.protobuf.DescriptorProtos.SourceCodeInfo.LocationOrBuilder>(
+                  location_,
+                  ((bitField0_ & 0x00000001) == 0x00000001),
+                  getParentForChildren(),
+                  isClean());
+          location_ = null;
+        }
+        return locationBuilder_;
+      }
+      
+      // @@protoc_insertion_point(builder_scope:google.protobuf.SourceCodeInfo)
+    }
+    
+    static {
+      defaultInstance = new SourceCodeInfo(true);
+      defaultInstance.initFields();
+    }
+    
+    // @@protoc_insertion_point(class_scope:google.protobuf.SourceCodeInfo)
+  }
+  
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_google_protobuf_FileDescriptorSet_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_google_protobuf_FileDescriptorSet_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_google_protobuf_FileDescriptorProto_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_google_protobuf_FileDescriptorProto_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_google_protobuf_DescriptorProto_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_google_protobuf_DescriptorProto_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_google_protobuf_DescriptorProto_ExtensionRange_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_google_protobuf_DescriptorProto_ExtensionRange_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_google_protobuf_FieldDescriptorProto_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_google_protobuf_FieldDescriptorProto_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_google_protobuf_EnumDescriptorProto_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_google_protobuf_EnumDescriptorProto_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_google_protobuf_EnumValueDescriptorProto_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_google_protobuf_EnumValueDescriptorProto_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_google_protobuf_ServiceDescriptorProto_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_google_protobuf_ServiceDescriptorProto_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_google_protobuf_MethodDescriptorProto_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_google_protobuf_MethodDescriptorProto_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_google_protobuf_FileOptions_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_google_protobuf_FileOptions_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_google_protobuf_MessageOptions_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_google_protobuf_MessageOptions_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_google_protobuf_FieldOptions_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_google_protobuf_FieldOptions_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_google_protobuf_EnumOptions_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_google_protobuf_EnumOptions_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_google_protobuf_EnumValueOptions_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_google_protobuf_EnumValueOptions_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_google_protobuf_ServiceOptions_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_google_protobuf_ServiceOptions_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_google_protobuf_MethodOptions_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_google_protobuf_MethodOptions_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_google_protobuf_UninterpretedOption_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_google_protobuf_UninterpretedOption_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_google_protobuf_UninterpretedOption_NamePart_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_google_protobuf_UninterpretedOption_NamePart_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_google_protobuf_SourceCodeInfo_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_google_protobuf_SourceCodeInfo_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_google_protobuf_SourceCodeInfo_Location_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_google_protobuf_SourceCodeInfo_Location_fieldAccessorTable;
+  
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n google/protobuf/descriptor.proto\022\017goog" +
+      "le.protobuf\"G\n\021FileDescriptorSet\0222\n\004file" +
+      "\030\001 \003(\0132$.google.protobuf.FileDescriptorP" +
+      "roto\"\227\003\n\023FileDescriptorProto\022\014\n\004name\030\001 \001" +
+      "(\t\022\017\n\007package\030\002 \001(\t\022\022\n\ndependency\030\003 \003(\t\022" +
+      "6\n\014message_type\030\004 \003(\0132 .google.protobuf." +
+      "DescriptorProto\0227\n\tenum_type\030\005 \003(\0132$.goo" +
+      "gle.protobuf.EnumDescriptorProto\0228\n\007serv" +
+      "ice\030\006 \003(\0132\'.google.protobuf.ServiceDescr" +
+      "iptorProto\0228\n\textension\030\007 \003(\0132%.google.p",
+      "rotobuf.FieldDescriptorProto\022-\n\007options\030" +
+      "\010 \001(\0132\034.google.protobuf.FileOptions\0229\n\020s" +
+      "ource_code_info\030\t \001(\0132\037.google.protobuf." +
+      "SourceCodeInfo\"\251\003\n\017DescriptorProto\022\014\n\004na" +
+      "me\030\001 \001(\t\0224\n\005field\030\002 \003(\0132%.google.protobu" +
+      "f.FieldDescriptorProto\0228\n\textension\030\006 \003(" +
+      "\0132%.google.protobuf.FieldDescriptorProto" +
+      "\0225\n\013nested_type\030\003 \003(\0132 .google.protobuf." +
+      "DescriptorProto\0227\n\tenum_type\030\004 \003(\0132$.goo" +
+      "gle.protobuf.EnumDescriptorProto\022H\n\017exte",
+      "nsion_range\030\005 \003(\0132/.google.protobuf.Desc" +
+      "riptorProto.ExtensionRange\0220\n\007options\030\007 " +
+      "\001(\0132\037.google.protobuf.MessageOptions\032,\n\016" +
+      "ExtensionRange\022\r\n\005start\030\001 \001(\005\022\013\n\003end\030\002 \001" +
+      "(\005\"\224\005\n\024FieldDescriptorProto\022\014\n\004name\030\001 \001(" +
+      "\t\022\016\n\006number\030\003 \001(\005\022:\n\005label\030\004 \001(\0162+.googl" +
+      "e.protobuf.FieldDescriptorProto.Label\0228\n" +
+      "\004type\030\005 \001(\0162*.google.protobuf.FieldDescr" +
+      "iptorProto.Type\022\021\n\ttype_name\030\006 \001(\t\022\020\n\010ex" +
+      "tendee\030\002 \001(\t\022\025\n\rdefault_value\030\007 \001(\t\022.\n\007o",
+      "ptions\030\010 \001(\0132\035.google.protobuf.FieldOpti" +
+      "ons\"\266\002\n\004Type\022\017\n\013TYPE_DOUBLE\020\001\022\016\n\nTYPE_FL" +
+      "OAT\020\002\022\016\n\nTYPE_INT64\020\003\022\017\n\013TYPE_UINT64\020\004\022\016" +
+      "\n\nTYPE_INT32\020\005\022\020\n\014TYPE_FIXED64\020\006\022\020\n\014TYPE" +
+      "_FIXED32\020\007\022\r\n\tTYPE_BOOL\020\010\022\017\n\013TYPE_STRING" +
+      "\020\t\022\016\n\nTYPE_GROUP\020\n\022\020\n\014TYPE_MESSAGE\020\013\022\016\n\n" +
+      "TYPE_BYTES\020\014\022\017\n\013TYPE_UINT32\020\r\022\r\n\tTYPE_EN" +
+      "UM\020\016\022\021\n\rTYPE_SFIXED32\020\017\022\021\n\rTYPE_SFIXED64" +
+      "\020\020\022\017\n\013TYPE_SINT32\020\021\022\017\n\013TYPE_SINT64\020\022\"C\n\005" +
+      "Label\022\022\n\016LABEL_OPTIONAL\020\001\022\022\n\016LABEL_REQUI",
+      "RED\020\002\022\022\n\016LABEL_REPEATED\020\003\"\214\001\n\023EnumDescri" +
+      "ptorProto\022\014\n\004name\030\001 \001(\t\0228\n\005value\030\002 \003(\0132)" +
+      ".google.protobuf.EnumValueDescriptorProt" +
+      "o\022-\n\007options\030\003 \001(\0132\034.google.protobuf.Enu" +
+      "mOptions\"l\n\030EnumValueDescriptorProto\022\014\n\004" +
+      "name\030\001 \001(\t\022\016\n\006number\030\002 \001(\005\0222\n\007options\030\003 " +
+      "\001(\0132!.google.protobuf.EnumValueOptions\"\220" +
+      "\001\n\026ServiceDescriptorProto\022\014\n\004name\030\001 \001(\t\022" +
+      "6\n\006method\030\002 \003(\0132&.google.protobuf.Method" +
+      "DescriptorProto\0220\n\007options\030\003 \001(\0132\037.googl",
+      "e.protobuf.ServiceOptions\"\177\n\025MethodDescr" +
+      "iptorProto\022\014\n\004name\030\001 \001(\t\022\022\n\ninput_type\030\002" +
+      " \001(\t\022\023\n\013output_type\030\003 \001(\t\022/\n\007options\030\004 \001" +
+      "(\0132\036.google.protobuf.MethodOptions\"\325\003\n\013F" +
+      "ileOptions\022\024\n\014java_package\030\001 \001(\t\022\034\n\024java" +
+      "_outer_classname\030\010 \001(\t\022\"\n\023java_multiple_" +
+      "files\030\n \001(\010:\005false\022,\n\035java_generate_equa" +
+      "ls_and_hash\030\024 \001(\010:\005false\022F\n\014optimize_for" +
+      "\030\t \001(\0162).google.protobuf.FileOptions.Opt" +
+      "imizeMode:\005SPEED\022\"\n\023cc_generic_services\030",
+      "\020 \001(\010:\005false\022$\n\025java_generic_services\030\021 " +
+      "\001(\010:\005false\022\"\n\023py_generic_services\030\022 \001(\010:" +
+      "\005false\022C\n\024uninterpreted_option\030\347\007 \003(\0132$." +
+      "google.protobuf.UninterpretedOption\":\n\014O" +
+      "ptimizeMode\022\t\n\005SPEED\020\001\022\r\n\tCODE_SIZE\020\002\022\020\n" +
+      "\014LITE_RUNTIME\020\003*\t\010\350\007\020\200\200\200\200\002\"\270\001\n\016MessageOp" +
+      "tions\022&\n\027message_set_wire_format\030\001 \001(\010:\005" +
+      "false\022.\n\037no_standard_descriptor_accessor" +
+      "\030\002 \001(\010:\005false\022C\n\024uninterpreted_option\030\347\007" +
+      " \003(\0132$.google.protobuf.UninterpretedOpti",
+      "on*\t\010\350\007\020\200\200\200\200\002\"\224\002\n\014FieldOptions\022:\n\005ctype\030" +
+      "\001 \001(\0162#.google.protobuf.FieldOptions.CTy" +
+      "pe:\006STRING\022\016\n\006packed\030\002 \001(\010\022\031\n\ndeprecated" +
+      "\030\003 \001(\010:\005false\022\034\n\024experimental_map_key\030\t " +
+      "\001(\t\022C\n\024uninterpreted_option\030\347\007 \003(\0132$.goo" +
+      "gle.protobuf.UninterpretedOption\"/\n\005CTyp" +
+      "e\022\n\n\006STRING\020\000\022\010\n\004CORD\020\001\022\020\n\014STRING_PIECE\020" +
+      "\002*\t\010\350\007\020\200\200\200\200\002\"]\n\013EnumOptions\022C\n\024uninterpr" +
+      "eted_option\030\347\007 \003(\0132$.google.protobuf.Uni" +
+      "nterpretedOption*\t\010\350\007\020\200\200\200\200\002\"b\n\020EnumValue",
+      "Options\022C\n\024uninterpreted_option\030\347\007 \003(\0132$" +
+      ".google.protobuf.UninterpretedOption*\t\010\350" +
+      "\007\020\200\200\200\200\002\"`\n\016ServiceOptions\022C\n\024uninterpret" +
+      "ed_option\030\347\007 \003(\0132$.google.protobuf.Unint" +
+      "erpretedOption*\t\010\350\007\020\200\200\200\200\002\"_\n\rMethodOptio" +
+      "ns\022C\n\024uninterpreted_option\030\347\007 \003(\0132$.goog" +
+      "le.protobuf.UninterpretedOption*\t\010\350\007\020\200\200\200" +
+      "\200\002\"\236\002\n\023UninterpretedOption\022;\n\004name\030\002 \003(\013" +
+      "2-.google.protobuf.UninterpretedOption.N" +
+      "amePart\022\030\n\020identifier_value\030\003 \001(\t\022\032\n\022pos",
+      "itive_int_value\030\004 \001(\004\022\032\n\022negative_int_va" +
+      "lue\030\005 \001(\003\022\024\n\014double_value\030\006 \001(\001\022\024\n\014strin" +
+      "g_value\030\007 \001(\014\022\027\n\017aggregate_value\030\010 \001(\t\0323" +
+      "\n\010NamePart\022\021\n\tname_part\030\001 \002(\t\022\024\n\014is_exte" +
+      "nsion\030\002 \002(\010\"|\n\016SourceCodeInfo\022:\n\010locatio" +
+      "n\030\001 \003(\0132(.google.protobuf.SourceCodeInfo" +
+      ".Location\032.\n\010Location\022\020\n\004path\030\001 \003(\005B\002\020\001\022" +
+      "\020\n\004span\030\002 \003(\005B\002\020\001B)\n\023com.google.protobuf" +
+      "B\020DescriptorProtosH\001"
+    };
+    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
+      new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
+        public com.google.protobuf.ExtensionRegistry assignDescriptors(
+            com.google.protobuf.Descriptors.FileDescriptor root) {
+          descriptor = root;
+          internal_static_google_protobuf_FileDescriptorSet_descriptor =
+            getDescriptor().getMessageTypes().get(0);
+          internal_static_google_protobuf_FileDescriptorSet_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_google_protobuf_FileDescriptorSet_descriptor,
+              new java.lang.String[] { "File", },
+              com.google.protobuf.DescriptorProtos.FileDescriptorSet.class,
+              com.google.protobuf.DescriptorProtos.FileDescriptorSet.Builder.class);
+          internal_static_google_protobuf_FileDescriptorProto_descriptor =
+            getDescriptor().getMessageTypes().get(1);
+          internal_static_google_protobuf_FileDescriptorProto_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_google_protobuf_FileDescriptorProto_descriptor,
+              new java.lang.String[] { "Name", "Package", "Dependency", "MessageType", "EnumType", "Service", "Extension", "Options", "SourceCodeInfo", },
+              com.google.protobuf.DescriptorProtos.FileDescriptorProto.class,
+              com.google.protobuf.DescriptorProtos.FileDescriptorProto.Builder.class);
+          internal_static_google_protobuf_DescriptorProto_descriptor =
+            getDescriptor().getMessageTypes().get(2);
+          internal_static_google_protobuf_DescriptorProto_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_google_protobuf_DescriptorProto_descriptor,
+              new java.lang.String[] { "Name", "Field", "Extension", "NestedType", "EnumType", "ExtensionRange", "Options", },
+              com.google.protobuf.DescriptorProtos.DescriptorProto.class,
+              com.google.protobuf.DescriptorProtos.DescriptorProto.Builder.class);
+          internal_static_google_protobuf_DescriptorProto_ExtensionRange_descriptor =
+            internal_static_google_protobuf_DescriptorProto_descriptor.getNestedTypes().get(0);
+          internal_static_google_protobuf_DescriptorProto_ExtensionRange_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_google_protobuf_DescriptorProto_ExtensionRange_descriptor,
+              new java.lang.String[] { "Start", "End", },
+              com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange.class,
+              com.google.protobuf.DescriptorProtos.DescriptorProto.ExtensionRange.Builder.class);
+          internal_static_google_protobuf_FieldDescriptorProto_descriptor =
+            getDescriptor().getMessageTypes().get(3);
+          internal_static_google_protobuf_FieldDescriptorProto_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_google_protobuf_FieldDescriptorProto_descriptor,
+              new java.lang.String[] { "Name", "Number", "Label", "Type", "TypeName", "Extendee", "DefaultValue", "Options", },
+              com.google.protobuf.DescriptorProtos.FieldDescriptorProto.class,
+              com.google.protobuf.DescriptorProtos.FieldDescriptorProto.Builder.class);
+          internal_static_google_protobuf_EnumDescriptorProto_descriptor =
+            getDescriptor().getMessageTypes().get(4);
+          internal_static_google_protobuf_EnumDescriptorProto_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_google_protobuf_EnumDescriptorProto_descriptor,
+              new java.lang.String[] { "Name", "Value", "Options", },
+              com.google.protobuf.DescriptorProtos.EnumDescriptorProto.class,
+              com.google.protobuf.DescriptorProtos.EnumDescriptorProto.Builder.class);
+          internal_static_google_protobuf_EnumValueDescriptorProto_descriptor =
+            getDescriptor().getMessageTypes().get(5);
+          internal_static_google_protobuf_EnumValueDescriptorProto_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_google_protobuf_EnumValueDescriptorProto_descriptor,
+              new java.lang.String[] { "Name", "Number", "Options", },
+              com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto.class,
+              com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto.Builder.class);
+          internal_static_google_protobuf_ServiceDescriptorProto_descriptor =
+            getDescriptor().getMessageTypes().get(6);
+          internal_static_google_protobuf_ServiceDescriptorProto_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_google_protobuf_ServiceDescriptorProto_descriptor,
+              new java.lang.String[] { "Name", "Method", "Options", },
+              com.google.protobuf.DescriptorProtos.ServiceDescriptorProto.class,
+              com.google.protobuf.DescriptorProtos.ServiceDescriptorProto.Builder.class);
+          internal_static_google_protobuf_MethodDescriptorProto_descriptor =
+            getDescriptor().getMessageTypes().get(7);
+          internal_static_google_protobuf_MethodDescriptorProto_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_google_protobuf_MethodDescriptorProto_descriptor,
+              new java.lang.String[] { "Name", "InputType", "OutputType", "Options", },
+              com.google.protobuf.DescriptorProtos.MethodDescriptorProto.class,
+              com.google.protobuf.DescriptorProtos.MethodDescriptorProto.Builder.class);
+          internal_static_google_protobuf_FileOptions_descriptor =
+            getDescriptor().getMessageTypes().get(8);
+          internal_static_google_protobuf_FileOptions_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_google_protobuf_FileOptions_descriptor,
+              new java.lang.String[] { "JavaPackage", "JavaOuterClassname", "JavaMultipleFiles", "JavaGenerateEqualsAndHash", "OptimizeFor", "CcGenericServices", "JavaGenericServices", "PyGenericServices", "UninterpretedOption", },
+              com.google.protobuf.DescriptorProtos.FileOptions.class,
+              com.google.protobuf.DescriptorProtos.FileOptions.Builder.class);
+          internal_static_google_protobuf_MessageOptions_descriptor =
+            getDescriptor().getMessageTypes().get(9);
+          internal_static_google_protobuf_MessageOptions_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_google_protobuf_MessageOptions_descriptor,
+              new java.lang.String[] { "MessageSetWireFormat", "NoStandardDescriptorAccessor", "UninterpretedOption", },
+              com.google.protobuf.DescriptorProtos.MessageOptions.class,
+              com.google.protobuf.DescriptorProtos.MessageOptions.Builder.class);
+          internal_static_google_protobuf_FieldOptions_descriptor =
+            getDescriptor().getMessageTypes().get(10);
+          internal_static_google_protobuf_FieldOptions_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_google_protobuf_FieldOptions_descriptor,
+              new java.lang.String[] { "Ctype", "Packed", "Deprecated", "ExperimentalMapKey", "UninterpretedOption", },
+              com.google.protobuf.DescriptorProtos.FieldOptions.class,
+              com.google.protobuf.DescriptorProtos.FieldOptions.Builder.class);
+          internal_static_google_protobuf_EnumOptions_descriptor =
+            getDescriptor().getMessageTypes().get(11);
+          internal_static_google_protobuf_EnumOptions_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_google_protobuf_EnumOptions_descriptor,
+              new java.lang.String[] { "UninterpretedOption", },
+              com.google.protobuf.DescriptorProtos.EnumOptions.class,
+              com.google.protobuf.DescriptorProtos.EnumOptions.Builder.class);
+          internal_static_google_protobuf_EnumValueOptions_descriptor =
+            getDescriptor().getMessageTypes().get(12);
+          internal_static_google_protobuf_EnumValueOptions_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_google_protobuf_EnumValueOptions_descriptor,
+              new java.lang.String[] { "UninterpretedOption", },
+              com.google.protobuf.DescriptorProtos.EnumValueOptions.class,
+              com.google.protobuf.DescriptorProtos.EnumValueOptions.Builder.class);
+          internal_static_google_protobuf_ServiceOptions_descriptor =
+            getDescriptor().getMessageTypes().get(13);
+          internal_static_google_protobuf_ServiceOptions_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_google_protobuf_ServiceOptions_descriptor,
+              new java.lang.String[] { "UninterpretedOption", },
+              com.google.protobuf.DescriptorProtos.ServiceOptions.class,
+              com.google.protobuf.DescriptorProtos.ServiceOptions.Builder.class);
+          internal_static_google_protobuf_MethodOptions_descriptor =
+            getDescriptor().getMessageTypes().get(14);
+          internal_static_google_protobuf_MethodOptions_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_google_protobuf_MethodOptions_descriptor,
+              new java.lang.String[] { "UninterpretedOption", },
+              com.google.protobuf.DescriptorProtos.MethodOptions.class,
+              com.google.protobuf.DescriptorProtos.MethodOptions.Builder.class);
+          internal_static_google_protobuf_UninterpretedOption_descriptor =
+            getDescriptor().getMessageTypes().get(15);
+          internal_static_google_protobuf_UninterpretedOption_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_google_protobuf_UninterpretedOption_descriptor,
+              new java.lang.String[] { "Name", "IdentifierValue", "PositiveIntValue", "NegativeIntValue", "DoubleValue", "StringValue", "AggregateValue", },
+              com.google.protobuf.DescriptorProtos.UninterpretedOption.class,
+              com.google.protobuf.DescriptorProtos.UninterpretedOption.Builder.class);
+          internal_static_google_protobuf_UninterpretedOption_NamePart_descriptor =
+            internal_static_google_protobuf_UninterpretedOption_descriptor.getNestedTypes().get(0);
+          internal_static_google_protobuf_UninterpretedOption_NamePart_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_google_protobuf_UninterpretedOption_NamePart_descriptor,
+              new java.lang.String[] { "NamePart", "IsExtension", },
+              com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart.class,
+              com.google.protobuf.DescriptorProtos.UninterpretedOption.NamePart.Builder.class);
+          internal_static_google_protobuf_SourceCodeInfo_descriptor =
+            getDescriptor().getMessageTypes().get(16);
+          internal_static_google_protobuf_SourceCodeInfo_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_google_protobuf_SourceCodeInfo_descriptor,
+              new java.lang.String[] { "Location", },
+              com.google.protobuf.DescriptorProtos.SourceCodeInfo.class,
+              com.google.protobuf.DescriptorProtos.SourceCodeInfo.Builder.class);
+          internal_static_google_protobuf_SourceCodeInfo_Location_descriptor =
+            internal_static_google_protobuf_SourceCodeInfo_descriptor.getNestedTypes().get(0);
+          internal_static_google_protobuf_SourceCodeInfo_Location_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_google_protobuf_SourceCodeInfo_Location_descriptor,
+              new java.lang.String[] { "Path", "Span", },
+              com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location.class,
+              com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location.Builder.class);
+          return null;
+        }
+      };
+    com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+        }, assigner);
+  }
+  
+  // @@protoc_insertion_point(outer_class_scope)
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/Descriptors.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/Descriptors.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/Descriptors.java	(revision 15014)
@@ -0,0 +1,1887 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.DescriptorProtos.*;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.io.UnsupportedEncodingException;
+
+/**
+ * Contains a collection of classes which describe protocol message types.
+ *
+ * Every message type has a {@link Descriptor}, which lists all
+ * its fields and other information about a type.  You can get a message
+ * type's descriptor by calling {@code MessageType.getDescriptor()}, or
+ * (given a message object of the type) {@code message.getDescriptorForType()}.
+ * Furthermore, each message is associated with a {@link FileDescriptor} for
+ * a relevant {@code .proto} file. You can obtain it by calling
+ * {@code Descriptor.getFile()}. A {@link FileDescriptor} contains descriptors
+ * for all the messages defined in that file, and file descriptors for all the
+ * imported {@code .proto} files.
+ *
+ * Descriptors are built from DescriptorProtos, as defined in
+ * {@code google/protobuf/descriptor.proto}.
+ *
+ * @author kenton@google.com Kenton Varda
+ */
+public final class Descriptors {
+  /**
+   * Describes a {@code .proto} file, including everything defined within.
+   * That includes, in particular, descriptors for all the messages and
+   * file descriptors for all other imported {@code .proto} files
+   * (dependencies).
+   */
+  public static final class FileDescriptor {
+    /** Convert the descriptor to its protocol message representation. */
+    public FileDescriptorProto toProto() { return proto; }
+
+    /** Get the file name. */
+    public String getName() { return proto.getName(); }
+
+    /**
+     * Get the proto package name.  This is the package name given by the
+     * {@code package} statement in the {@code .proto} file, which differs
+     * from the Java package.
+     */
+    public String getPackage() { return proto.getPackage(); }
+
+    /** Get the {@code FileOptions}, defined in {@code descriptor.proto}. */
+    public FileOptions getOptions() { return proto.getOptions(); }
+
+    /** Get a list of top-level message types declared in this file. */
+    public List<Descriptor> getMessageTypes() {
+      return Collections.unmodifiableList(Arrays.asList(messageTypes));
+    }
+
+    /** Get a list of top-level enum types declared in this file. */
+    public List<EnumDescriptor> getEnumTypes() {
+      return Collections.unmodifiableList(Arrays.asList(enumTypes));
+    }
+
+    /** Get a list of top-level services declared in this file. */
+    public List<ServiceDescriptor> getServices() {
+      return Collections.unmodifiableList(Arrays.asList(services));
+    }
+
+    /** Get a list of top-level extensions declared in this file. */
+    public List<FieldDescriptor> getExtensions() {
+      return Collections.unmodifiableList(Arrays.asList(extensions));
+    }
+
+    /** Get a list of this file's dependencies (imports). */
+    public List<FileDescriptor> getDependencies() {
+      return Collections.unmodifiableList(Arrays.asList(dependencies));
+    }
+
+    /**
+     * Find a message type in the file by name.  Does not find nested types.
+     *
+     * @param name The unqualified type name to look for.
+     * @return The message type's descriptor, or {@code null} if not found.
+     */
+    public Descriptor findMessageTypeByName(String name) {
+      // Don't allow looking up nested types.  This will make optimization
+      // easier later.
+      if (name.indexOf('.') != -1) {
+        return null;
+      }
+      if (getPackage().length() > 0) {
+        name = getPackage() + '.' + name;
+      }
+      final GenericDescriptor result = pool.findSymbol(name);
+      if (result != null && result instanceof Descriptor &&
+          result.getFile() == this) {
+        return (Descriptor)result;
+      } else {
+        return null;
+      }
+    }
+
+    /**
+     * Find an enum type in the file by name.  Does not find nested types.
+     *
+     * @param name The unqualified type name to look for.
+     * @return The enum type's descriptor, or {@code null} if not found.
+     */
+    public EnumDescriptor findEnumTypeByName(String name) {
+      // Don't allow looking up nested types.  This will make optimization
+      // easier later.
+      if (name.indexOf('.') != -1) {
+        return null;
+      }
+      if (getPackage().length() > 0) {
+        name = getPackage() + '.' + name;
+      }
+      final GenericDescriptor result = pool.findSymbol(name);
+      if (result != null && result instanceof EnumDescriptor &&
+          result.getFile() == this) {
+        return (EnumDescriptor)result;
+      } else {
+        return null;
+      }
+    }
+
+    /**
+     * Find a service type in the file by name.
+     *
+     * @param name The unqualified type name to look for.
+     * @return The service type's descriptor, or {@code null} if not found.
+     */
+    public ServiceDescriptor findServiceByName(String name) {
+      // Don't allow looking up nested types.  This will make optimization
+      // easier later.
+      if (name.indexOf('.') != -1) {
+        return null;
+      }
+      if (getPackage().length() > 0) {
+        name = getPackage() + '.' + name;
+      }
+      final GenericDescriptor result = pool.findSymbol(name);
+      if (result != null && result instanceof ServiceDescriptor &&
+          result.getFile() == this) {
+        return (ServiceDescriptor)result;
+      } else {
+        return null;
+      }
+    }
+
+    /**
+     * Find an extension in the file by name.  Does not find extensions nested
+     * inside message types.
+     *
+     * @param name The unqualified extension name to look for.
+     * @return The extension's descriptor, or {@code null} if not found.
+     */
+    public FieldDescriptor findExtensionByName(String name) {
+      if (name.indexOf('.') != -1) {
+        return null;
+      }
+      if (getPackage().length() > 0) {
+        name = getPackage() + '.' + name;
+      }
+      final GenericDescriptor result = pool.findSymbol(name);
+      if (result != null && result instanceof FieldDescriptor &&
+          result.getFile() == this) {
+        return (FieldDescriptor)result;
+      } else {
+        return null;
+      }
+    }
+
+    /**
+     * Construct a {@code FileDescriptor}.
+     *
+     * @param proto The protocol message form of the FileDescriptor.
+     * @param dependencies {@code FileDescriptor}s corresponding to all of
+     *                     the file's dependencies, in the exact order listed
+     *                     in {@code proto}.
+     * @throws DescriptorValidationException {@code proto} is not a valid
+     *           descriptor.  This can occur for a number of reasons, e.g.
+     *           because a field has an undefined type or because two messages
+     *           were defined with the same name.
+     */
+    public static FileDescriptor buildFrom(final FileDescriptorProto proto,
+                                           final FileDescriptor[] dependencies)
+                                    throws DescriptorValidationException {
+      // Building decsriptors involves two steps:  translating and linking.
+      // In the translation step (implemented by FileDescriptor's
+      // constructor), we build an object tree mirroring the
+      // FileDescriptorProto's tree and put all of the descriptors into the
+      // DescriptorPool's lookup tables.  In the linking step, we look up all
+      // type references in the DescriptorPool, so that, for example, a
+      // FieldDescriptor for an embedded message contains a pointer directly
+      // to the Descriptor for that message's type.  We also detect undefined
+      // types in the linking step.
+      final DescriptorPool pool = new DescriptorPool(dependencies);
+      final FileDescriptor result =
+          new FileDescriptor(proto, dependencies, pool);
+
+      if (dependencies.length != proto.getDependencyCount()) {
+        throw new DescriptorValidationException(result,
+          "Dependencies passed to FileDescriptor.buildFrom() don't match " +
+          "those listed in the FileDescriptorProto.");
+      }
+      for (int i = 0; i < proto.getDependencyCount(); i++) {
+        if (!dependencies[i].getName().equals(proto.getDependency(i))) {
+          throw new DescriptorValidationException(result,
+            "Dependencies passed to FileDescriptor.buildFrom() don't match " +
+            "those listed in the FileDescriptorProto.");
+        }
+      }
+
+      result.crossLink();
+      return result;
+    }
+
+    /**
+     * This method is to be called by generated code only.  It is equivalent
+     * to {@code buildFrom} except that the {@code FileDescriptorProto} is
+     * encoded in protocol buffer wire format.
+     */
+    public static void internalBuildGeneratedFileFrom(
+        final String[] descriptorDataParts,
+        final FileDescriptor[] dependencies,
+        final InternalDescriptorAssigner descriptorAssigner) {
+      // Hack:  We can't embed a raw byte array inside generated Java code
+      //   (at least, not efficiently), but we can embed Strings.  So, the
+      //   protocol compiler embeds the FileDescriptorProto as a giant
+      //   string literal which is passed to this function to construct the
+      //   file's FileDescriptor.  The string literal contains only 8-bit
+      //   characters, each one representing a byte of the FileDescriptorProto's
+      //   serialized form.  So, if we convert it to bytes in ISO-8859-1, we
+      //   should get the original bytes that we want.
+
+      // descriptorData may contain multiple strings in order to get around the
+      // Java 64k string literal limit.
+      StringBuilder descriptorData = new StringBuilder();
+      for (String part : descriptorDataParts) {
+        descriptorData.append(part);
+      }
+
+      final byte[] descriptorBytes;
+      try {
+        descriptorBytes = descriptorData.toString().getBytes("ISO-8859-1");
+      } catch (UnsupportedEncodingException e) {
+        throw new RuntimeException(
+          "Standard encoding ISO-8859-1 not supported by JVM.", e);
+      }
+
+      FileDescriptorProto proto;
+      try {
+        proto = FileDescriptorProto.parseFrom(descriptorBytes);
+      } catch (InvalidProtocolBufferException e) {
+        throw new IllegalArgumentException(
+          "Failed to parse protocol buffer descriptor for generated code.", e);
+      }
+
+      final FileDescriptor result;
+      try {
+        result = buildFrom(proto, dependencies);
+      } catch (DescriptorValidationException e) {
+        throw new IllegalArgumentException(
+          "Invalid embedded descriptor for \"" + proto.getName() + "\".", e);
+      }
+
+      final ExtensionRegistry registry =
+          descriptorAssigner.assignDescriptors(result);
+
+      if (registry != null) {
+        // We must re-parse the proto using the registry.
+        try {
+          proto = FileDescriptorProto.parseFrom(descriptorBytes, registry);
+        } catch (InvalidProtocolBufferException e) {
+          throw new IllegalArgumentException(
+            "Failed to parse protocol buffer descriptor for generated code.",
+            e);
+        }
+
+        result.setProto(proto);
+      }
+    }
+
+    /**
+     * This class should be used by generated code only.  When calling
+     * {@link FileDescriptor#internalBuildGeneratedFileFrom}, the caller
+     * provides a callback implementing this interface.  The callback is called
+     * after the FileDescriptor has been constructed, in order to assign all
+     * the global variales defined in the generated code which point at parts
+     * of the FileDescriptor.  The callback returns an ExtensionRegistry which
+     * contains any extensions which might be used in the descriptor -- that
+     * is, extensions of the various "Options" messages defined in
+     * descriptor.proto.  The callback may also return null to indicate that
+     * no extensions are used in the decsriptor.
+     */
+    public interface InternalDescriptorAssigner {
+      ExtensionRegistry assignDescriptors(FileDescriptor root);
+    }
+
+    private FileDescriptorProto proto;
+    private final Descriptor[] messageTypes;
+    private final EnumDescriptor[] enumTypes;
+    private final ServiceDescriptor[] services;
+    private final FieldDescriptor[] extensions;
+    private final FileDescriptor[] dependencies;
+    private final DescriptorPool pool;
+
+    private FileDescriptor(final FileDescriptorProto proto,
+                           final FileDescriptor[] dependencies,
+                           final DescriptorPool pool)
+                    throws DescriptorValidationException {
+      this.pool = pool;
+      this.proto = proto;
+      this.dependencies = dependencies.clone();
+
+      pool.addPackage(getPackage(), this);
+
+      messageTypes = new Descriptor[proto.getMessageTypeCount()];
+      for (int i = 0; i < proto.getMessageTypeCount(); i++) {
+        messageTypes[i] =
+          new Descriptor(proto.getMessageType(i), this, null, i);
+      }
+
+      enumTypes = new EnumDescriptor[proto.getEnumTypeCount()];
+      for (int i = 0; i < proto.getEnumTypeCount(); i++) {
+        enumTypes[i] = new EnumDescriptor(proto.getEnumType(i), this, null, i);
+      }
+
+      services = new ServiceDescriptor[proto.getServiceCount()];
+      for (int i = 0; i < proto.getServiceCount(); i++) {
+        services[i] = new ServiceDescriptor(proto.getService(i), this, i);
+      }
+
+      extensions = new FieldDescriptor[proto.getExtensionCount()];
+      for (int i = 0; i < proto.getExtensionCount(); i++) {
+        extensions[i] = new FieldDescriptor(
+          proto.getExtension(i), this, null, i, true);
+      }
+    }
+
+    /** Look up and cross-link all field types, etc. */
+    private void crossLink() throws DescriptorValidationException {
+      for (final Descriptor messageType : messageTypes) {
+        messageType.crossLink();
+      }
+
+      for (final ServiceDescriptor service : services) {
+        service.crossLink();
+      }
+
+      for (final FieldDescriptor extension : extensions) {
+        extension.crossLink();
+      }
+    }
+
+    /**
+     * Replace our {@link FileDescriptorProto} with the given one, which is
+     * identical except that it might contain extensions that weren't present
+     * in the original.  This method is needed for bootstrapping when a file
+     * defines custom options.  The options may be defined in the file itself,
+     * so we can't actually parse them until we've constructed the descriptors,
+     * but to construct the decsriptors we have to have parsed the descriptor
+     * protos.  So, we have to parse the descriptor protos a second time after
+     * constructing the descriptors.
+     */
+    private void setProto(final FileDescriptorProto proto) {
+      this.proto = proto;
+
+      for (int i = 0; i < messageTypes.length; i++) {
+        messageTypes[i].setProto(proto.getMessageType(i));
+      }
+
+      for (int i = 0; i < enumTypes.length; i++) {
+        enumTypes[i].setProto(proto.getEnumType(i));
+      }
+
+      for (int i = 0; i < services.length; i++) {
+        services[i].setProto(proto.getService(i));
+      }
+
+      for (int i = 0; i < extensions.length; i++) {
+        extensions[i].setProto(proto.getExtension(i));
+      }
+    }
+  }
+
+  // =================================================================
+
+  /** Describes a message type. */
+  public static final class Descriptor implements GenericDescriptor {
+    /**
+     * Get the index of this descriptor within its parent.  In other words,
+     * given a {@link FileDescriptor} {@code file}, the following is true:
+     * <pre>
+     *   for all i in [0, file.getMessageTypeCount()):
+     *     file.getMessageType(i).getIndex() == i
+     * </pre>
+     * Similarly, for a {@link Descriptor} {@code messageType}:
+     * <pre>
+     *   for all i in [0, messageType.getNestedTypeCount()):
+     *     messageType.getNestedType(i).getIndex() == i
+     * </pre>
+     */
+    public int getIndex() { return index; }
+
+    /** Convert the descriptor to its protocol message representation. */
+    public DescriptorProto toProto() { return proto; }
+
+    /** Get the type's unqualified name. */
+    public String getName() { return proto.getName(); }
+
+    /**
+     * Get the type's fully-qualified name, within the proto language's
+     * namespace.  This differs from the Java name.  For example, given this
+     * {@code .proto}:
+     * <pre>
+     *   package foo.bar;
+     *   option java_package = "com.example.protos"
+     *   message Baz {}
+     * </pre>
+     * {@code Baz}'s full name is "foo.bar.Baz".
+     */
+    public String getFullName() { return fullName; }
+
+    /** Get the {@link FileDescriptor} containing this descriptor. */
+    public FileDescriptor getFile() { return file; }
+
+    /** If this is a nested type, get the outer descriptor, otherwise null. */
+    public Descriptor getContainingType() { return containingType; }
+
+    /** Get the {@code MessageOptions}, defined in {@code descriptor.proto}. */
+    public MessageOptions getOptions() { return proto.getOptions(); }
+
+    /** Get a list of this message type's fields. */
+    public List<FieldDescriptor> getFields() {
+      return Collections.unmodifiableList(Arrays.asList(fields));
+    }
+
+    /** Get a list of this message type's extensions. */
+    public List<FieldDescriptor> getExtensions() {
+      return Collections.unmodifiableList(Arrays.asList(extensions));
+    }
+
+    /** Get a list of message types nested within this one. */
+    public List<Descriptor> getNestedTypes() {
+      return Collections.unmodifiableList(Arrays.asList(nestedTypes));
+    }
+
+    /** Get a list of enum types nested within this one. */
+    public List<EnumDescriptor> getEnumTypes() {
+      return Collections.unmodifiableList(Arrays.asList(enumTypes));
+    }
+
+    /** Determines if the given field number is an extension. */
+    public boolean isExtensionNumber(final int number) {
+      for (final DescriptorProto.ExtensionRange range :
+          proto.getExtensionRangeList()) {
+        if (range.getStart() <= number && number < range.getEnd()) {
+          return true;
+        }
+      }
+      return false;
+    }
+
+    /**
+     * Finds a field by name.
+     * @param name The unqualified name of the field (e.g. "foo").
+     * @return The field's descriptor, or {@code null} if not found.
+     */
+    public FieldDescriptor findFieldByName(final String name) {
+      final GenericDescriptor result =
+          file.pool.findSymbol(fullName + '.' + name);
+      if (result != null && result instanceof FieldDescriptor) {
+        return (FieldDescriptor)result;
+      } else {
+        return null;
+      }
+    }
+
+    /**
+     * Finds a field by field number.
+     * @param number The field number within this message type.
+     * @return The field's descriptor, or {@code null} if not found.
+     */
+    public FieldDescriptor findFieldByNumber(final int number) {
+      return file.pool.fieldsByNumber.get(
+        new DescriptorPool.DescriptorIntPair(this, number));
+    }
+
+    /**
+     * Finds a nested message type by name.
+     * @param name The unqualified name of the nested type (e.g. "Foo").
+     * @return The types's descriptor, or {@code null} if not found.
+     */
+    public Descriptor findNestedTypeByName(final String name) {
+      final GenericDescriptor result =
+          file.pool.findSymbol(fullName + '.' + name);
+      if (result != null && result instanceof Descriptor) {
+        return (Descriptor)result;
+      } else {
+        return null;
+      }
+    }
+
+    /**
+     * Finds a nested enum type by name.
+     * @param name The unqualified name of the nested type (e.g. "Foo").
+     * @return The types's descriptor, or {@code null} if not found.
+     */
+    public EnumDescriptor findEnumTypeByName(final String name) {
+      final GenericDescriptor result =
+          file.pool.findSymbol(fullName + '.' + name);
+      if (result != null && result instanceof EnumDescriptor) {
+        return (EnumDescriptor)result;
+      } else {
+        return null;
+      }
+    }
+
+    private final int index;
+    private DescriptorProto proto;
+    private final String fullName;
+    private final FileDescriptor file;
+    private final Descriptor containingType;
+    private final Descriptor[] nestedTypes;
+    private final EnumDescriptor[] enumTypes;
+    private final FieldDescriptor[] fields;
+    private final FieldDescriptor[] extensions;
+
+    private Descriptor(final DescriptorProto proto,
+                       final FileDescriptor file,
+                       final Descriptor parent,
+                       final int index)
+                throws DescriptorValidationException {
+      this.index = index;
+      this.proto = proto;
+      fullName = computeFullName(file, parent, proto.getName());
+      this.file = file;
+      containingType = parent;
+
+      nestedTypes = new Descriptor[proto.getNestedTypeCount()];
+      for (int i = 0; i < proto.getNestedTypeCount(); i++) {
+        nestedTypes[i] = new Descriptor(
+          proto.getNestedType(i), file, this, i);
+      }
+
+      enumTypes = new EnumDescriptor[proto.getEnumTypeCount()];
+      for (int i = 0; i < proto.getEnumTypeCount(); i++) {
+        enumTypes[i] = new EnumDescriptor(
+          proto.getEnumType(i), file, this, i);
+      }
+
+      fields = new FieldDescriptor[proto.getFieldCount()];
+      for (int i = 0; i < proto.getFieldCount(); i++) {
+        fields[i] = new FieldDescriptor(
+          proto.getField(i), file, this, i, false);
+      }
+
+      extensions = new FieldDescriptor[proto.getExtensionCount()];
+      for (int i = 0; i < proto.getExtensionCount(); i++) {
+        extensions[i] = new FieldDescriptor(
+          proto.getExtension(i), file, this, i, true);
+      }
+
+      file.pool.addSymbol(this);
+    }
+
+    /** Look up and cross-link all field types, etc. */
+    private void crossLink() throws DescriptorValidationException {
+      for (final Descriptor nestedType : nestedTypes) {
+        nestedType.crossLink();
+      }
+
+      for (final FieldDescriptor field : fields) {
+        field.crossLink();
+      }
+
+      for (final FieldDescriptor extension : extensions) {
+        extension.crossLink();
+      }
+    }
+
+    /** See {@link FileDescriptor#setProto}. */
+    private void setProto(final DescriptorProto proto) {
+      this.proto = proto;
+
+      for (int i = 0; i < nestedTypes.length; i++) {
+        nestedTypes[i].setProto(proto.getNestedType(i));
+      }
+
+      for (int i = 0; i < enumTypes.length; i++) {
+        enumTypes[i].setProto(proto.getEnumType(i));
+      }
+
+      for (int i = 0; i < fields.length; i++) {
+        fields[i].setProto(proto.getField(i));
+      }
+
+      for (int i = 0; i < extensions.length; i++) {
+        extensions[i].setProto(proto.getExtension(i));
+      }
+    }
+  }
+
+  // =================================================================
+
+  /** Describes a field of a message type. */
+  public static final class FieldDescriptor
+      implements GenericDescriptor, Comparable<FieldDescriptor>,
+                 FieldSet.FieldDescriptorLite<FieldDescriptor> {
+    /**
+     * Get the index of this descriptor within its parent.
+     * @see Descriptor#getIndex()
+     */
+    public int getIndex() { return index; }
+
+    /** Convert the descriptor to its protocol message representation. */
+    public FieldDescriptorProto toProto() { return proto; }
+
+    /** Get the field's unqualified name. */
+    public String getName() { return proto.getName(); }
+
+    /** Get the field's number. */
+    public int getNumber() { return proto.getNumber(); }
+
+    /**
+     * Get the field's fully-qualified name.
+     * @see Descriptor#getFullName()
+     */
+    public String getFullName() { return fullName; }
+
+    /**
+     * Get the field's java type.  This is just for convenience.  Every
+     * {@code FieldDescriptorProto.Type} maps to exactly one Java type.
+     */
+    public JavaType getJavaType() { return type.getJavaType(); }
+
+    /** For internal use only. */
+    public WireFormat.JavaType getLiteJavaType() {
+      return getLiteType().getJavaType();
+    }
+
+    /** Get the {@code FileDescriptor} containing this descriptor. */
+    public FileDescriptor getFile() { return file; }
+
+    /** Get the field's declared type. */
+    public Type getType() { return type; }
+
+    /** For internal use only. */
+    public WireFormat.FieldType getLiteType() {
+      return table[type.ordinal()];
+    }
+    // I'm pretty sure values() constructs a new array every time, since there
+    // is nothing stopping the caller from mutating the array.  Therefore we
+    // make a static copy here.
+    private static final WireFormat.FieldType[] table =
+        WireFormat.FieldType.values();
+
+    /** Is this field declared required? */
+    public boolean isRequired() {
+      return proto.getLabel() == FieldDescriptorProto.Label.LABEL_REQUIRED;
+    }
+
+    /** Is this field declared optional? */
+    public boolean isOptional() {
+      return proto.getLabel() == FieldDescriptorProto.Label.LABEL_OPTIONAL;
+    }
+
+    /** Is this field declared repeated? */
+    public boolean isRepeated() {
+      return proto.getLabel() == FieldDescriptorProto.Label.LABEL_REPEATED;
+    }
+
+    /** Does this field have the {@code [packed = true]} option? */
+    public boolean isPacked() {
+      return getOptions().getPacked();
+    }
+
+    /** Can this field be packed? i.e. is it a repeated primitive field? */
+    public boolean isPackable() {
+      return isRepeated() && getLiteType().isPackable();
+    }
+
+    /** Returns true if the field had an explicitly-defined default value. */
+    public boolean hasDefaultValue() { return proto.hasDefaultValue(); }
+
+    /**
+     * Returns the field's default value.  Valid for all types except for
+     * messages and groups.  For all other types, the object returned is of
+     * the same class that would returned by Message.getField(this).
+     */
+    public Object getDefaultValue() {
+      if (getJavaType() == JavaType.MESSAGE) {
+        throw new UnsupportedOperationException(
+          "FieldDescriptor.getDefaultValue() called on an embedded message " +
+          "field.");
+      }
+      return defaultValue;
+    }
+
+    /** Get the {@code FieldOptions}, defined in {@code descriptor.proto}. */
+    public FieldOptions getOptions() { return proto.getOptions(); }
+
+    /** Is this field an extension? */
+    public boolean isExtension() { return proto.hasExtendee(); }
+
+    /**
+     * Get the field's containing type. For extensions, this is the type being
+     * extended, not the location where the extension was defined.  See
+     * {@link #getExtensionScope()}.
+     */
+    public Descriptor getContainingType() { return containingType; }
+
+    /**
+     * For extensions defined nested within message types, gets the outer
+     * type.  Not valid for non-extension fields.  For example, consider
+     * this {@code .proto} file:
+     * <pre>
+     *   message Foo {
+     *     extensions 1000 to max;
+     *   }
+     *   extend Foo {
+     *     optional int32 baz = 1234;
+     *   }
+     *   message Bar {
+     *     extend Foo {
+     *       optional int32 qux = 4321;
+     *     }
+     *   }
+     * </pre>
+     * Both {@code baz}'s and {@code qux}'s containing type is {@code Foo}.
+     * However, {@code baz}'s extension scope is {@code null} while
+     * {@code qux}'s extension scope is {@code Bar}.
+     */
+    public Descriptor getExtensionScope() {
+      if (!isExtension()) {
+        throw new UnsupportedOperationException(
+          "This field is not an extension.");
+      }
+      return extensionScope;
+    }
+
+    /** For embedded message and group fields, gets the field's type. */
+    public Descriptor getMessageType() {
+      if (getJavaType() != JavaType.MESSAGE) {
+        throw new UnsupportedOperationException(
+          "This field is not of message type.");
+      }
+      return messageType;
+    }
+
+    /** For enum fields, gets the field's type. */
+    public EnumDescriptor getEnumType() {
+      if (getJavaType() != JavaType.ENUM) {
+        throw new UnsupportedOperationException(
+          "This field is not of enum type.");
+      }
+      return enumType;
+    }
+
+    /**
+     * Compare with another {@code FieldDescriptor}.  This orders fields in
+     * "canonical" order, which simply means ascending order by field number.
+     * {@code other} must be a field of the same type -- i.e.
+     * {@code getContainingType()} must return the same {@code Descriptor} for
+     * both fields.
+     *
+     * @return negative, zero, or positive if {@code this} is less than,
+     *         equal to, or greater than {@code other}, respectively.
+     */
+    public int compareTo(final FieldDescriptor other) {
+      if (other.containingType != containingType) {
+        throw new IllegalArgumentException(
+          "FieldDescriptors can only be compared to other FieldDescriptors " +
+          "for fields of the same message type.");
+      }
+      return getNumber() - other.getNumber();
+    }
+
+    private final int index;
+
+    private FieldDescriptorProto proto;
+    private final String fullName;
+    private final FileDescriptor file;
+    private final Descriptor extensionScope;
+
+    // Possibly initialized during cross-linking.
+    private Type type;
+    private Descriptor containingType;
+    private Descriptor messageType;
+    private EnumDescriptor enumType;
+    private Object defaultValue;
+
+    public enum Type {
+      DOUBLE  (JavaType.DOUBLE     ),
+      FLOAT   (JavaType.FLOAT      ),
+      INT64   (JavaType.LONG       ),
+      UINT64  (JavaType.LONG       ),
+      INT32   (JavaType.INT        ),
+      FIXED64 (JavaType.LONG       ),
+      FIXED32 (JavaType.INT        ),
+      BOOL    (JavaType.BOOLEAN    ),
+      STRING  (JavaType.STRING     ),
+      GROUP   (JavaType.MESSAGE    ),
+      MESSAGE (JavaType.MESSAGE    ),
+      BYTES   (JavaType.BYTE_STRING),
+      UINT32  (JavaType.INT        ),
+      ENUM    (JavaType.ENUM       ),
+      SFIXED32(JavaType.INT        ),
+      SFIXED64(JavaType.LONG       ),
+      SINT32  (JavaType.INT        ),
+      SINT64  (JavaType.LONG       );
+
+      Type(final JavaType javaType) {
+        this.javaType = javaType;
+      }
+
+      private JavaType javaType;
+
+      public FieldDescriptorProto.Type toProto() {
+        return FieldDescriptorProto.Type.valueOf(ordinal() + 1);
+      }
+      public JavaType getJavaType() { return javaType; }
+
+      public static Type valueOf(final FieldDescriptorProto.Type type) {
+        return values()[type.getNumber() - 1];
+      }
+    }
+
+    static {
+      // Refuse to init if someone added a new declared type.
+      if (Type.values().length != FieldDescriptorProto.Type.values().length) {
+        throw new RuntimeException(
+          "descriptor.proto has a new declared type but Desrciptors.java " +
+          "wasn't updated.");
+      }
+    }
+
+    public enum JavaType {
+      INT(0),
+      LONG(0L),
+      FLOAT(0F),
+      DOUBLE(0D),
+      BOOLEAN(false),
+      STRING(""),
+      BYTE_STRING(ByteString.EMPTY),
+      ENUM(null),
+      MESSAGE(null);
+
+      JavaType(final Object defaultDefault) {
+        this.defaultDefault = defaultDefault;
+      }
+
+      /**
+       * The default default value for fields of this type, if it's a primitive
+       * type.  This is meant for use inside this file only, hence is private.
+       */
+      private final Object defaultDefault;
+    }
+
+    private FieldDescriptor(final FieldDescriptorProto proto,
+                            final FileDescriptor file,
+                            final Descriptor parent,
+                            final int index,
+                            final boolean isExtension)
+                     throws DescriptorValidationException {
+      this.index = index;
+      this.proto = proto;
+      fullName = computeFullName(file, parent, proto.getName());
+      this.file = file;
+
+      if (proto.hasType()) {
+        type = Type.valueOf(proto.getType());
+      }
+
+      if (getNumber() <= 0) {
+        throw new DescriptorValidationException(this,
+          "Field numbers must be positive integers.");
+      }
+
+      // Only repeated primitive fields may be packed.
+      if (proto.getOptions().getPacked() && !isPackable()) {
+        throw new DescriptorValidationException(this,
+          "[packed = true] can only be specified for repeated primitive " +
+          "fields.");
+      }
+
+      if (isExtension) {
+        if (!proto.hasExtendee()) {
+          throw new DescriptorValidationException(this,
+            "FieldDescriptorProto.extendee not set for extension field.");
+        }
+        containingType = null;  // Will be filled in when cross-linking
+        if (parent != null) {
+          extensionScope = parent;
+        } else {
+          extensionScope = null;
+        }
+      } else {
+        if (proto.hasExtendee()) {
+          throw new DescriptorValidationException(this,
+            "FieldDescriptorProto.extendee set for non-extension field.");
+        }
+        containingType = parent;
+        extensionScope = null;
+      }
+
+      file.pool.addSymbol(this);
+    }
+
+    /** Look up and cross-link all field types, etc. */
+    private void crossLink() throws DescriptorValidationException {
+      if (proto.hasExtendee()) {
+        final GenericDescriptor extendee =
+          file.pool.lookupSymbol(proto.getExtendee(), this);
+        if (!(extendee instanceof Descriptor)) {
+          throw new DescriptorValidationException(this,
+              '\"' + proto.getExtendee() + "\" is not a message type.");
+        }
+        containingType = (Descriptor)extendee;
+
+        if (!getContainingType().isExtensionNumber(getNumber())) {
+          throw new DescriptorValidationException(this,
+              '\"' + getContainingType().getFullName() +
+              "\" does not declare " + getNumber() +
+              " as an extension number.");
+        }
+      }
+
+      if (proto.hasTypeName()) {
+        final GenericDescriptor typeDescriptor =
+          file.pool.lookupSymbol(proto.getTypeName(), this);
+
+        if (!proto.hasType()) {
+          // Choose field type based on symbol.
+          if (typeDescriptor instanceof Descriptor) {
+            type = Type.MESSAGE;
+          } else if (typeDescriptor instanceof EnumDescriptor) {
+            type = Type.ENUM;
+          } else {
+            throw new DescriptorValidationException(this,
+                '\"' + proto.getTypeName() + "\" is not a type.");
+          }
+        }
+
+        if (getJavaType() == JavaType.MESSAGE) {
+          if (!(typeDescriptor instanceof Descriptor)) {
+            throw new DescriptorValidationException(this,
+                '\"' + proto.getTypeName() + "\" is not a message type.");
+          }
+          messageType = (Descriptor)typeDescriptor;
+
+          if (proto.hasDefaultValue()) {
+            throw new DescriptorValidationException(this,
+              "Messages can't have default values.");
+          }
+        } else if (getJavaType() == JavaType.ENUM) {
+          if (!(typeDescriptor instanceof EnumDescriptor)) {
+            throw new DescriptorValidationException(this,
+                '\"' + proto.getTypeName() + "\" is not an enum type.");
+          }
+          enumType = (EnumDescriptor)typeDescriptor;
+        } else {
+          throw new DescriptorValidationException(this,
+            "Field with primitive type has type_name.");
+        }
+      } else {
+        if (getJavaType() == JavaType.MESSAGE ||
+            getJavaType() == JavaType.ENUM) {
+          throw new DescriptorValidationException(this,
+            "Field with message or enum type missing type_name.");
+        }
+      }
+
+      // We don't attempt to parse the default value until here because for
+      // enums we need the enum type's descriptor.
+      if (proto.hasDefaultValue()) {
+        if (isRepeated()) {
+          throw new DescriptorValidationException(this,
+            "Repeated fields cannot have default values.");
+        }
+
+        try {
+          switch (getType()) {
+            case INT32:
+            case SINT32:
+            case SFIXED32:
+              defaultValue = TextFormat.parseInt32(proto.getDefaultValue());
+              break;
+            case UINT32:
+            case FIXED32:
+              defaultValue = TextFormat.parseUInt32(proto.getDefaultValue());
+              break;
+            case INT64:
+            case SINT64:
+            case SFIXED64:
+              defaultValue = TextFormat.parseInt64(proto.getDefaultValue());
+              break;
+            case UINT64:
+            case FIXED64:
+              defaultValue = TextFormat.parseUInt64(proto.getDefaultValue());
+              break;
+            case FLOAT:
+              if (proto.getDefaultValue().equals("inf")) {
+                defaultValue = Float.POSITIVE_INFINITY;
+              } else if (proto.getDefaultValue().equals("-inf")) {
+                defaultValue = Float.NEGATIVE_INFINITY;
+              } else if (proto.getDefaultValue().equals("nan")) {
+                defaultValue = Float.NaN;
+              } else {
+                defaultValue = Float.valueOf(proto.getDefaultValue());
+              }
+              break;
+            case DOUBLE:
+              if (proto.getDefaultValue().equals("inf")) {
+                defaultValue = Double.POSITIVE_INFINITY;
+              } else if (proto.getDefaultValue().equals("-inf")) {
+                defaultValue = Double.NEGATIVE_INFINITY;
+              } else if (proto.getDefaultValue().equals("nan")) {
+                defaultValue = Double.NaN;
+              } else {
+                defaultValue = Double.valueOf(proto.getDefaultValue());
+              }
+              break;
+            case BOOL:
+              defaultValue = Boolean.valueOf(proto.getDefaultValue());
+              break;
+            case STRING:
+              defaultValue = proto.getDefaultValue();
+              break;
+            case BYTES:
+              try {
+                defaultValue =
+                  TextFormat.unescapeBytes(proto.getDefaultValue());
+              } catch (TextFormat.InvalidEscapeSequenceException e) {
+                throw new DescriptorValidationException(this,
+                  "Couldn't parse default value: " + e.getMessage(), e);
+              }
+              break;
+            case ENUM:
+              defaultValue = enumType.findValueByName(proto.getDefaultValue());
+              if (defaultValue == null) {
+                throw new DescriptorValidationException(this,
+                  "Unknown enum default value: \"" +
+                  proto.getDefaultValue() + '\"');
+              }
+              break;
+            case MESSAGE:
+            case GROUP:
+              throw new DescriptorValidationException(this,
+                "Message type had default value.");
+          }
+        } catch (NumberFormatException e) {
+          throw new DescriptorValidationException(this, 
+              "Could not parse default value: \"" + 
+              proto.getDefaultValue() + '\"', e);
+        }
+      } else {
+        // Determine the default default for this field.
+        if (isRepeated()) {
+          defaultValue = Collections.emptyList();
+        } else {
+          switch (getJavaType()) {
+            case ENUM:
+              // We guarantee elsewhere that an enum type always has at least
+              // one possible value.
+              defaultValue = enumType.getValues().get(0);
+              break;
+            case MESSAGE:
+              defaultValue = null;
+              break;
+            default:
+              defaultValue = getJavaType().defaultDefault;
+              break;
+          }
+        }
+      }
+
+      if (!isExtension()) {
+        file.pool.addFieldByNumber(this);
+      }
+
+      if (containingType != null &&
+          containingType.getOptions().getMessageSetWireFormat()) {
+        if (isExtension()) {
+          if (!isOptional() || getType() != Type.MESSAGE) {
+            throw new DescriptorValidationException(this,
+              "Extensions of MessageSets must be optional messages.");
+          }
+        } else {
+          throw new DescriptorValidationException(this,
+            "MessageSets cannot have fields, only extensions.");
+        }
+      }
+    }
+
+    /** See {@link FileDescriptor#setProto}. */
+    private void setProto(final FieldDescriptorProto proto) {
+      this.proto = proto;
+    }
+
+    /**
+     * For internal use only.  This is to satisfy the FieldDescriptorLite
+     * interface.
+     */
+    public MessageLite.Builder internalMergeFrom(
+        MessageLite.Builder to, MessageLite from) {
+      // FieldDescriptors are only used with non-lite messages so we can just
+      // down-cast and call mergeFrom directly.
+      return ((Message.Builder) to).mergeFrom((Message) from);
+    }
+  }
+
+  // =================================================================
+
+  /** Describes an enum type. */
+  public static final class EnumDescriptor
+      implements GenericDescriptor, Internal.EnumLiteMap<EnumValueDescriptor> {
+    /**
+     * Get the index of this descriptor within its parent.
+     * @see Descriptor#getIndex()
+     */
+    public int getIndex() { return index; }
+
+    /** Convert the descriptor to its protocol message representation. */
+    public EnumDescriptorProto toProto() { return proto; }
+
+    /** Get the type's unqualified name. */
+    public String getName() { return proto.getName(); }
+
+    /**
+     * Get the type's fully-qualified name.
+     * @see Descriptor#getFullName()
+     */
+    public String getFullName() { return fullName; }
+
+    /** Get the {@link FileDescriptor} containing this descriptor. */
+    public FileDescriptor getFile() { return file; }
+
+    /** If this is a nested type, get the outer descriptor, otherwise null. */
+    public Descriptor getContainingType() { return containingType; }
+
+    /** Get the {@code EnumOptions}, defined in {@code descriptor.proto}. */
+    public EnumOptions getOptions() { return proto.getOptions(); }
+
+    /** Get a list of defined values for this enum. */
+    public List<EnumValueDescriptor> getValues() {
+      return Collections.unmodifiableList(Arrays.asList(values));
+    }
+
+    /**
+     * Find an enum value by name.
+     * @param name The unqualified name of the value (e.g. "FOO").
+     * @return the value's decsriptor, or {@code null} if not found.
+     */
+    public EnumValueDescriptor findValueByName(final String name) {
+      final GenericDescriptor result =
+          file.pool.findSymbol(fullName + '.' + name);
+      if (result != null && result instanceof EnumValueDescriptor) {
+        return (EnumValueDescriptor)result;
+      } else {
+        return null;
+      }
+    }
+
+    /**
+     * Find an enum value by number.  If multiple enum values have the same
+     * number, this returns the first defined value with that number.
+     * @param number The value's number.
+     * @return the value's decsriptor, or {@code null} if not found.
+     */
+    public EnumValueDescriptor findValueByNumber(final int number) {
+      return file.pool.enumValuesByNumber.get(
+        new DescriptorPool.DescriptorIntPair(this, number));
+    }
+
+    private final int index;
+    private EnumDescriptorProto proto;
+    private final String fullName;
+    private final FileDescriptor file;
+    private final Descriptor containingType;
+    private EnumValueDescriptor[] values;
+
+    private EnumDescriptor(final EnumDescriptorProto proto,
+                           final FileDescriptor file,
+                           final Descriptor parent,
+                           final int index)
+                    throws DescriptorValidationException {
+      this.index = index;
+      this.proto = proto;
+      fullName = computeFullName(file, parent, proto.getName());
+      this.file = file;
+      containingType = parent;
+
+      if (proto.getValueCount() == 0) {
+        // We cannot allow enums with no values because this would mean there
+        // would be no valid default value for fields of this type.
+        throw new DescriptorValidationException(this,
+          "Enums must contain at least one value.");
+      }
+
+      values = new EnumValueDescriptor[proto.getValueCount()];
+      for (int i = 0; i < proto.getValueCount(); i++) {
+        values[i] = new EnumValueDescriptor(
+          proto.getValue(i), file, this, i);
+      }
+
+      file.pool.addSymbol(this);
+    }
+
+    /** See {@link FileDescriptor#setProto}. */
+    private void setProto(final EnumDescriptorProto proto) {
+      this.proto = proto;
+
+      for (int i = 0; i < values.length; i++) {
+        values[i].setProto(proto.getValue(i));
+      }
+    }
+  }
+
+  // =================================================================
+
+  /**
+   * Describes one value within an enum type.  Note that multiple defined
+   * values may have the same number.  In generated Java code, all values
+   * with the same number after the first become aliases of the first.
+   * However, they still have independent EnumValueDescriptors.
+   */
+  public static final class EnumValueDescriptor
+      implements GenericDescriptor, Internal.EnumLite {
+    /**
+     * Get the index of this descriptor within its parent.
+     * @see Descriptor#getIndex()
+     */
+    public int getIndex() { return index; }
+
+    /** Convert the descriptor to its protocol message representation. */
+    public EnumValueDescriptorProto toProto() { return proto; }
+
+    /** Get the value's unqualified name. */
+    public String getName() { return proto.getName(); }
+
+    /** Get the value's number. */
+    public int getNumber() { return proto.getNumber(); }
+
+    /**
+     * Get the value's fully-qualified name.
+     * @see Descriptor#getFullName()
+     */
+    public String getFullName() { return fullName; }
+
+    /** Get the {@link FileDescriptor} containing this descriptor. */
+    public FileDescriptor getFile() { return file; }
+
+    /** Get the value's enum type. */
+    public EnumDescriptor getType() { return type; }
+
+    /**
+     * Get the {@code EnumValueOptions}, defined in {@code descriptor.proto}.
+     */
+    public EnumValueOptions getOptions() { return proto.getOptions(); }
+
+    private final int index;
+    private EnumValueDescriptorProto proto;
+    private final String fullName;
+    private final FileDescriptor file;
+    private final EnumDescriptor type;
+
+    private EnumValueDescriptor(final EnumValueDescriptorProto proto,
+                                final FileDescriptor file,
+                                final EnumDescriptor parent,
+                                final int index)
+                         throws DescriptorValidationException {
+      this.index = index;
+      this.proto = proto;
+      this.file = file;
+      type = parent;
+
+      fullName = parent.getFullName() + '.' + proto.getName();
+
+      file.pool.addSymbol(this);
+      file.pool.addEnumValueByNumber(this);
+    }
+
+    /** See {@link FileDescriptor#setProto}. */
+    private void setProto(final EnumValueDescriptorProto proto) {
+      this.proto = proto;
+    }
+  }
+
+  // =================================================================
+
+  /** Describes a service type. */
+  public static final class ServiceDescriptor implements GenericDescriptor {
+    /**
+     * Get the index of this descriptor within its parent.
+     * * @see Descriptors.Descriptor#getIndex()
+     */
+    public int getIndex() { return index; }
+
+    /** Convert the descriptor to its protocol message representation. */
+    public ServiceDescriptorProto toProto() { return proto; }
+
+    /** Get the type's unqualified name. */
+    public String getName() { return proto.getName(); }
+
+    /**
+     * Get the type's fully-qualified name.
+     * @see Descriptor#getFullName()
+     */
+    public String getFullName() { return fullName; }
+
+    /** Get the {@link FileDescriptor} containing this descriptor. */
+    public FileDescriptor getFile() { return file; }
+
+    /** Get the {@code ServiceOptions}, defined in {@code descriptor.proto}. */
+    public ServiceOptions getOptions() { return proto.getOptions(); }
+
+    /** Get a list of methods for this service. */
+    public List<MethodDescriptor> getMethods() {
+      return Collections.unmodifiableList(Arrays.asList(methods));
+    }
+
+    /**
+     * Find a method by name.
+     * @param name The unqualified name of the method (e.g. "Foo").
+     * @return the method's decsriptor, or {@code null} if not found.
+     */
+    public MethodDescriptor findMethodByName(final String name) {
+      final GenericDescriptor result =
+          file.pool.findSymbol(fullName + '.' + name);
+      if (result != null && result instanceof MethodDescriptor) {
+        return (MethodDescriptor)result;
+      } else {
+        return null;
+      }
+    }
+
+    private final int index;
+    private ServiceDescriptorProto proto;
+    private final String fullName;
+    private final FileDescriptor file;
+    private MethodDescriptor[] methods;
+
+    private ServiceDescriptor(final ServiceDescriptorProto proto,
+                              final FileDescriptor file,
+                              final int index)
+                       throws DescriptorValidationException {
+      this.index = index;
+      this.proto = proto;
+      fullName = computeFullName(file, null, proto.getName());
+      this.file = file;
+
+      methods = new MethodDescriptor[proto.getMethodCount()];
+      for (int i = 0; i < proto.getMethodCount(); i++) {
+        methods[i] = new MethodDescriptor(
+          proto.getMethod(i), file, this, i);
+      }
+
+      file.pool.addSymbol(this);
+    }
+
+    private void crossLink() throws DescriptorValidationException {
+      for (final MethodDescriptor method : methods) {
+        method.crossLink();
+      }
+    }
+
+    /** See {@link FileDescriptor#setProto}. */
+    private void setProto(final ServiceDescriptorProto proto) {
+      this.proto = proto;
+
+      for (int i = 0; i < methods.length; i++) {
+        methods[i].setProto(proto.getMethod(i));
+      }
+    }
+  }
+
+  // =================================================================
+
+  /**
+   * Describes one method within a service type.
+   */
+  public static final class MethodDescriptor implements GenericDescriptor {
+    /**
+     * Get the index of this descriptor within its parent.
+     * * @see Descriptors.Descriptor#getIndex()
+     */
+    public int getIndex() { return index; }
+
+    /** Convert the descriptor to its protocol message representation. */
+    public MethodDescriptorProto toProto() { return proto; }
+
+    /** Get the method's unqualified name. */
+    public String getName() { return proto.getName(); }
+
+    /**
+     * Get the method's fully-qualified name.
+     * @see Descriptor#getFullName()
+     */
+    public String getFullName() { return fullName; }
+
+    /** Get the {@link FileDescriptor} containing this descriptor. */
+    public FileDescriptor getFile() { return file; }
+
+    /** Get the method's service type. */
+    public ServiceDescriptor getService() { return service; }
+
+    /** Get the method's input type. */
+    public Descriptor getInputType() { return inputType; }
+
+    /** Get the method's output type. */
+    public Descriptor getOutputType() { return outputType; }
+
+    /**
+     * Get the {@code MethodOptions}, defined in {@code descriptor.proto}.
+     */
+    public MethodOptions getOptions() { return proto.getOptions(); }
+
+    private final int index;
+    private MethodDescriptorProto proto;
+    private final String fullName;
+    private final FileDescriptor file;
+    private final ServiceDescriptor service;
+
+    // Initialized during cross-linking.
+    private Descriptor inputType;
+    private Descriptor outputType;
+
+    private MethodDescriptor(final MethodDescriptorProto proto,
+                             final FileDescriptor file,
+                             final ServiceDescriptor parent,
+                             final int index)
+                      throws DescriptorValidationException {
+      this.index = index;
+      this.proto = proto;
+      this.file = file;
+      service = parent;
+
+      fullName = parent.getFullName() + '.' + proto.getName();
+
+      file.pool.addSymbol(this);
+    }
+
+    private void crossLink() throws DescriptorValidationException {
+      final GenericDescriptor input =
+        file.pool.lookupSymbol(proto.getInputType(), this);
+      if (!(input instanceof Descriptor)) {
+        throw new DescriptorValidationException(this,
+            '\"' + proto.getInputType() + "\" is not a message type.");
+      }
+      inputType = (Descriptor)input;
+
+      final GenericDescriptor output =
+        file.pool.lookupSymbol(proto.getOutputType(), this);
+      if (!(output instanceof Descriptor)) {
+        throw new DescriptorValidationException(this,
+            '\"' + proto.getOutputType() + "\" is not a message type.");
+      }
+      outputType = (Descriptor)output;
+    }
+
+    /** See {@link FileDescriptor#setProto}. */
+    private void setProto(final MethodDescriptorProto proto) {
+      this.proto = proto;
+    }
+  }
+
+  // =================================================================
+
+  private static String computeFullName(final FileDescriptor file,
+                                        final Descriptor parent,
+                                        final String name) {
+    if (parent != null) {
+      return parent.getFullName() + '.' + name;
+    } else if (file.getPackage().length() > 0) {
+      return file.getPackage() + '.' + name;
+    } else {
+      return name;
+    }
+  }
+
+  // =================================================================
+
+  /**
+   * All descriptors except {@code FileDescriptor} implement this to make
+   * {@code DescriptorPool}'s life easier.
+   */
+  private interface GenericDescriptor {
+    Message toProto();
+    String getName();
+    String getFullName();
+    FileDescriptor getFile();
+  }
+
+  /**
+   * Thrown when building descriptors fails because the source DescriptorProtos
+   * are not valid.
+   */
+  public static class DescriptorValidationException extends Exception {
+    private static final long serialVersionUID = 5750205775490483148L;
+
+    /** Gets the full name of the descriptor where the error occurred. */
+    public String getProblemSymbolName() { return name; }
+
+    /**
+     * Gets the the protocol message representation of the invalid descriptor.
+     */
+    public Message getProblemProto() { return proto; }
+
+    /**
+     * Gets a human-readable description of the error.
+     */
+    public String getDescription() { return description; }
+
+    private final String name;
+    private final Message proto;
+    private final String description;
+
+    private DescriptorValidationException(
+        final GenericDescriptor problemDescriptor,
+        final String description) {
+      super(problemDescriptor.getFullName() + ": " + description);
+
+      // Note that problemDescriptor may be partially uninitialized, so we
+      // don't want to expose it directly to the user.  So, we only provide
+      // the name and the original proto.
+      name = problemDescriptor.getFullName();
+      proto = problemDescriptor.toProto();
+      this.description = description;
+    }
+
+    private DescriptorValidationException(
+        final GenericDescriptor problemDescriptor,
+        final String description,
+        final Throwable cause) {
+      this(problemDescriptor, description);
+      initCause(cause);
+    }
+
+    private DescriptorValidationException(
+        final FileDescriptor problemDescriptor,
+        final String description) {
+      super(problemDescriptor.getName() + ": " + description);
+
+      // Note that problemDescriptor may be partially uninitialized, so we
+      // don't want to expose it directly to the user.  So, we only provide
+      // the name and the original proto.
+      name = problemDescriptor.getName();
+      proto = problemDescriptor.toProto();
+      this.description = description;
+    }
+  }
+
+  // =================================================================
+
+  /**
+   * A private helper class which contains lookup tables containing all the
+   * descriptors defined in a particular file.
+   */
+  private static final class DescriptorPool {
+    DescriptorPool(final FileDescriptor[] dependencies) {
+      this.dependencies = new DescriptorPool[dependencies.length];
+
+      for (int i = 0; i < dependencies.length; i++)  {
+        this.dependencies[i] = dependencies[i].pool;
+      }
+
+      for (final FileDescriptor dependency : dependencies) {
+        try {
+          addPackage(dependency.getPackage(), dependency);
+        } catch (DescriptorValidationException e) {
+          // Can't happen, because addPackage() only fails when the name
+          // conflicts with a non-package, but we have not yet added any
+          // non-packages at this point.
+          assert false;
+        }
+      }
+    }
+
+    private final DescriptorPool[] dependencies;
+
+    private final Map<String, GenericDescriptor> descriptorsByName =
+      new HashMap<String, GenericDescriptor>();
+    private final Map<DescriptorIntPair, FieldDescriptor> fieldsByNumber =
+      new HashMap<DescriptorIntPair, FieldDescriptor>();
+    private final Map<DescriptorIntPair, EnumValueDescriptor> enumValuesByNumber
+        = new HashMap<DescriptorIntPair, EnumValueDescriptor>();
+
+    /** Find a generic descriptor by fully-qualified name. */
+    GenericDescriptor findSymbol(final String fullName) {
+      GenericDescriptor result = descriptorsByName.get(fullName);
+      if (result != null) {
+        return result;
+      }
+
+      for (final DescriptorPool dependency : dependencies) {
+        result = dependency.descriptorsByName.get(fullName);
+        if (result != null) {
+          return result;
+        }
+      }
+
+      return null;
+    }
+
+    /**
+     * Look up a descriptor by name, relative to some other descriptor.
+     * The name may be fully-qualified (with a leading '.'),
+     * partially-qualified, or unqualified.  C++-like name lookup semantics
+     * are used to search for the matching descriptor.
+     */
+    GenericDescriptor lookupSymbol(final String name,
+                                   final GenericDescriptor relativeTo)
+                            throws DescriptorValidationException {
+      // TODO(kenton):  This could be optimized in a number of ways.
+
+      GenericDescriptor result;
+      if (name.startsWith(".")) {
+        // Fully-qualified name.
+        result = findSymbol(name.substring(1));
+      } else {
+        // If "name" is a compound identifier, we want to search for the
+        // first component of it, then search within it for the rest.
+        final int firstPartLength = name.indexOf('.');
+        final String firstPart;
+        if (firstPartLength == -1) {
+          firstPart = name;
+        } else {
+          firstPart = name.substring(0, firstPartLength);
+        }
+
+        // We will search each parent scope of "relativeTo" looking for the
+        // symbol.
+        final StringBuilder scopeToTry =
+            new StringBuilder(relativeTo.getFullName());
+
+        while (true) {
+          // Chop off the last component of the scope.
+          final int dotpos = scopeToTry.lastIndexOf(".");
+          if (dotpos == -1) {
+            result = findSymbol(name);
+            break;
+          } else {
+            scopeToTry.setLength(dotpos + 1);
+
+            // Append firstPart and try to find.
+            scopeToTry.append(firstPart);
+            result = findSymbol(scopeToTry.toString());
+
+            if (result != null) {
+              if (firstPartLength != -1) {
+                // We only found the first part of the symbol.  Now look for
+                // the whole thing.  If this fails, we *don't* want to keep
+                // searching parent scopes.
+                scopeToTry.setLength(dotpos + 1);
+                scopeToTry.append(name);
+                result = findSymbol(scopeToTry.toString());
+              }
+              break;
+            }
+
+            // Not found.  Remove the name so we can try again.
+            scopeToTry.setLength(dotpos);
+          }
+        }
+      }
+
+      if (result == null) {
+        throw new DescriptorValidationException(relativeTo,
+            '\"' + name + "\" is not defined.");
+      } else {
+        return result;
+      }
+    }
+
+    /**
+     * Adds a symbol to the symbol table.  If a symbol with the same name
+     * already exists, throws an error.
+     */
+    void addSymbol(final GenericDescriptor descriptor)
+            throws DescriptorValidationException {
+      validateSymbolName(descriptor);
+
+      final String fullName = descriptor.getFullName();
+      final int dotpos = fullName.lastIndexOf('.');
+
+      final GenericDescriptor old = descriptorsByName.put(fullName, descriptor);
+      if (old != null) {
+        descriptorsByName.put(fullName, old);
+
+        if (descriptor.getFile() == old.getFile()) {
+          if (dotpos == -1) {
+            throw new DescriptorValidationException(descriptor,
+                '\"' + fullName + "\" is already defined.");
+          } else {
+            throw new DescriptorValidationException(descriptor,
+                '\"' + fullName.substring(dotpos + 1) +
+              "\" is already defined in \"" +
+              fullName.substring(0, dotpos) + "\".");
+          }
+        } else {
+          throw new DescriptorValidationException(descriptor,
+              '\"' + fullName + "\" is already defined in file \"" +
+            old.getFile().getName() + "\".");
+        }
+      }
+    }
+
+    /**
+     * Represents a package in the symbol table.  We use PackageDescriptors
+     * just as placeholders so that someone cannot define, say, a message type
+     * that has the same name as an existing package.
+     */
+    private static final class PackageDescriptor implements GenericDescriptor {
+      public Message toProto()        { return file.toProto(); }
+      public String getName()         { return name;           }
+      public String getFullName()     { return fullName;       }
+      public FileDescriptor getFile() { return file;           }
+
+      PackageDescriptor(final String name, final String fullName,
+                        final FileDescriptor file) {
+        this.file = file;
+        this.fullName = fullName;
+        this.name = name;
+      }
+
+      private final String name;
+      private final String fullName;
+      private final FileDescriptor file;
+    }
+
+    /**
+     * Adds a package to the symbol tables.  If a package by the same name
+     * already exists, that is fine, but if some other kind of symbol exists
+     * under the same name, an exception is thrown.  If the package has
+     * multiple components, this also adds the parent package(s).
+     */
+    void addPackage(final String fullName, final FileDescriptor file)
+             throws DescriptorValidationException {
+      final int dotpos = fullName.lastIndexOf('.');
+      final String name;
+      if (dotpos == -1) {
+        name = fullName;
+      } else {
+        addPackage(fullName.substring(0, dotpos), file);
+        name = fullName.substring(dotpos + 1);
+      }
+
+      final GenericDescriptor old =
+        descriptorsByName.put(fullName,
+          new PackageDescriptor(name, fullName, file));
+      if (old != null) {
+        descriptorsByName.put(fullName, old);
+        if (!(old instanceof PackageDescriptor)) {
+          throw new DescriptorValidationException(file,
+              '\"' + name + "\" is already defined (as something other than a "
+              + "package) in file \"" + old.getFile().getName() + "\".");
+        }
+      }
+    }
+
+    /** A (GenericDescriptor, int) pair, used as a map key. */
+    private static final class DescriptorIntPair {
+      private final GenericDescriptor descriptor;
+      private final int number;
+
+      DescriptorIntPair(final GenericDescriptor descriptor, final int number) {
+        this.descriptor = descriptor;
+        this.number = number;
+      }
+
+      @Override
+      public int hashCode() {
+        return descriptor.hashCode() * ((1 << 16) - 1) + number;
+      }
+      @Override
+      public boolean equals(final Object obj) {
+        if (!(obj instanceof DescriptorIntPair)) {
+          return false;
+        }
+        final DescriptorIntPair other = (DescriptorIntPair)obj;
+        return descriptor == other.descriptor && number == other.number;
+      }
+    }
+
+    /**
+     * Adds a field to the fieldsByNumber table.  Throws an exception if a
+     * field with hte same containing type and number already exists.
+     */
+    void addFieldByNumber(final FieldDescriptor field)
+                   throws DescriptorValidationException {
+      final DescriptorIntPair key =
+        new DescriptorIntPair(field.getContainingType(), field.getNumber());
+      final FieldDescriptor old = fieldsByNumber.put(key, field);
+      if (old != null) {
+        fieldsByNumber.put(key, old);
+        throw new DescriptorValidationException(field,
+          "Field number " + field.getNumber() +
+          "has already been used in \"" +
+          field.getContainingType().getFullName() +
+          "\" by field \"" + old.getName() + "\".");
+      }
+    }
+
+    /**
+     * Adds an enum value to the enumValuesByNumber table.  If an enum value
+     * with the same type and number already exists, does nothing.  (This is
+     * allowed; the first value define with the number takes precedence.)
+     */
+    void addEnumValueByNumber(final EnumValueDescriptor value) {
+      final DescriptorIntPair key =
+        new DescriptorIntPair(value.getType(), value.getNumber());
+      final EnumValueDescriptor old = enumValuesByNumber.put(key, value);
+      if (old != null) {
+        enumValuesByNumber.put(key, old);
+        // Not an error:  Multiple enum values may have the same number, but
+        // we only want the first one in the map.
+      }
+    }
+
+    /**
+     * Verifies that the descriptor's name is valid (i.e. it contains only
+     * letters, digits, and underscores, and does not start with a digit).
+     */
+    static void validateSymbolName(final GenericDescriptor descriptor)
+                                   throws DescriptorValidationException {
+      final String name = descriptor.getName();
+      if (name.length() == 0) {
+        throw new DescriptorValidationException(descriptor, "Missing name.");
+      } else {
+        boolean valid = true;
+        for (int i = 0; i < name.length(); i++) {
+          final char c = name.charAt(i);
+          // Non-ASCII characters are not valid in protobuf identifiers, even
+          // if they are letters or digits.
+          if (c >= 128) {
+            valid = false;
+          }
+          // First character must be letter or _.  Subsequent characters may
+          // be letters, numbers, or digits.
+          if (Character.isLetter(c) || c == '_' ||
+              (Character.isDigit(c) && i > 0)) {
+            // Valid
+          } else {
+            valid = false;
+          }
+        }
+        if (!valid) {
+          throw new DescriptorValidationException(descriptor,
+              '\"' + name + "\" is not a valid identifier.");
+        }
+      }
+    }
+  }
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/DynamicMessage.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/DynamicMessage.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/DynamicMessage.java	(revision 15014)
@@ -0,0 +1,438 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.Descriptors.Descriptor;
+import com.google.protobuf.Descriptors.FieldDescriptor;
+
+import java.io.InputStream;
+import java.io.IOException;
+import java.util.Map;
+
+/**
+ * An implementation of {@link Message} that can represent arbitrary types,
+ * given a {@link Descriptors.Descriptor}.
+ *
+ * @author kenton@google.com Kenton Varda
+ */
+public final class DynamicMessage extends AbstractMessage {
+  private final Descriptor type;
+  private final FieldSet<FieldDescriptor> fields;
+  private final UnknownFieldSet unknownFields;
+  private int memoizedSize = -1;
+
+  /**
+   * Construct a {@code DynamicMessage} using the given {@code FieldSet}.
+   */
+  private DynamicMessage(Descriptor type, FieldSet<FieldDescriptor> fields,
+                         UnknownFieldSet unknownFields) {
+    this.type = type;
+    this.fields = fields;
+    this.unknownFields = unknownFields;
+  }
+
+  /**
+   * Get a {@code DynamicMessage} representing the default instance of the
+   * given type.
+   */
+  public static DynamicMessage getDefaultInstance(Descriptor type) {
+    return new DynamicMessage(type, FieldSet.<FieldDescriptor>emptySet(),
+                              UnknownFieldSet.getDefaultInstance());
+  }
+
+  /** Parse a message of the given type from the given input stream. */
+  public static DynamicMessage parseFrom(Descriptor type,
+                                         CodedInputStream input)
+                                         throws IOException {
+    return newBuilder(type).mergeFrom(input).buildParsed();
+  }
+
+  /** Parse a message of the given type from the given input stream. */
+  public static DynamicMessage parseFrom(
+      Descriptor type,
+      CodedInputStream input,
+      ExtensionRegistry extensionRegistry)
+      throws IOException {
+    return newBuilder(type).mergeFrom(input, extensionRegistry).buildParsed();
+  }
+
+  /** Parse {@code data} as a message of the given type and return it. */
+  public static DynamicMessage parseFrom(Descriptor type, ByteString data)
+                                         throws InvalidProtocolBufferException {
+    return newBuilder(type).mergeFrom(data).buildParsed();
+  }
+
+  /** Parse {@code data} as a message of the given type and return it. */
+  public static DynamicMessage parseFrom(Descriptor type, ByteString data,
+                                         ExtensionRegistry extensionRegistry)
+                                         throws InvalidProtocolBufferException {
+    return newBuilder(type).mergeFrom(data, extensionRegistry).buildParsed();
+  }
+
+  /** Parse {@code data} as a message of the given type and return it. */
+  public static DynamicMessage parseFrom(Descriptor type, byte[] data)
+                                         throws InvalidProtocolBufferException {
+    return newBuilder(type).mergeFrom(data).buildParsed();
+  }
+
+  /** Parse {@code data} as a message of the given type and return it. */
+  public static DynamicMessage parseFrom(Descriptor type, byte[] data,
+                                         ExtensionRegistry extensionRegistry)
+                                         throws InvalidProtocolBufferException {
+    return newBuilder(type).mergeFrom(data, extensionRegistry).buildParsed();
+  }
+
+  /** Parse a message of the given type from {@code input} and return it. */
+  public static DynamicMessage parseFrom(Descriptor type, InputStream input)
+                                         throws IOException {
+    return newBuilder(type).mergeFrom(input).buildParsed();
+  }
+
+  /** Parse a message of the given type from {@code input} and return it. */
+  public static DynamicMessage parseFrom(Descriptor type, InputStream input,
+                                         ExtensionRegistry extensionRegistry)
+                                         throws IOException {
+    return newBuilder(type).mergeFrom(input, extensionRegistry).buildParsed();
+  }
+
+  /** Construct a {@link Message.Builder} for the given type. */
+  public static Builder newBuilder(Descriptor type) {
+    return new Builder(type);
+  }
+
+  /**
+   * Construct a {@link Message.Builder} for a message of the same type as
+   * {@code prototype}, and initialize it with {@code prototype}'s contents.
+   */
+  public static Builder newBuilder(Message prototype) {
+    return new Builder(prototype.getDescriptorForType()).mergeFrom(prototype);
+  }
+
+  // -----------------------------------------------------------------
+  // Implementation of Message interface.
+
+  public Descriptor getDescriptorForType() {
+    return type;
+  }
+
+  public DynamicMessage getDefaultInstanceForType() {
+    return getDefaultInstance(type);
+  }
+
+  public Map<FieldDescriptor, Object> getAllFields() {
+    return fields.getAllFields();
+  }
+
+  public boolean hasField(FieldDescriptor field) {
+    verifyContainingType(field);
+    return fields.hasField(field);
+  }
+
+  public Object getField(FieldDescriptor field) {
+    verifyContainingType(field);
+    Object result = fields.getField(field);
+    if (result == null) {
+      if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
+        result = getDefaultInstance(field.getMessageType());
+      } else {
+        result = field.getDefaultValue();
+      }
+    }
+    return result;
+  }
+
+  public int getRepeatedFieldCount(FieldDescriptor field) {
+    verifyContainingType(field);
+    return fields.getRepeatedFieldCount(field);
+  }
+
+  public Object getRepeatedField(FieldDescriptor field, int index) {
+    verifyContainingType(field);
+    return fields.getRepeatedField(field, index);
+  }
+
+  public UnknownFieldSet getUnknownFields() {
+    return unknownFields;
+  }
+
+  private static boolean isInitialized(Descriptor type,
+                                       FieldSet<FieldDescriptor> fields) {
+    // Check that all required fields are present.
+    for (final FieldDescriptor field : type.getFields()) {
+      if (field.isRequired()) {
+        if (!fields.hasField(field)) {
+          return false;
+        }
+      }
+    }
+
+    // Check that embedded messages are initialized.
+    return fields.isInitialized();
+  }
+
+  public boolean isInitialized() {
+    return isInitialized(type, fields);
+  }
+
+  public void writeTo(CodedOutputStream output) throws IOException {
+    if (type.getOptions().getMessageSetWireFormat()) {
+      fields.writeMessageSetTo(output);
+      unknownFields.writeAsMessageSetTo(output);
+    } else {
+      fields.writeTo(output);
+      unknownFields.writeTo(output);
+    }
+  }
+
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    if (type.getOptions().getMessageSetWireFormat()) {
+      size = fields.getMessageSetSerializedSize();
+      size += unknownFields.getSerializedSizeAsMessageSet();
+    } else {
+      size = fields.getSerializedSize();
+      size += unknownFields.getSerializedSize();
+    }
+
+    memoizedSize = size;
+    return size;
+  }
+
+  public Builder newBuilderForType() {
+    return new Builder(type);
+  }
+
+  public Builder toBuilder() {
+    return newBuilderForType().mergeFrom(this);
+  }
+
+  /** Verifies that the field is a field of this message. */
+  private void verifyContainingType(FieldDescriptor field) {
+    if (field.getContainingType() != type) {
+      throw new IllegalArgumentException(
+        "FieldDescriptor does not match message type.");
+    }
+  }
+
+  // =================================================================
+
+  /**
+   * Builder for {@link DynamicMessage}s.
+   */
+  public static final class Builder extends AbstractMessage.Builder<Builder> {
+    private final Descriptor type;
+    private FieldSet<FieldDescriptor> fields;
+    private UnknownFieldSet unknownFields;
+
+    /** Construct a {@code Builder} for the given type. */
+    private Builder(Descriptor type) {
+      this.type = type;
+      this.fields = FieldSet.newFieldSet();
+      this.unknownFields = UnknownFieldSet.getDefaultInstance();
+    }
+
+    // ---------------------------------------------------------------
+    // Implementation of Message.Builder interface.
+
+    public Builder clear() {
+      if (fields == null) {
+        throw new IllegalStateException("Cannot call clear() after build().");
+      }
+      fields.clear();
+      return this;
+    }
+
+    public Builder mergeFrom(Message other) {
+      if (other instanceof DynamicMessage) {
+        // This should be somewhat faster than calling super.mergeFrom().
+        DynamicMessage otherDynamicMessage = (DynamicMessage) other;
+        if (otherDynamicMessage.type != type) {
+          throw new IllegalArgumentException(
+            "mergeFrom(Message) can only merge messages of the same type.");
+        }
+        fields.mergeFrom(otherDynamicMessage.fields);
+        mergeUnknownFields(otherDynamicMessage.unknownFields);
+        return this;
+      } else {
+        return super.mergeFrom(other);
+      }
+    }
+
+    public DynamicMessage build() {
+      // If fields == null, we'll throw an appropriate exception later.
+      if (fields != null && !isInitialized()) {
+        throw newUninitializedMessageException(
+          new DynamicMessage(type, fields, unknownFields));
+      }
+      return buildPartial();
+    }
+
+    /**
+     * Helper for DynamicMessage.parseFrom() methods to call.  Throws
+     * {@link InvalidProtocolBufferException} instead of
+     * {@link UninitializedMessageException}.
+     */
+    private DynamicMessage buildParsed() throws InvalidProtocolBufferException {
+      if (!isInitialized()) {
+        throw newUninitializedMessageException(
+            new DynamicMessage(type, fields, unknownFields))
+          .asInvalidProtocolBufferException();
+      }
+      return buildPartial();
+    }
+
+    public DynamicMessage buildPartial() {
+      if (fields == null) {
+        throw new IllegalStateException(
+            "build() has already been called on this Builder.");
+      }
+      fields.makeImmutable();
+      DynamicMessage result =
+        new DynamicMessage(type, fields, unknownFields);
+      fields = null;
+      unknownFields = null;
+      return result;
+    }
+
+    public Builder clone() {
+      Builder result = new Builder(type);
+      result.fields.mergeFrom(fields);
+      return result;
+    }
+
+    public boolean isInitialized() {
+      return DynamicMessage.isInitialized(type, fields);
+    }
+
+    public Descriptor getDescriptorForType() {
+      return type;
+    }
+
+    public DynamicMessage getDefaultInstanceForType() {
+      return getDefaultInstance(type);
+    }
+
+    public Map<FieldDescriptor, Object> getAllFields() {
+      return fields.getAllFields();
+    }
+
+    public Builder newBuilderForField(FieldDescriptor field) {
+      verifyContainingType(field);
+
+      if (field.getJavaType() != FieldDescriptor.JavaType.MESSAGE) {
+        throw new IllegalArgumentException(
+          "newBuilderForField is only valid for fields with message type.");
+      }
+
+      return new Builder(field.getMessageType());
+    }
+
+    public boolean hasField(FieldDescriptor field) {
+      verifyContainingType(field);
+      return fields.hasField(field);
+    }
+
+    public Object getField(FieldDescriptor field) {
+      verifyContainingType(field);
+      Object result = fields.getField(field);
+      if (result == null) {
+        if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
+          result = getDefaultInstance(field.getMessageType());
+        } else {
+          result = field.getDefaultValue();
+        }
+      }
+      return result;
+    }
+
+    public Builder setField(FieldDescriptor field, Object value) {
+      verifyContainingType(field);
+      fields.setField(field, value);
+      return this;
+    }
+
+    public Builder clearField(FieldDescriptor field) {
+      verifyContainingType(field);
+      fields.clearField(field);
+      return this;
+    }
+
+    public int getRepeatedFieldCount(FieldDescriptor field) {
+      verifyContainingType(field);
+      return fields.getRepeatedFieldCount(field);
+    }
+
+    public Object getRepeatedField(FieldDescriptor field, int index) {
+      verifyContainingType(field);
+      return fields.getRepeatedField(field, index);
+    }
+
+    public Builder setRepeatedField(FieldDescriptor field,
+                                    int index, Object value) {
+      verifyContainingType(field);
+      fields.setRepeatedField(field, index, value);
+      return this;
+    }
+
+    public Builder addRepeatedField(FieldDescriptor field, Object value) {
+      verifyContainingType(field);
+      fields.addRepeatedField(field, value);
+      return this;
+    }
+
+    public UnknownFieldSet getUnknownFields() {
+      return unknownFields;
+    }
+
+    public Builder setUnknownFields(UnknownFieldSet unknownFields) {
+      this.unknownFields = unknownFields;
+      return this;
+    }
+
+    public Builder mergeUnknownFields(UnknownFieldSet unknownFields) {
+      this.unknownFields =
+        UnknownFieldSet.newBuilder(this.unknownFields)
+                       .mergeFrom(unknownFields)
+                       .build();
+      return this;
+    }
+
+    /** Verifies that the field is a field of this message. */
+    private void verifyContainingType(FieldDescriptor field) {
+      if (field.getContainingType() != type) {
+        throw new IllegalArgumentException(
+          "FieldDescriptor does not match message type.");
+      }
+    }
+  }
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/ExtensionRegistry.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/ExtensionRegistry.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/ExtensionRegistry.java	(revision 15014)
@@ -0,0 +1,266 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.Descriptors.Descriptor;
+import com.google.protobuf.Descriptors.FieldDescriptor;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * A table of known extensions, searchable by name or field number.  When
+ * parsing a protocol message that might have extensions, you must provide
+ * an {@code ExtensionRegistry} in which you have registered any extensions
+ * that you want to be able to parse.  Otherwise, those extensions will just
+ * be treated like unknown fields.
+ *
+ * <p>For example, if you had the {@code .proto} file:
+ *
+ * <pre>
+ * option java_class = "MyProto";
+ *
+ * message Foo {
+ *   extensions 1000 to max;
+ * }
+ *
+ * extend Foo {
+ *   optional int32 bar;
+ * }
+ * </pre>
+ *
+ * Then you might write code like:
+ *
+ * <pre>
+ * ExtensionRegistry registry = ExtensionRegistry.newInstance();
+ * registry.add(MyProto.bar);
+ * MyProto.Foo message = MyProto.Foo.parseFrom(input, registry);
+ * </pre>
+ *
+ * <p>Background:
+ *
+ * <p>You might wonder why this is necessary.  Two alternatives might come to
+ * mind.  First, you might imagine a system where generated extensions are
+ * automatically registered when their containing classes are loaded.  This
+ * is a popular technique, but is bad design; among other things, it creates a
+ * situation where behavior can change depending on what classes happen to be
+ * loaded.  It also introduces a security vulnerability, because an
+ * unprivileged class could cause its code to be called unexpectedly from a
+ * privileged class by registering itself as an extension of the right type.
+ *
+ * <p>Another option you might consider is lazy parsing: do not parse an
+ * extension until it is first requested, at which point the caller must
+ * provide a type to use.  This introduces a different set of problems.  First,
+ * it would require a mutex lock any time an extension was accessed, which
+ * would be slow.  Second, corrupt data would not be detected until first
+ * access, at which point it would be much harder to deal with it.  Third, it
+ * could violate the expectation that message objects are immutable, since the
+ * type provided could be any arbitrary message class.  An unprivileged user
+ * could take advantage of this to inject a mutable object into a message
+ * belonging to privileged code and create mischief.
+ *
+ * @author kenton@google.com Kenton Varda
+ */
+public final class ExtensionRegistry extends ExtensionRegistryLite {
+  /** Construct a new, empty instance. */
+  public static ExtensionRegistry newInstance() {
+    return new ExtensionRegistry();
+  }
+
+  /** Get the unmodifiable singleton empty instance. */
+  public static ExtensionRegistry getEmptyRegistry() {
+    return EMPTY;
+  }
+
+  /** Returns an unmodifiable view of the registry. */
+  @Override
+  public ExtensionRegistry getUnmodifiable() {
+    return new ExtensionRegistry(this);
+  }
+
+  /** A (Descriptor, Message) pair, returned by lookup methods. */
+  public static final class ExtensionInfo {
+    /** The extension's descriptor. */
+    public final FieldDescriptor descriptor;
+
+    /**
+     * A default instance of the extension's type, if it has a message type.
+     * Otherwise, {@code null}.
+     */
+    public final Message defaultInstance;
+
+    private ExtensionInfo(final FieldDescriptor descriptor) {
+      this.descriptor = descriptor;
+      defaultInstance = null;
+    }
+    private ExtensionInfo(final FieldDescriptor descriptor,
+                          final Message defaultInstance) {
+      this.descriptor = descriptor;
+      this.defaultInstance = defaultInstance;
+    }
+  }
+
+  /**
+   * Find an extension by fully-qualified field name, in the proto namespace.
+   * I.e. {@code result.descriptor.fullName()} will match {@code fullName} if
+   * a match is found.
+   *
+   * @return Information about the extension if found, or {@code null}
+   *         otherwise.
+   */
+  public ExtensionInfo findExtensionByName(final String fullName) {
+    return extensionsByName.get(fullName);
+  }
+
+  /**
+   * Find an extension by containing type and field number.
+   *
+   * @return Information about the extension if found, or {@code null}
+   *         otherwise.
+   */
+  public ExtensionInfo findExtensionByNumber(final Descriptor containingType,
+                                             final int fieldNumber) {
+    return extensionsByNumber.get(
+      new DescriptorIntPair(containingType, fieldNumber));
+  }
+
+  /** Add an extension from a generated file to the registry. */
+  public void add(final GeneratedMessage.GeneratedExtension<?, ?> extension) {
+    if (extension.getDescriptor().getJavaType() ==
+        FieldDescriptor.JavaType.MESSAGE) {
+      if (extension.getMessageDefaultInstance() == null) {
+        throw new IllegalStateException(
+            "Registered message-type extension had null default instance: " +
+            extension.getDescriptor().getFullName());
+      }
+      add(new ExtensionInfo(extension.getDescriptor(),
+                            extension.getMessageDefaultInstance()));
+    } else {
+      add(new ExtensionInfo(extension.getDescriptor(), null));
+    }
+  }
+
+  /** Add a non-message-type extension to the registry by descriptor. */
+  public void add(final FieldDescriptor type) {
+    if (type.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
+      throw new IllegalArgumentException(
+        "ExtensionRegistry.add() must be provided a default instance when " +
+        "adding an embedded message extension.");
+    }
+    add(new ExtensionInfo(type, null));
+  }
+
+  /** Add a message-type extension to the registry by descriptor. */
+  public void add(final FieldDescriptor type, final Message defaultInstance) {
+    if (type.getJavaType() != FieldDescriptor.JavaType.MESSAGE) {
+      throw new IllegalArgumentException(
+        "ExtensionRegistry.add() provided a default instance for a " +
+        "non-message extension.");
+    }
+    add(new ExtensionInfo(type, defaultInstance));
+  }
+
+  // =================================================================
+  // Private stuff.
+
+  private ExtensionRegistry() {
+    this.extensionsByName = new HashMap<String, ExtensionInfo>();
+    this.extensionsByNumber = new HashMap<DescriptorIntPair, ExtensionInfo>();
+  }
+
+  private ExtensionRegistry(ExtensionRegistry other) {
+    super(other);
+    this.extensionsByName = Collections.unmodifiableMap(other.extensionsByName);
+    this.extensionsByNumber =
+        Collections.unmodifiableMap(other.extensionsByNumber);
+  }
+
+  private final Map<String, ExtensionInfo> extensionsByName;
+  private final Map<DescriptorIntPair, ExtensionInfo> extensionsByNumber;
+
+  private ExtensionRegistry(boolean empty) {
+    super(ExtensionRegistryLite.getEmptyRegistry());
+    this.extensionsByName = Collections.<String, ExtensionInfo>emptyMap();
+    this.extensionsByNumber =
+        Collections.<DescriptorIntPair, ExtensionInfo>emptyMap();
+  }
+  private static final ExtensionRegistry EMPTY = new ExtensionRegistry(true);
+
+  private void add(final ExtensionInfo extension) {
+    if (!extension.descriptor.isExtension()) {
+      throw new IllegalArgumentException(
+        "ExtensionRegistry.add() was given a FieldDescriptor for a regular " +
+        "(non-extension) field.");
+    }
+
+    extensionsByName.put(extension.descriptor.getFullName(), extension);
+    extensionsByNumber.put(
+      new DescriptorIntPair(extension.descriptor.getContainingType(),
+                            extension.descriptor.getNumber()),
+      extension);
+
+    final FieldDescriptor field = extension.descriptor;
+    if (field.getContainingType().getOptions().getMessageSetWireFormat() &&
+        field.getType() == FieldDescriptor.Type.MESSAGE &&
+        field.isOptional() &&
+        field.getExtensionScope() == field.getMessageType()) {
+      // This is an extension of a MessageSet type defined within the extension
+      // type's own scope.  For backwards-compatibility, allow it to be looked
+      // up by type name.
+      extensionsByName.put(field.getMessageType().getFullName(), extension);
+    }
+  }
+
+  /** A (GenericDescriptor, int) pair, used as a map key. */
+  private static final class DescriptorIntPair {
+    private final Descriptor descriptor;
+    private final int number;
+
+    DescriptorIntPair(final Descriptor descriptor, final int number) {
+      this.descriptor = descriptor;
+      this.number = number;
+    }
+
+    @Override
+    public int hashCode() {
+      return descriptor.hashCode() * ((1 << 16) - 1) + number;
+    }
+    @Override
+    public boolean equals(final Object obj) {
+      if (!(obj instanceof DescriptorIntPair)) {
+        return false;
+      }
+      final DescriptorIntPair other = (DescriptorIntPair)obj;
+      return descriptor == other.descriptor && number == other.number;
+    }
+  }
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/ExtensionRegistryLite.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/ExtensionRegistryLite.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/ExtensionRegistryLite.java	(revision 15014)
@@ -0,0 +1,169 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Equivalent to {@link ExtensionRegistry} but supports only "lite" types.
+ * <p>
+ * If all of your types are lite types, then you only need to use
+ * {@code ExtensionRegistryLite}.  Similarly, if all your types are regular
+ * types, then you only need {@link ExtensionRegistry}.  Typically it does not
+ * make sense to mix the two, since if you have any regular types in your
+ * program, you then require the full runtime and lose all the benefits of
+ * the lite runtime, so you might as well make all your types be regular types.
+ * However, in some cases (e.g. when depending on multiple third-patry libraries
+ * where one uses lite types and one uses regular), you may find yourself
+ * wanting to mix the two.  In this case things get more complicated.
+ * <p>
+ * There are three factors to consider:  Whether the type being extended is
+ * lite, whether the embedded type (in the case of a message-typed extension)
+ * is lite, and whether the extension itself is lite.  Since all three are
+ * declared in different files, they could all be different.  Here are all
+ * the combinations and which type of registry to use:
+ * <pre>
+ *   Extended type     Inner type    Extension         Use registry
+ *   =======================================================================
+ *   lite              lite          lite              ExtensionRegistryLite
+ *   lite              regular       lite              ExtensionRegistry
+ *   regular           regular       regular           ExtensionRegistry
+ *   all other combinations                            not supported
+ * </pre>
+ * <p>
+ * Note that just as regular types are not allowed to contain lite-type fields,
+ * they are also not allowed to contain lite-type extensions.  This is because
+ * regular types must be fully accessible via reflection, which in turn means
+ * that all the inner messages must also support reflection.  On the other hand,
+ * since regular types implement the entire lite interface, there is no problem
+ * with embedding regular types inside lite types.
+ *
+ * @author kenton@google.com Kenton Varda
+ */
+public class ExtensionRegistryLite {
+  /** Construct a new, empty instance. */
+  public static ExtensionRegistryLite newInstance() {
+    return new ExtensionRegistryLite();
+  }
+
+  /** Get the unmodifiable singleton empty instance. */
+  public static ExtensionRegistryLite getEmptyRegistry() {
+    return EMPTY;
+  }
+
+  /** Returns an unmodifiable view of the registry. */
+  public ExtensionRegistryLite getUnmodifiable() {
+    return new ExtensionRegistryLite(this);
+  }
+
+  /**
+   * Find an extension by containing type and field number.
+   *
+   * @return Information about the extension if found, or {@code null}
+   *         otherwise.
+   */
+  @SuppressWarnings("unchecked")
+  public <ContainingType extends MessageLite>
+      GeneratedMessageLite.GeneratedExtension<ContainingType, ?>
+        findLiteExtensionByNumber(
+          final ContainingType containingTypeDefaultInstance,
+          final int fieldNumber) {
+    return (GeneratedMessageLite.GeneratedExtension<ContainingType, ?>)
+      extensionsByNumber.get(
+        new ObjectIntPair(containingTypeDefaultInstance, fieldNumber));
+  }
+
+  /** Add an extension from a lite generated file to the registry. */
+  public final void add(
+      final GeneratedMessageLite.GeneratedExtension<?, ?> extension) {
+    extensionsByNumber.put(
+      new ObjectIntPair(extension.getContainingTypeDefaultInstance(),
+                        extension.getNumber()),
+      extension);
+  }
+
+  // =================================================================
+  // Private stuff.
+
+  // Constructors are package-private so that ExtensionRegistry can subclass
+  // this.
+
+  ExtensionRegistryLite() {
+    this.extensionsByNumber =
+        new HashMap<ObjectIntPair,
+                    GeneratedMessageLite.GeneratedExtension<?, ?>>();
+  }
+
+  ExtensionRegistryLite(ExtensionRegistryLite other) {
+    if (other == EMPTY) {
+      this.extensionsByNumber = Collections.emptyMap();
+    } else {
+      this.extensionsByNumber =
+        Collections.unmodifiableMap(other.extensionsByNumber);
+    }
+  }
+
+  private final Map<ObjectIntPair,
+                    GeneratedMessageLite.GeneratedExtension<?, ?>>
+      extensionsByNumber;
+
+  private ExtensionRegistryLite(boolean empty) {
+    this.extensionsByNumber = Collections.emptyMap();
+  }
+  private static final ExtensionRegistryLite EMPTY =
+    new ExtensionRegistryLite(true);
+
+  /** A (Object, int) pair, used as a map key. */
+  private static final class ObjectIntPair {
+    private final Object object;
+    private final int number;
+
+    ObjectIntPair(final Object object, final int number) {
+      this.object = object;
+      this.number = number;
+    }
+
+    @Override
+    public int hashCode() {
+      return System.identityHashCode(object) * ((1 << 16) - 1) + number;
+    }
+    @Override
+    public boolean equals(final Object obj) {
+      if (!(obj instanceof ObjectIntPair)) {
+        return false;
+      }
+      final ObjectIntPair other = (ObjectIntPair)obj;
+      return object == other.object && number == other.number;
+    }
+  }
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/FieldSet.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/FieldSet.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/FieldSet.java	(revision 15014)
@@ -0,0 +1,788 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.io.IOException;
+
+/**
+ * A class which represents an arbitrary set of fields of some message type.
+ * This is used to implement {@link DynamicMessage}, and also to represent
+ * extensions in {@link GeneratedMessage}.  This class is package-private,
+ * since outside users should probably be using {@link DynamicMessage}.
+ *
+ * @author kenton@google.com Kenton Varda
+ */
+final class FieldSet<FieldDescriptorType extends
+      FieldSet.FieldDescriptorLite<FieldDescriptorType>> {
+  /**
+   * Interface for a FieldDescriptor or lite extension descriptor.  This
+   * prevents FieldSet from depending on {@link Descriptors.FieldDescriptor}.
+   */
+  public interface FieldDescriptorLite<T extends FieldDescriptorLite<T>>
+      extends Comparable<T> {
+    int getNumber();
+    WireFormat.FieldType getLiteType();
+    WireFormat.JavaType getLiteJavaType();
+    boolean isRepeated();
+    boolean isPacked();
+    Internal.EnumLiteMap<?> getEnumType();
+
+    // If getLiteJavaType() == MESSAGE, this merges a message object of the
+    // type into a builder of the type.  Returns {@code to}.
+    MessageLite.Builder internalMergeFrom(
+        MessageLite.Builder to, MessageLite from);
+  }
+
+  private final SmallSortedMap<FieldDescriptorType, Object> fields;
+  private boolean isImmutable;
+
+  /** Construct a new FieldSet. */
+  private FieldSet() {
+    this.fields = SmallSortedMap.newFieldMap(16);
+  }
+
+  /**
+   * Construct an empty FieldSet.  This is only used to initialize
+   * DEFAULT_INSTANCE.
+   */
+  private FieldSet(final boolean dummy) {
+    this.fields = SmallSortedMap.newFieldMap(0);
+    makeImmutable();
+  }
+
+  /** Construct a new FieldSet. */
+  public static <T extends FieldSet.FieldDescriptorLite<T>>
+      FieldSet<T> newFieldSet() {
+    return new FieldSet<T>();
+  }
+
+  /** Get an immutable empty FieldSet. */
+  @SuppressWarnings("unchecked")
+  public static <T extends FieldSet.FieldDescriptorLite<T>>
+      FieldSet<T> emptySet() {
+    return DEFAULT_INSTANCE;
+  }
+  @SuppressWarnings("unchecked")
+  private static final FieldSet DEFAULT_INSTANCE = new FieldSet(true);
+
+  /** Make this FieldSet immutable from this point forward. */
+  @SuppressWarnings("unchecked")
+  public void makeImmutable() {
+    if (isImmutable) {
+      return;
+    }
+    fields.makeImmutable();
+    isImmutable = true;
+  }
+
+  /**
+   * Retuns whether the FieldSet is immutable. This is true if it is the
+   * {@link #emptySet} or if {@link #makeImmutable} were called.
+   *
+   * @return whether the FieldSet is immutable.
+   */
+  public boolean isImmutable() {
+    return isImmutable;
+  }
+
+  /**
+   * Clones the FieldSet. The returned FieldSet will be mutable even if the
+   * original FieldSet was immutable.
+   *
+   * @return the newly cloned FieldSet
+   */
+  @Override
+  public FieldSet<FieldDescriptorType> clone() {
+    // We can't just call fields.clone because List objects in the map
+    // should not be shared.
+    FieldSet<FieldDescriptorType> clone = FieldSet.newFieldSet();
+    for (int i = 0; i < fields.getNumArrayEntries(); i++) {
+      Map.Entry<FieldDescriptorType, Object> entry = fields.getArrayEntryAt(i);
+      FieldDescriptorType descriptor = entry.getKey();
+      clone.setField(descriptor, entry.getValue());
+    }
+    for (Map.Entry<FieldDescriptorType, Object> entry :
+             fields.getOverflowEntries()) {
+      FieldDescriptorType descriptor = entry.getKey();
+      clone.setField(descriptor, entry.getValue());
+    }
+    return clone;
+  }
+
+  // =================================================================
+
+  /** See {@link Message.Builder#clear()}. */
+  public void clear() {
+    fields.clear();
+  }
+
+  /**
+   * Get a simple map containing all the fields.
+   */
+  public Map<FieldDescriptorType, Object> getAllFields() {
+    return fields.isImmutable() ? fields : Collections.unmodifiableMap(fields);
+  }
+
+  /**
+   * Get an iterator to the field map. This iterator should not be leaked out
+   * of the protobuf library as it is not protected from mutation when
+   * fields is not immutable.
+   */
+  public Iterator<Map.Entry<FieldDescriptorType, Object>> iterator() {
+    return fields.entrySet().iterator();
+  }
+
+  /**
+   * Useful for implementing
+   * {@link Message#hasField(Descriptors.FieldDescriptor)}.
+   */
+  public boolean hasField(final FieldDescriptorType descriptor) {
+    if (descriptor.isRepeated()) {
+      throw new IllegalArgumentException(
+        "hasField() can only be called on non-repeated fields.");
+    }
+
+    return fields.get(descriptor) != null;
+  }
+
+  /**
+   * Useful for implementing
+   * {@link Message#getField(Descriptors.FieldDescriptor)}.  This method
+   * returns {@code null} if the field is not set; in this case it is up
+   * to the caller to fetch the field's default value.
+   */
+  public Object getField(final FieldDescriptorType descriptor) {
+    return fields.get(descriptor);
+  }
+
+  /**
+   * Useful for implementing
+   * {@link Message.Builder#setField(Descriptors.FieldDescriptor,Object)}.
+   */
+  @SuppressWarnings("unchecked")
+  public void setField(final FieldDescriptorType descriptor,
+                       Object value) {
+    if (descriptor.isRepeated()) {
+      if (!(value instanceof List)) {
+        throw new IllegalArgumentException(
+          "Wrong object type used with protocol message reflection.");
+      }
+
+      // Wrap the contents in a new list so that the caller cannot change
+      // the list's contents after setting it.
+      final List newList = new ArrayList();
+      newList.addAll((List)value);
+      for (final Object element : newList) {
+        verifyType(descriptor.getLiteType(), element);
+      }
+      value = newList;
+    } else {
+      verifyType(descriptor.getLiteType(), value);
+    }
+
+    fields.put(descriptor, value);
+  }
+
+  /**
+   * Useful for implementing
+   * {@link Message.Builder#clearField(Descriptors.FieldDescriptor)}.
+   */
+  public void clearField(final FieldDescriptorType descriptor) {
+    fields.remove(descriptor);
+  }
+
+  /**
+   * Useful for implementing
+   * {@link Message#getRepeatedFieldCount(Descriptors.FieldDescriptor)}.
+   */
+  public int getRepeatedFieldCount(final FieldDescriptorType descriptor) {
+    if (!descriptor.isRepeated()) {
+      throw new IllegalArgumentException(
+        "getRepeatedField() can only be called on repeated fields.");
+    }
+
+    final Object value = fields.get(descriptor);
+    if (value == null) {
+      return 0;
+    } else {
+      return ((List<?>) value).size();
+    }
+  }
+
+  /**
+   * Useful for implementing
+   * {@link Message#getRepeatedField(Descriptors.FieldDescriptor,int)}.
+   */
+  public Object getRepeatedField(final FieldDescriptorType descriptor,
+                                 final int index) {
+    if (!descriptor.isRepeated()) {
+      throw new IllegalArgumentException(
+        "getRepeatedField() can only be called on repeated fields.");
+    }
+
+    final Object value = fields.get(descriptor);
+
+    if (value == null) {
+      throw new IndexOutOfBoundsException();
+    } else {
+      return ((List<?>) value).get(index);
+    }
+  }
+
+  /**
+   * Useful for implementing
+   * {@link Message.Builder#setRepeatedField(Descriptors.FieldDescriptor,int,Object)}.
+   */
+  @SuppressWarnings("unchecked")
+  public void setRepeatedField(final FieldDescriptorType descriptor,
+                               final int index,
+                               final Object value) {
+    if (!descriptor.isRepeated()) {
+      throw new IllegalArgumentException(
+        "getRepeatedField() can only be called on repeated fields.");
+    }
+
+    final Object list = fields.get(descriptor);
+    if (list == null) {
+      throw new IndexOutOfBoundsException();
+    }
+
+    verifyType(descriptor.getLiteType(), value);
+    ((List) list).set(index, value);
+  }
+
+  /**
+   * Useful for implementing
+   * {@link Message.Builder#addRepeatedField(Descriptors.FieldDescriptor,Object)}.
+   */
+  @SuppressWarnings("unchecked")
+  public void addRepeatedField(final FieldDescriptorType descriptor,
+                               final Object value) {
+    if (!descriptor.isRepeated()) {
+      throw new IllegalArgumentException(
+        "addRepeatedField() can only be called on repeated fields.");
+    }
+
+    verifyType(descriptor.getLiteType(), value);
+
+    final Object existingValue = fields.get(descriptor);
+    List list;
+    if (existingValue == null) {
+      list = new ArrayList();
+      fields.put(descriptor, list);
+    } else {
+      list = (List) existingValue;
+    }
+
+    list.add(value);
+  }
+
+  /**
+   * Verifies that the given object is of the correct type to be a valid
+   * value for the given field.  (For repeated fields, this checks if the
+   * object is the right type to be one element of the field.)
+   *
+   * @throws IllegalArgumentException The value is not of the right type.
+   */
+  private static void verifyType(final WireFormat.FieldType type,
+                                 final Object value) {
+    if (value == null) {
+      throw new NullPointerException();
+    }
+
+    boolean isValid = false;
+    switch (type.getJavaType()) {
+      case INT:          isValid = value instanceof Integer   ; break;
+      case LONG:         isValid = value instanceof Long      ; break;
+      case FLOAT:        isValid = value instanceof Float     ; break;
+      case DOUBLE:       isValid = value instanceof Double    ; break;
+      case BOOLEAN:      isValid = value instanceof Boolean   ; break;
+      case STRING:       isValid = value instanceof String    ; break;
+      case BYTE_STRING:  isValid = value instanceof ByteString; break;
+      case ENUM:
+        // TODO(kenton):  Caller must do type checking here, I guess.
+        isValid = value instanceof Internal.EnumLite;
+        break;
+      case MESSAGE:
+        // TODO(kenton):  Caller must do type checking here, I guess.
+        isValid = value instanceof MessageLite;
+        break;
+    }
+
+    if (!isValid) {
+      // TODO(kenton):  When chaining calls to setField(), it can be hard to
+      //   tell from the stack trace which exact call failed, since the whole
+      //   chain is considered one line of code.  It would be nice to print
+      //   more information here, e.g. naming the field.  We used to do that.
+      //   But we can't now that FieldSet doesn't use descriptors.  Maybe this
+      //   isn't a big deal, though, since it would only really apply when using
+      //   reflection and generally people don't chain reflection setters.
+      throw new IllegalArgumentException(
+        "Wrong object type used with protocol message reflection.");
+    }
+  }
+
+  // =================================================================
+  // Parsing and serialization
+
+  /**
+   * See {@link Message#isInitialized()}.  Note:  Since {@code FieldSet}
+   * itself does not have any way of knowing about required fields that
+   * aren't actually present in the set, it is up to the caller to check
+   * that all required fields are present.
+   */
+  public boolean isInitialized() {
+    for (int i = 0; i < fields.getNumArrayEntries(); i++) {
+      if (!isInitialized(fields.getArrayEntryAt(i))) {
+        return false;
+      }
+    }
+    for (final Map.Entry<FieldDescriptorType, Object> entry :
+             fields.getOverflowEntries()) {
+      if (!isInitialized(entry)) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  @SuppressWarnings("unchecked")
+  private boolean isInitialized(
+      final Map.Entry<FieldDescriptorType, Object> entry) {
+    final FieldDescriptorType descriptor = entry.getKey();
+    if (descriptor.getLiteJavaType() == WireFormat.JavaType.MESSAGE) {
+      if (descriptor.isRepeated()) {
+        for (final MessageLite element:
+                 (List<MessageLite>) entry.getValue()) {
+          if (!element.isInitialized()) {
+            return false;
+          }
+        }
+      } else {
+        if (!((MessageLite) entry.getValue()).isInitialized()) {
+          return false;
+        }
+      }
+    }
+    return true;
+  }
+
+  /**
+   * Given a field type, return the wire type.
+   *
+   * @returns One of the {@code WIRETYPE_} constants defined in
+   *          {@link WireFormat}.
+   */
+  static int getWireFormatForFieldType(final WireFormat.FieldType type,
+                                       boolean isPacked) {
+    if (isPacked) {
+      return WireFormat.WIRETYPE_LENGTH_DELIMITED;
+    } else {
+      return type.getWireType();
+    }
+  }
+
+  /**
+   * Like {@link #mergeFrom(Message)}, but merges from another {@link FieldSet}.
+   */
+  public void mergeFrom(final FieldSet<FieldDescriptorType> other) {
+    for (int i = 0; i < other.fields.getNumArrayEntries(); i++) {
+      mergeFromField(other.fields.getArrayEntryAt(i));
+    }
+    for (final Map.Entry<FieldDescriptorType, Object> entry :
+             other.fields.getOverflowEntries()) {
+      mergeFromField(entry);
+    }
+  }
+
+  @SuppressWarnings("unchecked")
+  private void mergeFromField(
+      final Map.Entry<FieldDescriptorType, Object> entry) {
+    final FieldDescriptorType descriptor = entry.getKey();
+    final Object otherValue = entry.getValue();
+
+    if (descriptor.isRepeated()) {
+      Object value = fields.get(descriptor);
+      if (value == null) {
+        // Our list is empty, but we still need to make a defensive copy of
+        // the other list since we don't know if the other FieldSet is still
+        // mutable.
+        fields.put(descriptor, new ArrayList((List) otherValue));
+      } else {
+        // Concatenate the lists.
+        ((List) value).addAll((List) otherValue);
+      }
+    } else if (descriptor.getLiteJavaType() == WireFormat.JavaType.MESSAGE) {
+      Object value = fields.get(descriptor);
+      if (value == null) {
+        fields.put(descriptor, otherValue);
+      } else {
+        // Merge the messages.
+        fields.put(
+            descriptor,
+            descriptor.internalMergeFrom(
+                ((MessageLite) value).toBuilder(), (MessageLite) otherValue)
+            .build());
+      }
+
+    } else {
+      fields.put(descriptor, otherValue);
+    }
+  }
+
+  // TODO(kenton):  Move static parsing and serialization methods into some
+  //   other class.  Probably WireFormat.
+
+  /**
+   * Read a field of any primitive type from a CodedInputStream.  Enums,
+   * groups, and embedded messages are not handled by this method.
+   *
+   * @param input The stream from which to read.
+   * @param type Declared type of the field.
+   * @return An object representing the field's value, of the exact
+   *         type which would be returned by
+   *         {@link Message#getField(Descriptors.FieldDescriptor)} for
+   *         this field.
+   */
+  public static Object readPrimitiveField(
+      CodedInputStream input,
+      final WireFormat.FieldType type) throws IOException {
+    switch (type) {
+      case DOUBLE  : return input.readDouble  ();
+      case FLOAT   : return input.readFloat   ();
+      case INT64   : return input.readInt64   ();
+      case UINT64  : return input.readUInt64  ();
+      case INT32   : return input.readInt32   ();
+      case FIXED64 : return input.readFixed64 ();
+      case FIXED32 : return input.readFixed32 ();
+      case BOOL    : return input.readBool    ();
+      case STRING  : return input.readString  ();
+      case BYTES   : return input.readBytes   ();
+      case UINT32  : return input.readUInt32  ();
+      case SFIXED32: return input.readSFixed32();
+      case SFIXED64: return input.readSFixed64();
+      case SINT32  : return input.readSInt32  ();
+      case SINT64  : return input.readSInt64  ();
+
+      case GROUP:
+        throw new IllegalArgumentException(
+          "readPrimitiveField() cannot handle nested groups.");
+      case MESSAGE:
+        throw new IllegalArgumentException(
+          "readPrimitiveField() cannot handle embedded messages.");
+      case ENUM:
+        // We don't handle enums because we don't know what to do if the
+        // value is not recognized.
+        throw new IllegalArgumentException(
+          "readPrimitiveField() cannot handle enums.");
+    }
+
+    throw new RuntimeException(
+      "There is no way to get here, but the compiler thinks otherwise.");
+  }
+
+  /** See {@link Message#writeTo(CodedOutputStream)}. */
+  public void writeTo(final CodedOutputStream output)
+                      throws IOException {
+    for (int i = 0; i < fields.getNumArrayEntries(); i++) {
+      final Map.Entry<FieldDescriptorType, Object> entry =
+          fields.getArrayEntryAt(i);
+      writeField(entry.getKey(), entry.getValue(), output);
+    }
+    for (final Map.Entry<FieldDescriptorType, Object> entry :
+         fields.getOverflowEntries()) {
+      writeField(entry.getKey(), entry.getValue(), output);
+    }
+  }
+
+  /**
+   * Like {@link #writeTo} but uses MessageSet wire format.
+   */
+  public void writeMessageSetTo(final CodedOutputStream output)
+                                throws IOException {
+    for (int i = 0; i < fields.getNumArrayEntries(); i++) {
+      writeMessageSetTo(fields.getArrayEntryAt(i), output);
+    }
+    for (final Map.Entry<FieldDescriptorType, Object> entry :
+             fields.getOverflowEntries()) {
+      writeMessageSetTo(entry, output);
+    }
+  }
+
+  private void writeMessageSetTo(
+      final Map.Entry<FieldDescriptorType, Object> entry,
+      final CodedOutputStream output) throws IOException {
+    final FieldDescriptorType descriptor = entry.getKey();
+    if (descriptor.getLiteJavaType() == WireFormat.JavaType.MESSAGE &&
+        !descriptor.isRepeated() && !descriptor.isPacked()) {
+      output.writeMessageSetExtension(entry.getKey().getNumber(),
+                                      (MessageLite) entry.getValue());
+    } else {
+      writeField(descriptor, entry.getValue(), output);
+    }
+  }
+
+  /**
+   * Write a single tag-value pair to the stream.
+   *
+   * @param output The output stream.
+   * @param type   The field's type.
+   * @param number The field's number.
+   * @param value  Object representing the field's value.  Must be of the exact
+   *               type which would be returned by
+   *               {@link Message#getField(Descriptors.FieldDescriptor)} for
+   *               this field.
+   */
+  private static void writeElement(final CodedOutputStream output,
+                                   final WireFormat.FieldType type,
+                                   final int number,
+                                   final Object value) throws IOException {
+    // Special case for groups, which need a start and end tag; other fields
+    // can just use writeTag() and writeFieldNoTag().
+    if (type == WireFormat.FieldType.GROUP) {
+      output.writeGroup(number, (MessageLite) value);
+    } else {
+      output.writeTag(number, getWireFormatForFieldType(type, false));
+      writeElementNoTag(output, type, value);
+    }
+  }
+
+  /**
+   * Write a field of arbitrary type, without its tag, to the stream.
+   *
+   * @param output The output stream.
+   * @param type The field's type.
+   * @param value  Object representing the field's value.  Must be of the exact
+   *               type which would be returned by
+   *               {@link Message#getField(Descriptors.FieldDescriptor)} for
+   *               this field.
+   */
+  private static void writeElementNoTag(
+      final CodedOutputStream output,
+      final WireFormat.FieldType type,
+      final Object value) throws IOException {
+    switch (type) {
+      case DOUBLE  : output.writeDoubleNoTag  ((Double     ) value); break;
+      case FLOAT   : output.writeFloatNoTag   ((Float      ) value); break;
+      case INT64   : output.writeInt64NoTag   ((Long       ) value); break;
+      case UINT64  : output.writeUInt64NoTag  ((Long       ) value); break;
+      case INT32   : output.writeInt32NoTag   ((Integer    ) value); break;
+      case FIXED64 : output.writeFixed64NoTag ((Long       ) value); break;
+      case FIXED32 : output.writeFixed32NoTag ((Integer    ) value); break;
+      case BOOL    : output.writeBoolNoTag    ((Boolean    ) value); break;
+      case STRING  : output.writeStringNoTag  ((String     ) value); break;
+      case GROUP   : output.writeGroupNoTag   ((MessageLite) value); break;
+      case MESSAGE : output.writeMessageNoTag ((MessageLite) value); break;
+      case BYTES   : output.writeBytesNoTag   ((ByteString ) value); break;
+      case UINT32  : output.writeUInt32NoTag  ((Integer    ) value); break;
+      case SFIXED32: output.writeSFixed32NoTag((Integer    ) value); break;
+      case SFIXED64: output.writeSFixed64NoTag((Long       ) value); break;
+      case SINT32  : output.writeSInt32NoTag  ((Integer    ) value); break;
+      case SINT64  : output.writeSInt64NoTag  ((Long       ) value); break;
+
+      case ENUM:
+        output.writeEnumNoTag(((Internal.EnumLite) value).getNumber());
+        break;
+    }
+  }
+
+  /** Write a single field. */
+  public static void writeField(final FieldDescriptorLite<?> descriptor,
+                                final Object value,
+                                final CodedOutputStream output)
+                                throws IOException {
+    WireFormat.FieldType type = descriptor.getLiteType();
+    int number = descriptor.getNumber();
+    if (descriptor.isRepeated()) {
+      final List<?> valueList = (List<?>)value;
+      if (descriptor.isPacked()) {
+        output.writeTag(number, WireFormat.WIRETYPE_LENGTH_DELIMITED);
+        // Compute the total data size so the length can be written.
+        int dataSize = 0;
+        for (final Object element : valueList) {
+          dataSize += computeElementSizeNoTag(type, element);
+        }
+        output.writeRawVarint32(dataSize);
+        // Write the data itself, without any tags.
+        for (final Object element : valueList) {
+          writeElementNoTag(output, type, element);
+        }
+      } else {
+        for (final Object element : valueList) {
+          writeElement(output, type, number, element);
+        }
+      }
+    } else {
+      writeElement(output, type, number, value);
+    }
+  }
+
+  /**
+   * See {@link Message#getSerializedSize()}.  It's up to the caller to cache
+   * the resulting size if desired.
+   */
+  public int getSerializedSize() {
+    int size = 0;
+    for (int i = 0; i < fields.getNumArrayEntries(); i++) {
+      final Map.Entry<FieldDescriptorType, Object> entry =
+          fields.getArrayEntryAt(i);
+      size += computeFieldSize(entry.getKey(), entry.getValue());
+    }
+    for (final Map.Entry<FieldDescriptorType, Object> entry :
+         fields.getOverflowEntries()) {
+      size += computeFieldSize(entry.getKey(), entry.getValue());
+    }
+    return size;
+  }
+
+  /**
+   * Like {@link #getSerializedSize} but uses MessageSet wire format.
+   */
+  public int getMessageSetSerializedSize() {
+    int size = 0;
+    for (int i = 0; i < fields.getNumArrayEntries(); i++) {
+      size += getMessageSetSerializedSize(fields.getArrayEntryAt(i));
+    }
+    for (final Map.Entry<FieldDescriptorType, Object> entry :
+             fields.getOverflowEntries()) {
+      size += getMessageSetSerializedSize(entry);
+    }
+    return size;
+  }
+
+  private int getMessageSetSerializedSize(
+      final Map.Entry<FieldDescriptorType, Object> entry) {
+    final FieldDescriptorType descriptor = entry.getKey();
+    if (descriptor.getLiteJavaType() == WireFormat.JavaType.MESSAGE &&
+        !descriptor.isRepeated() && !descriptor.isPacked()) {
+      return CodedOutputStream.computeMessageSetExtensionSize(
+          entry.getKey().getNumber(), (MessageLite) entry.getValue());
+    } else {
+      return computeFieldSize(descriptor, entry.getValue());
+    }
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode a
+   * single tag/value pair of arbitrary type.
+   *
+   * @param type   The field's type.
+   * @param number The field's number.
+   * @param value  Object representing the field's value.  Must be of the exact
+   *               type which would be returned by
+   *               {@link Message#getField(Descriptors.FieldDescriptor)} for
+   *               this field.
+   */
+  private static int computeElementSize(
+      final WireFormat.FieldType type,
+      final int number, final Object value) {
+    int tagSize = CodedOutputStream.computeTagSize(number);
+    if (type == WireFormat.FieldType.GROUP) {
+      tagSize *= 2;
+    }
+    return tagSize + computeElementSizeNoTag(type, value);
+  }
+
+  /**
+   * Compute the number of bytes that would be needed to encode a
+   * particular value of arbitrary type, excluding tag.
+   *
+   * @param type   The field's type.
+   * @param value  Object representing the field's value.  Must be of the exact
+   *               type which would be returned by
+   *               {@link Message#getField(Descriptors.FieldDescriptor)} for
+   *               this field.
+   */
+  private static int computeElementSizeNoTag(
+      final WireFormat.FieldType type, final Object value) {
+    switch (type) {
+      // Note:  Minor violation of 80-char limit rule here because this would
+      //   actually be harder to read if we wrapped the lines.
+      case DOUBLE  : return CodedOutputStream.computeDoubleSizeNoTag  ((Double     )value);
+      case FLOAT   : return CodedOutputStream.computeFloatSizeNoTag   ((Float      )value);
+      case INT64   : return CodedOutputStream.computeInt64SizeNoTag   ((Long       )value);
+      case UINT64  : return CodedOutputStream.computeUInt64SizeNoTag  ((Long       )value);
+      case INT32   : return CodedOutputStream.computeInt32SizeNoTag   ((Integer    )value);
+      case FIXED64 : return CodedOutputStream.computeFixed64SizeNoTag ((Long       )value);
+      case FIXED32 : return CodedOutputStream.computeFixed32SizeNoTag ((Integer    )value);
+      case BOOL    : return CodedOutputStream.computeBoolSizeNoTag    ((Boolean    )value);
+      case STRING  : return CodedOutputStream.computeStringSizeNoTag  ((String     )value);
+      case GROUP   : return CodedOutputStream.computeGroupSizeNoTag   ((MessageLite)value);
+      case MESSAGE : return CodedOutputStream.computeMessageSizeNoTag ((MessageLite)value);
+      case BYTES   : return CodedOutputStream.computeBytesSizeNoTag   ((ByteString )value);
+      case UINT32  : return CodedOutputStream.computeUInt32SizeNoTag  ((Integer    )value);
+      case SFIXED32: return CodedOutputStream.computeSFixed32SizeNoTag((Integer    )value);
+      case SFIXED64: return CodedOutputStream.computeSFixed64SizeNoTag((Long       )value);
+      case SINT32  : return CodedOutputStream.computeSInt32SizeNoTag  ((Integer    )value);
+      case SINT64  : return CodedOutputStream.computeSInt64SizeNoTag  ((Long       )value);
+
+      case ENUM:
+        return CodedOutputStream.computeEnumSizeNoTag(
+            ((Internal.EnumLite) value).getNumber());
+    }
+
+    throw new RuntimeException(
+      "There is no way to get here, but the compiler thinks otherwise.");
+  }
+
+  /**
+   * Compute the number of bytes needed to encode a particular field.
+   */
+  public static int computeFieldSize(final FieldDescriptorLite<?> descriptor,
+                                     final Object value) {
+    WireFormat.FieldType type = descriptor.getLiteType();
+    int number = descriptor.getNumber();
+    if (descriptor.isRepeated()) {
+      if (descriptor.isPacked()) {
+        int dataSize = 0;
+        for (final Object element : (List<?>)value) {
+          dataSize += computeElementSizeNoTag(type, element);
+        }
+        return dataSize +
+            CodedOutputStream.computeTagSize(number) +
+            CodedOutputStream.computeRawVarint32Size(dataSize);
+      } else {
+        int size = 0;
+        for (final Object element : (List<?>)value) {
+          size += computeElementSize(type, number, element);
+        }
+        return size;
+      }
+    } else {
+      return computeElementSize(type, number, value);
+    }
+  }
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/GeneratedMessage.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/GeneratedMessage.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/GeneratedMessage.java	(revision 15014)
@@ -0,0 +1,1834 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.Descriptors.Descriptor;
+import com.google.protobuf.Descriptors.EnumValueDescriptor;
+import com.google.protobuf.Descriptors.FieldDescriptor;
+
+import java.io.IOException;
+import java.io.ObjectStreamException;
+import java.io.Serializable;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * All generated protocol message classes extend this class.  This class
+ * implements most of the Message and Builder interfaces using Java reflection.
+ * Users can ignore this class and pretend that generated messages implement
+ * the Message interface directly.
+ *
+ * @author kenton@google.com Kenton Varda
+ */
+public abstract class GeneratedMessage extends AbstractMessage
+    implements Serializable {
+  private static final long serialVersionUID = 1L;
+
+  private final UnknownFieldSet unknownFields;
+
+  /**
+   * For testing. Allows a test to disable the optimization that avoids using
+   * field builders for nested messages until they are requested. By disabling
+   * this optimization, existing tests can be reused to test the field builders.
+   */
+  protected static boolean alwaysUseFieldBuilders = false;
+
+  protected GeneratedMessage() {
+    this.unknownFields = UnknownFieldSet.getDefaultInstance();
+  }
+
+  protected GeneratedMessage(Builder<?> builder) {
+    this.unknownFields = builder.getUnknownFields();
+  }
+
+ /**
+  * For testing. Allows a test to disable the optimization that avoids using
+  * field builders for nested messages until they are requested. By disabling
+  * this optimization, existing tests can be reused to test the field builders.
+  * See {@link RepeatedFieldBuilder} and {@link SingleFieldBuilder}.
+  */
+  static void enableAlwaysUseFieldBuildersForTesting() {
+    alwaysUseFieldBuilders = true;
+  }
+
+  /**
+   * Get the FieldAccessorTable for this type.  We can't have the message
+   * class pass this in to the constructor because of bootstrapping trouble
+   * with DescriptorProtos.
+   */
+  protected abstract FieldAccessorTable internalGetFieldAccessorTable();
+
+  //@Override (Java 1.6 override semantics, but we must support 1.5)
+  public Descriptor getDescriptorForType() {
+    return internalGetFieldAccessorTable().descriptor;
+  }
+
+  /** Internal helper which returns a mutable map. */
+  private Map<FieldDescriptor, Object> getAllFieldsMutable() {
+    final TreeMap<FieldDescriptor, Object> result =
+      new TreeMap<FieldDescriptor, Object>();
+    final Descriptor descriptor = internalGetFieldAccessorTable().descriptor;
+    for (final FieldDescriptor field : descriptor.getFields()) {
+      if (field.isRepeated()) {
+        final List<?> value = (List<?>) getField(field);
+        if (!value.isEmpty()) {
+          result.put(field, value);
+        }
+      } else {
+        if (hasField(field)) {
+          result.put(field, getField(field));
+        }
+      }
+    }
+    return result;
+  }
+
+  @Override
+  public boolean isInitialized() {
+    for (final FieldDescriptor field : getDescriptorForType().getFields()) {
+      // Check that all required fields are present.
+      if (field.isRequired()) {
+        if (!hasField(field)) {
+          return false;
+        }
+      }
+      // Check that embedded messages are initialized.
+      if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
+        if (field.isRepeated()) {
+          @SuppressWarnings("unchecked") final
+          List<Message> messageList = (List<Message>) getField(field);
+          for (final Message element : messageList) {
+            if (!element.isInitialized()) {
+              return false;
+            }
+          }
+        } else {
+          if (hasField(field) && !((Message) getField(field)).isInitialized()) {
+            return false;
+          }
+        }
+      }
+    }
+
+    return true;
+  }
+
+  //@Override (Java 1.6 override semantics, but we must support 1.5)
+  public Map<FieldDescriptor, Object> getAllFields() {
+    return Collections.unmodifiableMap(getAllFieldsMutable());
+  }
+
+  //@Override (Java 1.6 override semantics, but we must support 1.5)
+  public boolean hasField(final FieldDescriptor field) {
+    return internalGetFieldAccessorTable().getField(field).has(this);
+  }
+
+  //@Override (Java 1.6 override semantics, but we must support 1.5)
+  public Object getField(final FieldDescriptor field) {
+    return internalGetFieldAccessorTable().getField(field).get(this);
+  }
+
+  //@Override (Java 1.6 override semantics, but we must support 1.5)
+  public int getRepeatedFieldCount(final FieldDescriptor field) {
+    return internalGetFieldAccessorTable().getField(field)
+      .getRepeatedCount(this);
+  }
+
+  //@Override (Java 1.6 override semantics, but we must support 1.5)
+  public Object getRepeatedField(final FieldDescriptor field, final int index) {
+    return internalGetFieldAccessorTable().getField(field)
+      .getRepeated(this, index);
+  }
+
+  //@Override (Java 1.6 override semantics, but we must support 1.5)
+  public final UnknownFieldSet getUnknownFields() {
+    return unknownFields;
+  }
+
+  protected abstract Message.Builder newBuilderForType(BuilderParent parent);
+
+  /**
+   * Interface for the parent of a Builder that allows the builder to
+   * communicate invalidations back to the parent for use when using nested
+   * builders.
+   */
+  protected interface BuilderParent {
+
+    /**
+     * A builder becomes dirty whenever a field is modified -- including fields
+     * in nested builders -- and becomes clean when build() is called.  Thus,
+     * when a builder becomes dirty, all its parents become dirty as well, and
+     * when it becomes clean, all its children become clean.  The dirtiness
+     * state is used to invalidate certain cached values.
+     * <br>
+     * To this end, a builder calls markAsDirty() on its parent whenever it
+     * transitions from clean to dirty.  The parent must propagate this call to
+     * its own parent, unless it was already dirty, in which case the
+     * grandparent must necessarily already be dirty as well.  The parent can
+     * only transition back to "clean" after calling build() on all children.
+     */
+    void markDirty();
+  }
+
+  @SuppressWarnings("unchecked")
+  public abstract static class Builder <BuilderType extends Builder>
+      extends AbstractMessage.Builder<BuilderType> {
+
+    private BuilderParent builderParent;
+
+    private BuilderParentImpl meAsParent;
+
+    // Indicates that we've built a message and so we are now obligated
+    // to dispatch dirty invalidations. See GeneratedMessage.BuilderListener.
+    private boolean isClean;
+
+    private UnknownFieldSet unknownFields =
+        UnknownFieldSet.getDefaultInstance();
+
+    protected Builder() {
+      this(null);
+    }
+
+    protected Builder(BuilderParent builderParent) {
+      this.builderParent = builderParent;
+    }
+
+    void dispose() {
+      builderParent = null;
+    }
+
+    /**
+     * Called by the subclass when a message is built.
+     */
+    protected void onBuilt() {
+      if (builderParent != null) {
+        markClean();
+      }
+    }
+
+    /**
+     * Called by the subclass or a builder to notify us that a message was
+     * built and may be cached and therefore invalidations are needed.
+     */
+    protected void markClean() {
+      this.isClean = true;
+    }
+
+    /**
+     * Gets whether invalidations are needed
+     *
+     * @return whether invalidations are needed
+     */
+    protected boolean isClean() {
+      return isClean;
+    }
+
+    // This is implemented here only to work around an apparent bug in the
+    // Java compiler and/or build system.  See bug #1898463.  The mere presence
+    // of this dummy clone() implementation makes it go away.
+    @Override
+    public BuilderType clone() {
+      throw new UnsupportedOperationException(
+          "This is supposed to be overridden by subclasses.");
+    }
+
+    /**
+     * Called by the initialization and clear code paths to allow subclasses to
+     * reset any of their builtin fields back to the initial values.
+     */
+    public BuilderType clear() {
+      unknownFields = UnknownFieldSet.getDefaultInstance();
+      onChanged();
+      return (BuilderType) this;
+    }
+
+    /**
+     * Get the FieldAccessorTable for this type.  We can't have the message
+     * class pass this in to the constructor because of bootstrapping trouble
+     * with DescriptorProtos.
+     */
+    protected abstract FieldAccessorTable internalGetFieldAccessorTable();
+
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    public Descriptor getDescriptorForType() {
+      return internalGetFieldAccessorTable().descriptor;
+    }
+
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    public Map<FieldDescriptor, Object> getAllFields() {
+      return Collections.unmodifiableMap(getAllFieldsMutable());
+    }
+
+    /** Internal helper which returns a mutable map. */
+    private Map<FieldDescriptor, Object> getAllFieldsMutable() {
+      final TreeMap<FieldDescriptor, Object> result =
+        new TreeMap<FieldDescriptor, Object>();
+      final Descriptor descriptor = internalGetFieldAccessorTable().descriptor;
+      for (final FieldDescriptor field : descriptor.getFields()) {
+        if (field.isRepeated()) {
+          final List value = (List) getField(field);
+          if (!value.isEmpty()) {
+            result.put(field, value);
+          }
+        } else {
+          if (hasField(field)) {
+            result.put(field, getField(field));
+          }
+        }
+      }
+      return result;
+    }
+
+    public Message.Builder newBuilderForField(
+        final FieldDescriptor field) {
+      return internalGetFieldAccessorTable().getField(field).newBuilder();
+    }
+
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    public boolean hasField(final FieldDescriptor field) {
+      return internalGetFieldAccessorTable().getField(field).has(this);
+    }
+
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    public Object getField(final FieldDescriptor field) {
+      Object object = internalGetFieldAccessorTable().getField(field).get(this);
+      if (field.isRepeated()) {
+        // The underlying list object is still modifiable at this point.
+        // Make sure not to expose the modifiable list to the caller.
+        return Collections.unmodifiableList((List) object);
+      } else {
+        return object;
+      }
+    }
+
+    public BuilderType setField(final FieldDescriptor field,
+                                final Object value) {
+      internalGetFieldAccessorTable().getField(field).set(this, value);
+      return (BuilderType) this;
+    }
+
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    public BuilderType clearField(final FieldDescriptor field) {
+      internalGetFieldAccessorTable().getField(field).clear(this);
+      return (BuilderType) this;
+    }
+
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    public int getRepeatedFieldCount(final FieldDescriptor field) {
+      return internalGetFieldAccessorTable().getField(field)
+          .getRepeatedCount(this);
+    }
+
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    public Object getRepeatedField(final FieldDescriptor field,
+                                   final int index) {
+      return internalGetFieldAccessorTable().getField(field)
+          .getRepeated(this, index);
+    }
+
+    public BuilderType setRepeatedField(final FieldDescriptor field,
+                                        final int index, final Object value) {
+      internalGetFieldAccessorTable().getField(field)
+        .setRepeated(this, index, value);
+      return (BuilderType) this;
+    }
+
+    public BuilderType addRepeatedField(final FieldDescriptor field,
+                                        final Object value) {
+      internalGetFieldAccessorTable().getField(field).addRepeated(this, value);
+      return (BuilderType) this;
+    }
+
+    public final BuilderType setUnknownFields(
+        final UnknownFieldSet unknownFields) {
+      this.unknownFields = unknownFields;
+      onChanged();
+      return (BuilderType) this;
+    }
+
+    @Override
+    public final BuilderType mergeUnknownFields(
+        final UnknownFieldSet unknownFields) {
+      this.unknownFields =
+        UnknownFieldSet.newBuilder(this.unknownFields)
+                       .mergeFrom(unknownFields)
+                       .build();
+      onChanged();
+      return (BuilderType) this;
+    }
+
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    public boolean isInitialized() {
+      for (final FieldDescriptor field : getDescriptorForType().getFields()) {
+        // Check that all required fields are present.
+        if (field.isRequired()) {
+          if (!hasField(field)) {
+            return false;
+          }
+        }
+        // Check that embedded messages are initialized.
+        if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
+          if (field.isRepeated()) {
+            @SuppressWarnings("unchecked") final
+            List<Message> messageList = (List<Message>) getField(field);
+            for (final Message element : messageList) {
+              if (!element.isInitialized()) {
+                return false;
+              }
+            }
+          } else {
+            if (hasField(field) &&
+                !((Message) getField(field)).isInitialized()) {
+              return false;
+            }
+          }
+        }
+      }
+      return true;
+    }
+
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    public final UnknownFieldSet getUnknownFields() {
+      return unknownFields;
+    }
+
+    /**
+     * Called by subclasses to parse an unknown field.
+     * @return {@code true} unless the tag is an end-group tag.
+     */
+    protected boolean parseUnknownField(
+        final CodedInputStream input,
+        final UnknownFieldSet.Builder unknownFields,
+        final ExtensionRegistryLite extensionRegistry,
+        final int tag) throws IOException {
+      return unknownFields.mergeFieldFrom(tag, input);
+    }
+
+    /**
+     * Implementation of {@link BuilderParent} for giving to our children. This
+     * small inner class makes it so we don't publicly expose the BuilderParent
+     * methods.
+     */
+    private class BuilderParentImpl implements BuilderParent {
+
+      //@Override (Java 1.6 override semantics, but we must support 1.5)
+      public void markDirty() {
+        onChanged();
+      }
+    }
+
+    /**
+     * Gets the {@link BuilderParent} for giving to our children.
+     * @return The builder parent for our children.
+     */
+    protected BuilderParent getParentForChildren() {
+      if (meAsParent == null) {
+        meAsParent = new BuilderParentImpl();
+      }
+      return meAsParent;
+    }
+
+    /**
+     * Called when a the builder or one of its nested children has changed
+     * and any parent should be notified of its invalidation.
+     */
+    protected final void onChanged() {
+      if (isClean && builderParent != null) {
+        builderParent.markDirty();
+
+        // Don't keep dispatching invalidations until build is called again.
+        isClean = false;
+      }
+    }
+  }
+
+  // =================================================================
+  // Extensions-related stuff
+
+  public interface ExtendableMessageOrBuilder<
+      MessageType extends ExtendableMessage> extends MessageOrBuilder {
+
+    /** Check if a singular extension is present. */
+    <Type> boolean hasExtension(
+        GeneratedExtension<MessageType, Type> extension);
+
+    /** Get the number of elements in a repeated extension. */
+    <Type> int getExtensionCount(
+        GeneratedExtension<MessageType, List<Type>> extension);
+
+    /** Get the value of an extension. */
+    <Type> Type getExtension(GeneratedExtension<MessageType, Type> extension);
+
+    /** Get one element of a repeated extension. */
+    <Type> Type getExtension(
+        GeneratedExtension<MessageType, List<Type>> extension,
+        int index);
+  }
+
+  /**
+   * Generated message classes for message types that contain extension ranges
+   * subclass this.
+   *
+   * <p>This class implements type-safe accessors for extensions.  They
+   * implement all the same operations that you can do with normal fields --
+   * e.g. "has", "get", and "getCount" -- but for extensions.  The extensions
+   * are identified using instances of the class {@link GeneratedExtension};
+   * the protocol compiler generates a static instance of this class for every
+   * extension in its input.  Through the magic of generics, all is made
+   * type-safe.
+   *
+   * <p>For example, imagine you have the {@code .proto} file:
+   *
+   * <pre>
+   * option java_class = "MyProto";
+   *
+   * message Foo {
+   *   extensions 1000 to max;
+   * }
+   *
+   * extend Foo {
+   *   optional int32 bar;
+   * }
+   * </pre>
+   *
+   * <p>Then you might write code like:
+   *
+   * <pre>
+   * MyProto.Foo foo = getFoo();
+   * int i = foo.getExtension(MyProto.bar);
+   * </pre>
+   *
+   * <p>See also {@link ExtendableBuilder}.
+   */
+  public abstract static class ExtendableMessage<
+        MessageType extends ExtendableMessage>
+      extends GeneratedMessage
+      implements ExtendableMessageOrBuilder<MessageType> {
+
+    private final FieldSet<FieldDescriptor> extensions;
+
+    protected ExtendableMessage() {
+      this.extensions = FieldSet.newFieldSet();
+    }
+
+    protected ExtendableMessage(
+        ExtendableBuilder<MessageType, ?> builder) {
+      super(builder);
+      this.extensions = builder.buildExtensions();
+    }
+
+    private void verifyExtensionContainingType(
+        final GeneratedExtension<MessageType, ?> extension) {
+      if (extension.getDescriptor().getContainingType() !=
+          getDescriptorForType()) {
+        // This can only happen if someone uses unchecked operations.
+        throw new IllegalArgumentException(
+          "Extension is for type \"" +
+          extension.getDescriptor().getContainingType().getFullName() +
+          "\" which does not match message type \"" +
+          getDescriptorForType().getFullName() + "\".");
+      }
+    }
+
+    /** Check if a singular extension is present. */
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    public final <Type> boolean hasExtension(
+        final GeneratedExtension<MessageType, Type> extension) {
+      verifyExtensionContainingType(extension);
+      return extensions.hasField(extension.getDescriptor());
+    }
+
+    /** Get the number of elements in a repeated extension. */
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    public final <Type> int getExtensionCount(
+        final GeneratedExtension<MessageType, List<Type>> extension) {
+      verifyExtensionContainingType(extension);
+      final FieldDescriptor descriptor = extension.getDescriptor();
+      return extensions.getRepeatedFieldCount(descriptor);
+    }
+
+    /** Get the value of an extension. */
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    @SuppressWarnings("unchecked")
+    public final <Type> Type getExtension(
+        final GeneratedExtension<MessageType, Type> extension) {
+      verifyExtensionContainingType(extension);
+      FieldDescriptor descriptor = extension.getDescriptor();
+      final Object value = extensions.getField(descriptor);
+      if (value == null) {
+        if (descriptor.isRepeated()) {
+          return (Type) Collections.emptyList();
+        } else if (descriptor.getJavaType() ==
+                   FieldDescriptor.JavaType.MESSAGE) {
+          return (Type) extension.getMessageDefaultInstance();
+        } else {
+          return (Type) extension.fromReflectionType(
+              descriptor.getDefaultValue());
+        }
+      } else {
+        return (Type) extension.fromReflectionType(value);
+      }
+    }
+
+    /** Get one element of a repeated extension. */
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    @SuppressWarnings("unchecked")
+    public final <Type> Type getExtension(
+        final GeneratedExtension<MessageType, List<Type>> extension,
+        final int index) {
+      verifyExtensionContainingType(extension);
+      FieldDescriptor descriptor = extension.getDescriptor();
+      return (Type) extension.singularFromReflectionType(
+          extensions.getRepeatedField(descriptor, index));
+    }
+
+    /** Called by subclasses to check if all extensions are initialized. */
+    protected boolean extensionsAreInitialized() {
+      return extensions.isInitialized();
+    }
+
+    @Override
+    public boolean isInitialized() {
+      return super.isInitialized() && extensionsAreInitialized();
+    }
+
+    /**
+     * Used by subclasses to serialize extensions.  Extension ranges may be
+     * interleaved with field numbers, but we must write them in canonical
+     * (sorted by field number) order.  ExtensionWriter helps us write
+     * individual ranges of extensions at once.
+     */
+    protected class ExtensionWriter {
+      // Imagine how much simpler this code would be if Java iterators had
+      // a way to get the next element without advancing the iterator.
+
+      private final Iterator<Map.Entry<FieldDescriptor, Object>> iter =
+        extensions.iterator();
+      private Map.Entry<FieldDescriptor, Object> next;
+      private final boolean messageSetWireFormat;
+
+      private ExtensionWriter(final boolean messageSetWireFormat) {
+        if (iter.hasNext()) {
+          next = iter.next();
+        }
+        this.messageSetWireFormat = messageSetWireFormat;
+      }
+
+      public void writeUntil(final int end, final CodedOutputStream output)
+                             throws IOException {
+        while (next != null && next.getKey().getNumber() < end) {
+          FieldDescriptor descriptor = next.getKey();
+          if (messageSetWireFormat && descriptor.getLiteJavaType() ==
+                  WireFormat.JavaType.MESSAGE &&
+              !descriptor.isRepeated()) {
+            output.writeMessageSetExtension(descriptor.getNumber(),
+                                            (Message) next.getValue());
+          } else {
+            FieldSet.writeField(descriptor, next.getValue(), output);
+          }
+          if (iter.hasNext()) {
+            next = iter.next();
+          } else {
+            next = null;
+          }
+        }
+      }
+    }
+
+    protected ExtensionWriter newExtensionWriter() {
+      return new ExtensionWriter(false);
+    }
+    protected ExtensionWriter newMessageSetExtensionWriter() {
+      return new ExtensionWriter(true);
+    }
+
+    /** Called by subclasses to compute the size of extensions. */
+    protected int extensionsSerializedSize() {
+      return extensions.getSerializedSize();
+    }
+    protected int extensionsSerializedSizeAsMessageSet() {
+      return extensions.getMessageSetSerializedSize();
+    }
+
+    // ---------------------------------------------------------------
+    // Reflection
+
+    protected Map<FieldDescriptor, Object> getExtensionFields() {
+      return extensions.getAllFields();
+    }
+
+    @Override
+    public Map<FieldDescriptor, Object> getAllFields() {
+      final Map<FieldDescriptor, Object> result = super.getAllFieldsMutable();
+      result.putAll(getExtensionFields());
+      return Collections.unmodifiableMap(result);
+    }
+
+    @Override
+    public boolean hasField(final FieldDescriptor field) {
+      if (field.isExtension()) {
+        verifyContainingType(field);
+        return extensions.hasField(field);
+      } else {
+        return super.hasField(field);
+      }
+    }
+
+    @Override
+    public Object getField(final FieldDescriptor field) {
+      if (field.isExtension()) {
+        verifyContainingType(field);
+        final Object value = extensions.getField(field);
+        if (value == null) {
+          if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
+            // Lacking an ExtensionRegistry, we have no way to determine the
+            // extension's real type, so we return a DynamicMessage.
+            return DynamicMessage.getDefaultInstance(field.getMessageType());
+          } else {
+            return field.getDefaultValue();
+          }
+        } else {
+          return value;
+        }
+      } else {
+        return super.getField(field);
+      }
+    }
+
+    @Override
+    public int getRepeatedFieldCount(final FieldDescriptor field) {
+      if (field.isExtension()) {
+        verifyContainingType(field);
+        return extensions.getRepeatedFieldCount(field);
+      } else {
+        return super.getRepeatedFieldCount(field);
+      }
+    }
+
+    @Override
+    public Object getRepeatedField(final FieldDescriptor field,
+                                   final int index) {
+      if (field.isExtension()) {
+        verifyContainingType(field);
+        return extensions.getRepeatedField(field, index);
+      } else {
+        return super.getRepeatedField(field, index);
+      }
+    }
+
+    private void verifyContainingType(final FieldDescriptor field) {
+      if (field.getContainingType() != getDescriptorForType()) {
+        throw new IllegalArgumentException(
+          "FieldDescriptor does not match message type.");
+      }
+    }
+  }
+
+  /**
+   * Generated message builders for message types that contain extension ranges
+   * subclass this.
+   *
+   * <p>This class implements type-safe accessors for extensions.  They
+   * implement all the same operations that you can do with normal fields --
+   * e.g. "get", "set", and "add" -- but for extensions.  The extensions are
+   * identified using instances of the class {@link GeneratedExtension}; the
+   * protocol compiler generates a static instance of this class for every
+   * extension in its input.  Through the magic of generics, all is made
+   * type-safe.
+   *
+   * <p>For example, imagine you have the {@code .proto} file:
+   *
+   * <pre>
+   * option java_class = "MyProto";
+   *
+   * message Foo {
+   *   extensions 1000 to max;
+   * }
+   *
+   * extend Foo {
+   *   optional int32 bar;
+   * }
+   * </pre>
+   *
+   * <p>Then you might write code like:
+   *
+   * <pre>
+   * MyProto.Foo foo =
+   *   MyProto.Foo.newBuilder()
+   *     .setExtension(MyProto.bar, 123)
+   *     .build();
+   * </pre>
+   *
+   * <p>See also {@link ExtendableMessage}.
+   */
+  @SuppressWarnings("unchecked")
+  public abstract static class ExtendableBuilder<
+        MessageType extends ExtendableMessage,
+        BuilderType extends ExtendableBuilder>
+      extends Builder<BuilderType>
+      implements ExtendableMessageOrBuilder<MessageType> {
+
+    private FieldSet<FieldDescriptor> extensions = FieldSet.emptySet();
+
+    protected ExtendableBuilder() {}
+
+    protected ExtendableBuilder(
+        BuilderParent parent) {
+      super(parent);
+    }
+
+    @Override
+    public BuilderType clear() {
+      extensions = FieldSet.emptySet();
+      return super.clear();
+    }
+
+    // This is implemented here only to work around an apparent bug in the
+    // Java compiler and/or build system.  See bug #1898463.  The mere presence
+    // of this dummy clone() implementation makes it go away.
+    @Override
+    public BuilderType clone() {
+      throw new UnsupportedOperationException(
+          "This is supposed to be overridden by subclasses.");
+    }
+
+    private void ensureExtensionsIsMutable() {
+      if (extensions.isImmutable()) {
+        extensions = extensions.clone();
+      }
+    }
+
+    private void verifyExtensionContainingType(
+        final GeneratedExtension<MessageType, ?> extension) {
+      if (extension.getDescriptor().getContainingType() !=
+          getDescriptorForType()) {
+        // This can only happen if someone uses unchecked operations.
+        throw new IllegalArgumentException(
+          "Extension is for type \"" +
+          extension.getDescriptor().getContainingType().getFullName() +
+          "\" which does not match message type \"" +
+          getDescriptorForType().getFullName() + "\".");
+      }
+    }
+
+    /** Check if a singular extension is present. */
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    public final <Type> boolean hasExtension(
+        final GeneratedExtension<MessageType, Type> extension) {
+      verifyExtensionContainingType(extension);
+      return extensions.hasField(extension.getDescriptor());
+    }
+
+    /** Get the number of elements in a repeated extension. */
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    public final <Type> int getExtensionCount(
+        final GeneratedExtension<MessageType, List<Type>> extension) {
+      verifyExtensionContainingType(extension);
+      final FieldDescriptor descriptor = extension.getDescriptor();
+      return extensions.getRepeatedFieldCount(descriptor);
+    }
+
+    /** Get the value of an extension. */
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    public final <Type> Type getExtension(
+        final GeneratedExtension<MessageType, Type> extension) {
+      verifyExtensionContainingType(extension);
+      FieldDescriptor descriptor = extension.getDescriptor();
+      final Object value = extensions.getField(descriptor);
+      if (value == null) {
+        if (descriptor.isRepeated()) {
+          return (Type) Collections.emptyList();
+        } else if (descriptor.getJavaType() ==
+                   FieldDescriptor.JavaType.MESSAGE) {
+          return (Type) extension.getMessageDefaultInstance();
+        } else {
+          return (Type) extension.fromReflectionType(
+              descriptor.getDefaultValue());
+        }
+      } else {
+        return (Type) extension.fromReflectionType(value);
+      }
+    }
+
+    /** Get one element of a repeated extension. */
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    public final <Type> Type getExtension(
+        final GeneratedExtension<MessageType, List<Type>> extension,
+        final int index) {
+      verifyExtensionContainingType(extension);
+      FieldDescriptor descriptor = extension.getDescriptor();
+      return (Type) extension.singularFromReflectionType(
+          extensions.getRepeatedField(descriptor, index));
+    }
+
+    /** Set the value of an extension. */
+    public final <Type> BuilderType setExtension(
+        final GeneratedExtension<MessageType, Type> extension,
+        final Type value) {
+      verifyExtensionContainingType(extension);
+      ensureExtensionsIsMutable();
+      final FieldDescriptor descriptor = extension.getDescriptor();
+      extensions.setField(descriptor, extension.toReflectionType(value));
+      onChanged();
+      return (BuilderType) this;
+    }
+
+    /** Set the value of one element of a repeated extension. */
+    public final <Type> BuilderType setExtension(
+        final GeneratedExtension<MessageType, List<Type>> extension,
+        final int index, final Type value) {
+      verifyExtensionContainingType(extension);
+      ensureExtensionsIsMutable();
+      final FieldDescriptor descriptor = extension.getDescriptor();
+      extensions.setRepeatedField(
+        descriptor, index,
+        extension.singularToReflectionType(value));
+      onChanged();
+      return (BuilderType) this;
+    }
+
+    /** Append a value to a repeated extension. */
+    public final <Type> BuilderType addExtension(
+        final GeneratedExtension<MessageType, List<Type>> extension,
+        final Type value) {
+      verifyExtensionContainingType(extension);
+      ensureExtensionsIsMutable();
+      final FieldDescriptor descriptor = extension.getDescriptor();
+      extensions.addRepeatedField(
+          descriptor, extension.singularToReflectionType(value));
+      onChanged();
+      return (BuilderType) this;
+    }
+
+    /** Clear an extension. */
+    public final <Type> BuilderType clearExtension(
+        final GeneratedExtension<MessageType, ?> extension) {
+      verifyExtensionContainingType(extension);
+      ensureExtensionsIsMutable();
+      extensions.clearField(extension.getDescriptor());
+      onChanged();
+      return (BuilderType) this;
+    }
+
+    /** Called by subclasses to check if all extensions are initialized. */
+    protected boolean extensionsAreInitialized() {
+      return extensions.isInitialized();
+    }
+
+    /**
+     * Called by the build code path to create a copy of the extensions for
+     * building the message.
+     */
+    private FieldSet<FieldDescriptor> buildExtensions() {
+      extensions.makeImmutable();
+      return extensions;
+    }
+
+    @Override
+    public boolean isInitialized() {
+      return super.isInitialized() && extensionsAreInitialized();
+    }
+
+    /**
+     * Called by subclasses to parse an unknown field or an extension.
+     * @return {@code true} unless the tag is an end-group tag.
+     */
+    @Override
+    protected boolean parseUnknownField(
+        final CodedInputStream input,
+        final UnknownFieldSet.Builder unknownFields,
+        final ExtensionRegistryLite extensionRegistry,
+        final int tag) throws IOException {
+      return AbstractMessage.Builder.mergeFieldFrom(
+        input, unknownFields, extensionRegistry, this, tag);
+    }
+
+    // ---------------------------------------------------------------
+    // Reflection
+
+    @Override
+    public Map<FieldDescriptor, Object> getAllFields() {
+      final Map<FieldDescriptor, Object> result = super.getAllFieldsMutable();
+      result.putAll(extensions.getAllFields());
+      return Collections.unmodifiableMap(result);
+    }
+
+    @Override
+    public Object getField(final FieldDescriptor field) {
+      if (field.isExtension()) {
+        verifyContainingType(field);
+        final Object value = extensions.getField(field);
+        if (value == null) {
+          if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
+            // Lacking an ExtensionRegistry, we have no way to determine the
+            // extension's real type, so we return a DynamicMessage.
+            return DynamicMessage.getDefaultInstance(field.getMessageType());
+          } else {
+            return field.getDefaultValue();
+          }
+        } else {
+          return value;
+        }
+      } else {
+        return super.getField(field);
+      }
+    }
+
+    @Override
+    public int getRepeatedFieldCount(final FieldDescriptor field) {
+      if (field.isExtension()) {
+        verifyContainingType(field);
+        return extensions.getRepeatedFieldCount(field);
+      } else {
+        return super.getRepeatedFieldCount(field);
+      }
+    }
+
+    @Override
+    public Object getRepeatedField(final FieldDescriptor field,
+                                   final int index) {
+      if (field.isExtension()) {
+        verifyContainingType(field);
+        return extensions.getRepeatedField(field, index);
+      } else {
+        return super.getRepeatedField(field, index);
+      }
+    }
+
+    @Override
+    public boolean hasField(final FieldDescriptor field) {
+      if (field.isExtension()) {
+        verifyContainingType(field);
+        return extensions.hasField(field);
+      } else {
+        return super.hasField(field);
+      }
+    }
+
+    @Override
+    public BuilderType setField(final FieldDescriptor field,
+                                final Object value) {
+      if (field.isExtension()) {
+        verifyContainingType(field);
+        ensureExtensionsIsMutable();
+        extensions.setField(field, value);
+        onChanged();
+        return (BuilderType) this;
+      } else {
+        return super.setField(field, value);
+      }
+    }
+
+    @Override
+    public BuilderType clearField(final FieldDescriptor field) {
+      if (field.isExtension()) {
+        verifyContainingType(field);
+        ensureExtensionsIsMutable();
+        extensions.clearField(field);
+        onChanged();
+        return (BuilderType) this;
+      } else {
+        return super.clearField(field);
+      }
+    }
+
+    @Override
+    public BuilderType setRepeatedField(final FieldDescriptor field,
+                                        final int index, final Object value) {
+      if (field.isExtension()) {
+        verifyContainingType(field);
+        ensureExtensionsIsMutable();
+        extensions.setRepeatedField(field, index, value);
+        onChanged();
+        return (BuilderType) this;
+      } else {
+        return super.setRepeatedField(field, index, value);
+      }
+    }
+
+    @Override
+    public BuilderType addRepeatedField(final FieldDescriptor field,
+                                        final Object value) {
+      if (field.isExtension()) {
+        verifyContainingType(field);
+        ensureExtensionsIsMutable();
+        extensions.addRepeatedField(field, value);
+        onChanged();
+        return (BuilderType) this;
+      } else {
+        return super.addRepeatedField(field, value);
+      }
+    }
+
+    protected final void mergeExtensionFields(final ExtendableMessage other) {
+      ensureExtensionsIsMutable();
+      extensions.mergeFrom(other.extensions);
+      onChanged();
+    }
+
+    private void verifyContainingType(final FieldDescriptor field) {
+      if (field.getContainingType() != getDescriptorForType()) {
+        throw new IllegalArgumentException(
+          "FieldDescriptor does not match message type.");
+      }
+    }
+  }
+
+  // -----------------------------------------------------------------
+
+  /**
+   * Gets the descriptor for an extension. The implementation depends on whether
+   * the extension is scoped in the top level of a file or scoped in a Message.
+   */
+  private static interface ExtensionDescriptorRetriever {
+    FieldDescriptor getDescriptor();
+  }
+
+  /** For use by generated code only. */
+  public static <ContainingType extends Message, Type>
+      GeneratedExtension<ContainingType, Type>
+      newMessageScopedGeneratedExtension(final Message scope,
+                                         final int descriptorIndex,
+                                         final Class singularType,
+                                         final Message defaultInstance) {
+    // For extensions scoped within a Message, we use the Message to resolve
+    // the outer class's descriptor, from which the extension descriptor is
+    // obtained.
+    return new GeneratedExtension<ContainingType, Type>(
+        new ExtensionDescriptorRetriever() {
+          //@Override (Java 1.6 override semantics, but we must support 1.5)
+          public FieldDescriptor getDescriptor() {
+            return scope.getDescriptorForType().getExtensions()
+                .get(descriptorIndex);
+          }
+        },
+        singularType,
+        defaultInstance);
+  }
+
+  /** For use by generated code only. */
+  public static <ContainingType extends Message, Type>
+     GeneratedExtension<ContainingType, Type>
+     newFileScopedGeneratedExtension(final Class singularType,
+                                     final Message defaultInstance) {
+    // For extensions scoped within a file, we rely on the outer class's
+    // static initializer to call internalInit() on the extension when the
+    // descriptor is available.
+    return new GeneratedExtension<ContainingType, Type>(
+        null,  // ExtensionDescriptorRetriever is initialized in internalInit();
+        singularType,
+        defaultInstance);
+  }
+
+  /**
+   * Type used to represent generated extensions.  The protocol compiler
+   * generates a static singleton instance of this class for each extension.
+   *
+   * <p>For example, imagine you have the {@code .proto} file:
+   *
+   * <pre>
+   * option java_class = "MyProto";
+   *
+   * message Foo {
+   *   extensions 1000 to max;
+   * }
+   *
+   * extend Foo {
+   *   optional int32 bar;
+   * }
+   * </pre>
+   *
+   * <p>Then, {@code MyProto.Foo.bar} has type
+   * {@code GeneratedExtension<MyProto.Foo, Integer>}.
+   *
+   * <p>In general, users should ignore the details of this type, and simply use
+   * these static singletons as parameters to the extension accessors defined
+   * in {@link ExtendableMessage} and {@link ExtendableBuilder}.
+   */
+  public static final class GeneratedExtension<
+      ContainingType extends Message, Type> {
+    // TODO(kenton):  Find ways to avoid using Java reflection within this
+    //   class.  Also try to avoid suppressing unchecked warnings.
+
+    // We can't always initialize the descriptor of a GeneratedExtension when
+    // we first construct it due to initialization order difficulties (namely,
+    // the descriptor may not have been constructed yet, since it is often
+    // constructed by the initializer of a separate module).
+    //
+    // In the case of nested extensions, we initialize the
+    // ExtensionDescriptorRetriever with an instance that uses the scoping
+    // Message's default instance to retrieve the extension's descriptor.
+    //
+    // In the case of non-nested extensions, we initialize the
+    // ExtensionDescriptorRetriever to null and rely on the outer class's static
+    // initializer to call internalInit() after the descriptor has been parsed.
+    private GeneratedExtension(ExtensionDescriptorRetriever descriptorRetriever,
+                               Class singularType,
+                               Message messageDefaultInstance) {
+      if (Message.class.isAssignableFrom(singularType) &&
+          !singularType.isInstance(messageDefaultInstance)) {
+        throw new IllegalArgumentException(
+            "Bad messageDefaultInstance for " + singularType.getName());
+      }
+      this.descriptorRetriever = descriptorRetriever;
+      this.singularType = singularType;
+      this.messageDefaultInstance = messageDefaultInstance;
+
+      if (ProtocolMessageEnum.class.isAssignableFrom(singularType)) {
+        this.enumValueOf = getMethodOrDie(singularType, "valueOf",
+                                          EnumValueDescriptor.class);
+        this.enumGetValueDescriptor =
+            getMethodOrDie(singularType, "getValueDescriptor");
+      } else {
+        this.enumValueOf = null;
+        this.enumGetValueDescriptor = null;
+      }
+    }
+
+    /** For use by generated code only. */
+    public void internalInit(final FieldDescriptor descriptor) {
+      if (descriptorRetriever != null) {
+        throw new IllegalStateException("Already initialized.");
+      }
+      descriptorRetriever = new ExtensionDescriptorRetriever() {
+          //@Override (Java 1.6 override semantics, but we must support 1.5)
+          public FieldDescriptor getDescriptor() {
+            return descriptor;
+          }
+        };
+    }
+
+    private ExtensionDescriptorRetriever descriptorRetriever;
+    private final Class singularType;
+    private final Message messageDefaultInstance;
+    private final Method enumValueOf;
+    private final Method enumGetValueDescriptor;
+
+    public FieldDescriptor getDescriptor() {
+      if (descriptorRetriever == null) {
+        throw new IllegalStateException(
+            "getDescriptor() called before internalInit()");
+      }
+      return descriptorRetriever.getDescriptor();
+    }
+
+    /**
+     * If the extension is an embedded message or group, returns the default
+     * instance of the message.
+     */
+    public Message getMessageDefaultInstance() {
+      return messageDefaultInstance;
+    }
+
+    /**
+     * Convert from the type used by the reflection accessors to the type used
+     * by native accessors.  E.g., for enums, the reflection accessors use
+     * EnumValueDescriptors but the native accessors use the generated enum
+     * type.
+     */
+    @SuppressWarnings("unchecked")
+    private Object fromReflectionType(final Object value) {
+      FieldDescriptor descriptor = getDescriptor();
+      if (descriptor.isRepeated()) {
+        if (descriptor.getJavaType() == FieldDescriptor.JavaType.MESSAGE ||
+            descriptor.getJavaType() == FieldDescriptor.JavaType.ENUM) {
+          // Must convert the whole list.
+          final List result = new ArrayList();
+          for (final Object element : (List) value) {
+            result.add(singularFromReflectionType(element));
+          }
+          return result;
+        } else {
+          return value;
+        }
+      } else {
+        return singularFromReflectionType(value);
+      }
+    }
+
+    /**
+     * Like {@link #fromReflectionType(Object)}, but if the type is a repeated
+     * type, this converts a single element.
+     */
+    private Object singularFromReflectionType(final Object value) {
+      FieldDescriptor descriptor = getDescriptor();
+      switch (descriptor.getJavaType()) {
+        case MESSAGE:
+          if (singularType.isInstance(value)) {
+            return value;
+          } else {
+            // It seems the copy of the embedded message stored inside the
+            // extended message is not of the exact type the user was
+            // expecting.  This can happen if a user defines a
+            // GeneratedExtension manually and gives it a different type.
+            // This should not happen in normal use.  But, to be nice, we'll
+            // copy the message to whatever type the caller was expecting.
+            return messageDefaultInstance.newBuilderForType()
+                           .mergeFrom((Message) value).build();
+          }
+        case ENUM:
+          return invokeOrDie(enumValueOf, null, (EnumValueDescriptor) value);
+        default:
+          return value;
+      }
+    }
+
+    /**
+     * Convert from the type used by the native accessors to the type used
+     * by reflection accessors.  E.g., for enums, the reflection accessors use
+     * EnumValueDescriptors but the native accessors use the generated enum
+     * type.
+     */
+    @SuppressWarnings("unchecked")
+    private Object toReflectionType(final Object value) {
+      FieldDescriptor descriptor = getDescriptor();
+      if (descriptor.isRepeated()) {
+        if (descriptor.getJavaType() == FieldDescriptor.JavaType.ENUM) {
+          // Must convert the whole list.
+          final List result = new ArrayList();
+          for (final Object element : (List) value) {
+            result.add(singularToReflectionType(element));
+          }
+          return result;
+        } else {
+          return value;
+        }
+      } else {
+        return singularToReflectionType(value);
+      }
+    }
+
+    /**
+     * Like {@link #toReflectionType(Object)}, but if the type is a repeated
+     * type, this converts a single element.
+     */
+    private Object singularToReflectionType(final Object value) {
+      FieldDescriptor descriptor = getDescriptor();
+      switch (descriptor.getJavaType()) {
+        case ENUM:
+          return invokeOrDie(enumGetValueDescriptor, value);
+        default:
+          return value;
+      }
+    }
+  }
+
+  // =================================================================
+
+  /** Calls Class.getMethod and throws a RuntimeException if it fails. */
+  @SuppressWarnings("unchecked")
+  private static Method getMethodOrDie(
+      final Class clazz, final String name, final Class... params) {
+    try {
+      return clazz.getMethod(name, params);
+    } catch (NoSuchMethodException e) {
+      throw new RuntimeException(
+        "Generated message class \"" + clazz.getName() +
+        "\" missing method \"" + name + "\".", e);
+    }
+  }
+
+  /** Calls invoke and throws a RuntimeException if it fails. */
+  private static Object invokeOrDie(
+      final Method method, final Object object, final Object... params) {
+    try {
+      return method.invoke(object, params);
+    } catch (IllegalAccessException e) {
+      throw new RuntimeException(
+        "Couldn't use Java reflection to implement protocol message " +
+        "reflection.", e);
+    } catch (InvocationTargetException e) {
+      final Throwable cause = e.getCause();
+      if (cause instanceof RuntimeException) {
+        throw (RuntimeException) cause;
+      } else if (cause instanceof Error) {
+        throw (Error) cause;
+      } else {
+        throw new RuntimeException(
+          "Unexpected exception thrown by generated accessor method.", cause);
+      }
+    }
+  }
+
+  /**
+   * Users should ignore this class.  This class provides the implementation
+   * with access to the fields of a message object using Java reflection.
+   */
+  public static final class FieldAccessorTable {
+
+    /**
+     * Construct a FieldAccessorTable for a particular message class.  Only
+     * one FieldAccessorTable should ever be constructed per class.
+     *
+     * @param descriptor     The type's descriptor.
+     * @param camelCaseNames The camelcase names of all fields in the message.
+     *                       These are used to derive the accessor method names.
+     * @param messageClass   The message type.
+     * @param builderClass   The builder type.
+     */
+    public FieldAccessorTable(
+        final Descriptor descriptor,
+        final String[] camelCaseNames,
+        final Class<? extends GeneratedMessage> messageClass,
+        final Class<? extends Builder> builderClass) {
+      this.descriptor = descriptor;
+      fields = new FieldAccessor[descriptor.getFields().size()];
+
+      for (int i = 0; i < fields.length; i++) {
+        final FieldDescriptor field = descriptor.getFields().get(i);
+        if (field.isRepeated()) {
+          if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
+            fields[i] = new RepeatedMessageFieldAccessor(
+              field, camelCaseNames[i], messageClass, builderClass);
+          } else if (field.getJavaType() == FieldDescriptor.JavaType.ENUM) {
+            fields[i] = new RepeatedEnumFieldAccessor(
+              field, camelCaseNames[i], messageClass, builderClass);
+          } else {
+            fields[i] = new RepeatedFieldAccessor(
+              field, camelCaseNames[i], messageClass, builderClass);
+          }
+        } else {
+          if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
+            fields[i] = new SingularMessageFieldAccessor(
+              field, camelCaseNames[i], messageClass, builderClass);
+          } else if (field.getJavaType() == FieldDescriptor.JavaType.ENUM) {
+            fields[i] = new SingularEnumFieldAccessor(
+              field, camelCaseNames[i], messageClass, builderClass);
+          } else {
+            fields[i] = new SingularFieldAccessor(
+              field, camelCaseNames[i], messageClass, builderClass);
+          }
+        }
+      }
+    }
+
+    private final Descriptor descriptor;
+    private final FieldAccessor[] fields;
+
+    /** Get the FieldAccessor for a particular field. */
+    private FieldAccessor getField(final FieldDescriptor field) {
+      if (field.getContainingType() != descriptor) {
+        throw new IllegalArgumentException(
+          "FieldDescriptor does not match message type.");
+      } else if (field.isExtension()) {
+        // If this type had extensions, it would subclass ExtendableMessage,
+        // which overrides the reflection interface to handle extensions.
+        throw new IllegalArgumentException(
+          "This type does not have extensions.");
+      }
+      return fields[field.getIndex()];
+    }
+
+    /**
+     * Abstract interface that provides access to a single field.  This is
+     * implemented differently depending on the field type and cardinality.
+     */
+    private interface FieldAccessor {
+      Object get(GeneratedMessage message);
+      Object get(GeneratedMessage.Builder builder);
+      void set(Builder builder, Object value);
+      Object getRepeated(GeneratedMessage message, int index);
+      Object getRepeated(GeneratedMessage.Builder builder, int index);
+      void setRepeated(Builder builder,
+                       int index, Object value);
+      void addRepeated(Builder builder, Object value);
+      boolean has(GeneratedMessage message);
+      boolean has(GeneratedMessage.Builder builder);
+      int getRepeatedCount(GeneratedMessage message);
+      int getRepeatedCount(GeneratedMessage.Builder builder);
+      void clear(Builder builder);
+      Message.Builder newBuilder();
+    }
+
+    // ---------------------------------------------------------------
+
+    private static class SingularFieldAccessor implements FieldAccessor {
+      SingularFieldAccessor(
+          final FieldDescriptor descriptor, final String camelCaseName,
+          final Class<? extends GeneratedMessage> messageClass,
+          final Class<? extends Builder> builderClass) {
+        getMethod = getMethodOrDie(messageClass, "get" + camelCaseName);
+        getMethodBuilder = getMethodOrDie(builderClass, "get" + camelCaseName);
+        type = getMethod.getReturnType();
+        setMethod = getMethodOrDie(builderClass, "set" + camelCaseName, type);
+        hasMethod =
+            getMethodOrDie(messageClass, "has" + camelCaseName);
+        hasMethodBuilder =
+            getMethodOrDie(builderClass, "has" + camelCaseName);
+        clearMethod = getMethodOrDie(builderClass, "clear" + camelCaseName);
+      }
+
+      // Note:  We use Java reflection to call public methods rather than
+      //   access private fields directly as this avoids runtime security
+      //   checks.
+      protected final Class<?> type;
+      protected final Method getMethod;
+      protected final Method getMethodBuilder;
+      protected final Method setMethod;
+      protected final Method hasMethod;
+      protected final Method hasMethodBuilder;
+      protected final Method clearMethod;
+
+      public Object get(final GeneratedMessage message) {
+        return invokeOrDie(getMethod, message);
+      }
+      public Object get(GeneratedMessage.Builder builder) {
+        return invokeOrDie(getMethodBuilder, builder);
+      }
+      public void set(final Builder builder, final Object value) {
+        invokeOrDie(setMethod, builder, value);
+      }
+      public Object getRepeated(final GeneratedMessage message,
+                                final int index) {
+        throw new UnsupportedOperationException(
+          "getRepeatedField() called on a singular field.");
+      }
+      public Object getRepeated(GeneratedMessage.Builder builder, int index) {
+        throw new UnsupportedOperationException(
+          "getRepeatedField() called on a singular field.");
+      }
+      public void setRepeated(final Builder builder,
+                              final int index, final Object value) {
+        throw new UnsupportedOperationException(
+          "setRepeatedField() called on a singular field.");
+      }
+      public void addRepeated(final Builder builder, final Object value) {
+        throw new UnsupportedOperationException(
+          "addRepeatedField() called on a singular field.");
+      }
+      public boolean has(final GeneratedMessage message) {
+        return (Boolean) invokeOrDie(hasMethod, message);
+      }
+      public boolean has(GeneratedMessage.Builder builder) {
+        return (Boolean) invokeOrDie(hasMethodBuilder, builder);
+      }
+      public int getRepeatedCount(final GeneratedMessage message) {
+        throw new UnsupportedOperationException(
+          "getRepeatedFieldSize() called on a singular field.");
+      }
+      public int getRepeatedCount(GeneratedMessage.Builder builder) {
+        throw new UnsupportedOperationException(
+          "getRepeatedFieldSize() called on a singular field.");
+      }
+      public void clear(final Builder builder) {
+        invokeOrDie(clearMethod, builder);
+      }
+      public Message.Builder newBuilder() {
+        throw new UnsupportedOperationException(
+          "newBuilderForField() called on a non-Message type.");
+      }
+    }
+
+    private static class RepeatedFieldAccessor implements FieldAccessor {
+      protected final Class type;
+      protected final Method getMethod;
+      protected final Method getMethodBuilder;
+      protected final Method getRepeatedMethod;
+      protected final Method getRepeatedMethodBuilder;
+      protected final Method setRepeatedMethod;
+      protected final Method addRepeatedMethod;
+      protected final Method getCountMethod;
+      protected final Method getCountMethodBuilder;
+      protected final Method clearMethod;
+
+      RepeatedFieldAccessor(
+          final FieldDescriptor descriptor, final String camelCaseName,
+          final Class<? extends GeneratedMessage> messageClass,
+          final Class<? extends Builder> builderClass) {
+        getMethod = getMethodOrDie(messageClass,
+                                   "get" + camelCaseName + "List");
+        getMethodBuilder = getMethodOrDie(builderClass,
+                                   "get" + camelCaseName + "List");
+
+
+        getRepeatedMethod =
+            getMethodOrDie(messageClass, "get" + camelCaseName, Integer.TYPE);
+        getRepeatedMethodBuilder =
+            getMethodOrDie(builderClass, "get" + camelCaseName, Integer.TYPE);
+        type = getRepeatedMethod.getReturnType();
+        setRepeatedMethod =
+            getMethodOrDie(builderClass, "set" + camelCaseName,
+                           Integer.TYPE, type);
+        addRepeatedMethod =
+            getMethodOrDie(builderClass, "add" + camelCaseName, type);
+        getCountMethod =
+            getMethodOrDie(messageClass, "get" + camelCaseName + "Count");
+        getCountMethodBuilder =
+            getMethodOrDie(builderClass, "get" + camelCaseName + "Count");
+
+        clearMethod = getMethodOrDie(builderClass, "clear" + camelCaseName);
+      }
+
+      public Object get(final GeneratedMessage message) {
+        return invokeOrDie(getMethod, message);
+      }
+      public Object get(GeneratedMessage.Builder builder) {
+        return invokeOrDie(getMethodBuilder, builder);
+      }
+      public void set(final Builder builder, final Object value) {
+        // Add all the elements individually.  This serves two purposes:
+        // 1) Verifies that each element has the correct type.
+        // 2) Insures that the caller cannot modify the list later on and
+        //    have the modifications be reflected in the message.
+        clear(builder);
+        for (final Object element : (List<?>) value) {
+          addRepeated(builder, element);
+        }
+      }
+      public Object getRepeated(final GeneratedMessage message,
+                                final int index) {
+        return invokeOrDie(getRepeatedMethod, message, index);
+      }
+      public Object getRepeated(GeneratedMessage.Builder builder, int index) {
+        return invokeOrDie(getRepeatedMethodBuilder, builder, index);
+      }
+      public void setRepeated(final Builder builder,
+                              final int index, final Object value) {
+        invokeOrDie(setRepeatedMethod, builder, index, value);
+      }
+      public void addRepeated(final Builder builder, final Object value) {
+        invokeOrDie(addRepeatedMethod, builder, value);
+      }
+      public boolean has(final GeneratedMessage message) {
+        throw new UnsupportedOperationException(
+          "hasField() called on a singular field.");
+      }
+      public boolean has(GeneratedMessage.Builder builder) {
+        throw new UnsupportedOperationException(
+          "hasField() called on a singular field.");
+      }
+      public int getRepeatedCount(final GeneratedMessage message) {
+        return (Integer) invokeOrDie(getCountMethod, message);
+      }
+      public int getRepeatedCount(GeneratedMessage.Builder builder) {
+        return (Integer) invokeOrDie(getCountMethodBuilder, builder);
+      }
+      public void clear(final Builder builder) {
+        invokeOrDie(clearMethod, builder);
+      }
+      public Message.Builder newBuilder() {
+        throw new UnsupportedOperationException(
+          "newBuilderForField() called on a non-Message type.");
+      }
+    }
+
+    // ---------------------------------------------------------------
+
+    private static final class SingularEnumFieldAccessor
+        extends SingularFieldAccessor {
+      SingularEnumFieldAccessor(
+          final FieldDescriptor descriptor, final String camelCaseName,
+          final Class<? extends GeneratedMessage> messageClass,
+          final Class<? extends Builder> builderClass) {
+        super(descriptor, camelCaseName, messageClass, builderClass);
+
+        valueOfMethod = getMethodOrDie(type, "valueOf",
+                                       EnumValueDescriptor.class);
+        getValueDescriptorMethod =
+          getMethodOrDie(type, "getValueDescriptor");
+      }
+
+      private Method valueOfMethod;
+      private Method getValueDescriptorMethod;
+
+      @Override
+      public Object get(final GeneratedMessage message) {
+        return invokeOrDie(getValueDescriptorMethod, super.get(message));
+      }
+
+      @Override
+      public Object get(final GeneratedMessage.Builder builder) {
+        return invokeOrDie(getValueDescriptorMethod, super.get(builder));
+      }
+
+      @Override
+      public void set(final Builder builder, final Object value) {
+        super.set(builder, invokeOrDie(valueOfMethod, null, value));
+      }
+    }
+
+    private static final class RepeatedEnumFieldAccessor
+        extends RepeatedFieldAccessor {
+      RepeatedEnumFieldAccessor(
+          final FieldDescriptor descriptor, final String camelCaseName,
+          final Class<? extends GeneratedMessage> messageClass,
+          final Class<? extends Builder> builderClass) {
+        super(descriptor, camelCaseName, messageClass, builderClass);
+
+        valueOfMethod = getMethodOrDie(type, "valueOf",
+                                       EnumValueDescriptor.class);
+        getValueDescriptorMethod =
+          getMethodOrDie(type, "getValueDescriptor");
+      }
+
+      private final Method valueOfMethod;
+      private final Method getValueDescriptorMethod;
+
+      @Override
+      @SuppressWarnings("unchecked")
+      public Object get(final GeneratedMessage message) {
+        final List newList = new ArrayList();
+        for (final Object element : (List) super.get(message)) {
+          newList.add(invokeOrDie(getValueDescriptorMethod, element));
+        }
+        return Collections.unmodifiableList(newList);
+      }
+
+      @Override
+      @SuppressWarnings("unchecked")
+      public Object get(final GeneratedMessage.Builder builder) {
+        final List newList = new ArrayList();
+        for (final Object element : (List) super.get(builder)) {
+          newList.add(invokeOrDie(getValueDescriptorMethod, element));
+        }
+        return Collections.unmodifiableList(newList);
+      }
+
+      @Override
+      public Object getRepeated(final GeneratedMessage message,
+                                final int index) {
+        return invokeOrDie(getValueDescriptorMethod,
+          super.getRepeated(message, index));
+      }
+      @Override
+      public Object getRepeated(final GeneratedMessage.Builder builder,
+                                final int index) {
+        return invokeOrDie(getValueDescriptorMethod,
+          super.getRepeated(builder, index));
+      }
+      @Override
+      public void setRepeated(final Builder builder,
+                              final int index, final Object value) {
+        super.setRepeated(builder, index, invokeOrDie(valueOfMethod, null,
+                          value));
+      }
+      @Override
+      public void addRepeated(final Builder builder, final Object value) {
+        super.addRepeated(builder, invokeOrDie(valueOfMethod, null, value));
+      }
+    }
+
+    // ---------------------------------------------------------------
+
+    private static final class SingularMessageFieldAccessor
+        extends SingularFieldAccessor {
+      SingularMessageFieldAccessor(
+          final FieldDescriptor descriptor, final String camelCaseName,
+          final Class<? extends GeneratedMessage> messageClass,
+          final Class<? extends Builder> builderClass) {
+        super(descriptor, camelCaseName, messageClass, builderClass);
+
+        newBuilderMethod = getMethodOrDie(type, "newBuilder");
+      }
+
+      private final Method newBuilderMethod;
+
+      private Object coerceType(final Object value) {
+        if (type.isInstance(value)) {
+          return value;
+        } else {
+          // The value is not the exact right message type.  However, if it
+          // is an alternative implementation of the same type -- e.g. a
+          // DynamicMessage -- we should accept it.  In this case we can make
+          // a copy of the message.
+          return ((Message.Builder) invokeOrDie(newBuilderMethod, null))
+                  .mergeFrom((Message) value).build();
+        }
+      }
+
+      @Override
+      public void set(final Builder builder, final Object value) {
+        super.set(builder, coerceType(value));
+      }
+      @Override
+      public Message.Builder newBuilder() {
+        return (Message.Builder) invokeOrDie(newBuilderMethod, null);
+      }
+    }
+
+    private static final class RepeatedMessageFieldAccessor
+        extends RepeatedFieldAccessor {
+      RepeatedMessageFieldAccessor(
+          final FieldDescriptor descriptor, final String camelCaseName,
+          final Class<? extends GeneratedMessage> messageClass,
+          final Class<? extends Builder> builderClass) {
+        super(descriptor, camelCaseName, messageClass, builderClass);
+
+        newBuilderMethod = getMethodOrDie(type, "newBuilder");
+      }
+
+      private final Method newBuilderMethod;
+
+      private Object coerceType(final Object value) {
+        if (type.isInstance(value)) {
+          return value;
+        } else {
+          // The value is not the exact right message type.  However, if it
+          // is an alternative implementation of the same type -- e.g. a
+          // DynamicMessage -- we should accept it.  In this case we can make
+          // a copy of the message.
+          return ((Message.Builder) invokeOrDie(newBuilderMethod, null))
+                  .mergeFrom((Message) value).build();
+        }
+      }
+
+      @Override
+      public void setRepeated(final Builder builder,
+                              final int index, final Object value) {
+        super.setRepeated(builder, index, coerceType(value));
+      }
+      @Override
+      public void addRepeated(final Builder builder, final Object value) {
+        super.addRepeated(builder, coerceType(value));
+      }
+      @Override
+      public Message.Builder newBuilder() {
+        return (Message.Builder) invokeOrDie(newBuilderMethod, null);
+      }
+    }
+  }
+
+  /**
+   * Replaces this object in the output stream with a serialized form.
+   * Part of Java's serialization magic.  Generated sub-classes must override
+   * this method by calling <code>return super.writeReplace();</code>
+   * @return a SerializedForm of this message
+   */
+  protected Object writeReplace() throws ObjectStreamException {
+    return new GeneratedMessageLite.SerializedForm(this);
+  }
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/GeneratedMessageLite.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/GeneratedMessageLite.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/GeneratedMessageLite.java	(revision 15014)
@@ -0,0 +1,731 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import java.io.IOException;
+import java.io.ObjectStreamException;
+import java.io.Serializable;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Lite version of {@link GeneratedMessage}.
+ *
+ * @author kenton@google.com Kenton Varda
+ */
+public abstract class GeneratedMessageLite extends AbstractMessageLite
+    implements Serializable {
+  private static final long serialVersionUID = 1L;
+
+  protected GeneratedMessageLite() {
+  }
+
+  protected GeneratedMessageLite(Builder builder) {
+  }
+
+  @SuppressWarnings("unchecked")
+  public abstract static class Builder<MessageType extends GeneratedMessageLite,
+                                       BuilderType extends Builder>
+      extends AbstractMessageLite.Builder<BuilderType> {
+    protected Builder() {}
+
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    public BuilderType clear() {
+      return (BuilderType) this;
+    }
+
+    // This is implemented here only to work around an apparent bug in the
+    // Java compiler and/or build system.  See bug #1898463.  The mere presence
+    // of this dummy clone() implementation makes it go away.
+    @Override
+    public BuilderType clone() {
+      throw new UnsupportedOperationException(
+          "This is supposed to be overridden by subclasses.");
+    }
+
+    /** All subclasses implement this. */
+    public abstract BuilderType mergeFrom(MessageType message);
+
+    // Defined here for return type covariance.
+    public abstract MessageType getDefaultInstanceForType();
+
+    /**
+     * Called by subclasses to parse an unknown field.
+     * @return {@code true} unless the tag is an end-group tag.
+     */
+    protected boolean parseUnknownField(
+        final CodedInputStream input,
+        final ExtensionRegistryLite extensionRegistry,
+        final int tag) throws IOException {
+      return input.skipField(tag);
+    }
+  }
+
+  // =================================================================
+  // Extensions-related stuff
+
+  /**
+   * Lite equivalent of {@link com.google.protobuf.GeneratedMessage.ExtendableMessageOrBuilder}.
+   */
+  public interface ExtendableMessageOrBuilder<
+      MessageType extends ExtendableMessage> extends MessageLiteOrBuilder {
+
+    /** Check if a singular extension is present. */
+    <Type> boolean hasExtension(
+        GeneratedExtension<MessageType, Type> extension);
+
+    /** Get the number of elements in a repeated extension. */
+    <Type> int getExtensionCount(
+        GeneratedExtension<MessageType, List<Type>> extension);
+
+    /** Get the value of an extension. */
+    <Type> Type getExtension(GeneratedExtension<MessageType, Type> extension);
+
+    /** Get one element of a repeated extension. */
+    <Type> Type getExtension(
+        GeneratedExtension<MessageType, List<Type>> extension,
+        int index);
+  }
+
+  /**
+   * Lite equivalent of {@link GeneratedMessage.ExtendableMessage}.
+   */
+  public abstract static class ExtendableMessage<
+        MessageType extends ExtendableMessage<MessageType>>
+      extends GeneratedMessageLite
+      implements ExtendableMessageOrBuilder<MessageType> {
+
+    private final FieldSet<ExtensionDescriptor> extensions;
+
+    protected ExtendableMessage() {
+      this.extensions = FieldSet.newFieldSet();
+    }
+
+    protected ExtendableMessage(ExtendableBuilder<MessageType, ?> builder) {
+      this.extensions = builder.buildExtensions();
+    }
+
+    private void verifyExtensionContainingType(
+        final GeneratedExtension<MessageType, ?> extension) {
+      if (extension.getContainingTypeDefaultInstance() !=
+          getDefaultInstanceForType()) {
+        // This can only happen if someone uses unchecked operations.
+        throw new IllegalArgumentException(
+          "This extension is for a different message type.  Please make " +
+          "sure that you are not suppressing any generics type warnings.");
+      }
+    }
+
+    /** Check if a singular extension is present. */
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    public final <Type> boolean hasExtension(
+        final GeneratedExtension<MessageType, Type> extension) {
+      verifyExtensionContainingType(extension);
+      return extensions.hasField(extension.descriptor);
+    }
+
+    /** Get the number of elements in a repeated extension. */
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    public final <Type> int getExtensionCount(
+        final GeneratedExtension<MessageType, List<Type>> extension) {
+      verifyExtensionContainingType(extension);
+      return extensions.getRepeatedFieldCount(extension.descriptor);
+    }
+
+    /** Get the value of an extension. */
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    @SuppressWarnings("unchecked")
+    public final <Type> Type getExtension(
+        final GeneratedExtension<MessageType, Type> extension) {
+      verifyExtensionContainingType(extension);
+      final Object value = extensions.getField(extension.descriptor);
+      if (value == null) {
+        return extension.defaultValue;
+      } else {
+        return (Type) value;
+      }
+    }
+
+    /** Get one element of a repeated extension. */
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    @SuppressWarnings("unchecked")
+    public final <Type> Type getExtension(
+        final GeneratedExtension<MessageType, List<Type>> extension,
+        final int index) {
+      verifyExtensionContainingType(extension);
+      return (Type) extensions.getRepeatedField(extension.descriptor, index);
+    }
+
+    /** Called by subclasses to check if all extensions are initialized. */
+    protected boolean extensionsAreInitialized() {
+      return extensions.isInitialized();
+    }
+
+    /**
+     * Used by subclasses to serialize extensions.  Extension ranges may be
+     * interleaved with field numbers, but we must write them in canonical
+     * (sorted by field number) order.  ExtensionWriter helps us write
+     * individual ranges of extensions at once.
+     */
+    protected class ExtensionWriter {
+      // Imagine how much simpler this code would be if Java iterators had
+      // a way to get the next element without advancing the iterator.
+
+      private final Iterator<Map.Entry<ExtensionDescriptor, Object>> iter =
+            extensions.iterator();
+      private Map.Entry<ExtensionDescriptor, Object> next;
+      private final boolean messageSetWireFormat;
+
+      private ExtensionWriter(boolean messageSetWireFormat) {
+        if (iter.hasNext()) {
+          next = iter.next();
+        }
+        this.messageSetWireFormat = messageSetWireFormat;
+      }
+
+      public void writeUntil(final int end, final CodedOutputStream output)
+                             throws IOException {
+        while (next != null && next.getKey().getNumber() < end) {
+          ExtensionDescriptor extension = next.getKey();
+          if (messageSetWireFormat && extension.getLiteJavaType() ==
+                  WireFormat.JavaType.MESSAGE &&
+              !extension.isRepeated()) {
+            output.writeMessageSetExtension(extension.getNumber(),
+                                            (MessageLite) next.getValue());
+          } else {
+            FieldSet.writeField(extension, next.getValue(), output);
+          }
+          if (iter.hasNext()) {
+            next = iter.next();
+          } else {
+            next = null;
+          }
+        }
+      }
+    }
+
+    protected ExtensionWriter newExtensionWriter() {
+      return new ExtensionWriter(false);
+    }
+    protected ExtensionWriter newMessageSetExtensionWriter() {
+      return new ExtensionWriter(true);
+    }
+
+    /** Called by subclasses to compute the size of extensions. */
+    protected int extensionsSerializedSize() {
+      return extensions.getSerializedSize();
+    }
+    protected int extensionsSerializedSizeAsMessageSet() {
+      return extensions.getMessageSetSerializedSize();
+    }
+  }
+
+  /**
+   * Lite equivalent of {@link GeneratedMessage.ExtendableBuilder}.
+   */
+  @SuppressWarnings("unchecked")
+  public abstract static class ExtendableBuilder<
+        MessageType extends ExtendableMessage<MessageType>,
+        BuilderType extends ExtendableBuilder<MessageType, BuilderType>>
+      extends Builder<MessageType, BuilderType>
+      implements ExtendableMessageOrBuilder<MessageType> {
+    protected ExtendableBuilder() {}
+
+    private FieldSet<ExtensionDescriptor> extensions = FieldSet.emptySet();
+    private boolean extensionsIsMutable;
+
+    @Override
+    public BuilderType clear() {
+      extensions.clear();
+      extensionsIsMutable = false;
+      return super.clear();
+    }
+
+    private void ensureExtensionsIsMutable() {
+      if (!extensionsIsMutable) {
+        extensions = extensions.clone();
+        extensionsIsMutable = true;
+      }
+    }
+
+    /**
+     * Called by the build code path to create a copy of the extensions for
+     * building the message.
+     */
+    private FieldSet<ExtensionDescriptor> buildExtensions() {
+      extensions.makeImmutable();
+      extensionsIsMutable = false;
+      return extensions;
+    }
+
+    private void verifyExtensionContainingType(
+        final GeneratedExtension<MessageType, ?> extension) {
+      if (extension.getContainingTypeDefaultInstance() !=
+          getDefaultInstanceForType()) {
+        // This can only happen if someone uses unchecked operations.
+        throw new IllegalArgumentException(
+          "This extension is for a different message type.  Please make " +
+          "sure that you are not suppressing any generics type warnings.");
+      }
+    }
+
+    /** Check if a singular extension is present. */
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    public final <Type> boolean hasExtension(
+        final GeneratedExtension<MessageType, Type> extension) {
+      verifyExtensionContainingType(extension);
+      return extensions.hasField(extension.descriptor);
+    }
+
+    /** Get the number of elements in a repeated extension. */
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    public final <Type> int getExtensionCount(
+        final GeneratedExtension<MessageType, List<Type>> extension) {
+      verifyExtensionContainingType(extension);
+      return extensions.getRepeatedFieldCount(extension.descriptor);
+    }
+
+    /** Get the value of an extension. */
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    @SuppressWarnings("unchecked")
+    public final <Type> Type getExtension(
+        final GeneratedExtension<MessageType, Type> extension) {
+      verifyExtensionContainingType(extension);
+      final Object value = extensions.getField(extension.descriptor);
+      if (value == null) {
+        return extension.defaultValue;
+      } else {
+        return (Type) value;
+      }
+    }
+
+    /** Get one element of a repeated extension. */
+    @SuppressWarnings("unchecked")
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    public final <Type> Type getExtension(
+        final GeneratedExtension<MessageType, List<Type>> extension,
+        final int index) {
+      verifyExtensionContainingType(extension);
+      return (Type) extensions.getRepeatedField(extension.descriptor, index);
+    }
+
+    // This is implemented here only to work around an apparent bug in the
+    // Java compiler and/or build system.  See bug #1898463.  The mere presence
+    // of this dummy clone() implementation makes it go away.
+    @Override
+    public BuilderType clone() {
+      throw new UnsupportedOperationException(
+          "This is supposed to be overridden by subclasses.");
+    }
+
+    /** Set the value of an extension. */
+    public final <Type> BuilderType setExtension(
+        final GeneratedExtension<MessageType, Type> extension,
+        final Type value) {
+      verifyExtensionContainingType(extension);
+      ensureExtensionsIsMutable();
+      extensions.setField(extension.descriptor, value);
+      return (BuilderType) this;
+    }
+
+    /** Set the value of one element of a repeated extension. */
+    public final <Type> BuilderType setExtension(
+        final GeneratedExtension<MessageType, List<Type>> extension,
+        final int index, final Type value) {
+      verifyExtensionContainingType(extension);
+      ensureExtensionsIsMutable();
+      extensions.setRepeatedField(extension.descriptor, index, value);
+      return (BuilderType) this;
+    }
+
+    /** Append a value to a repeated extension. */
+    public final <Type> BuilderType addExtension(
+        final GeneratedExtension<MessageType, List<Type>> extension,
+        final Type value) {
+      verifyExtensionContainingType(extension);
+      ensureExtensionsIsMutable();
+      extensions.addRepeatedField(extension.descriptor, value);
+      return (BuilderType) this;
+    }
+
+    /** Clear an extension. */
+    public final <Type> BuilderType clearExtension(
+        final GeneratedExtension<MessageType, ?> extension) {
+      verifyExtensionContainingType(extension);
+      ensureExtensionsIsMutable();
+      extensions.clearField(extension.descriptor);
+      return (BuilderType) this;
+    }
+
+    /** Called by subclasses to check if all extensions are initialized. */
+    protected boolean extensionsAreInitialized() {
+      return extensions.isInitialized();
+    }
+
+    /**
+     * Called by subclasses to parse an unknown field or an extension.
+     * @return {@code true} unless the tag is an end-group tag.
+     */
+    @Override
+    protected boolean parseUnknownField(
+        final CodedInputStream input,
+        final ExtensionRegistryLite extensionRegistry,
+        final int tag) throws IOException {
+      final int wireType = WireFormat.getTagWireType(tag);
+      final int fieldNumber = WireFormat.getTagFieldNumber(tag);
+
+      final GeneratedExtension<MessageType, ?> extension =
+        extensionRegistry.findLiteExtensionByNumber(
+            getDefaultInstanceForType(), fieldNumber);
+
+      boolean unknown = false;
+      boolean packed = false;
+      if (extension == null) {
+        unknown = true;  // Unknown field.
+      } else if (wireType == FieldSet.getWireFormatForFieldType(
+                   extension.descriptor.getLiteType(),
+                   false  /* isPacked */)) {
+        packed = false;  // Normal, unpacked value.
+      } else if (extension.descriptor.isRepeated &&
+                 extension.descriptor.type.isPackable() &&
+                 wireType == FieldSet.getWireFormatForFieldType(
+                   extension.descriptor.getLiteType(),
+                   true  /* isPacked */)) {
+        packed = true;  // Packed value.
+      } else {
+        unknown = true;  // Wrong wire type.
+      }
+
+      if (unknown) {  // Unknown field or wrong wire type.  Skip.
+        return input.skipField(tag);
+      }
+
+      if (packed) {
+        final int length = input.readRawVarint32();
+        final int limit = input.pushLimit(length);
+        if (extension.descriptor.getLiteType() == WireFormat.FieldType.ENUM) {
+          while (input.getBytesUntilLimit() > 0) {
+            final int rawValue = input.readEnum();
+            final Object value =
+                extension.descriptor.getEnumType().findValueByNumber(rawValue);
+            if (value == null) {
+              // If the number isn't recognized as a valid value for this
+              // enum, drop it (don't even add it to unknownFields).
+              return true;
+            }
+            ensureExtensionsIsMutable();
+            extensions.addRepeatedField(extension.descriptor, value);
+          }
+        } else {
+          while (input.getBytesUntilLimit() > 0) {
+            final Object value =
+              FieldSet.readPrimitiveField(input,
+                                          extension.descriptor.getLiteType());
+            ensureExtensionsIsMutable();
+            extensions.addRepeatedField(extension.descriptor, value);
+          }
+        }
+        input.popLimit(limit);
+      } else {
+        final Object value;
+        switch (extension.descriptor.getLiteJavaType()) {
+          case MESSAGE: {
+            MessageLite.Builder subBuilder = null;
+            if (!extension.descriptor.isRepeated()) {
+              MessageLite existingValue =
+                  (MessageLite) extensions.getField(extension.descriptor);
+              if (existingValue != null) {
+                subBuilder = existingValue.toBuilder();
+              }
+            }
+            if (subBuilder == null) {
+              subBuilder = extension.messageDefaultInstance.newBuilderForType();
+            }
+            if (extension.descriptor.getLiteType() ==
+                WireFormat.FieldType.GROUP) {
+              input.readGroup(extension.getNumber(),
+                              subBuilder, extensionRegistry);
+            } else {
+              input.readMessage(subBuilder, extensionRegistry);
+            }
+            value = subBuilder.build();
+            break;
+          }
+          case ENUM:
+            final int rawValue = input.readEnum();
+            value = extension.descriptor.getEnumType()
+                             .findValueByNumber(rawValue);
+            // If the number isn't recognized as a valid value for this enum,
+            // drop it.
+            if (value == null) {
+              return true;
+            }
+            break;
+          default:
+            value = FieldSet.readPrimitiveField(input,
+                extension.descriptor.getLiteType());
+            break;
+        }
+
+        if (extension.descriptor.isRepeated()) {
+          ensureExtensionsIsMutable();
+          extensions.addRepeatedField(extension.descriptor, value);
+        } else {
+          ensureExtensionsIsMutable();
+          extensions.setField(extension.descriptor, value);
+        }
+      }
+
+      return true;
+    }
+
+    protected final void mergeExtensionFields(final MessageType other) {
+      ensureExtensionsIsMutable();
+      extensions.mergeFrom(((ExtendableMessage) other).extensions);
+    }
+  }
+
+  // -----------------------------------------------------------------
+
+  /** For use by generated code only. */
+  public static <ContainingType extends MessageLite, Type>
+      GeneratedExtension<ContainingType, Type>
+          newSingularGeneratedExtension(
+              final ContainingType containingTypeDefaultInstance,
+              final Type defaultValue,
+              final MessageLite messageDefaultInstance,
+              final Internal.EnumLiteMap<?> enumTypeMap,
+              final int number,
+              final WireFormat.FieldType type) {
+    return new GeneratedExtension<ContainingType, Type>(
+        containingTypeDefaultInstance,
+        defaultValue,
+        messageDefaultInstance,
+        new ExtensionDescriptor(enumTypeMap, number, type,
+                                false /* isRepeated */,
+                                false /* isPacked */));
+  }
+
+  /** For use by generated code only. */
+  public static <ContainingType extends MessageLite, Type>
+      GeneratedExtension<ContainingType, Type>
+          newRepeatedGeneratedExtension(
+              final ContainingType containingTypeDefaultInstance,
+              final MessageLite messageDefaultInstance,
+              final Internal.EnumLiteMap<?> enumTypeMap,
+              final int number,
+              final WireFormat.FieldType type,
+              final boolean isPacked) {
+    @SuppressWarnings("unchecked")  // Subclasses ensure Type is a List
+    Type emptyList = (Type) Collections.emptyList();
+    return new GeneratedExtension<ContainingType, Type>(
+        containingTypeDefaultInstance,
+        emptyList,
+        messageDefaultInstance,
+        new ExtensionDescriptor(
+            enumTypeMap, number, type, true /* isRepeated */, isPacked));
+  }
+
+  private static final class ExtensionDescriptor
+      implements FieldSet.FieldDescriptorLite<
+        ExtensionDescriptor> {
+    private ExtensionDescriptor(
+        final Internal.EnumLiteMap<?> enumTypeMap,
+        final int number,
+        final WireFormat.FieldType type,
+        final boolean isRepeated,
+        final boolean isPacked) {
+      this.enumTypeMap = enumTypeMap;
+      this.number = number;
+      this.type = type;
+      this.isRepeated = isRepeated;
+      this.isPacked = isPacked;
+    }
+
+    private final Internal.EnumLiteMap<?> enumTypeMap;
+    private final int number;
+    private final WireFormat.FieldType type;
+    private final boolean isRepeated;
+    private final boolean isPacked;
+
+    public int getNumber() {
+      return number;
+    }
+
+    public WireFormat.FieldType getLiteType() {
+      return type;
+    }
+
+    public WireFormat.JavaType getLiteJavaType() {
+      return type.getJavaType();
+    }
+
+    public boolean isRepeated() {
+      return isRepeated;
+    }
+
+    public boolean isPacked() {
+      return isPacked;
+    }
+
+    public Internal.EnumLiteMap<?> getEnumType() {
+      return enumTypeMap;
+    }
+
+    @SuppressWarnings("unchecked")
+    public MessageLite.Builder internalMergeFrom(
+        MessageLite.Builder to, MessageLite from) {
+      return ((Builder) to).mergeFrom((GeneratedMessageLite) from);
+    }
+
+    public int compareTo(ExtensionDescriptor other) {
+      return number - other.number;
+    }
+  }
+
+  /**
+   * Lite equivalent to {@link GeneratedMessage.GeneratedExtension}.
+   *
+   * Users should ignore the contents of this class and only use objects of
+   * this type as parameters to extension accessors and ExtensionRegistry.add().
+   */
+  public static final class GeneratedExtension<
+      ContainingType extends MessageLite, Type> {
+
+    private GeneratedExtension(
+        final ContainingType containingTypeDefaultInstance,
+        final Type defaultValue,
+        final MessageLite messageDefaultInstance,
+        final ExtensionDescriptor descriptor) {
+      // Defensive checks to verify the correct initialization order of
+      // GeneratedExtensions and their related GeneratedMessages.
+      if (containingTypeDefaultInstance == null) {
+        throw new IllegalArgumentException(
+            "Null containingTypeDefaultInstance");
+      }
+      if (descriptor.getLiteType() == WireFormat.FieldType.MESSAGE &&
+          messageDefaultInstance == null) {
+        throw new IllegalArgumentException(
+            "Null messageDefaultInstance");
+      }
+      this.containingTypeDefaultInstance = containingTypeDefaultInstance;
+      this.defaultValue = defaultValue;
+      this.messageDefaultInstance = messageDefaultInstance;
+      this.descriptor = descriptor;
+    }
+
+    private final ContainingType containingTypeDefaultInstance;
+    private final Type defaultValue;
+    private final MessageLite messageDefaultInstance;
+    private final ExtensionDescriptor descriptor;
+
+    /**
+     * Default instance of the type being extended, used to identify that type.
+     */
+    public ContainingType getContainingTypeDefaultInstance() {
+      return containingTypeDefaultInstance;
+    }
+
+    /** Get the field number. */
+    public int getNumber() {
+      return descriptor.getNumber();
+    }
+
+    /**
+     * If the extension is an embedded message, this is the default instance of
+     * that type.
+     */
+    public MessageLite getMessageDefaultInstance() {
+      return messageDefaultInstance;
+    }
+  }
+
+  /**
+   * A serialized (serializable) form of the generated message.  Stores the
+   * message as a class name and a byte array.
+   */
+  static final class SerializedForm implements Serializable {
+    private static final long serialVersionUID = 0L;
+
+    private String messageClassName;
+    private byte[] asBytes;
+
+    /**
+     * Creates the serialized form by calling {@link com.google.protobuf.MessageLite#toByteArray}.
+     * @param regularForm the message to serialize
+     */
+    SerializedForm(MessageLite regularForm) {
+      messageClassName = regularForm.getClass().getName();
+      asBytes = regularForm.toByteArray();
+    }
+
+    /**
+     * When read from an ObjectInputStream, this method converts this object
+     * back to the regular form.  Part of Java's serialization magic.
+     * @return a GeneratedMessage of the type that was serialized
+     */
+    @SuppressWarnings("unchecked")
+    protected Object readResolve() throws ObjectStreamException {
+      try {
+        Class messageClass = Class.forName(messageClassName);
+        Method newBuilder = messageClass.getMethod("newBuilder");
+        MessageLite.Builder builder =
+            (MessageLite.Builder) newBuilder.invoke(null);
+        builder.mergeFrom(asBytes);
+        return builder.buildPartial();
+      } catch (ClassNotFoundException e) {
+        throw new RuntimeException("Unable to find proto buffer class", e);
+      } catch (NoSuchMethodException e) {
+        throw new RuntimeException("Unable to find newBuilder method", e);
+      } catch (IllegalAccessException e) {
+        throw new RuntimeException("Unable to call newBuilder method", e);
+      } catch (InvocationTargetException e) {
+        throw new RuntimeException("Error calling newBuilder", e.getCause());
+      } catch (InvalidProtocolBufferException e) {
+        throw new RuntimeException("Unable to understand proto buffer", e);
+      }
+    }
+  }
+
+  /**
+   * Replaces this object in the output stream with a serialized form.
+   * Part of Java's serialization magic.  Generated sub-classes must override
+   * this method by calling <code>return super.writeReplace();</code>
+   * @return a SerializedForm of this message
+   */
+  protected Object writeReplace() throws ObjectStreamException {
+    return new SerializedForm(this);
+  }
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/Internal.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/Internal.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/Internal.java	(revision 15014)
@@ -0,0 +1,206 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import java.io.UnsupportedEncodingException;
+
+/**
+ * The classes contained within are used internally by the Protocol Buffer
+ * library and generated message implementations. They are public only because
+ * those generated messages do not reside in the {@code protobuf} package.
+ * Others should not use this class directly.
+ *
+ * @author kenton@google.com (Kenton Varda)
+ */
+public class Internal {
+  /**
+   * Helper called by generated code to construct default values for string
+   * fields.
+   * <p>
+   * The protocol compiler does not actually contain a UTF-8 decoder -- it
+   * just pushes UTF-8-encoded text around without touching it.  The one place
+   * where this presents a problem is when generating Java string literals.
+   * Unicode characters in the string literal would normally need to be encoded
+   * using a Unicode escape sequence, which would require decoding them.
+   * To get around this, protoc instead embeds the UTF-8 bytes into the
+   * generated code and leaves it to the runtime library to decode them.
+   * <p>
+   * It gets worse, though.  If protoc just generated a byte array, like:
+   *   new byte[] {0x12, 0x34, 0x56, 0x78}
+   * Java actually generates *code* which allocates an array and then fills
+   * in each value.  This is much less efficient than just embedding the bytes
+   * directly into the bytecode.  To get around this, we need another
+   * work-around.  String literals are embedded directly, so protoc actually
+   * generates a string literal corresponding to the bytes.  The easiest way
+   * to do this is to use the ISO-8859-1 character set, which corresponds to
+   * the first 256 characters of the Unicode range.  Protoc can then use
+   * good old CEscape to generate the string.
+   * <p>
+   * So we have a string literal which represents a set of bytes which
+   * represents another string.  This function -- stringDefaultValue --
+   * converts from the generated string to the string we actually want.  The
+   * generated code calls this automatically.
+   */
+  public static String stringDefaultValue(String bytes) {
+    try {
+      return new String(bytes.getBytes("ISO-8859-1"), "UTF-8");
+    } catch (UnsupportedEncodingException e) {
+      // This should never happen since all JVMs are required to implement
+      // both of the above character sets.
+      throw new IllegalStateException(
+          "Java VM does not support a standard character set.", e);
+    }
+  }
+
+  /**
+   * Helper called by generated code to construct default values for bytes
+   * fields.
+   * <p>
+   * This is a lot like {@link #stringDefaultValue}, but for bytes fields.
+   * In this case we only need the second of the two hacks -- allowing us to
+   * embed raw bytes as a string literal with ISO-8859-1 encoding.
+   */
+  public static ByteString bytesDefaultValue(String bytes) {
+    try {
+      return ByteString.copyFrom(bytes.getBytes("ISO-8859-1"));
+    } catch (UnsupportedEncodingException e) {
+      // This should never happen since all JVMs are required to implement
+      // ISO-8859-1.
+      throw new IllegalStateException(
+          "Java VM does not support a standard character set.", e);
+    }
+  }
+
+  /**
+   * Helper called by generated code to determine if a byte array is a valid
+   * UTF-8 encoded string such that the original bytes can be converted to
+   * a String object and then back to a byte array round tripping the bytes
+   * without loss.
+   * <p>
+   * This is inspired by UTF_8.java in sun.nio.cs.
+   *
+   * @param byteString the string to check
+   * @return whether the byte array is round trippable
+   */
+  public static boolean isValidUtf8(ByteString byteString) {
+    int index = 0;
+    int size = byteString.size();
+    // To avoid the masking, we could change this to use bytes;
+    // Then X > 0xC2 gets turned into X < -0xC2; X < 0x80
+    // gets turned into X >= 0, etc.
+
+    while (index < size) {
+      int byte1 = byteString.byteAt(index++) & 0xFF;
+      if (byte1 < 0x80) {
+        // fast loop for single bytes
+        continue;
+
+        // we know from this point on that we have 2-4 byte forms
+      } else if (byte1 < 0xC2 || byte1 > 0xF4) {
+        // catch illegal first bytes: < C2 or > F4
+        return false;
+      }
+      if (index >= size) {
+        // fail if we run out of bytes
+        return false;
+      }
+      int byte2 = byteString.byteAt(index++) & 0xFF;
+      if (byte2 < 0x80 || byte2 > 0xBF) {
+        // general trail-byte test
+        return false;
+      }
+      if (byte1 <= 0xDF) {
+        // two-byte form; general trail-byte test is sufficient
+        continue;
+      }
+
+      // we know from this point on that we have 3 or 4 byte forms
+      if (index >= size) {
+        // fail if we run out of bytes
+        return false;
+      }
+      int byte3 = byteString.byteAt(index++) & 0xFF;
+      if (byte3 < 0x80 || byte3 > 0xBF) {
+        // general trail-byte test
+        return false;
+      }
+      if (byte1 <= 0xEF) {
+        // three-byte form. Vastly more frequent than four-byte forms
+        // The following has an extra test, but not worth restructuring
+        if (byte1 == 0xE0 && byte2 < 0xA0 ||
+            byte1 == 0xED && byte2 > 0x9F) {
+          // check special cases of byte2
+          return false;
+        }
+
+      } else {
+        // four-byte form
+
+        if (index >= size) {
+          // fail if we run out of bytes
+          return false;
+        }
+        int byte4 = byteString.byteAt(index++) & 0xFF;
+        if (byte4 < 0x80 || byte4 > 0xBF) {
+          // general trail-byte test
+          return false;
+        }
+        // The following has an extra test, but not worth restructuring
+        if (byte1 == 0xF0 && byte2 < 0x90 ||
+            byte1 == 0xF4 && byte2 > 0x8F) {
+          // check special cases of byte2
+          return false;
+        }
+      }
+    }
+    return true;
+  }
+
+  /**
+   * Interface for an enum value or value descriptor, to be used in FieldSet.
+   * The lite library stores enum values directly in FieldSets but the full
+   * library stores EnumValueDescriptors in order to better support reflection.
+   */
+  public interface EnumLite {
+    int getNumber();
+  }
+
+  /**
+   * Interface for an object which maps integers to {@link EnumLite}s.
+   * {@link Descriptors.EnumDescriptor} implements this interface by mapping
+   * numbers to {@link Descriptors.EnumValueDescriptor}s.  Additionally,
+   * every generated enum type has a static method internalGetValueMap() which
+   * returns an implementation of this type that maps numbers to enum values.
+   */
+  public interface EnumLiteMap<T extends EnumLite> {
+    T findValueByNumber(int number);
+  }
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/InvalidProtocolBufferException.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/InvalidProtocolBufferException.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/InvalidProtocolBufferException.java	(revision 15014)
@@ -0,0 +1,93 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import java.io.IOException;
+
+/**
+ * Thrown when a protocol message being parsed is invalid in some way,
+ * e.g. it contains a malformed varint or a negative byte length.
+ *
+ * @author kenton@google.com Kenton Varda
+ */
+public class InvalidProtocolBufferException extends IOException {
+  private static final long serialVersionUID = -1616151763072450476L;
+
+  public InvalidProtocolBufferException(final String description) {
+    super(description);
+  }
+
+  static InvalidProtocolBufferException truncatedMessage() {
+    return new InvalidProtocolBufferException(
+      "While parsing a protocol message, the input ended unexpectedly " +
+      "in the middle of a field.  This could mean either than the " +
+      "input has been truncated or that an embedded message " +
+      "misreported its own length.");
+  }
+
+  static InvalidProtocolBufferException negativeSize() {
+    return new InvalidProtocolBufferException(
+      "CodedInputStream encountered an embedded string or message " +
+      "which claimed to have negative size.");
+  }
+
+  static InvalidProtocolBufferException malformedVarint() {
+    return new InvalidProtocolBufferException(
+      "CodedInputStream encountered a malformed varint.");
+  }
+
+  static InvalidProtocolBufferException invalidTag() {
+    return new InvalidProtocolBufferException(
+      "Protocol message contained an invalid tag (zero).");
+  }
+
+  static InvalidProtocolBufferException invalidEndTag() {
+    return new InvalidProtocolBufferException(
+      "Protocol message end-group tag did not match expected tag.");
+  }
+
+  static InvalidProtocolBufferException invalidWireType() {
+    return new InvalidProtocolBufferException(
+      "Protocol message tag had invalid wire type.");
+  }
+
+  static InvalidProtocolBufferException recursionLimitExceeded() {
+    return new InvalidProtocolBufferException(
+      "Protocol message had too many levels of nesting.  May be malicious.  " +
+      "Use CodedInputStream.setRecursionLimit() to increase the depth limit.");
+  }
+
+  static InvalidProtocolBufferException sizeLimitExceeded() {
+    return new InvalidProtocolBufferException(
+      "Protocol message was too large.  May be malicious.  " +
+      "Use CodedInputStream.setSizeLimit() to increase the size limit.");
+  }
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/LazyStringArrayList.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/LazyStringArrayList.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/LazyStringArrayList.java	(revision 15014)
@@ -0,0 +1,155 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import java.util.List;
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.RandomAccess;
+import java.util.Collection;
+
+/**
+ * An implementation of {@link LazyStringList} that wraps an ArrayList. Each
+ * element is either a ByteString or a String. It caches the last one requested
+ * which is most likely the one needed next. This minimizes memory usage while
+ * satisfying the most common use cases.
+ * <p>
+ * <strong>Note that this implementation is not synchronized.</strong>
+ * If multiple threads access an <tt>ArrayList</tt> instance concurrently,
+ * and at least one of the threads modifies the list structurally, it
+ * <i>must</i> be synchronized externally.  (A structural modification is
+ * any operation that adds or deletes one or more elements, or explicitly
+ * resizes the backing array; merely setting the value of an element is not
+ * a structural modification.)  This is typically accomplished by
+ * synchronizing on some object that naturally encapsulates the list.
+ * <p>
+ * If the implementation is accessed via concurrent reads, this is thread safe.
+ * Conversions are done in a thread safe manner. It's possible that the
+ * conversion may happen more than once if two threads attempt to access the
+ * same element and the modifications were not visible to each other, but this
+ * will not result in any corruption of the list or change in behavior other
+ * than performance.
+ *
+ * @author jonp@google.com (Jon Perlow)
+ */
+public class LazyStringArrayList extends AbstractList<String>
+    implements LazyStringList, RandomAccess {
+
+  public final static LazyStringList EMPTY = new UnmodifiableLazyStringList(
+      new LazyStringArrayList());
+
+  private final List<Object> list;
+
+  public LazyStringArrayList() {
+    list = new ArrayList<Object>();
+  }
+
+  public LazyStringArrayList(List<String> from) {
+    list = new ArrayList<Object>(from);
+  }
+
+  @Override
+  public String get(int index) {
+    Object o = list.get(index);
+    if (o instanceof String) {
+      return (String) o;
+    } else {
+      ByteString bs = (ByteString) o;
+      String s = bs.toStringUtf8();
+      if (Internal.isValidUtf8(bs)) {
+        list.set(index, s);
+      }
+      return s;
+    }
+  }
+
+  @Override
+  public int size() {
+    return list.size();
+  }
+
+  @Override
+  public String set(int index, String s) {
+    Object o = list.set(index, s);
+    return asString(o);
+  }
+
+  @Override
+  public void add(int index, String element) {
+    list.add(index, element);
+    modCount++;
+  }
+
+  @Override
+  public boolean addAll(int index, Collection<? extends String> c) {
+    boolean ret = list.addAll(index, c);
+    modCount++;
+    return ret;
+  }
+
+  @Override
+  public String remove(int index) {
+    Object o = list.remove(index);
+    modCount++;
+    return asString(o);
+  }
+
+  public void clear() {
+    list.clear();
+    modCount++;
+  }
+
+  // @Override
+  public void add(ByteString element) {
+    list.add(element);
+    modCount++;
+  }
+
+  // @Override
+  public ByteString getByteString(int index) {
+    Object o = list.get(index);
+    if (o instanceof String) {
+      ByteString b = ByteString.copyFromUtf8((String) o);
+      list.set(index, b);
+      return b;
+    } else {
+      return (ByteString) o;
+    }
+  }
+
+  private String asString(Object o) {
+    if (o instanceof String) {
+      return (String) o;
+    } else {
+      return ((ByteString) o).toStringUtf8();
+    }
+  }
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/LazyStringList.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/LazyStringList.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/LazyStringList.java	(revision 15014)
@@ -0,0 +1,72 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import java.util.List;
+
+/**
+ * An interface extending List&lt;String&gt; that also provides access to the
+ * items of the list as UTF8-encoded ByteString objects. This is used by the
+ * protocol buffer implementation to support lazily converting bytes parsed
+ * over the wire to String objects until needed and also increases the
+ * efficiency of serialization if the String was never requested as the
+ * ByteString is already cached.
+ * <p>
+ * This only adds additional methods that are required for the use in the
+ * protocol buffer code in order to be able successfuly round trip byte arrays
+ * through parsing and serialization without conversion to strings. It's not
+ * attempting to support the functionality of say List&ltByteString&gt, hence
+ * why only these two very specific methods are added.
+ *
+ * @author jonp@google.com (Jon Perlow)
+ */
+public interface LazyStringList extends List<String> {
+
+  /**
+   * Returns the element at the specified position in this list as a ByteString.
+   *
+   * @param index index of the element to return
+   * @return the element at the specified position in this list
+   * @throws IndexOutOfBoundsException if the index is out of range
+   *         (<tt>index &lt; 0 || index &gt;= size()</tt>)
+   */
+  ByteString getByteString(int index);
+
+  /**
+   * Appends the specified element to the end of this list (optional
+   * operation).
+   *
+   * @param element element to be appended to this list
+   * @throws UnsupportedOperationException if the <tt>add</tt> operation
+   *         is not supported by this list
+   */
+  void add(ByteString element);
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/Message.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/Message.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/Message.java	(revision 15014)
@@ -0,0 +1,215 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// TODO(kenton):  Use generics?  E.g. Builder<BuilderType extends Builder>, then
+//   mergeFrom*() could return BuilderType for better type-safety.
+
+package com.google.protobuf;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Map;
+
+/**
+ * Abstract interface implemented by Protocol Message objects.
+ * <p>
+ * See also {@link MessageLite}, which defines most of the methods that typical
+ * users care about.  {@link Message} adds to it methods that are not available
+ * in the "lite" runtime.  The biggest added features are introspection and
+ * reflection -- i.e., getting descriptors for the message type and accessing
+ * the field values dynamically.
+ *
+ * @author kenton@google.com Kenton Varda
+ */
+public interface Message extends MessageLite, MessageOrBuilder {
+
+  // -----------------------------------------------------------------
+  // Comparison and hashing
+
+  /**
+   * Compares the specified object with this message for equality.  Returns
+   * <tt>true</tt> if the given object is a message of the same type (as
+   * defined by {@code getDescriptorForType()}) and has identical values for
+   * all of its fields.  Subclasses must implement this; inheriting
+   * {@code Object.equals()} is incorrect.
+   *
+   * @param other object to be compared for equality with this message
+   * @return <tt>true</tt> if the specified object is equal to this message
+   */
+  @Override
+  boolean equals(Object other);
+
+  /**
+   * Returns the hash code value for this message.  The hash code of a message
+   * should mix the message's type (object identity of the decsriptor) with its
+   * contents (known and unknown field values).  Subclasses must implement this;
+   * inheriting {@code Object.hashCode()} is incorrect.
+   *
+   * @return the hash code value for this message
+   * @see Map#hashCode()
+   */
+  @Override
+  int hashCode();
+
+  // -----------------------------------------------------------------
+  // Convenience methods.
+
+  /**
+   * Converts the message to a string in protocol buffer text format. This is
+   * just a trivial wrapper around {@link TextFormat#printToString(Message)}.
+   */
+  @Override
+  String toString();
+
+  // =================================================================
+  // Builders
+
+  // (From MessageLite, re-declared here only for return type covariance.)
+  Builder newBuilderForType();
+  Builder toBuilder();
+
+  /**
+   * Abstract interface implemented by Protocol Message builders.
+   */
+  interface Builder extends MessageLite.Builder, MessageOrBuilder {
+    // (From MessageLite.Builder, re-declared here only for return type
+    // covariance.)
+    Builder clear();
+
+    /**
+     * Merge {@code other} into the message being built.  {@code other} must
+     * have the exact same type as {@code this} (i.e.
+     * {@code getDescriptorForType() == other.getDescriptorForType()}).
+     *
+     * Merging occurs as follows.  For each field:<br>
+     * * For singular primitive fields, if the field is set in {@code other},
+     *   then {@code other}'s value overwrites the value in this message.<br>
+     * * For singular message fields, if the field is set in {@code other},
+     *   it is merged into the corresponding sub-message of this message
+     *   using the same merging rules.<br>
+     * * For repeated fields, the elements in {@code other} are concatenated
+     *   with the elements in this message.
+     *
+     * This is equivalent to the {@code Message::MergeFrom} method in C++.
+     */
+    Builder mergeFrom(Message other);
+
+    // (From MessageLite.Builder, re-declared here only for return type
+    // covariance.)
+    Message build();
+    Message buildPartial();
+    Builder clone();
+    Builder mergeFrom(CodedInputStream input) throws IOException;
+    Builder mergeFrom(CodedInputStream input,
+                      ExtensionRegistryLite extensionRegistry)
+                      throws IOException;
+
+    /**
+     * Get the message's type's descriptor.
+     * See {@link Message#getDescriptorForType()}.
+     */
+    Descriptors.Descriptor getDescriptorForType();
+
+    /**
+     * Create a Builder for messages of the appropriate type for the given
+     * field.  Messages built with this can then be passed to setField(),
+     * setRepeatedField(), or addRepeatedField().
+     */
+    Builder newBuilderForField(Descriptors.FieldDescriptor field);
+
+    /**
+     * Sets a field to the given value.  The value must be of the correct type
+     * for this field, i.e. the same type that
+     * {@link Message#getField(Descriptors.FieldDescriptor)} would return.
+     */
+    Builder setField(Descriptors.FieldDescriptor field, Object value);
+
+    /**
+     * Clears the field.  This is exactly equivalent to calling the generated
+     * "clear" accessor method corresponding to the field.
+     */
+    Builder clearField(Descriptors.FieldDescriptor field);
+
+    /**
+     * Sets an element of a repeated field to the given value.  The value must
+     * be of the correct type for this field, i.e. the same type that
+     * {@link Message#getRepeatedField(Descriptors.FieldDescriptor,int)} would
+     * return.
+     * @throws IllegalArgumentException The field is not a repeated field, or
+     *           {@code field.getContainingType() != getDescriptorForType()}.
+     */
+    Builder setRepeatedField(Descriptors.FieldDescriptor field,
+                             int index, Object value);
+
+    /**
+     * Like {@code setRepeatedField}, but appends the value as a new element.
+     * @throws IllegalArgumentException The field is not a repeated field, or
+     *           {@code field.getContainingType() != getDescriptorForType()}.
+     */
+    Builder addRepeatedField(Descriptors.FieldDescriptor field, Object value);
+
+    /** Set the {@link UnknownFieldSet} for this message. */
+    Builder setUnknownFields(UnknownFieldSet unknownFields);
+
+    /**
+     * Merge some unknown fields into the {@link UnknownFieldSet} for this
+     * message.
+     */
+    Builder mergeUnknownFields(UnknownFieldSet unknownFields);
+
+    // ---------------------------------------------------------------
+    // Convenience methods.
+
+    // (From MessageLite.Builder, re-declared here only for return type
+    // covariance.)
+    Builder mergeFrom(ByteString data) throws InvalidProtocolBufferException;
+    Builder mergeFrom(ByteString data,
+                      ExtensionRegistryLite extensionRegistry)
+                      throws InvalidProtocolBufferException;
+    Builder mergeFrom(byte[] data) throws InvalidProtocolBufferException;
+    Builder mergeFrom(byte[] data, int off, int len)
+                      throws InvalidProtocolBufferException;
+    Builder mergeFrom(byte[] data,
+                      ExtensionRegistryLite extensionRegistry)
+                      throws InvalidProtocolBufferException;
+    Builder mergeFrom(byte[] data, int off, int len,
+                      ExtensionRegistryLite extensionRegistry)
+                      throws InvalidProtocolBufferException;
+    Builder mergeFrom(InputStream input) throws IOException;
+    Builder mergeFrom(InputStream input,
+                      ExtensionRegistryLite extensionRegistry)
+                      throws IOException;
+    boolean mergeDelimitedFrom(InputStream input)
+                               throws IOException;
+    boolean mergeDelimitedFrom(InputStream input,
+                               ExtensionRegistryLite extensionRegistry)
+                               throws IOException;
+  }
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/MessageLite.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/MessageLite.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/MessageLite.java	(revision 15014)
@@ -0,0 +1,325 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// TODO(kenton):  Use generics?  E.g. Builder<BuilderType extends Builder>, then
+//   mergeFrom*() could return BuilderType for better type-safety.
+
+package com.google.protobuf;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/**
+ * Abstract interface implemented by Protocol Message objects.
+ *
+ * <p>This interface is implemented by all protocol message objects.  Non-lite
+ * messages additionally implement the Message interface, which is a subclass
+ * of MessageLite.  Use MessageLite instead when you only need the subset of
+ * features which it supports -- namely, nothing that uses descriptors or
+ * reflection.  You can instruct the protocol compiler to generate classes
+ * which implement only MessageLite, not the full Message interface, by adding
+ * the follow line to the .proto file:
+ * <pre>
+ *   option optimize_for = LITE_RUNTIME;
+ * </pre>
+ *
+ * <p>This is particularly useful on resource-constrained systems where the
+ * full protocol buffers runtime library is too big.
+ *
+ * <p>Note that on non-constrained systems (e.g. servers) when you need to link
+ * in lots of protocol definitions, a better way to reduce total code footprint
+ * is to use {@code optimize_for = CODE_SIZE}.  This will make the generated
+ * code smaller while still supporting all the same features (at the expense of
+ * speed).  {@code optimize_for = LITE_RUNTIME} is best when you only have a
+ * small number of message types linked into your binary, in which case the
+ * size of the protocol buffers runtime itself is the biggest problem.
+ *
+ * @author kenton@google.com Kenton Varda
+ */
+public interface MessageLite extends MessageLiteOrBuilder {
+
+
+  /**
+   * Serializes the message and writes it to {@code output}.  This does not
+   * flush or close the stream.
+   */
+  void writeTo(CodedOutputStream output) throws IOException;
+
+  /**
+   * Get the number of bytes required to encode this message.  The result
+   * is only computed on the first call and memoized after that.
+   */
+  int getSerializedSize();
+
+  // -----------------------------------------------------------------
+  // Convenience methods.
+
+  /**
+   * Serializes the message to a {@code ByteString} and returns it. This is
+   * just a trivial wrapper around
+   * {@link #writeTo(CodedOutputStream)}.
+   */
+  ByteString toByteString();
+
+  /**
+   * Serializes the message to a {@code byte} array and returns it.  This is
+   * just a trivial wrapper around
+   * {@link #writeTo(CodedOutputStream)}.
+   */
+  byte[] toByteArray();
+
+  /**
+   * Serializes the message and writes it to {@code output}.  This is just a
+   * trivial wrapper around {@link #writeTo(CodedOutputStream)}.  This does
+   * not flush or close the stream.
+   * <p>
+   * NOTE:  Protocol Buffers are not self-delimiting.  Therefore, if you write
+   * any more data to the stream after the message, you must somehow ensure
+   * that the parser on the receiving end does not interpret this as being
+   * part of the protocol message.  This can be done e.g. by writing the size
+   * of the message before the data, then making sure to limit the input to
+   * that size on the receiving end (e.g. by wrapping the InputStream in one
+   * which limits the input).  Alternatively, just use
+   * {@link #writeDelimitedTo(OutputStream)}.
+   */
+  void writeTo(OutputStream output) throws IOException;
+
+  /**
+   * Like {@link #writeTo(OutputStream)}, but writes the size of the message
+   * as a varint before writing the data.  This allows more data to be written
+   * to the stream after the message without the need to delimit the message
+   * data yourself.  Use {@link Builder#mergeDelimitedFrom(InputStream)} (or
+   * the static method {@code YourMessageType.parseDelimitedFrom(InputStream)})
+   * to parse messages written by this method.
+   */
+  void writeDelimitedTo(OutputStream output) throws IOException;
+
+  // =================================================================
+  // Builders
+
+  /**
+   * Constructs a new builder for a message of the same type as this message.
+   */
+  Builder newBuilderForType();
+
+  /**
+   * Constructs a builder initialized with the current message.  Use this to
+   * derive a new message from the current one.
+   */
+  Builder toBuilder();
+
+  /**
+   * Abstract interface implemented by Protocol Message builders.
+   */
+  interface Builder extends MessageLiteOrBuilder, Cloneable {
+    /** Resets all fields to their default values. */
+    Builder clear();
+
+    /**
+     * Construct the final message.  Once this is called, the Builder is no
+     * longer valid, and calling any other method will result in undefined
+     * behavior and may throw a NullPointerException.  If you need to continue
+     * working with the builder after calling {@code build()}, {@code clone()}
+     * it first.
+     * @throws UninitializedMessageException The message is missing one or more
+     *         required fields (i.e. {@link #isInitialized()} returns false).
+     *         Use {@link #buildPartial()} to bypass this check.
+     */
+    MessageLite build();
+
+    /**
+     * Like {@link #build()}, but does not throw an exception if the message
+     * is missing required fields.  Instead, a partial message is returned.
+     * Once this is called, the Builder is no longer valid, and calling any
+     * will result in undefined behavior and may throw a NullPointerException.
+     *
+     * If you need to continue working with the builder after calling
+     * {@code buildPartial()}, {@code clone()} it first.
+     */
+    MessageLite buildPartial();
+
+    /**
+     * Clones the Builder.
+     * @see Object#clone()
+     */
+    Builder clone();
+
+    /**
+     * Parses a message of this type from the input and merges it with this
+     * message, as if using {@link Builder#mergeFrom(MessageLite)}.
+     *
+     * <p>Warning:  This does not verify that all required fields are present in
+     * the input message.  If you call {@link #build()} without setting all
+     * required fields, it will throw an {@link UninitializedMessageException},
+     * which is a {@code RuntimeException} and thus might not be caught.  There
+     * are a few good ways to deal with this:
+     * <ul>
+     *   <li>Call {@link #isInitialized()} to verify that all required fields
+     *       are set before building.
+     *   <li>Parse the message separately using one of the static
+     *       {@code parseFrom} methods, then use {@link #mergeFrom(MessageLite)}
+     *       to merge it with this one.  {@code parseFrom} will throw an
+     *       {@link InvalidProtocolBufferException} (an {@code IOException})
+     *       if some required fields are missing.
+     *   <li>Use {@code buildPartial()} to build, which ignores missing
+     *       required fields.
+     * </ul>
+     *
+     * <p>Note:  The caller should call
+     * {@link CodedInputStream#checkLastTagWas(int)} after calling this to
+     * verify that the last tag seen was the appropriate end-group tag,
+     * or zero for EOF.
+     */
+    Builder mergeFrom(CodedInputStream input) throws IOException;
+
+    /**
+     * Like {@link Builder#mergeFrom(CodedInputStream)}, but also
+     * parses extensions.  The extensions that you want to be able to parse
+     * must be registered in {@code extensionRegistry}.  Extensions not in
+     * the registry will be treated as unknown fields.
+     */
+    Builder mergeFrom(CodedInputStream input,
+                      ExtensionRegistryLite extensionRegistry)
+                      throws IOException;
+
+    // ---------------------------------------------------------------
+    // Convenience methods.
+
+    /**
+     * Parse {@code data} as a message of this type and merge it with the
+     * message being built.  This is just a small wrapper around
+     * {@link #mergeFrom(CodedInputStream)}.
+     *
+     * @return this
+     */
+    Builder mergeFrom(ByteString data) throws InvalidProtocolBufferException;
+
+    /**
+     * Parse {@code data} as a message of this type and merge it with the
+     * message being built.  This is just a small wrapper around
+     * {@link #mergeFrom(CodedInputStream,ExtensionRegistry)}.
+     *
+     * @return this
+     */
+    Builder mergeFrom(ByteString data,
+                      ExtensionRegistryLite extensionRegistry)
+                      throws InvalidProtocolBufferException;
+
+    /**
+     * Parse {@code data} as a message of this type and merge it with the
+     * message being built.  This is just a small wrapper around
+     * {@link #mergeFrom(CodedInputStream)}.
+     *
+     * @return this
+     */
+    Builder mergeFrom(byte[] data) throws InvalidProtocolBufferException;
+
+    /**
+     * Parse {@code data} as a message of this type and merge it with the
+     * message being built.  This is just a small wrapper around
+     * {@link #mergeFrom(CodedInputStream)}.
+     *
+     * @return this
+     */
+    Builder mergeFrom(byte[] data, int off, int len)
+                      throws InvalidProtocolBufferException;
+
+    /**
+     * Parse {@code data} as a message of this type and merge it with the
+     * message being built.  This is just a small wrapper around
+     * {@link #mergeFrom(CodedInputStream,ExtensionRegistry)}.
+     *
+     * @return this
+     */
+    Builder mergeFrom(byte[] data,
+                      ExtensionRegistryLite extensionRegistry)
+                      throws InvalidProtocolBufferException;
+
+    /**
+     * Parse {@code data} as a message of this type and merge it with the
+     * message being built.  This is just a small wrapper around
+     * {@link #mergeFrom(CodedInputStream,ExtensionRegistry)}.
+     *
+     * @return this
+     */
+    Builder mergeFrom(byte[] data, int off, int len,
+                      ExtensionRegistryLite extensionRegistry)
+                      throws InvalidProtocolBufferException;
+
+    /**
+     * Parse a message of this type from {@code input} and merge it with the
+     * message being built.  This is just a small wrapper around
+     * {@link #mergeFrom(CodedInputStream)}.  Note that this method always
+     * reads the <i>entire</i> input (unless it throws an exception).  If you
+     * want it to stop earlier, you will need to wrap your input in some
+     * wrapper stream that limits reading.  Or, use
+     * {@link MessageLite#writeDelimitedTo(OutputStream)} to write your message
+     * and {@link #mergeDelimitedFrom(InputStream)} to read it.
+     * <p>
+     * Despite usually reading the entire input, this does not close the stream.
+     *
+     * @return this
+     */
+    Builder mergeFrom(InputStream input) throws IOException;
+
+    /**
+     * Parse a message of this type from {@code input} and merge it with the
+     * message being built.  This is just a small wrapper around
+     * {@link #mergeFrom(CodedInputStream,ExtensionRegistry)}.
+     *
+     * @return this
+     */
+    Builder mergeFrom(InputStream input,
+                      ExtensionRegistryLite extensionRegistry)
+                      throws IOException;
+
+    /**
+     * Like {@link #mergeFrom(InputStream)}, but does not read until EOF.
+     * Instead, the size of the message (encoded as a varint) is read first,
+     * then the message data.  Use
+     * {@link MessageLite#writeDelimitedTo(OutputStream)} to write messages in
+     * this format.
+     *
+     * @returns True if successful, or false if the stream is at EOF when the
+     *          method starts.  Any other error (including reaching EOF during
+     *          parsing) will cause an exception to be thrown.
+     */
+    boolean mergeDelimitedFrom(InputStream input)
+                               throws IOException;
+
+    /**
+     * Like {@link #mergeDelimitedFrom(InputStream)} but supporting extensions.
+     */
+    boolean mergeDelimitedFrom(InputStream input,
+                               ExtensionRegistryLite extensionRegistry)
+                               throws IOException;
+  }
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/MessageLiteOrBuilder.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/MessageLiteOrBuilder.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/MessageLiteOrBuilder.java	(revision 15014)
@@ -0,0 +1,58 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+/**
+ * Base interface for methods common to {@link MessageLite}
+ * and {@link MessageLite.Builder} to provide type equivalency.
+ *
+ * @author jonp@google.com (Jon Perlow)
+ */
+public interface MessageLiteOrBuilder {
+  /**
+   * Get an instance of the type with no fields set. Because no fields are set,
+   * all getters for singular fields will return default values and repeated
+   * fields will appear empty.
+   * This may or may not be a singleton.  This differs from the
+   * {@code getDefaultInstance()} method of generated message classes in that
+   * this method is an abstract method of the {@code MessageLite} interface
+   * whereas {@code getDefaultInstance()} is a static method of a specific
+   * class.  They return the same thing.
+   */
+  MessageLite getDefaultInstanceForType();
+
+  /**
+   * Returns true if all required fields in the message and all embedded
+   * messages are set, false otherwise.
+   */
+  boolean isInitialized();
+
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/MessageOrBuilder.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/MessageOrBuilder.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/MessageOrBuilder.java	(revision 15014)
@@ -0,0 +1,110 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import java.util.Map;
+
+/**
+ * Base interface for methods common to {@link Message} and
+ * {@link Message.Builder} to provide type equivalency.
+ *
+ * @author jonp@google.com (Jon Perlow)
+ */
+public interface MessageOrBuilder extends MessageLiteOrBuilder {
+
+  // (From MessageLite, re-declared here only for return type covariance.)
+  //@Override (Java 1.6 override semantics, but we must support 1.5)
+  Message getDefaultInstanceForType();
+
+  /**
+   * Get the message's type's descriptor.  This differs from the
+   * {@code getDescriptor()} method of generated message classes in that
+   * this method is an abstract method of the {@code Message} interface
+   * whereas {@code getDescriptor()} is a static method of a specific class.
+   * They return the same thing.
+   */
+  Descriptors.Descriptor getDescriptorForType();
+
+  /**
+   * Returns a collection of all the fields in this message which are set
+   * and their corresponding values.  A singular ("required" or "optional")
+   * field is set iff hasField() returns true for that field.  A "repeated"
+   * field is set iff getRepeatedFieldSize() is greater than zero.  The
+   * values are exactly what would be returned by calling
+   * {@link #getField(Descriptors.FieldDescriptor)} for each field.  The map
+   * is guaranteed to be a sorted map, so iterating over it will return fields
+   * in order by field number.
+   * <br>
+   * If this is for a builder, the returned map may or may not reflect future
+   * changes to the builder.  Either way, the returned map is itself
+   * unmodifiable.
+   */
+  Map<Descriptors.FieldDescriptor, Object> getAllFields();
+
+  /**
+   * Returns true if the given field is set.  This is exactly equivalent to
+   * calling the generated "has" accessor method corresponding to the field.
+   * @throws IllegalArgumentException The field is a repeated field, or
+   *           {@code field.getContainingType() != getDescriptorForType()}.
+   */
+  boolean hasField(Descriptors.FieldDescriptor field);
+
+  /**
+   * Obtains the value of the given field, or the default value if it is
+   * not set.  For primitive fields, the boxed primitive value is returned.
+   * For enum fields, the EnumValueDescriptor for the value is returend. For
+   * embedded message fields, the sub-message is returned.  For repeated
+   * fields, a java.util.List is returned.
+   */
+  Object getField(Descriptors.FieldDescriptor field);
+
+  /**
+   * Gets the number of elements of a repeated field.  This is exactly
+   * equivalent to calling the generated "Count" accessor method corresponding
+   * to the field.
+   * @throws IllegalArgumentException The field is not a repeated field, or
+   *           {@code field.getContainingType() != getDescriptorForType()}.
+   */
+  int getRepeatedFieldCount(Descriptors.FieldDescriptor field);
+
+  /**
+   * Gets an element of a repeated field.  For primitive fields, the boxed
+   * primitive value is returned.  For enum fields, the EnumValueDescriptor
+   * for the value is returend. For embedded message fields, the sub-message
+   * is returned.
+   * @throws IllegalArgumentException The field is not a repeated field, or
+   *           {@code field.getContainingType() != getDescriptorForType()}.
+   */
+  Object getRepeatedField(Descriptors.FieldDescriptor field, int index);
+
+  /** Get the {@link UnknownFieldSet} for this message. */
+  UnknownFieldSet getUnknownFields();
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/ProtocolMessageEnum.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/ProtocolMessageEnum.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/ProtocolMessageEnum.java	(revision 15014)
@@ -0,0 +1,58 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.Descriptors.EnumDescriptor;
+import com.google.protobuf.Descriptors.EnumValueDescriptor;
+
+/**
+ * Interface of useful methods added to all enums generated by the protocol
+ * compiler.
+ */
+public interface ProtocolMessageEnum extends Internal.EnumLite {
+
+  /**
+   * Return the value's numeric value as defined in the .proto file.
+   */
+  int getNumber();
+
+  /**
+   * Return the value's descriptor, which contains information such as
+   * value name, number, and type.
+   */
+  EnumValueDescriptor getValueDescriptor();
+
+  /**
+   * Return the enum type's descriptor, which contains information
+   * about each defined value, etc.
+   */
+  EnumDescriptor getDescriptorForType();
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/RepeatedFieldBuilder.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/RepeatedFieldBuilder.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/RepeatedFieldBuilder.java	(revision 15014)
@@ -0,0 +1,696 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * <code>RepeatedFieldBuilder</code> implements a structure that a protocol
+ * message uses to hold a repeated field of other protocol messages. It supports
+ * the classical use case of adding immutable {@link Message}'s to the
+ * repeated field and is highly optimized around this (no extra memory
+ * allocations and sharing of immutable arrays).
+ * <br>
+ * It also supports the additional use case of adding a {@link Message.Builder}
+ * to the repeated field and deferring conversion of that <code>Builder</code>
+ * to an immutable <code>Message</code>. In this way, it's possible to maintain
+ * a tree of <code>Builder</code>'s that acts as a fully read/write data
+ * structure.
+ * <br>
+ * Logically, one can think of a tree of builders as converting the entire tree
+ * to messages when build is called on the root or when any method is called
+ * that desires a Message instead of a Builder. In terms of the implementation,
+ * the <code>SingleFieldBuilder</code> and <code>RepeatedFieldBuilder</code>
+ * classes cache messages that were created so that messages only need to be
+ * created when some change occured in its builder or a builder for one of its
+ * descendants.
+ *
+ * @param <MType> the type of message for the field
+ * @param <BType> the type of builder for the field
+ * @param <IType> the common interface for the message and the builder
+ *
+ * @author jonp@google.com (Jon Perlow)
+ */
+public class RepeatedFieldBuilder
+    <MType extends GeneratedMessage,
+     BType extends GeneratedMessage.Builder,
+     IType extends MessageOrBuilder>
+    implements GeneratedMessage.BuilderParent {
+
+  // Parent to send changes to.
+  private GeneratedMessage.BuilderParent parent;
+
+  // List of messages. Never null. It may be immutable, in which case
+  // isMessagesListImmutable will be true. See note below.
+  private List<MType> messages;
+
+  // Whether messages is an mutable array that can be modified.
+  private boolean isMessagesListMutable;
+
+  // List of builders. May be null, in which case, no nested builders were
+  // created. If not null, entries represent the builder for that index.
+  private List<SingleFieldBuilder<MType, BType, IType>> builders;
+
+  // Here are the invariants for messages and builders:
+  // 1. messages is never null and its count corresponds to the number of items
+  //    in the repeated field.
+  // 2. If builders is non-null, messages and builders MUST always
+  //    contain the same number of items.
+  // 3. Entries in either array can be null, but for any index, there MUST be
+  //    either a Message in messages or a builder in builders.
+  // 4. If the builder at an index is non-null, the builder is
+  //    authoritative. This is the case where a Builder was set on the index.
+  //    Any message in the messages array MUST be ignored.
+  // t. If the builder at an index is null, the message in the messages
+  //    list is authoritative. This is the case where a Message (not a Builder)
+  //    was set directly for an index.
+
+  // Indicates that we've built a message and so we are now obligated
+  // to dispatch dirty invalidations. See GeneratedMessage.BuilderListener.
+  private boolean isClean;
+
+  // A view of this builder that exposes a List interface of messages. This is
+  // initialized on demand. This is fully backed by this object and all changes
+  // are reflected in it. Access to any item converts it to a message if it
+  // was a builder.
+  private MessageExternalList<MType, BType, IType> externalMessageList;
+
+  // A view of this builder that exposes a List interface of builders. This is
+  // initialized on demand. This is fully backed by this object and all changes
+  // are reflected in it. Access to any item converts it to a builder if it
+  // was a message.
+  private BuilderExternalList<MType, BType, IType> externalBuilderList;
+
+  // A view of this builder that exposes a List interface of the interface
+  // implemented by messages and builders. This is initialized on demand. This
+  // is fully backed by this object and all changes are reflected in it.
+  // Access to any item returns either a builder or message depending on
+  // what is most efficient.
+  private MessageOrBuilderExternalList<MType, BType, IType>
+      externalMessageOrBuilderList;
+
+  /**
+   * Constructs a new builder with an empty list of messages.
+   *
+   * @param messages the current list of messages
+   * @param isMessagesListMutable Whether the messages list is mutable
+   * @param parent a listener to notify of changes
+   * @param isClean whether the builder is initially marked clean
+   */
+  public RepeatedFieldBuilder(
+      List<MType> messages,
+      boolean isMessagesListMutable,
+      GeneratedMessage.BuilderParent parent,
+      boolean isClean) {
+    this.messages = messages;
+    this.isMessagesListMutable = isMessagesListMutable;
+    this.parent = parent;
+    this.isClean = isClean;
+  }
+
+  public void dispose() {
+    // Null out parent so we stop sending it invalidations.
+    parent = null;
+  }
+
+  /**
+   * Ensures that the list of messages is mutable so it can be updated. If it's
+   * immutable, a copy is made.
+   */
+  private void ensureMutableMessageList() {
+    if (!isMessagesListMutable) {
+      messages = new ArrayList<MType>(messages);
+      isMessagesListMutable = true;
+    }
+  }
+
+  /**
+   * Ensures that the list of builders is not null. If it's null, the list is
+   * created and initialized to be the same size as the messages list with
+   * null entries.
+   */
+  private void ensureBuilders() {
+    if (this.builders == null) {
+      this.builders =
+          new ArrayList<SingleFieldBuilder<MType, BType, IType>>(
+              messages.size());
+      for (int i = 0; i < messages.size(); i++) {
+        builders.add(null);
+      }
+    }
+  }
+
+  /**
+   * Gets the count of items in the list.
+   *
+   * @return the count of items in the list.
+   */
+  public int getCount() {
+    return messages.size();
+  }
+
+  /**
+   * Gets whether the list is empty.
+   *
+   * @return whether the list is empty
+   */
+  public boolean isEmpty() {
+    return messages.isEmpty();
+  }
+
+  /**
+   * Get the message at the specified index. If the message is currently stored
+   * as a <code>Builder</code>, it is converted to a <code>Message</code> by
+   * calling {@link Message.Builder#buildPartial} on it.
+   *
+   * @param index the index of the message to get
+   * @return the message for the specified index
+   */
+  public MType getMessage(int index) {
+    return getMessage(index, false);
+  }
+
+  /**
+   * Get the message at the specified index. If the message is currently stored
+   * as a <code>Builder</code>, it is converted to a <code>Message</code> by
+   * calling {@link Message.Builder#buildPartial} on it.
+   *
+   * @param index the index of the message to get
+   * @param forBuild this is being called for build so we want to make sure
+   *     we SingleFieldBuilder.build to send dirty invalidations
+   * @return the message for the specified index
+   */
+  private MType getMessage(int index, boolean forBuild) {
+    if (this.builders == null) {
+      // We don't have any builders -- return the current Message.
+      // This is the case where no builder was created, so we MUST have a
+      // Message.
+      return messages.get(index);
+    }
+
+    SingleFieldBuilder<MType, BType, IType> builder = builders.get(index);
+    if (builder == null) {
+      // We don't have a builder -- return the current message.
+      // This is the case where no builder was created for the entry at index,
+      // so we MUST have a message.
+      return messages.get(index);
+
+    } else {
+      return forBuild ? builder.build() : builder.getMessage();
+    }
+  }
+
+  /**
+   * Gets a builder for the specified index. If no builder has been created for
+   * that index, a builder is created on demand by calling
+   * {@link Message#toBuilder}.
+   *
+   * @param index the index of the message to get
+   * @return The builder for that index
+   */
+  public BType getBuilder(int index) {
+    ensureBuilders();
+    SingleFieldBuilder<MType, BType, IType> builder = builders.get(index);
+    if (builder == null) {
+      MType message = messages.get(index);
+      builder = new SingleFieldBuilder<MType, BType, IType>(
+          message, this, isClean);
+      builders.set(index, builder);
+    }
+    return builder.getBuilder();
+  }
+
+  /**
+   * Gets the base class interface for the specified index. This may either be
+   * a builder or a message. It will return whatever is more efficient.
+   *
+   * @param index the index of the message to get
+   * @return the message or builder for the index as the base class interface
+   */
+  @SuppressWarnings("unchecked")
+  public IType getMessageOrBuilder(int index) {
+    if (this.builders == null) {
+      // We don't have any builders -- return the current Message.
+      // This is the case where no builder was created, so we MUST have a
+      // Message.
+      return (IType) messages.get(index);
+    }
+
+    SingleFieldBuilder<MType, BType, IType> builder = builders.get(index);
+    if (builder == null) {
+      // We don't have a builder -- return the current message.
+      // This is the case where no builder was created for the entry at index,
+      // so we MUST have a message.
+      return (IType) messages.get(index);
+
+    } else {
+      return builder.getMessageOrBuilder();
+    }
+  }
+
+  /**
+   * Sets a  message at the specified index replacing the existing item at
+   * that index.
+   *
+   * @param index the index to set.
+   * @param message the message to set
+   * @return the builder
+   */
+  public RepeatedFieldBuilder<MType, BType, IType> setMessage(
+      int index, MType message) {
+    if (message == null) {
+      throw new NullPointerException();
+    }
+    ensureMutableMessageList();
+    messages.set(index, message);
+    if (builders != null) {
+      SingleFieldBuilder<MType, BType, IType> entry =
+          builders.set(index, null);
+      if (entry != null) {
+        entry.dispose();
+      }
+    }
+    onChanged();
+    incrementModCounts();
+    return this;
+  }
+
+  /**
+   * Appends the specified element to the end of this list.
+   *
+   * @param message the message to add
+   * @return the builder
+   */
+  public RepeatedFieldBuilder<MType, BType, IType> addMessage(
+      MType message) {
+    if (message == null) {
+      throw new NullPointerException();
+    }
+    ensureMutableMessageList();
+    messages.add(message);
+    if (builders != null) {
+      builders.add(null);
+    }
+    onChanged();
+    incrementModCounts();
+    return this;
+  }
+
+  /**
+   * Inserts the specified message at the specified position in this list.
+   * Shifts the element currently at that position (if any) and any subsequent
+   * elements to the right (adds one to their indices).
+   *
+   * @param index the index at which to insert the message
+   * @param message the message to add
+   * @return the builder
+   */
+  public RepeatedFieldBuilder<MType, BType, IType> addMessage(
+      int index, MType message) {
+    if (message == null) {
+      throw new NullPointerException();
+    }
+    ensureMutableMessageList();
+    messages.add(index, message);
+    if (builders != null) {
+      builders.add(index, null);
+    }
+    onChanged();
+    incrementModCounts();
+    return this;
+  }
+
+  /**
+   * Appends all of the messages in the specified collection to the end of
+   * this list, in the order that they are returned by the specified
+   * collection's iterator.
+   *
+   * @param values the messages to add
+   * @return the builder
+   */
+  public RepeatedFieldBuilder<MType, BType, IType> addAllMessages(
+      Iterable<? extends MType> values) {
+    for (final MType value : values) {
+      if (value == null) {
+        throw new NullPointerException();
+      }
+    }
+    if (values instanceof Collection) {
+      @SuppressWarnings("unchecked") final
+      Collection<MType> collection = (Collection<MType>) values;
+      if (collection.size() == 0) {
+        return this;
+      }
+      ensureMutableMessageList();
+      for (MType value : values) {
+        addMessage(value);
+      }
+    } else {
+      ensureMutableMessageList();
+      for (MType value : values) {
+        addMessage(value);
+      }
+    }
+    onChanged();
+    incrementModCounts();
+    return this;
+  }
+
+  /**
+   * Appends a new builder to the end of this list and returns the builder.
+   *
+   * @param message the message to add which is the basis of the builder
+   * @return the new builder
+   */
+  public BType addBuilder(MType message) {
+    ensureMutableMessageList();
+    ensureBuilders();
+    SingleFieldBuilder<MType, BType, IType> builder =
+        new SingleFieldBuilder<MType, BType, IType>(
+            message, this, isClean);
+    messages.add(null);
+    builders.add(builder);
+    onChanged();
+    incrementModCounts();
+    return builder.getBuilder();
+  }
+
+  /**
+   * Inserts a new builder at the specified position in this list.
+   * Shifts the element currently at that position (if any) and any subsequent
+   * elements to the right (adds one to their indices).
+   *
+   * @param index the index at which to insert the builder
+   * @param message the message to add which is the basis of the builder
+   * @return the builder
+   */
+  public BType addBuilder(int index, MType message) {
+    ensureMutableMessageList();
+    ensureBuilders();
+    SingleFieldBuilder<MType, BType, IType> builder =
+        new SingleFieldBuilder<MType, BType, IType>(
+            message, this, isClean);
+    messages.add(index, null);
+    builders.add(index, builder);
+    onChanged();
+    incrementModCounts();
+    return builder.getBuilder();
+  }
+
+  /**
+   * Removes the element at the specified position in this list. Shifts any
+   * subsequent elements to the left (subtracts one from their indices).
+   * Returns the element that was removed from the list.
+   *
+   * @param index the index at which to remove the message
+   */
+  public void remove(int index) {
+    ensureMutableMessageList();
+    messages.remove(index);
+    if (builders != null) {
+      SingleFieldBuilder<MType, BType, IType> entry =
+          builders.remove(index);
+      if (entry != null) {
+        entry.dispose();
+      }
+    }
+    onChanged();
+    incrementModCounts();
+  }
+
+  /**
+   * Removes all of the elements from this list.
+   * The list will be empty after this call returns.
+   */
+  public void clear() {
+    messages = Collections.emptyList();
+    isMessagesListMutable = false;
+    if (builders != null) {
+      for (SingleFieldBuilder<MType, BType, IType> entry :
+          builders) {
+        if (entry != null) {
+          entry.dispose();
+        }
+      }
+      builders = null;
+    }
+    onChanged();
+    incrementModCounts();
+  }
+
+  /**
+   * Builds the list of messages from the builder and returns them.
+   *
+   * @return an immutable list of messages
+   */
+  public List<MType> build() {
+    // Now that build has been called, we are required to dispatch
+    // invalidations.
+    isClean = true;
+
+    if (!isMessagesListMutable && builders == null) {
+      // We still have an immutable list and we never created a builder.
+      return messages;
+    }
+
+    boolean allMessagesInSync = true;
+    if (!isMessagesListMutable) {
+      // We still have an immutable list. Let's see if any of them are out
+      // of sync with their builders.
+      for (int i = 0; i < messages.size(); i++) {
+        Message message = messages.get(i);
+        SingleFieldBuilder<MType, BType, IType> builder = builders.get(i);
+        if (builder != null) {
+          if (builder.build() != message) {
+            allMessagesInSync = false;
+            break;
+          }
+        }
+      }
+      if (allMessagesInSync) {
+        // Immutable list is still in sync.
+        return messages;
+      }
+    }
+
+    // Need to make sure messages is up to date
+    ensureMutableMessageList();
+    for (int i = 0; i < messages.size(); i++) {
+      messages.set(i, getMessage(i, true));
+    }
+
+    // We're going to return our list as immutable so we mark that we can
+    // no longer update it.
+    messages = Collections.unmodifiableList(messages);
+    isMessagesListMutable = false;
+    return messages;
+  }
+
+  /**
+   * Gets a view of the builder as a list of messages. The returned list is live
+   * and will reflect any changes to the underlying builder.
+   *
+   * @return the messages in the list
+   */
+  public List<MType> getMessageList() {
+    if (externalMessageList == null) {
+      externalMessageList =
+          new MessageExternalList<MType, BType, IType>(this);
+    }
+    return externalMessageList;
+  }
+
+  /**
+   * Gets a view of the builder as a list of builders. This returned list is
+   * live and will reflect any changes to the underlying builder.
+   *
+   * @return the builders in the list
+   */
+  public List<BType> getBuilderList() {
+    if (externalBuilderList == null) {
+      externalBuilderList =
+          new BuilderExternalList<MType, BType, IType>(this);
+    }
+    return externalBuilderList;
+  }
+
+  /**
+   * Gets a view of the builder as a list of MessageOrBuilders. This returned
+   * list is live and will reflect any changes to the underlying builder.
+   *
+   * @return the builders in the list
+   */
+  public List<IType> getMessageOrBuilderList() {
+    if (externalMessageOrBuilderList == null) {
+      externalMessageOrBuilderList =
+          new MessageOrBuilderExternalList<MType, BType, IType>(this);
+    }
+    return externalMessageOrBuilderList;
+  }
+
+  /**
+   * Called when a the builder or one of its nested children has changed
+   * and any parent should be notified of its invalidation.
+   */
+  private void onChanged() {
+    if (isClean && parent != null) {
+      parent.markDirty();
+
+      // Don't keep dispatching invalidations until build is called again.
+      isClean = false;
+    }
+  }
+
+  //@Override (Java 1.6 override semantics, but we must support 1.5)
+  public void markDirty() {
+    onChanged();
+  }
+
+  /**
+   * Increments the mod counts so that an ConcurrentModificationException can
+   * be thrown if calling code tries to modify the builder while its iterating
+   * the list.
+   */
+  private void incrementModCounts() {
+    if (externalMessageList != null) {
+      externalMessageList.incrementModCount();
+    }
+    if (externalBuilderList != null) {
+      externalBuilderList.incrementModCount();
+    }
+    if (externalMessageOrBuilderList != null) {
+      externalMessageOrBuilderList.incrementModCount();
+    }
+  }
+
+  /**
+   * Provides a live view of the builder as a list of messages.
+   *
+   * @param <MType> the type of message for the field
+   * @param <BType> the type of builder for the field
+   * @param <IType> the common interface for the message and the builder
+   */
+  private static class MessageExternalList<
+      MType extends GeneratedMessage,
+      BType extends GeneratedMessage.Builder,
+      IType extends MessageOrBuilder>
+      extends AbstractList<MType> implements List<MType> {
+
+    RepeatedFieldBuilder<MType, BType, IType> builder;
+
+    MessageExternalList(
+        RepeatedFieldBuilder<MType, BType, IType> builder) {
+      this.builder = builder;
+    }
+
+    public int size() {
+      return this.builder.getCount();
+    }
+
+    public MType get(int index) {
+      return builder.getMessage(index);
+    }
+
+    void incrementModCount() {
+      modCount++;
+    }
+  }
+
+  /**
+   * Provides a live view of the builder as a list of builders.
+   *
+   * @param <MType> the type of message for the field
+   * @param <BType> the type of builder for the field
+   * @param <IType> the common interface for the message and the builder
+   */
+  private static class BuilderExternalList<
+      MType extends GeneratedMessage,
+      BType extends GeneratedMessage.Builder,
+      IType extends MessageOrBuilder>
+      extends AbstractList<BType> implements List<BType> {
+
+    RepeatedFieldBuilder<MType, BType, IType> builder;
+
+    BuilderExternalList(
+        RepeatedFieldBuilder<MType, BType, IType> builder) {
+      this.builder = builder;
+    }
+
+    public int size() {
+      return this.builder.getCount();
+    }
+
+    public BType get(int index) {
+      return builder.getBuilder(index);
+    }
+
+    void incrementModCount() {
+      modCount++;
+    }
+  }
+
+  /**
+   * Provides a live view of the builder as a list of builders.
+   *
+   * @param <MType> the type of message for the field
+   * @param <BType> the type of builder for the field
+   * @param <IType> the common interface for the message and the builder
+   */
+  private static class MessageOrBuilderExternalList<
+      MType extends GeneratedMessage,
+      BType extends GeneratedMessage.Builder,
+      IType extends MessageOrBuilder>
+      extends AbstractList<IType> implements List<IType> {
+
+    RepeatedFieldBuilder<MType, BType, IType> builder;
+
+    MessageOrBuilderExternalList(
+        RepeatedFieldBuilder<MType, BType, IType> builder) {
+      this.builder = builder;
+    }
+
+    public int size() {
+      return this.builder.getCount();
+    }
+
+    public IType get(int index) {
+      return builder.getMessageOrBuilder(index);
+    }
+
+    void incrementModCount() {
+      modCount++;
+    }
+  }
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/RpcCallback.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/RpcCallback.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/RpcCallback.java	(revision 15014)
@@ -0,0 +1,47 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+/**
+ * Interface for an RPC callback, normally called when an RPC completes.
+ * {@code ParameterType} is normally the method's response message type.
+ *
+ * <p>Starting with version 2.3.0, RPC implementations should not try to build
+ * on this, but should instead provide code generator plugins which generate
+ * code specific to the particular RPC implementation.  This way the generated
+ * code can be more appropriate for the implementation in use and can avoid
+ * unnecessary layers of indirection.
+ *
+ * @author kenton@google.com Kenton Varda
+ */
+public interface RpcCallback<ParameterType> {
+  void run(ParameterType parameter);
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/RpcChannel.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/RpcChannel.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/RpcChannel.java	(revision 15014)
@@ -0,0 +1,71 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+/**
+ * <p>Abstract interface for an RPC channel.  An {@code RpcChannel} represents a
+ * communication line to a {@link Service} which can be used to call that
+ * {@link Service}'s methods.  The {@link Service} may be running on another
+ * machine.  Normally, you should not call an {@code RpcChannel} directly, but
+ * instead construct a stub {@link Service} wrapping it.  Example:
+ *
+ * <pre>
+ *   RpcChannel channel = rpcImpl.newChannel("remotehost.example.com:1234");
+ *   RpcController controller = rpcImpl.newController();
+ *   MyService service = MyService.newStub(channel);
+ *   service.myMethod(controller, request, callback);
+ * </pre>
+ *
+ * <p>Starting with version 2.3.0, RPC implementations should not try to build
+ * on this, but should instead provide code generator plugins which generate
+ * code specific to the particular RPC implementation.  This way the generated
+ * code can be more appropriate for the implementation in use and can avoid
+ * unnecessary layers of indirection.
+ *
+ * @author kenton@google.com Kenton Varda
+ */
+public interface RpcChannel {
+  /**
+   * Call the given method of the remote service.  This method is similar to
+   * {@code Service.callMethod()} with one important difference:  the caller
+   * decides the types of the {@code Message} objects, not the callee.  The
+   * request may be of any type as long as
+   * {@code request.getDescriptor() == method.getInputType()}.
+   * The response passed to the callback will be of the same type as
+   * {@code responsePrototype} (which must have
+   * {@code getDescriptor() == method.getOutputType()}).
+   */
+  void callMethod(Descriptors.MethodDescriptor method,
+                  RpcController controller,
+                  Message request,
+                  Message responsePrototype,
+                  RpcCallback<Message> done);
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/RpcController.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/RpcController.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/RpcController.java	(revision 15014)
@@ -0,0 +1,118 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+/**
+ * <p>An {@code RpcController} mediates a single method call.  The primary
+ * purpose of the controller is to provide a way to manipulate settings
+ * specific to the RPC implementation and to find out about RPC-level errors.
+ *
+ * <p>Starting with version 2.3.0, RPC implementations should not try to build
+ * on this, but should instead provide code generator plugins which generate
+ * code specific to the particular RPC implementation.  This way the generated
+ * code can be more appropriate for the implementation in use and can avoid
+ * unnecessary layers of indirection.
+ *
+ * <p>The methods provided by the {@code RpcController} interface are intended
+ * to be a "least common denominator" set of features which we expect all
+ * implementations to support.  Specific implementations may provide more
+ * advanced features (e.g. deadline propagation).
+ *
+ * @author kenton@google.com Kenton Varda
+ */
+public interface RpcController {
+  // -----------------------------------------------------------------
+  // These calls may be made from the client side only.  Their results
+  // are undefined on the server side (may throw RuntimeExceptions).
+
+  /**
+   * Resets the RpcController to its initial state so that it may be reused in
+   * a new call.  This can be called from the client side only.  It must not
+   * be called while an RPC is in progress.
+   */
+  void reset();
+
+  /**
+   * After a call has finished, returns true if the call failed.  The possible
+   * reasons for failure depend on the RPC implementation.  {@code failed()}
+   * most only be called on the client side, and must not be called before a
+   * call has finished.
+   */
+  boolean failed();
+
+  /**
+   * If {@code failed()} is {@code true}, returns a human-readable description
+   * of the error.
+   */
+  String errorText();
+
+  /**
+   * Advises the RPC system that the caller desires that the RPC call be
+   * canceled.  The RPC system may cancel it immediately, may wait awhile and
+   * then cancel it, or may not even cancel the call at all.  If the call is
+   * canceled, the "done" callback will still be called and the RpcController
+   * will indicate that the call failed at that time.
+   */
+  void startCancel();
+
+  // -----------------------------------------------------------------
+  // These calls may be made from the server side only.  Their results
+  // are undefined on the client side (may throw RuntimeExceptions).
+
+  /**
+   * Causes {@code failed()} to return true on the client side.  {@code reason}
+   * will be incorporated into the message returned by {@code errorText()}.
+   * If you find you need to return machine-readable information about
+   * failures, you should incorporate it into your response protocol buffer
+   * and should NOT call {@code setFailed()}.
+   */
+  void setFailed(String reason);
+
+  /**
+   * If {@code true}, indicates that the client canceled the RPC, so the server
+   * may as well give up on replying to it.  This method must be called on the
+   * server side only.  The server should still call the final "done" callback.
+   */
+  boolean isCanceled();
+
+  /**
+   * Asks that the given callback be called when the RPC is canceled.  The
+   * parameter passed to the callback will always be {@code null}.  The
+   * callback will always be called exactly once.  If the RPC completes without
+   * being canceled, the callback will be called after completion.  If the RPC
+   * has already been canceled when NotifyOnCancel() is called, the callback
+   * will be called immediately.
+   *
+   * <p>{@code notifyOnCancel()} must be called no more than once per request.
+   * It must be called on the server side only.
+   */
+  void notifyOnCancel(RpcCallback<Object> callback);
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/RpcUtil.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/RpcUtil.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/RpcUtil.java	(revision 15014)
@@ -0,0 +1,135 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+/**
+ * Grab-bag of utility functions useful when dealing with RPCs.
+ *
+ * @author kenton@google.com Kenton Varda
+ */
+public final class RpcUtil {
+  private RpcUtil() {}
+
+  /**
+   * Take an {@code RpcCallback<Message>} and convert it to an
+   * {@code RpcCallback} accepting a specific message type.  This is always
+   * type-safe (parameter type contravariance).
+   */
+  @SuppressWarnings("unchecked")
+  public static <Type extends Message> RpcCallback<Type>
+  specializeCallback(final RpcCallback<Message> originalCallback) {
+    return (RpcCallback<Type>)originalCallback;
+    // The above cast works, but only due to technical details of the Java
+    // implementation.  A more theoretically correct -- but less efficient --
+    // implementation would be as follows:
+    //   return new RpcCallback<Type>() {
+    //     public void run(Type parameter) {
+    //       originalCallback.run(parameter);
+    //     }
+    //   };
+  }
+
+  /**
+   * Take an {@code RpcCallback} accepting a specific message type and convert
+   * it to an {@code RpcCallback<Message>}.  The generalized callback will
+   * accept any message object which has the same descriptor, and will convert
+   * it to the correct class before calling the original callback.  However,
+   * if the generalized callback is given a message with a different descriptor,
+   * an exception will be thrown.
+   */
+  public static <Type extends Message>
+  RpcCallback<Message> generalizeCallback(
+      final RpcCallback<Type> originalCallback,
+      final Class<Type> originalClass,
+      final Type defaultInstance) {
+    return new RpcCallback<Message>() {
+      public void run(final Message parameter) {
+        Type typedParameter;
+        try {
+          typedParameter = originalClass.cast(parameter);
+        } catch (ClassCastException ignored) {
+          typedParameter = copyAsType(defaultInstance, parameter);
+        }
+        originalCallback.run(typedParameter);
+      }
+    };
+  }
+
+  /**
+   * Creates a new message of type "Type" which is a copy of "source".  "source"
+   * must have the same descriptor but may be a different class (e.g.
+   * DynamicMessage).
+   */
+  @SuppressWarnings("unchecked")
+  private static <Type extends Message> Type copyAsType(
+      final Type typeDefaultInstance, final Message source) {
+    return (Type)typeDefaultInstance.newBuilderForType()
+                                    .mergeFrom(source)
+                                    .build();
+  }
+
+  /**
+   * Creates a callback which can only be called once.  This may be useful for
+   * security, when passing a callback to untrusted code:  most callbacks do
+   * not expect to be called more than once, so doing so may expose bugs if it
+   * is not prevented.
+   */
+  public static <ParameterType>
+    RpcCallback<ParameterType> newOneTimeCallback(
+      final RpcCallback<ParameterType> originalCallback) {
+    return new RpcCallback<ParameterType>() {
+      private boolean alreadyCalled = false;
+
+      public void run(final ParameterType parameter) {
+        synchronized(this) {
+          if (alreadyCalled) {
+            throw new AlreadyCalledException();
+          }
+          alreadyCalled = true;
+        }
+
+        originalCallback.run(parameter);
+      }
+    };
+  }
+
+  /**
+   * Exception thrown when a one-time callback is called more than once.
+   */
+  public static final class AlreadyCalledException extends RuntimeException {
+    private static final long serialVersionUID = 5469741279507848266L;
+
+    public AlreadyCalledException() {
+      super("This RpcCallback was already called and cannot be called " +
+            "multiple times.");
+    }
+  }
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/Service.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/Service.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/Service.java	(revision 15014)
@@ -0,0 +1,117 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+/**
+ * Abstract base interface for protocol-buffer-based RPC services.  Services
+ * themselves are abstract classes (implemented either by servers or as
+ * stubs), but they subclass this base interface.  The methods of this
+ * interface can be used to call the methods of the service without knowing
+ * its exact type at compile time (analogous to the Message interface).
+ *
+ * <p>Starting with version 2.3.0, RPC implementations should not try to build
+ * on this, but should instead provide code generator plugins which generate
+ * code specific to the particular RPC implementation.  This way the generated
+ * code can be more appropriate for the implementation in use and can avoid
+ * unnecessary layers of indirection.
+ *
+ * @author kenton@google.com Kenton Varda
+ */
+public interface Service {
+  /**
+   * Get the {@code ServiceDescriptor} describing this service and its methods.
+   */
+  Descriptors.ServiceDescriptor getDescriptorForType();
+
+  /**
+   * <p>Call a method of the service specified by MethodDescriptor.  This is
+   * normally implemented as a simple {@code switch()} that calls the standard
+   * definitions of the service's methods.
+   *
+   * <p>Preconditions:
+   * <ul>
+   *   <li>{@code method.getService() == getDescriptorForType()}
+   *   <li>{@code request} is of the exact same class as the object returned by
+   *       {@code getRequestPrototype(method)}.
+   *   <li>{@code controller} is of the correct type for the RPC implementation
+   *       being used by this Service.  For stubs, the "correct type" depends
+   *       on the RpcChannel which the stub is using.  Server-side Service
+   *       implementations are expected to accept whatever type of
+   *       {@code RpcController} the server-side RPC implementation uses.
+   * </ul>
+   *
+   * <p>Postconditions:
+   * <ul>
+   *   <li>{@code done} will be called when the method is complete.  This may be
+   *       before {@code callMethod()} returns or it may be at some point in
+   *       the future.
+   *   <li>The parameter to {@code done} is the response.  It must be of the
+   *       exact same type as would be returned by
+   *       {@code getResponsePrototype(method)}.
+   *   <li>If the RPC failed, the parameter to {@code done} will be
+   *       {@code null}.  Further details about the failure can be found by
+   *       querying {@code controller}.
+   * </ul>
+   */
+  void callMethod(Descriptors.MethodDescriptor method,
+                  RpcController controller,
+                  Message request,
+                  RpcCallback<Message> done);
+
+  /**
+   * <p>{@code callMethod()} requires that the request passed in is of a
+   * particular subclass of {@code Message}.  {@code getRequestPrototype()}
+   * gets the default instances of this type for a given method.  You can then
+   * call {@code Message.newBuilderForType()} on this instance to
+   * construct a builder to build an object which you can then pass to
+   * {@code callMethod()}.
+   *
+   * <p>Example:
+   * <pre>
+   *   MethodDescriptor method =
+   *     service.getDescriptorForType().findMethodByName("Foo");
+   *   Message request =
+   *     stub.getRequestPrototype(method).newBuilderForType()
+   *         .mergeFrom(input).build();
+   *   service.callMethod(method, request, callback);
+   * </pre>
+   */
+  Message getRequestPrototype(Descriptors.MethodDescriptor method);
+
+  /**
+   * Like {@code getRequestPrototype()}, but gets a prototype of the response
+   * message.  {@code getResponsePrototype()} is generally not needed because
+   * the {@code Service} implementation constructs the response message itself,
+   * but it may be useful in some cases to know ahead of time what type of
+   * object will be returned.
+   */
+  Message getResponsePrototype(Descriptors.MethodDescriptor method);
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/ServiceException.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/ServiceException.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/ServiceException.java	(revision 15014)
@@ -0,0 +1,52 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+/**
+ * Thrown by blocking RPC methods when a failure occurs.
+ *
+ * @author cpovirk@google.com (Chris Povirk)
+ */
+public class ServiceException extends Exception {
+  private static final long serialVersionUID = -1219262335729891920L;
+
+  public ServiceException(final String message) {
+    super(message);
+  }
+
+  public ServiceException(final Throwable cause) {
+    super(cause);
+  }
+
+  public ServiceException(final String message, final Throwable cause) {
+    super(message, cause);
+  }
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/SingleFieldBuilder.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/SingleFieldBuilder.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/SingleFieldBuilder.java	(revision 15014)
@@ -0,0 +1,241 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+/**
+ * <code>SingleFieldBuilder</code> implements a structure that a protocol
+ * message uses to hold a single field of another protocol message. It supports
+ * the classical use case of setting an immutable {@link Message} as the value
+ * of the field and is highly optimized around this.
+ * <br>
+ * It also supports the additional use case of setting a {@link Message.Builder}
+ * as the field and deferring conversion of that <code>Builder</code>
+ * to an immutable <code>Message</code>. In this way, it's possible to maintain
+ * a tree of <code>Builder</code>'s that acts as a fully read/write data
+ * structure.
+ * <br>
+ * Logically, one can think of a tree of builders as converting the entire tree
+ * to messages when build is called on the root or when any method is called
+ * that desires a Message instead of a Builder. In terms of the implementation,
+ * the <code>SingleFieldBuilder</code> and <code>RepeatedFieldBuilder</code>
+ * classes cache messages that were created so that messages only need to be
+ * created when some change occured in its builder or a builder for one of its
+ * descendants.
+ *
+ * @param <MType> the type of message for the field
+ * @param <BType> the type of builder for the field
+ * @param <IType> the common interface for the message and the builder
+ *
+ * @author jonp@google.com (Jon Perlow)
+ */
+public class SingleFieldBuilder
+    <MType extends GeneratedMessage,
+     BType extends GeneratedMessage.Builder,
+     IType extends MessageOrBuilder>
+    implements GeneratedMessage.BuilderParent {
+
+  // Parent to send changes to.
+  private GeneratedMessage.BuilderParent parent;
+
+  // Invariant: one of builder or message fields must be non-null.
+
+  // If set, this is the case where we are backed by a builder. In this case,
+  // message field represents a cached message for the builder (or null if
+  // there is no cached message).
+  private BType builder;
+
+  // If builder is non-null, this represents a cached message from the builder.
+  // If builder is null, this is the authoritative message for the field.
+  private MType message;
+
+  // Indicates that we've built a message and so we are now obligated
+  // to dispatch dirty invalidations. See GeneratedMessage.BuilderListener.
+  private boolean isClean;
+
+  public SingleFieldBuilder(
+      MType message,
+      GeneratedMessage.BuilderParent parent,
+      boolean isClean) {
+    if (message == null) {
+      throw new NullPointerException();
+    }
+    this.message = message;
+    this.parent = parent;
+    this.isClean = isClean;
+  }
+
+  public void dispose() {
+    // Null out parent so we stop sending it invalidations.
+    parent = null;
+  }
+
+  /**
+   * Get the message for the field. If the message is currently stored
+   * as a <code>Builder</code>, it is converted to a <code>Message</code> by
+   * calling {@link Message.Builder#buildPartial} on it. If no message has
+   * been set, returns the default instance of the message.
+   *
+   * @return the message for the field
+   */
+  @SuppressWarnings("unchecked")
+  public MType getMessage() {
+    if (message == null) {
+      // If message is null, the invariant is that we must be have a builder.
+      message = (MType) builder.buildPartial();
+    }
+    return message;
+  }
+
+  /**
+   * Builds the message and returns it.
+   *
+   * @return the message
+   */
+  public MType build() {
+    // Now that build has been called, we are required to dispatch
+    // invalidations.
+    isClean = true;
+    return getMessage();
+  }
+
+  /**
+   * Gets a builder for the field. If no builder has been created yet, a
+   * builder is created on demand by calling {@link Message#toBuilder}.
+   *
+   * @return The builder for the field
+   */
+  @SuppressWarnings("unchecked")
+  public BType getBuilder() {
+    if (builder == null) {
+      // builder.mergeFrom() on a fresh builder
+      // does not create any sub-objects with independent clean/dirty states,
+      // therefore setting the builder itself to clean without actually calling
+      // build() cannot break any invariants.
+      builder = (BType) message.newBuilderForType(this);
+      builder.mergeFrom(message); // no-op if message is the default message
+      builder.markClean();
+    }
+    return builder;
+  }
+
+  /**
+   * Gets the base class interface for the field. This may either be a builder
+   * or a message. It will return whatever is more efficient.
+   *
+   * @return the message or builder for the field as the base class interface
+   */
+  @SuppressWarnings("unchecked")
+  public IType getMessageOrBuilder() {
+    if (builder != null) {
+      return  (IType) builder;
+    } else {
+      return (IType) message;
+    }
+  }
+
+  /**
+   * Sets a  message for the field replacing any existing value.
+   *
+   * @param message the message to set
+   * @return the builder
+   */
+  public SingleFieldBuilder<MType, BType, IType> setMessage(
+      MType message) {
+    if (message == null) {
+      throw new NullPointerException();
+    }
+    this.message = message;
+    if (builder != null) {
+      builder.dispose();
+      builder = null;
+    }
+    onChanged();
+    return this;
+  }
+
+  /**
+   * Merges the field from another field.
+   *
+   * @param value the value to merge from
+   * @return the builder
+   */
+  public SingleFieldBuilder<MType, BType, IType> mergeFrom(
+      MType value) {
+    if (builder == null && message == message.getDefaultInstanceForType()) {
+      message = value;
+    } else {
+      getBuilder().mergeFrom(value);
+    }
+    onChanged();
+    return this;
+  }
+
+  /**
+   * Clears the value of the field.
+   *
+   * @return the builder
+   */
+  @SuppressWarnings("unchecked")
+  public SingleFieldBuilder<MType, BType, IType> clear() {
+    message = (MType) (message != null ?
+        message.getDefaultInstanceForType() :
+        builder.getDefaultInstanceForType());
+    if (builder != null) {
+      builder.dispose();
+      builder = null;
+    }
+    onChanged();
+    return this;
+  }
+
+  /**
+   * Called when a the builder or one of its nested children has changed
+   * and any parent should be notified of its invalidation.
+   */
+  private void onChanged() {
+    // If builder is null, this is the case where onChanged is being called
+    // from setMessage or clear.
+    if (builder != null) {
+      message = null;
+    }
+    if (isClean && parent != null) {
+      parent.markDirty();
+
+      // Don't keep dispatching invalidations until build is called again.
+      isClean = false;
+    }
+  }
+
+  //@Override (Java 1.6 override semantics, but we must support 1.5)
+  public void markDirty() {
+    onChanged();
+  }
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/SmallSortedMap.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/SmallSortedMap.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/SmallSortedMap.java	(revision 15014)
@@ -0,0 +1,618 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import java.util.AbstractMap;
+import java.util.AbstractSet;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.TreeMap;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Set;
+import java.util.SortedMap;
+
+/**
+ * A custom map implementation from FieldDescriptor to Object optimized to
+ * minimize the number of memory allocations for instances with a small number
+ * of mappings. The implementation stores the first {@code k} mappings in an
+ * array for a configurable value of {@code k}, allowing direct access to the
+ * corresponding {@code Entry}s without the need to create an Iterator. The
+ * remaining entries are stored in an overflow map. Iteration over the entries
+ * in the map should be done as follows:
+ *
+ * <pre>
+ * for (int i = 0; i &lt; fieldMap.getNumArrayEntries(); i++) {
+ *   process(fieldMap.getArrayEntryAt(i));
+ * }
+ * for (Map.Entry&lt;K, V&gt; entry : fieldMap.getOverflowEntries()) {
+ *   process(entry);
+ * }
+ * </pre>
+ *
+ * The resulting iteration is in order of ascending field tag number. The
+ * object returned by {@link #entrySet()} adheres to the same contract but is
+ * less efficient as it necessarily involves creating an object for iteration.
+ * <p>
+ * The tradeoff for this memory efficiency is that the worst case running time
+ * of the {@code put()} operation is {@code O(k + lg n)}, which happens when
+ * entries are added in descending order. {@code k} should be chosen such that
+ * it covers enough common cases without adversely affecting larger maps. In
+ * practice, the worst case scenario does not happen for extensions because
+ * extension fields are serialized and deserialized in order of ascending tag
+ * number, but the worst case scenario can happen for DynamicMessages.
+ * <p>
+ * The running time for all other operations is similar to that of
+ * {@code TreeMap}.
+ * <p>
+ * Instances are not thread-safe until {@link #makeImmutable()} is called,
+ * after which any modifying operation will result in an
+ * {@link UnsupportedOperationException}.
+ *
+ * @author darick@google.com Darick Tong
+ */
+// This class is final for all intents and purposes because the constructor is
+// private. However, the FieldDescriptor-specific logic is encapsulated in
+// a subclass to aid testability of the core logic.
+class SmallSortedMap<K extends Comparable<K>, V> extends AbstractMap<K, V> {
+
+  /**
+   * Creates a new instance for mapping FieldDescriptors to their values.
+   * The {@link #makeImmutable()} implementation will convert the List values
+   * of any repeated fields to unmodifiable lists.
+   *
+   * @param arraySize The size of the entry array containing the
+   *        lexicographically smallest mappings.
+   */
+  static <FieldDescriptorType extends
+      FieldSet.FieldDescriptorLite<FieldDescriptorType>>
+      SmallSortedMap<FieldDescriptorType, Object> newFieldMap(int arraySize) {
+    return new SmallSortedMap<FieldDescriptorType, Object>(arraySize) {
+      @Override
+      @SuppressWarnings("unchecked")
+      public void makeImmutable() {
+        if (!isImmutable()) {
+          for (int i = 0; i < getNumArrayEntries(); i++) {
+            final Map.Entry<FieldDescriptorType, Object> entry =
+                getArrayEntryAt(i);
+            if (entry.getKey().isRepeated()) {
+              final List value = (List) entry.getValue();
+              entry.setValue(Collections.unmodifiableList(value));
+            }
+          }
+          for (Map.Entry<FieldDescriptorType, Object> entry :
+                   getOverflowEntries()) {
+            if (entry.getKey().isRepeated()) {
+              final List value = (List) entry.getValue();
+              entry.setValue(Collections.unmodifiableList(value));
+            }
+          }
+        }
+        super.makeImmutable();
+      }
+    };
+  }
+
+  /**
+   * Creates a new instance for testing.
+   *
+   * @param arraySize The size of the entry array containing the
+   *        lexicographically smallest mappings.
+   */
+  static <K extends Comparable<K>, V> SmallSortedMap<K, V> newInstanceForTest(
+      int arraySize) {
+    return new SmallSortedMap<K, V>(arraySize);
+  }
+
+  private final int maxArraySize;
+  // The "entry array" is actually a List because generic arrays are not
+  // allowed. ArrayList also nicely handles the entry shifting on inserts and
+  // removes.
+  private List<Entry> entryList;
+  private Map<K, V> overflowEntries;
+  private boolean isImmutable;
+  // The EntrySet is a stateless view of the Map. It's initialized the first
+  // time it is requested and reused henceforth.
+  private volatile EntrySet lazyEntrySet;
+
+  /**
+   * @code arraySize Size of the array in which the lexicographically smallest
+   *       mappings are stored. (i.e. the {@code k} referred to in the class
+   *       documentation).
+   */
+  private SmallSortedMap(int arraySize) {
+    this.maxArraySize = arraySize;
+    this.entryList = Collections.emptyList();
+    this.overflowEntries = Collections.emptyMap();
+  }
+
+  /** Make this map immutable from this point forward. */
+  public void makeImmutable() {
+    if (!isImmutable) {
+      // Note: There's no need to wrap the entryList in an unmodifiableList
+      // because none of the list's accessors are exposed. The iterator() of
+      // overflowEntries, on the other hand, is exposed so it must be made
+      // unmodifiable.
+      overflowEntries = overflowEntries.isEmpty() ?
+          Collections.<K, V>emptyMap() :
+          Collections.unmodifiableMap(overflowEntries);
+      isImmutable = true;
+    }
+  }
+
+  /** @return Whether {@link #makeImmutable()} has been called. */
+  public boolean isImmutable() {
+    return isImmutable;
+  }
+
+  /** @return The number of entries in the entry array. */
+  public int getNumArrayEntries() {
+    return entryList.size();
+  }
+
+  /** @return The array entry at the given {@code index}. */
+  public Map.Entry<K, V> getArrayEntryAt(int index) {
+    return entryList.get(index);
+  }
+
+  /** @return There number of overflow entries. */
+  public int getNumOverflowEntries() {
+    return overflowEntries.size();
+  }
+
+  /** @return An iterable over the overflow entries. */
+  public Iterable<Map.Entry<K, V>> getOverflowEntries() {
+    return overflowEntries.isEmpty() ?
+        EmptySet.<Map.Entry<K, V>>iterable() :
+        overflowEntries.entrySet();
+  }
+
+  @Override
+  public int size() {
+    return entryList.size() + overflowEntries.size();
+  }
+
+  /**
+   * The implementation throws a {@code ClassCastException} if o is not an
+   * object of type {@code K}.
+   *
+   * {@inheritDoc}
+   */
+  @Override
+  public boolean containsKey(Object o) {
+    @SuppressWarnings("unchecked")
+    final K key = (K) o;
+    return binarySearchInArray(key) >= 0 || overflowEntries.containsKey(key);
+  }
+
+  /**
+   * The implementation throws a {@code ClassCastException} if o is not an
+   * object of type {@code K}.
+   *
+   * {@inheritDoc}
+   */
+  @Override
+  public V get(Object o) {
+    @SuppressWarnings("unchecked")
+    final K key = (K) o;
+    final int index = binarySearchInArray(key);
+    if (index >= 0) {
+      return entryList.get(index).getValue();
+    }
+    return overflowEntries.get(key);
+  }
+
+  @Override
+  public V put(K key, V value) {
+    checkMutable();
+    final int index = binarySearchInArray(key);
+    if (index >= 0) {
+      // Replace existing array entry.
+      return entryList.get(index).setValue(value);
+    }
+    ensureEntryArrayMutable();
+    final int insertionPoint = -(index + 1);
+    if (insertionPoint >= maxArraySize) {
+      // Put directly in overflow.
+      return getOverflowEntriesMutable().put(key, value);
+    }
+    // Insert new Entry in array.
+    if (entryList.size() == maxArraySize) {
+      // Shift the last array entry into overflow.
+      final Entry lastEntryInArray = entryList.remove(maxArraySize - 1);
+      getOverflowEntriesMutable().put(lastEntryInArray.getKey(),
+                                      lastEntryInArray.getValue());
+    }
+    entryList.add(insertionPoint, new Entry(key, value));
+    return null;
+  }
+
+  @Override
+  public void clear() {
+    checkMutable();
+    if (!entryList.isEmpty()) {
+      entryList.clear();
+    }
+    if (!overflowEntries.isEmpty()) {
+      overflowEntries.clear();
+    }
+  }
+
+  /**
+   * The implementation throws a {@code ClassCastException} if o is not an
+   * object of type {@code K}.
+   *
+   * {@inheritDoc}
+   */
+  @Override
+  public V remove(Object o) {
+    checkMutable();
+    @SuppressWarnings("unchecked")
+    final K key = (K) o;
+    final int index = binarySearchInArray(key);
+    if (index >= 0) {
+      return removeArrayEntryAt(index);
+    }
+    // overflowEntries might be Collections.unmodifiableMap(), so only
+    // call remove() if it is non-empty.
+    if (overflowEntries.isEmpty()) {
+      return null;
+    } else {
+      return overflowEntries.remove(key);
+    }
+  }
+
+  private V removeArrayEntryAt(int index) {
+    checkMutable();
+    final V removed = entryList.remove(index).getValue();
+    if (!overflowEntries.isEmpty()) {
+      // Shift the first entry in the overflow to be the last entry in the
+      // array.
+      final Iterator<Map.Entry<K, V>> iterator =
+          getOverflowEntriesMutable().entrySet().iterator();
+      entryList.add(new Entry(iterator.next()));
+      iterator.remove();
+    }
+    return removed;
+  }
+
+  /**
+   * @param key The key to find in the entry array.
+   * @return The returned integer position follows the same semantics as the
+   *     value returned by {@link java.util.Arrays#binarySearch()}.
+   */
+  private int binarySearchInArray(K key) {
+    int left = 0;
+    int right = entryList.size() - 1;
+
+    // Optimization: For the common case in which entries are added in
+    // ascending tag order, check the largest element in the array before
+    // doing a full binary search.
+    if (right >= 0) {
+      int cmp = key.compareTo(entryList.get(right).getKey());
+      if (cmp > 0) {
+        return -(right + 2);  // Insert point is after "right".
+      } else if (cmp == 0) {
+        return right;
+      }
+    }
+
+    while (left <= right) {
+      int mid = (left + right) / 2;
+      int cmp = key.compareTo(entryList.get(mid).getKey());
+      if (cmp < 0) {
+        right = mid - 1;
+      } else if (cmp > 0) {
+        left = mid + 1;
+      } else {
+        return mid;
+      }
+    }
+    return -(left + 1);
+  }
+
+  /**
+   * Similar to the AbstractMap implementation of {@code keySet()} and
+   * {@code values()}, the entry set is created the first time this method is
+   * called, and returned in response to all subsequent calls.
+   *
+   * {@inheritDoc}
+   */
+  @Override
+  public Set<Map.Entry<K, V>> entrySet() {
+    if (lazyEntrySet == null) {
+      lazyEntrySet = new EntrySet();
+    }
+    return lazyEntrySet;
+  }
+
+  /**
+   * @throws UnsupportedOperationException if {@link #makeImmutable()} has
+   *         has been called.
+   */
+  private void checkMutable() {
+    if (isImmutable) {
+      throw new UnsupportedOperationException();
+    }
+  }
+
+  /**
+   * @return a {@link SortedMap} to which overflow entries mappings can be
+   *         added or removed.
+   * @throws UnsupportedOperationException if {@link #makeImmutable()} has been
+   *         called.
+   */
+  @SuppressWarnings("unchecked")
+  private SortedMap<K, V> getOverflowEntriesMutable() {
+    checkMutable();
+    if (overflowEntries.isEmpty() && !(overflowEntries instanceof TreeMap)) {
+      overflowEntries = new TreeMap<K, V>();
+    }
+    return (SortedMap<K, V>) overflowEntries;
+  }
+
+  /**
+   * Lazily creates the entry list. Any code that adds to the list must first
+   * call this method.
+   */
+  private void ensureEntryArrayMutable() {
+    checkMutable();
+    if (entryList.isEmpty() && !(entryList instanceof ArrayList)) {
+      entryList = new ArrayList<Entry>(maxArraySize);
+    }
+  }
+
+  /**
+   * Entry implementation that implements Comparable in order to support
+   * binary search witin the entry array. Also checks mutability in
+   * {@link #setValue()}.
+   */
+  private class Entry implements Map.Entry<K, V>, Comparable<Entry> {
+
+    private final K key;
+    private V value;
+
+    Entry(Map.Entry<K, V> copy) {
+      this(copy.getKey(), copy.getValue());
+    }
+
+    Entry(K key, V value) {
+      this.key = key;
+      this.value = value;
+    }
+
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    public K getKey() {
+      return key;
+    }
+
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    public V getValue() {
+      return value;
+    }
+
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    public int compareTo(Entry other) {
+      return getKey().compareTo(other.getKey());
+    }
+
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    public V setValue(V newValue) {
+      checkMutable();
+      final V oldValue = this.value;
+      this.value = newValue;
+      return oldValue;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+      if (o == this) {
+        return true;
+      }
+      if (!(o instanceof Map.Entry)) {
+        return false;
+      }
+      @SuppressWarnings("unchecked")
+      Map.Entry<?, ?> other = (Map.Entry<?, ?>) o;
+      return equals(key, other.getKey()) && equals(value, other.getValue());
+    }
+
+    @Override
+    public int hashCode() {
+      return (key == null ? 0 : key.hashCode()) ^
+          (value == null ? 0 : value.hashCode());
+    }
+
+    @Override
+    public String toString() {
+      return key + "=" + value;
+    }
+
+    /** equals() that handles null values. */
+    private boolean equals(Object o1, Object o2) {
+      return o1 == null ? o2 == null : o1.equals(o2);
+    }
+  }
+
+  /**
+   * Stateless view of the entries in the field map.
+   */
+  private class EntrySet extends AbstractSet<Map.Entry<K, V>> {
+
+    @Override
+    public Iterator<Map.Entry<K, V>> iterator() {
+      return new EntryIterator();
+    }
+
+    @Override
+    public int size() {
+      return SmallSortedMap.this.size();
+    }
+
+    /**
+     * Throws a {@link ClassCastException} if o is not of the expected type.
+     *
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean contains(Object o) {
+      @SuppressWarnings("unchecked")
+      final Map.Entry<K, V> entry = (Map.Entry<K, V>) o;
+      final V existing = get(entry.getKey());
+      final V value = entry.getValue();
+      return existing == value ||
+          (existing != null && existing.equals(value));
+    }
+
+    @Override
+    public boolean add(Map.Entry<K, V> entry) {
+      if (!contains(entry)) {
+        put(entry.getKey(), entry.getValue());
+        return true;
+      }
+      return false;
+    }
+
+    /**
+     * Throws a {@link ClassCastException} if o is not of the expected type.
+     *
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean remove(Object o) {
+      @SuppressWarnings("unchecked")
+      final Map.Entry<K, V> entry = (Map.Entry<K, V>) o;
+      if (contains(entry)) {
+        SmallSortedMap.this.remove(entry.getKey());
+        return true;
+      }
+      return false;
+    }
+
+    @Override
+    public void clear() {
+      SmallSortedMap.this.clear();
+    }
+  }
+
+  /**
+   * Iterator implementation that switches from the entry array to the overflow
+   * entries appropriately.
+   */
+  private class EntryIterator implements Iterator<Map.Entry<K, V>> {
+
+    private int pos = -1;
+    private boolean nextCalledBeforeRemove;
+    private Iterator<Map.Entry<K, V>> lazyOverflowIterator;
+
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    public boolean hasNext() {
+      return (pos + 1) < entryList.size() ||
+          getOverflowIterator().hasNext();
+    }
+
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    public Map.Entry<K, V> next() {
+      nextCalledBeforeRemove = true;
+      // Always increment pos so that we know whether the last returned value
+      // was from the array or from overflow.
+      if (++pos < entryList.size()) {
+        return entryList.get(pos);
+      }
+      return getOverflowIterator().next();
+    }
+
+    //@Override (Java 1.6 override semantics, but we must support 1.5)
+    public void remove() {
+      if (!nextCalledBeforeRemove) {
+        throw new IllegalStateException("remove() was called before next()");
+      }
+      nextCalledBeforeRemove = false;
+      checkMutable();
+
+      if (pos < entryList.size()) {
+        removeArrayEntryAt(pos--);
+      } else {
+        getOverflowIterator().remove();
+      }
+    }
+
+    /**
+     * It is important to create the overflow iterator only after the array
+     * entries have been iterated over because the overflow entry set changes
+     * when the client calls remove() on the array entries, which invalidates
+     * any existing iterators.
+     */
+    private Iterator<Map.Entry<K, V>> getOverflowIterator() {
+      if (lazyOverflowIterator == null) {
+        lazyOverflowIterator = overflowEntries.entrySet().iterator();
+      }
+      return lazyOverflowIterator;
+    }
+  }
+
+  /**
+   * Helper class that holds immutable instances of an Iterable/Iterator that
+   * we return when the overflow entries is empty. This eliminates the creation
+   * of an Iterator object when there is nothing to iterate over.
+   */
+  private static class EmptySet {
+
+    private static final Iterator<Object> ITERATOR = new Iterator<Object>() {
+      //@Override (Java 1.6 override semantics, but we must support 1.5)
+      public boolean hasNext() {
+        return false;
+      }
+      //@Override (Java 1.6 override semantics, but we must support 1.5)
+      public Object next() {
+        throw new NoSuchElementException();
+      }
+      //@Override (Java 1.6 override semantics, but we must support 1.5)
+      public void remove() {
+        throw new UnsupportedOperationException();
+      }
+    };
+
+    private static final Iterable<Object> ITERABLE = new Iterable<Object>() {
+      //@Override (Java 1.6 override semantics, but we must support 1.5)
+      public Iterator<Object> iterator() {
+        return ITERATOR;
+      }
+    };
+
+    @SuppressWarnings("unchecked")
+    static <T> Iterable<T> iterable() {
+      return (Iterable<T>) ITERABLE;
+    }
+  }
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/TextFormat.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/TextFormat.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/TextFormat.java	(revision 15014)
@@ -0,0 +1,1476 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.Descriptors.Descriptor;
+import com.google.protobuf.Descriptors.FieldDescriptor;
+import com.google.protobuf.Descriptors.EnumDescriptor;
+import com.google.protobuf.Descriptors.EnumValueDescriptor;
+
+import java.io.IOException;
+import java.nio.CharBuffer;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Provide text parsing and formatting support for proto2 instances.
+ * The implementation largely follows google/protobuf/text_format.cc.
+ *
+ * @author wenboz@google.com Wenbo Zhu
+ * @author kenton@google.com Kenton Varda
+ */
+public final class TextFormat {
+  private TextFormat() {}
+
+  private static final Printer DEFAULT_PRINTER = new Printer(false);
+  private static final Printer SINGLE_LINE_PRINTER = new Printer(true);
+
+  /**
+   * Outputs a textual representation of the Protocol Message supplied into
+   * the parameter output. (This representation is the new version of the
+   * classic "ProtocolPrinter" output from the original Protocol Buffer system)
+   */
+  public static void print(final Message message, final Appendable output)
+                           throws IOException {
+    DEFAULT_PRINTER.print(message, new TextGenerator(output));
+  }
+
+  /** Outputs a textual representation of {@code fields} to {@code output}. */
+  public static void print(final UnknownFieldSet fields,
+                           final Appendable output)
+                           throws IOException {
+    DEFAULT_PRINTER.printUnknownFields(fields, new TextGenerator(output));
+  }
+
+  /**
+   * Generates a human readable form of this message, useful for debugging and
+   * other purposes, with no newline characters.
+   */
+  public static String shortDebugString(final Message message) {
+    try {
+      final StringBuilder sb = new StringBuilder();
+      SINGLE_LINE_PRINTER.print(message, new TextGenerator(sb));
+      // Single line mode currently might have an extra space at the end.
+      return sb.toString().trim();
+    } catch (IOException e) {
+      throw new IllegalStateException(e);
+    }
+  }
+
+  /**
+   * Generates a human readable form of the unknown fields, useful for debugging
+   * and other purposes, with no newline characters.
+   */
+  public static String shortDebugString(final UnknownFieldSet fields) {
+    try {
+      final StringBuilder sb = new StringBuilder();
+      SINGLE_LINE_PRINTER.printUnknownFields(fields, new TextGenerator(sb));
+      // Single line mode currently might have an extra space at the end.
+      return sb.toString().trim();
+    } catch (IOException e) {
+      throw new IllegalStateException(e);
+    }
+  }
+
+  /**
+   * Like {@code print()}, but writes directly to a {@code String} and
+   * returns it.
+   */
+  public static String printToString(final Message message) {
+    try {
+      final StringBuilder text = new StringBuilder();
+      print(message, text);
+      return text.toString();
+    } catch (IOException e) {
+      throw new IllegalStateException(e);
+    }
+  }
+
+  /**
+   * Like {@code print()}, but writes directly to a {@code String} and
+   * returns it.
+   */
+  public static String printToString(final UnknownFieldSet fields) {
+    try {
+      final StringBuilder text = new StringBuilder();
+      print(fields, text);
+      return text.toString();
+    } catch (IOException e) {
+      throw new IllegalStateException(e);
+    }
+  }
+
+  public static void printField(final FieldDescriptor field,
+                                final Object value,
+                                final Appendable output)
+                                throws IOException {
+    DEFAULT_PRINTER.printField(field, value, new TextGenerator(output));
+  }
+
+  public static String printFieldToString(final FieldDescriptor field,
+                                          final Object value) {
+    try {
+      final StringBuilder text = new StringBuilder();
+      printField(field, value, text);
+      return text.toString();
+    } catch (IOException e) {
+      throw new IllegalStateException(e);
+    }
+  }
+
+  /**
+   * Outputs a textual representation of the value of given field value.
+   *
+   * @param field the descriptor of the field
+   * @param value the value of the field
+   * @param output the output to which to append the formatted value
+   * @throws ClassCastException if the value is not appropriate for the
+   *     given field descriptor
+   * @throws IOException if there is an exception writing to the output
+   */
+  public static void printFieldValue(final FieldDescriptor field,
+                                     final Object value,
+                                     final Appendable output)
+                                     throws IOException {
+    DEFAULT_PRINTER.printFieldValue(field, value, new TextGenerator(output));
+  }
+
+  /**
+   * Outputs a textual representation of the value of an unknown field.
+   *
+   * @param tag the field's tag number
+   * @param value the value of the field
+   * @param output the output to which to append the formatted value
+   * @throws ClassCastException if the value is not appropriate for the
+   *     given field descriptor
+   * @throws IOException if there is an exception writing to the output
+   */
+  public static void printUnknownFieldValue(final int tag,
+                                            final Object value,
+                                            final Appendable output)
+                                            throws IOException {
+    printUnknownFieldValue(tag, value, new TextGenerator(output));
+  }
+
+  private static void printUnknownFieldValue(final int tag,
+                                             final Object value,
+                                             final TextGenerator generator)
+                                             throws IOException {
+    switch (WireFormat.getTagWireType(tag)) {
+      case WireFormat.WIRETYPE_VARINT:
+        generator.print(unsignedToString((Long) value));
+        break;
+      case WireFormat.WIRETYPE_FIXED32:
+        generator.print(
+            String.format((Locale) null, "0x%08x", (Integer) value));
+        break;
+      case WireFormat.WIRETYPE_FIXED64:
+        generator.print(String.format((Locale) null, "0x%016x", (Long) value));
+        break;
+      case WireFormat.WIRETYPE_LENGTH_DELIMITED:
+        generator.print("\"");
+        generator.print(escapeBytes((ByteString) value));
+        generator.print("\"");
+        break;
+      case WireFormat.WIRETYPE_START_GROUP:
+        DEFAULT_PRINTER.printUnknownFields((UnknownFieldSet) value, generator);
+        break;
+      default:
+        throw new IllegalArgumentException("Bad tag: " + tag);
+    }
+  }
+
+  /** Helper class for converting protobufs to text. */
+  private static final class Printer {
+    /** Whether to omit newlines from the output. */
+    final boolean singleLineMode;
+
+    private Printer(final boolean singleLineMode) {
+      this.singleLineMode = singleLineMode;
+    }
+
+    private void print(final Message message, final TextGenerator generator)
+        throws IOException {
+      for (Map.Entry<FieldDescriptor, Object> field
+          : message.getAllFields().entrySet()) {
+        printField(field.getKey(), field.getValue(), generator);
+      }
+      printUnknownFields(message.getUnknownFields(), generator);
+    }
+
+    private void printField(final FieldDescriptor field, final Object value,
+        final TextGenerator generator) throws IOException {
+      if (field.isRepeated()) {
+        // Repeated field.  Print each element.
+        for (Object element : (List<?>) value) {
+          printSingleField(field, element, generator);
+        }
+      } else {
+        printSingleField(field, value, generator);
+      }
+    }
+
+    private void printSingleField(final FieldDescriptor field,
+                                  final Object value,
+                                  final TextGenerator generator)
+                                  throws IOException {
+      if (field.isExtension()) {
+        generator.print("[");
+        // We special-case MessageSet elements for compatibility with proto1.
+        if (field.getContainingType().getOptions().getMessageSetWireFormat()
+            && (field.getType() == FieldDescriptor.Type.MESSAGE)
+            && (field.isOptional())
+            // object equality
+            && (field.getExtensionScope() == field.getMessageType())) {
+          generator.print(field.getMessageType().getFullName());
+        } else {
+          generator.print(field.getFullName());
+        }
+        generator.print("]");
+      } else {
+        if (field.getType() == FieldDescriptor.Type.GROUP) {
+          // Groups must be serialized with their original capitalization.
+          generator.print(field.getMessageType().getName());
+        } else {
+          generator.print(field.getName());
+        }
+      }
+
+      if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
+        if (singleLineMode) {
+          generator.print(" { ");
+        } else {
+          generator.print(" {\n");
+          generator.indent();
+        }
+      } else {
+        generator.print(": ");
+      }
+
+      printFieldValue(field, value, generator);
+
+      if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
+        if (singleLineMode) {
+          generator.print("} ");
+        } else {
+          generator.outdent();
+          generator.print("}\n");
+        }
+      } else {
+        if (singleLineMode) {
+          generator.print(" ");
+        } else {
+          generator.print("\n");
+        }
+      }
+    }
+
+    private void printFieldValue(final FieldDescriptor field,
+                                 final Object value,
+                                 final TextGenerator generator)
+                                 throws IOException {
+      switch (field.getType()) {
+        case INT32:
+        case SINT32:
+        case SFIXED32:
+          generator.print(((Integer) value).toString());
+          break;
+
+        case INT64:
+        case SINT64:
+        case SFIXED64:
+          generator.print(((Long) value).toString());
+          break;
+
+        case BOOL:
+          generator.print(((Boolean) value).toString());
+          break;
+
+        case FLOAT:
+          generator.print(((Float) value).toString());
+          break;
+
+        case DOUBLE:
+          generator.print(((Double) value).toString());
+          break;
+
+        case UINT32:
+        case FIXED32:
+          generator.print(unsignedToString((Integer) value));
+          break;
+
+        case UINT64:
+        case FIXED64:
+          generator.print(unsignedToString((Long) value));
+          break;
+
+        case STRING:
+          generator.print("\"");
+          generator.print(escapeText((String) value));
+          generator.print("\"");
+          break;
+
+        case BYTES:
+          generator.print("\"");
+          generator.print(escapeBytes((ByteString) value));
+          generator.print("\"");
+          break;
+
+        case ENUM:
+          generator.print(((EnumValueDescriptor) value).getName());
+          break;
+
+        case MESSAGE:
+        case GROUP:
+          print((Message) value, generator);
+          break;
+      }
+    }
+
+    private void printUnknownFields(final UnknownFieldSet unknownFields,
+                                    final TextGenerator generator)
+                                    throws IOException {
+      for (Map.Entry<Integer, UnknownFieldSet.Field> entry :
+               unknownFields.asMap().entrySet()) {
+        final int number = entry.getKey();
+        final UnknownFieldSet.Field field = entry.getValue();
+        printUnknownField(number, WireFormat.WIRETYPE_VARINT,
+            field.getVarintList(), generator);
+        printUnknownField(number, WireFormat.WIRETYPE_FIXED32,
+            field.getFixed32List(), generator);
+        printUnknownField(number, WireFormat.WIRETYPE_FIXED64,
+            field.getFixed64List(), generator);
+        printUnknownField(number, WireFormat.WIRETYPE_LENGTH_DELIMITED,
+            field.getLengthDelimitedList(), generator);
+        for (final UnknownFieldSet value : field.getGroupList()) {
+          generator.print(entry.getKey().toString());
+          if (singleLineMode) {
+            generator.print(" { ");
+          } else {
+            generator.print(" {\n");
+            generator.indent();
+          }
+          printUnknownFields(value, generator);
+          if (singleLineMode) {
+            generator.print("} ");
+          } else {
+            generator.outdent();
+            generator.print("}\n");
+          }
+        }
+      }
+    }
+
+    private void printUnknownField(final int number,
+                                   final int wireType,
+                                   final List<?> values,
+                                   final TextGenerator generator)
+                                   throws IOException {
+      for (final Object value : values) {
+        generator.print(String.valueOf(number));
+        generator.print(": ");
+        printUnknownFieldValue(wireType, value, generator);
+        generator.print(singleLineMode ? " " : "\n");
+      }
+    }
+  }
+
+  /** Convert an unsigned 32-bit integer to a string. */
+  private static String unsignedToString(final int value) {
+    if (value >= 0) {
+      return Integer.toString(value);
+    } else {
+      return Long.toString(((long) value) & 0x00000000FFFFFFFFL);
+    }
+  }
+
+  /** Convert an unsigned 64-bit integer to a string. */
+  private static String unsignedToString(final long value) {
+    if (value >= 0) {
+      return Long.toString(value);
+    } else {
+      // Pull off the most-significant bit so that BigInteger doesn't think
+      // the number is negative, then set it again using setBit().
+      return BigInteger.valueOf(value & 0x7FFFFFFFFFFFFFFFL)
+                       .setBit(63).toString();
+    }
+  }
+
+  /**
+   * An inner class for writing text to the output stream.
+   */
+  private static final class TextGenerator {
+    private final Appendable output;
+    private final StringBuilder indent = new StringBuilder();
+    private boolean atStartOfLine = true;
+
+    private TextGenerator(final Appendable output) {
+      this.output = output;
+    }
+
+    /**
+     * Indent text by two spaces.  After calling Indent(), two spaces will be
+     * inserted at the beginning of each line of text.  Indent() may be called
+     * multiple times to produce deeper indents.
+     */
+    public void indent() {
+      indent.append("  ");
+    }
+
+    /**
+     * Reduces the current indent level by two spaces, or crashes if the indent
+     * level is zero.
+     */
+    public void outdent() {
+      final int length = indent.length();
+      if (length == 0) {
+        throw new IllegalArgumentException(
+            " Outdent() without matching Indent().");
+      }
+      indent.delete(length - 2, length);
+    }
+
+    /**
+     * Print text to the output stream.
+     */
+    public void print(final CharSequence text) throws IOException {
+      final int size = text.length();
+      int pos = 0;
+
+      for (int i = 0; i < size; i++) {
+        if (text.charAt(i) == '\n') {
+          write(text.subSequence(pos, size), i - pos + 1);
+          pos = i + 1;
+          atStartOfLine = true;
+        }
+      }
+      write(text.subSequence(pos, size), size - pos);
+    }
+
+    private void write(final CharSequence data, final int size)
+                       throws IOException {
+      if (size == 0) {
+        return;
+      }
+      if (atStartOfLine) {
+        atStartOfLine = false;
+        output.append(indent);
+      }
+      output.append(data);
+    }
+  }
+
+  // =================================================================
+  // Parsing
+
+  /**
+   * Represents a stream of tokens parsed from a {@code String}.
+   *
+   * <p>The Java standard library provides many classes that you might think
+   * would be useful for implementing this, but aren't.  For example:
+   *
+   * <ul>
+   * <li>{@code java.io.StreamTokenizer}:  This almost does what we want -- or,
+   *   at least, something that would get us close to what we want -- except
+   *   for one fatal flaw:  It automatically un-escapes strings using Java
+   *   escape sequences, which do not include all the escape sequences we
+   *   need to support (e.g. '\x').
+   * <li>{@code java.util.Scanner}:  This seems like a great way at least to
+   *   parse regular expressions out of a stream (so we wouldn't have to load
+   *   the entire input into a single string before parsing).  Sadly,
+   *   {@code Scanner} requires that tokens be delimited with some delimiter.
+   *   Thus, although the text "foo:" should parse to two tokens ("foo" and
+   *   ":"), {@code Scanner} would recognize it only as a single token.
+   *   Furthermore, {@code Scanner} provides no way to inspect the contents
+   *   of delimiters, making it impossible to keep track of line and column
+   *   numbers.
+   * </ul>
+   *
+   * <p>Luckily, Java's regular expression support does manage to be useful to
+   * us.  (Barely:  We need {@code Matcher.usePattern()}, which is new in
+   * Java 1.5.)  So, we can use that, at least.  Unfortunately, this implies
+   * that we need to have the entire input in one contiguous string.
+   */
+  private static final class Tokenizer {
+    private final CharSequence text;
+    private final Matcher matcher;
+    private String currentToken;
+
+    // The character index within this.text at which the current token begins.
+    private int pos = 0;
+
+    // The line and column numbers of the current token.
+    private int line = 0;
+    private int column = 0;
+
+    // The line and column numbers of the previous token (allows throwing
+    // errors *after* consuming).
+    private int previousLine = 0;
+    private int previousColumn = 0;
+
+    // We use possesive quantifiers (*+ and ++) because otherwise the Java
+    // regex matcher has stack overflows on large inputs.
+    private static final Pattern WHITESPACE =
+      Pattern.compile("(\\s|(#.*$))++", Pattern.MULTILINE);
+    private static final Pattern TOKEN = Pattern.compile(
+      "[a-zA-Z_][0-9a-zA-Z_+-]*+|" +                // an identifier
+      "[.]?[0-9+-][0-9a-zA-Z_.+-]*+|" +             // a number
+      "\"([^\"\n\\\\]|\\\\.)*+(\"|\\\\?$)|" +       // a double-quoted string
+      "\'([^\'\n\\\\]|\\\\.)*+(\'|\\\\?$)",         // a single-quoted string
+      Pattern.MULTILINE);
+
+    private static final Pattern DOUBLE_INFINITY = Pattern.compile(
+      "-?inf(inity)?",
+      Pattern.CASE_INSENSITIVE);
+    private static final Pattern FLOAT_INFINITY = Pattern.compile(
+      "-?inf(inity)?f?",
+      Pattern.CASE_INSENSITIVE);
+    private static final Pattern FLOAT_NAN = Pattern.compile(
+      "nanf?",
+      Pattern.CASE_INSENSITIVE);
+
+    /** Construct a tokenizer that parses tokens from the given text. */
+    private Tokenizer(final CharSequence text) {
+      this.text = text;
+      this.matcher = WHITESPACE.matcher(text);
+      skipWhitespace();
+      nextToken();
+    }
+
+    /** Are we at the end of the input? */
+    public boolean atEnd() {
+      return currentToken.length() == 0;
+    }
+
+    /** Advance to the next token. */
+    public void nextToken() {
+      previousLine = line;
+      previousColumn = column;
+
+      // Advance the line counter to the current position.
+      while (pos < matcher.regionStart()) {
+        if (text.charAt(pos) == '\n') {
+          ++line;
+          column = 0;
+        } else {
+          ++column;
+        }
+        ++pos;
+      }
+
+      // Match the next token.
+      if (matcher.regionStart() == matcher.regionEnd()) {
+        // EOF
+        currentToken = "";
+      } else {
+        matcher.usePattern(TOKEN);
+        if (matcher.lookingAt()) {
+          currentToken = matcher.group();
+          matcher.region(matcher.end(), matcher.regionEnd());
+        } else {
+          // Take one character.
+          currentToken = String.valueOf(text.charAt(pos));
+          matcher.region(pos + 1, matcher.regionEnd());
+        }
+
+        skipWhitespace();
+      }
+    }
+
+    /**
+     * Skip over any whitespace so that the matcher region starts at the next
+     * token.
+     */
+    private void skipWhitespace() {
+      matcher.usePattern(WHITESPACE);
+      if (matcher.lookingAt()) {
+        matcher.region(matcher.end(), matcher.regionEnd());
+      }
+    }
+
+    /**
+     * If the next token exactly matches {@code token}, consume it and return
+     * {@code true}.  Otherwise, return {@code false} without doing anything.
+     */
+    public boolean tryConsume(final String token) {
+      if (currentToken.equals(token)) {
+        nextToken();
+        return true;
+      } else {
+        return false;
+      }
+    }
+
+    /**
+     * If the next token exactly matches {@code token}, consume it.  Otherwise,
+     * throw a {@link ParseException}.
+     */
+    public void consume(final String token) throws ParseException {
+      if (!tryConsume(token)) {
+        throw parseException("Expected \"" + token + "\".");
+      }
+    }
+
+    /**
+     * Returns {@code true} if the next token is an integer, but does
+     * not consume it.
+     */
+    public boolean lookingAtInteger() {
+      if (currentToken.length() == 0) {
+        return false;
+      }
+
+      final char c = currentToken.charAt(0);
+      return ('0' <= c && c <= '9') ||
+             c == '-' || c == '+';
+    }
+
+    /**
+     * If the next token is an identifier, consume it and return its value.
+     * Otherwise, throw a {@link ParseException}.
+     */
+    public String consumeIdentifier() throws ParseException {
+      for (int i = 0; i < currentToken.length(); i++) {
+        final char c = currentToken.charAt(i);
+        if (('a' <= c && c <= 'z') ||
+            ('A' <= c && c <= 'Z') ||
+            ('0' <= c && c <= '9') ||
+            (c == '_') || (c == '.')) {
+          // OK
+        } else {
+          throw parseException("Expected identifier.");
+        }
+      }
+
+      final String result = currentToken;
+      nextToken();
+      return result;
+    }
+
+    /**
+     * If the next token is a 32-bit signed integer, consume it and return its
+     * value.  Otherwise, throw a {@link ParseException}.
+     */
+    public int consumeInt32() throws ParseException {
+      try {
+        final int result = parseInt32(currentToken);
+        nextToken();
+        return result;
+      } catch (NumberFormatException e) {
+        throw integerParseException(e);
+      }
+    }
+
+    /**
+     * If the next token is a 32-bit unsigned integer, consume it and return its
+     * value.  Otherwise, throw a {@link ParseException}.
+     */
+    public int consumeUInt32() throws ParseException {
+      try {
+        final int result = parseUInt32(currentToken);
+        nextToken();
+        return result;
+      } catch (NumberFormatException e) {
+        throw integerParseException(e);
+      }
+    }
+
+    /**
+     * If the next token is a 64-bit signed integer, consume it and return its
+     * value.  Otherwise, throw a {@link ParseException}.
+     */
+    public long consumeInt64() throws ParseException {
+      try {
+        final long result = parseInt64(currentToken);
+        nextToken();
+        return result;
+      } catch (NumberFormatException e) {
+        throw integerParseException(e);
+      }
+    }
+
+    /**
+     * If the next token is a 64-bit unsigned integer, consume it and return its
+     * value.  Otherwise, throw a {@link ParseException}.
+     */
+    public long consumeUInt64() throws ParseException {
+      try {
+        final long result = parseUInt64(currentToken);
+        nextToken();
+        return result;
+      } catch (NumberFormatException e) {
+        throw integerParseException(e);
+      }
+    }
+
+    /**
+     * If the next token is a double, consume it and return its value.
+     * Otherwise, throw a {@link ParseException}.
+     */
+    public double consumeDouble() throws ParseException {
+      // We need to parse infinity and nan separately because
+      // Double.parseDouble() does not accept "inf", "infinity", or "nan".
+      if (DOUBLE_INFINITY.matcher(currentToken).matches()) {
+        final boolean negative = currentToken.startsWith("-");
+        nextToken();
+        return negative ? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY;
+      }
+      if (currentToken.equalsIgnoreCase("nan")) {
+        nextToken();
+        return Double.NaN;
+      }
+      try {
+        final double result = Double.parseDouble(currentToken);
+        nextToken();
+        return result;
+      } catch (NumberFormatException e) {
+        throw floatParseException(e);
+      }
+    }
+
+    /**
+     * If the next token is a float, consume it and return its value.
+     * Otherwise, throw a {@link ParseException}.
+     */
+    public float consumeFloat() throws ParseException {
+      // We need to parse infinity and nan separately because
+      // Float.parseFloat() does not accept "inf", "infinity", or "nan".
+      if (FLOAT_INFINITY.matcher(currentToken).matches()) {
+        final boolean negative = currentToken.startsWith("-");
+        nextToken();
+        return negative ? Float.NEGATIVE_INFINITY : Float.POSITIVE_INFINITY;
+      }
+      if (FLOAT_NAN.matcher(currentToken).matches()) {
+        nextToken();
+        return Float.NaN;
+      }
+      try {
+        final float result = Float.parseFloat(currentToken);
+        nextToken();
+        return result;
+      } catch (NumberFormatException e) {
+        throw floatParseException(e);
+      }
+    }
+
+    /**
+     * If the next token is a boolean, consume it and return its value.
+     * Otherwise, throw a {@link ParseException}.
+     */
+    public boolean consumeBoolean() throws ParseException {
+      if (currentToken.equals("true") ||
+          currentToken.equals("t") ||
+          currentToken.equals("1")) {
+        nextToken();
+        return true;
+      } else if (currentToken.equals("false") ||
+                 currentToken.equals("f") ||
+                 currentToken.equals("0")) {
+        nextToken();
+        return false;
+      } else {
+        throw parseException("Expected \"true\" or \"false\".");
+      }
+    }
+
+    /**
+     * If the next token is a string, consume it and return its (unescaped)
+     * value.  Otherwise, throw a {@link ParseException}.
+     */
+    public String consumeString() throws ParseException {
+      return consumeByteString().toStringUtf8();
+    }
+
+    /**
+     * If the next token is a string, consume it, unescape it as a
+     * {@link ByteString}, and return it.  Otherwise, throw a
+     * {@link ParseException}.
+     */
+    public ByteString consumeByteString() throws ParseException {
+      List<ByteString> list = new ArrayList<ByteString>();
+      consumeByteString(list);
+      while (currentToken.startsWith("'") || currentToken.startsWith("\"")) {
+        consumeByteString(list);
+      }
+      return ByteString.copyFrom(list);
+    }
+
+    /**
+     * Like {@link #consumeByteString()} but adds each token of the string to
+     * the given list.  String literals (whether bytes or text) may come in
+     * multiple adjacent tokens which are automatically concatenated, like in
+     * C or Python.
+     */
+    private void consumeByteString(List<ByteString> list) throws ParseException {
+      final char quote = currentToken.length() > 0 ? currentToken.charAt(0)
+                                                   : '\0';
+      if (quote != '\"' && quote != '\'') {
+        throw parseException("Expected string.");
+      }
+
+      if (currentToken.length() < 2 ||
+          currentToken.charAt(currentToken.length() - 1) != quote) {
+        throw parseException("String missing ending quote.");
+      }
+
+      try {
+        final String escaped =
+            currentToken.substring(1, currentToken.length() - 1);
+        final ByteString result = unescapeBytes(escaped);
+        nextToken();
+        list.add(result);
+      } catch (InvalidEscapeSequenceException e) {
+        throw parseException(e.getMessage());
+      }
+    }
+
+    /**
+     * Returns a {@link ParseException} with the current line and column
+     * numbers in the description, suitable for throwing.
+     */
+    public ParseException parseException(final String description) {
+      // Note:  People generally prefer one-based line and column numbers.
+      return new ParseException(
+        (line + 1) + ":" + (column + 1) + ": " + description);
+    }
+
+    /**
+     * Returns a {@link ParseException} with the line and column numbers of
+     * the previous token in the description, suitable for throwing.
+     */
+    public ParseException parseExceptionPreviousToken(
+        final String description) {
+      // Note:  People generally prefer one-based line and column numbers.
+      return new ParseException(
+        (previousLine + 1) + ":" + (previousColumn + 1) + ": " + description);
+    }
+
+    /**
+     * Constructs an appropriate {@link ParseException} for the given
+     * {@code NumberFormatException} when trying to parse an integer.
+     */
+    private ParseException integerParseException(
+        final NumberFormatException e) {
+      return parseException("Couldn't parse integer: " + e.getMessage());
+    }
+
+    /**
+     * Constructs an appropriate {@link ParseException} for the given
+     * {@code NumberFormatException} when trying to parse a float or double.
+     */
+    private ParseException floatParseException(final NumberFormatException e) {
+      return parseException("Couldn't parse number: " + e.getMessage());
+    }
+  }
+
+  /** Thrown when parsing an invalid text format message. */
+  public static class ParseException extends IOException {
+    private static final long serialVersionUID = 3196188060225107702L;
+
+    public ParseException(final String message) {
+      super(message);
+    }
+  }
+
+  /**
+   * Parse a text-format message from {@code input} and merge the contents
+   * into {@code builder}.
+   */
+  public static void merge(final Readable input,
+                           final Message.Builder builder)
+                           throws IOException {
+    merge(input, ExtensionRegistry.getEmptyRegistry(), builder);
+  }
+
+  /**
+   * Parse a text-format message from {@code input} and merge the contents
+   * into {@code builder}.
+   */
+  public static void merge(final CharSequence input,
+                           final Message.Builder builder)
+                           throws ParseException {
+    merge(input, ExtensionRegistry.getEmptyRegistry(), builder);
+  }
+
+  /**
+   * Parse a text-format message from {@code input} and merge the contents
+   * into {@code builder}.  Extensions will be recognized if they are
+   * registered in {@code extensionRegistry}.
+   */
+  public static void merge(final Readable input,
+                           final ExtensionRegistry extensionRegistry,
+                           final Message.Builder builder)
+                           throws IOException {
+    // Read the entire input to a String then parse that.
+
+    // If StreamTokenizer were not quite so crippled, or if there were a kind
+    // of Reader that could read in chunks that match some particular regex,
+    // or if we wanted to write a custom Reader to tokenize our stream, then
+    // we would not have to read to one big String.  Alas, none of these is
+    // the case.  Oh well.
+
+    merge(toStringBuilder(input), extensionRegistry, builder);
+  }
+
+  private static final int BUFFER_SIZE = 4096;
+
+  // TODO(chrisn): See if working around java.io.Reader#read(CharBuffer)
+  // overhead is worthwhile
+  private static StringBuilder toStringBuilder(final Readable input)
+      throws IOException {
+    final StringBuilder text = new StringBuilder();
+    final CharBuffer buffer = CharBuffer.allocate(BUFFER_SIZE);
+    while (true) {
+      final int n = input.read(buffer);
+      if (n == -1) {
+        break;
+      }
+      buffer.flip();
+      text.append(buffer, 0, n);
+    }
+    return text;
+  }
+
+  /**
+   * Parse a text-format message from {@code input} and merge the contents
+   * into {@code builder}.  Extensions will be recognized if they are
+   * registered in {@code extensionRegistry}.
+   */
+  public static void merge(final CharSequence input,
+                           final ExtensionRegistry extensionRegistry,
+                           final Message.Builder builder)
+                           throws ParseException {
+    final Tokenizer tokenizer = new Tokenizer(input);
+
+    while (!tokenizer.atEnd()) {
+      mergeField(tokenizer, extensionRegistry, builder);
+    }
+  }
+
+  /**
+   * Parse a single field from {@code tokenizer} and merge it into
+   * {@code builder}.
+   */
+  private static void mergeField(final Tokenizer tokenizer,
+                                 final ExtensionRegistry extensionRegistry,
+                                 final Message.Builder builder)
+                                 throws ParseException {
+    FieldDescriptor field;
+    final Descriptor type = builder.getDescriptorForType();
+    ExtensionRegistry.ExtensionInfo extension = null;
+
+    if (tokenizer.tryConsume("[")) {
+      // An extension.
+      final StringBuilder name =
+          new StringBuilder(tokenizer.consumeIdentifier());
+      while (tokenizer.tryConsume(".")) {
+        name.append('.');
+        name.append(tokenizer.consumeIdentifier());
+      }
+
+      extension = extensionRegistry.findExtensionByName(name.toString());
+
+      if (extension == null) {
+        throw tokenizer.parseExceptionPreviousToken(
+          "Extension \"" + name + "\" not found in the ExtensionRegistry.");
+      } else if (extension.descriptor.getContainingType() != type) {
+        throw tokenizer.parseExceptionPreviousToken(
+          "Extension \"" + name + "\" does not extend message type \"" +
+          type.getFullName() + "\".");
+      }
+
+      tokenizer.consume("]");
+
+      field = extension.descriptor;
+    } else {
+      final String name = tokenizer.consumeIdentifier();
+      field = type.findFieldByName(name);
+
+      // Group names are expected to be capitalized as they appear in the
+      // .proto file, which actually matches their type names, not their field
+      // names.
+      if (field == null) {
+        // Explicitly specify US locale so that this code does not break when
+        // executing in Turkey.
+        final String lowerName = name.toLowerCase(Locale.US);
+        field = type.findFieldByName(lowerName);
+        // If the case-insensitive match worked but the field is NOT a group,
+        if (field != null && field.getType() != FieldDescriptor.Type.GROUP) {
+          field = null;
+        }
+      }
+      // Again, special-case group names as described above.
+      if (field != null && field.getType() == FieldDescriptor.Type.GROUP &&
+          !field.getMessageType().getName().equals(name)) {
+        field = null;
+      }
+
+      if (field == null) {
+        throw tokenizer.parseExceptionPreviousToken(
+          "Message type \"" + type.getFullName() +
+          "\" has no field named \"" + name + "\".");
+      }
+    }
+
+    Object value = null;
+
+    if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
+      tokenizer.tryConsume(":");  // optional
+
+      final String endToken;
+      if (tokenizer.tryConsume("<")) {
+        endToken = ">";
+      } else {
+        tokenizer.consume("{");
+        endToken = "}";
+      }
+
+      final Message.Builder subBuilder;
+      if (extension == null) {
+        subBuilder = builder.newBuilderForField(field);
+      } else {
+        subBuilder = extension.defaultInstance.newBuilderForType();
+      }
+
+      while (!tokenizer.tryConsume(endToken)) {
+        if (tokenizer.atEnd()) {
+          throw tokenizer.parseException(
+            "Expected \"" + endToken + "\".");
+        }
+        mergeField(tokenizer, extensionRegistry, subBuilder);
+      }
+
+      value = subBuilder.build();
+
+    } else {
+      tokenizer.consume(":");
+
+      switch (field.getType()) {
+        case INT32:
+        case SINT32:
+        case SFIXED32:
+          value = tokenizer.consumeInt32();
+          break;
+
+        case INT64:
+        case SINT64:
+        case SFIXED64:
+          value = tokenizer.consumeInt64();
+          break;
+
+        case UINT32:
+        case FIXED32:
+          value = tokenizer.consumeUInt32();
+          break;
+
+        case UINT64:
+        case FIXED64:
+          value = tokenizer.consumeUInt64();
+          break;
+
+        case FLOAT:
+          value = tokenizer.consumeFloat();
+          break;
+
+        case DOUBLE:
+          value = tokenizer.consumeDouble();
+          break;
+
+        case BOOL:
+          value = tokenizer.consumeBoolean();
+          break;
+
+        case STRING:
+          value = tokenizer.consumeString();
+          break;
+
+        case BYTES:
+          value = tokenizer.consumeByteString();
+          break;
+
+        case ENUM:
+          final EnumDescriptor enumType = field.getEnumType();
+
+          if (tokenizer.lookingAtInteger()) {
+            final int number = tokenizer.consumeInt32();
+            value = enumType.findValueByNumber(number);
+            if (value == null) {
+              throw tokenizer.parseExceptionPreviousToken(
+                "Enum type \"" + enumType.getFullName() +
+                "\" has no value with number " + number + '.');
+            }
+          } else {
+            final String id = tokenizer.consumeIdentifier();
+            value = enumType.findValueByName(id);
+            if (value == null) {
+              throw tokenizer.parseExceptionPreviousToken(
+                "Enum type \"" + enumType.getFullName() +
+                "\" has no value named \"" + id + "\".");
+            }
+          }
+
+          break;
+
+        case MESSAGE:
+        case GROUP:
+          throw new RuntimeException("Can't get here.");
+      }
+    }
+
+    if (field.isRepeated()) {
+      builder.addRepeatedField(field, value);
+    } else {
+      builder.setField(field, value);
+    }
+  }
+
+  // =================================================================
+  // Utility functions
+  //
+  // Some of these methods are package-private because Descriptors.java uses
+  // them.
+
+  /**
+   * Escapes bytes in the format used in protocol buffer text format, which
+   * is the same as the format used for C string literals.  All bytes
+   * that are not printable 7-bit ASCII characters are escaped, as well as
+   * backslash, single-quote, and double-quote characters.  Characters for
+   * which no defined short-hand escape sequence is defined will be escaped
+   * using 3-digit octal sequences.
+   */
+  static String escapeBytes(final ByteString input) {
+    final StringBuilder builder = new StringBuilder(input.size());
+    for (int i = 0; i < input.size(); i++) {
+      final byte b = input.byteAt(i);
+      switch (b) {
+        // Java does not recognize \a or \v, apparently.
+        case 0x07: builder.append("\\a" ); break;
+        case '\b': builder.append("\\b" ); break;
+        case '\f': builder.append("\\f" ); break;
+        case '\n': builder.append("\\n" ); break;
+        case '\r': builder.append("\\r" ); break;
+        case '\t': builder.append("\\t" ); break;
+        case 0x0b: builder.append("\\v" ); break;
+        case '\\': builder.append("\\\\"); break;
+        case '\'': builder.append("\\\'"); break;
+        case '"' : builder.append("\\\""); break;
+        default:
+          // Note:  Bytes with the high-order bit set should be escaped.  Since
+          //   bytes are signed, such bytes will compare less than 0x20, hence
+          //   the following line is correct.
+          if (b >= 0x20) {
+            builder.append((char) b);
+          } else {
+            builder.append('\\');
+            builder.append((char) ('0' + ((b >>> 6) & 3)));
+            builder.append((char) ('0' + ((b >>> 3) & 7)));
+            builder.append((char) ('0' + (b & 7)));
+          }
+          break;
+      }
+    }
+    return builder.toString();
+  }
+
+  /**
+   * Un-escape a byte sequence as escaped using
+   * {@link #escapeBytes(ByteString)}.  Two-digit hex escapes (starting with
+   * "\x") are also recognized.
+   */
+  static ByteString unescapeBytes(final CharSequence charString)
+      throws InvalidEscapeSequenceException {
+    // First convert the Java characater sequence to UTF-8 bytes.
+    ByteString input = ByteString.copyFromUtf8(charString.toString());
+    // Then unescape certain byte sequences introduced by ASCII '\\'.  The valid
+    // escapes can all be expressed with ASCII characters, so it is safe to
+    // operate on bytes here.
+    //
+    // Unescaping the input byte array will result in a byte sequence that's no
+    // longer than the input.  That's because each escape sequence is between
+    // two and four bytes long and stands for a single byte.
+    final byte[] result = new byte[input.size()];
+    int pos = 0;
+    for (int i = 0; i < input.size(); i++) {
+      byte c = input.byteAt(i);
+      if (c == '\\') {
+        if (i + 1 < input.size()) {
+          ++i;
+          c = input.byteAt(i);
+          if (isOctal(c)) {
+            // Octal escape.
+            int code = digitValue(c);
+            if (i + 1 < input.size() && isOctal(input.byteAt(i + 1))) {
+              ++i;
+              code = code * 8 + digitValue(input.byteAt(i));
+            }
+            if (i + 1 < input.size() && isOctal(input.byteAt(i + 1))) {
+              ++i;
+              code = code * 8 + digitValue(input.byteAt(i));
+            }
+            // TODO: Check that 0 <= code && code <= 0xFF.
+            result[pos++] = (byte)code;
+          } else {
+            switch (c) {
+              case 'a' : result[pos++] = 0x07; break;
+              case 'b' : result[pos++] = '\b'; break;
+              case 'f' : result[pos++] = '\f'; break;
+              case 'n' : result[pos++] = '\n'; break;
+              case 'r' : result[pos++] = '\r'; break;
+              case 't' : result[pos++] = '\t'; break;
+              case 'v' : result[pos++] = 0x0b; break;
+              case '\\': result[pos++] = '\\'; break;
+              case '\'': result[pos++] = '\''; break;
+              case '"' : result[pos++] = '\"'; break;
+
+              case 'x':
+                // hex escape
+                int code = 0;
+                if (i + 1 < input.size() && isHex(input.byteAt(i + 1))) {
+                  ++i;
+                  code = digitValue(input.byteAt(i));
+                } else {
+                  throw new InvalidEscapeSequenceException(
+                      "Invalid escape sequence: '\\x' with no digits");
+                }
+                if (i + 1 < input.size() && isHex(input.byteAt(i + 1))) {
+                  ++i;
+                  code = code * 16 + digitValue(input.byteAt(i));
+                }
+                result[pos++] = (byte)code;
+                break;
+
+              default:
+                throw new InvalidEscapeSequenceException(
+                    "Invalid escape sequence: '\\" + (char)c + '\'');
+            }
+          }
+        } else {
+          throw new InvalidEscapeSequenceException(
+              "Invalid escape sequence: '\\' at end of string.");
+        }
+      } else {
+        result[pos++] = c;
+      }
+    }
+
+    return ByteString.copyFrom(result, 0, pos);
+  }
+
+  /**
+   * Thrown by {@link TextFormat#unescapeBytes} and
+   * {@link TextFormat#unescapeText} when an invalid escape sequence is seen.
+   */
+  static class InvalidEscapeSequenceException extends IOException {
+    private static final long serialVersionUID = -8164033650142593304L;
+
+    InvalidEscapeSequenceException(final String description) {
+      super(description);
+    }
+  }
+
+  /**
+   * Like {@link #escapeBytes(ByteString)}, but escapes a text string.
+   * Non-ASCII characters are first encoded as UTF-8, then each byte is escaped
+   * individually as a 3-digit octal escape.  Yes, it's weird.
+   */
+  static String escapeText(final String input) {
+    return escapeBytes(ByteString.copyFromUtf8(input));
+  }
+
+  /**
+   * Un-escape a text string as escaped using {@link #escapeText(String)}.
+   * Two-digit hex escapes (starting with "\x") are also recognized.
+   */
+  static String unescapeText(final String input)
+                             throws InvalidEscapeSequenceException {
+    return unescapeBytes(input).toStringUtf8();
+  }
+
+  /** Is this an octal digit? */
+  private static boolean isOctal(final byte c) {
+    return '0' <= c && c <= '7';
+  }
+
+  /** Is this a hex digit? */
+  private static boolean isHex(final byte c) {
+    return ('0' <= c && c <= '9') ||
+           ('a' <= c && c <= 'f') ||
+           ('A' <= c && c <= 'F');
+  }
+
+  /**
+   * Interpret a character as a digit (in any base up to 36) and return the
+   * numeric value.  This is like {@code Character.digit()} but we don't accept
+   * non-ASCII digits.
+   */
+  private static int digitValue(final byte c) {
+    if ('0' <= c && c <= '9') {
+      return c - '0';
+    } else if ('a' <= c && c <= 'z') {
+      return c - 'a' + 10;
+    } else {
+      return c - 'A' + 10;
+    }
+  }
+
+  /**
+   * Parse a 32-bit signed integer from the text.  Unlike the Java standard
+   * {@code Integer.parseInt()}, this function recognizes the prefixes "0x"
+   * and "0" to signify hexidecimal and octal numbers, respectively.
+   */
+  static int parseInt32(final String text) throws NumberFormatException {
+    return (int) parseInteger(text, true, false);
+  }
+
+  /**
+   * Parse a 32-bit unsigned integer from the text.  Unlike the Java standard
+   * {@code Integer.parseInt()}, this function recognizes the prefixes "0x"
+   * and "0" to signify hexidecimal and octal numbers, respectively.  The
+   * result is coerced to a (signed) {@code int} when returned since Java has
+   * no unsigned integer type.
+   */
+  static int parseUInt32(final String text) throws NumberFormatException {
+    return (int) parseInteger(text, false, false);
+  }
+
+  /**
+   * Parse a 64-bit signed integer from the text.  Unlike the Java standard
+   * {@code Integer.parseInt()}, this function recognizes the prefixes "0x"
+   * and "0" to signify hexidecimal and octal numbers, respectively.
+   */
+  static long parseInt64(final String text) throws NumberFormatException {
+    return parseInteger(text, true, true);
+  }
+
+  /**
+   * Parse a 64-bit unsigned integer from the text.  Unlike the Java standard
+   * {@code Integer.parseInt()}, this function recognizes the prefixes "0x"
+   * and "0" to signify hexidecimal and octal numbers, respectively.  The
+   * result is coerced to a (signed) {@code long} when returned since Java has
+   * no unsigned long type.
+   */
+  static long parseUInt64(final String text) throws NumberFormatException {
+    return parseInteger(text, false, true);
+  }
+
+  private static long parseInteger(final String text,
+                                   final boolean isSigned,
+                                   final boolean isLong)
+                                   throws NumberFormatException {
+    int pos = 0;
+
+    boolean negative = false;
+    if (text.startsWith("-", pos)) {
+      if (!isSigned) {
+        throw new NumberFormatException("Number must be positive: " + text);
+      }
+      ++pos;
+      negative = true;
+    }
+
+    int radix = 10;
+    if (text.startsWith("0x", pos)) {
+      pos += 2;
+      radix = 16;
+    } else if (text.startsWith("0", pos)) {
+      radix = 8;
+    }
+
+    final String numberText = text.substring(pos);
+
+    long result = 0;
+    if (numberText.length() < 16) {
+      // Can safely assume no overflow.
+      result = Long.parseLong(numberText, radix);
+      if (negative) {
+        result = -result;
+      }
+
+      // Check bounds.
+      // No need to check for 64-bit numbers since they'd have to be 16 chars
+      // or longer to overflow.
+      if (!isLong) {
+        if (isSigned) {
+          if (result > Integer.MAX_VALUE || result < Integer.MIN_VALUE) {
+            throw new NumberFormatException(
+              "Number out of range for 32-bit signed integer: " + text);
+          }
+        } else {
+          if (result >= (1L << 32) || result < 0) {
+            throw new NumberFormatException(
+              "Number out of range for 32-bit unsigned integer: " + text);
+          }
+        }
+      }
+    } else {
+      BigInteger bigValue = new BigInteger(numberText, radix);
+      if (negative) {
+        bigValue = bigValue.negate();
+      }
+
+      // Check bounds.
+      if (!isLong) {
+        if (isSigned) {
+          if (bigValue.bitLength() > 31) {
+            throw new NumberFormatException(
+              "Number out of range for 32-bit signed integer: " + text);
+          }
+        } else {
+          if (bigValue.bitLength() > 32) {
+            throw new NumberFormatException(
+              "Number out of range for 32-bit unsigned integer: " + text);
+          }
+        }
+      } else {
+        if (isSigned) {
+          if (bigValue.bitLength() > 63) {
+            throw new NumberFormatException(
+              "Number out of range for 64-bit signed integer: " + text);
+          }
+        } else {
+          if (bigValue.bitLength() > 64) {
+            throw new NumberFormatException(
+              "Number out of range for 64-bit unsigned integer: " + text);
+          }
+        }
+      }
+
+      result = bigValue.longValue();
+    }
+
+    return result;
+  }
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/UninitializedMessageException.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/UninitializedMessageException.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/UninitializedMessageException.java	(revision 15014)
@@ -0,0 +1,99 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Thrown when attempting to build a protocol message that is missing required
+ * fields.  This is a {@code RuntimeException} because it normally represents
+ * a programming error:  it happens when some code which constructs a message
+ * fails to set all the fields.  {@code parseFrom()} methods <b>do not</b>
+ * throw this; they throw an {@link InvalidProtocolBufferException} if
+ * required fields are missing, because it is not a programming error to
+ * receive an incomplete message.  In other words,
+ * {@code UninitializedMessageException} should never be thrown by correct
+ * code, but {@code InvalidProtocolBufferException} might be.
+ *
+ * @author kenton@google.com Kenton Varda
+ */
+public class UninitializedMessageException extends RuntimeException {
+  private static final long serialVersionUID = -7466929953374883507L;
+
+  public UninitializedMessageException(final MessageLite message) {
+    super("Message was missing required fields.  (Lite runtime could not " +
+          "determine which fields were missing).");
+    missingFields = null;
+  }
+
+  public UninitializedMessageException(final List<String> missingFields) {
+    super(buildDescription(missingFields));
+    this.missingFields = missingFields;
+  }
+
+  private final List<String> missingFields;
+
+  /**
+   * Get a list of human-readable names of required fields missing from this
+   * message.  Each name is a full path to a field, e.g. "foo.bar[5].baz".
+   * Returns null if the lite runtime was used, since it lacks the ability to
+   * find missing fields.
+   */
+  public List<String> getMissingFields() {
+    return Collections.unmodifiableList(missingFields);
+  }
+
+  /**
+   * Converts this exception to an {@link InvalidProtocolBufferException}.
+   * When a parsed message is missing required fields, this should be thrown
+   * instead of {@code UninitializedMessageException}.
+   */
+  public InvalidProtocolBufferException asInvalidProtocolBufferException() {
+    return new InvalidProtocolBufferException(getMessage());
+  }
+
+  /** Construct the description string for this exception. */
+  private static String buildDescription(final List<String> missingFields) {
+    final StringBuilder description =
+      new StringBuilder("Message missing required fields: ");
+    boolean first = true;
+    for (final String field : missingFields) {
+      if (first) {
+        first = false;
+      } else {
+        description.append(", ");
+      }
+      description.append(field);
+    }
+    return description.toString();
+  }
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/UnknownFieldSet.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/UnknownFieldSet.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/UnknownFieldSet.java	(revision 15014)
@@ -0,0 +1,953 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.AbstractMessageLite.Builder.LimitedInputStream;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * {@code UnknownFieldSet} is used to keep track of fields which were seen when
+ * parsing a protocol message but whose field numbers or types are unrecognized.
+ * This most frequently occurs when new fields are added to a message type
+ * and then messages containing those feilds are read by old software that was
+ * compiled before the new types were added.
+ *
+ * <p>Every {@link Message} contains an {@code UnknownFieldSet} (and every
+ * {@link Message.Builder} contains an {@link Builder}).
+ *
+ * <p>Most users will never need to use this class.
+ *
+ * @author kenton@google.com Kenton Varda
+ */
+public final class UnknownFieldSet implements MessageLite {
+  private UnknownFieldSet() {}
+
+  /** Create a new {@link Builder}. */
+  public static Builder newBuilder() {
+    return Builder.create();
+  }
+
+  /**
+   * Create a new {@link Builder} and initialize it to be a copy
+   * of {@code copyFrom}.
+   */
+  public static Builder newBuilder(final UnknownFieldSet copyFrom) {
+    return newBuilder().mergeFrom(copyFrom);
+  }
+
+  /** Get an empty {@code UnknownFieldSet}. */
+  public static UnknownFieldSet getDefaultInstance() {
+    return defaultInstance;
+  }
+  public UnknownFieldSet getDefaultInstanceForType() {
+    return defaultInstance;
+  }
+  private static final UnknownFieldSet defaultInstance =
+    new UnknownFieldSet(Collections.<Integer, Field>emptyMap());
+
+  /**
+   * Construct an {@code UnknownFieldSet} around the given map.  The map is
+   * expected to be immutable.
+   */
+  private UnknownFieldSet(final Map<Integer, Field> fields) {
+    this.fields = fields;
+  }
+  private Map<Integer, Field> fields;
+
+  @Override
+  public boolean equals(final Object other) {
+    if (this == other) {
+      return true;
+    }
+    return (other instanceof UnknownFieldSet) &&
+           fields.equals(((UnknownFieldSet) other).fields);
+  }
+
+  @Override
+  public int hashCode() {
+    return fields.hashCode();
+  }
+
+  /** Get a map of fields in the set by number. */
+  public Map<Integer, Field> asMap() {
+    return fields;
+  }
+
+  /** Check if the given field number is present in the set. */
+  public boolean hasField(final int number) {
+    return fields.containsKey(number);
+  }
+
+  /**
+   * Get a field by number.  Returns an empty field if not present.  Never
+   * returns {@code null}.
+   */
+  public Field getField(final int number) {
+    final Field result = fields.get(number);
+    return (result == null) ? Field.getDefaultInstance() : result;
+  }
+
+  /** Serializes the set and writes it to {@code output}. */
+  public void writeTo(final CodedOutputStream output) throws IOException {
+    for (final Map.Entry<Integer, Field> entry : fields.entrySet()) {
+      entry.getValue().writeTo(entry.getKey(), output);
+    }
+  }
+
+  /**
+   * Converts the set to a string in protocol buffer text format. This is
+   * just a trivial wrapper around
+   * {@link TextFormat#printToString(UnknownFieldSet)}.
+   */
+  @Override
+  public String toString() {
+    return TextFormat.printToString(this);
+  }
+
+  /**
+   * Serializes the message to a {@code ByteString} and returns it. This is
+   * just a trivial wrapper around {@link #writeTo(CodedOutputStream)}.
+   */
+  public ByteString toByteString() {
+    try {
+      final ByteString.CodedBuilder out =
+        ByteString.newCodedBuilder(getSerializedSize());
+      writeTo(out.getCodedOutput());
+      return out.build();
+    } catch (final IOException e) {
+      throw new RuntimeException(
+        "Serializing to a ByteString threw an IOException (should " +
+        "never happen).", e);
+    }
+  }
+
+  /**
+   * Serializes the message to a {@code byte} array and returns it.  This is
+   * just a trivial wrapper around {@link #writeTo(CodedOutputStream)}.
+   */
+  public byte[] toByteArray() {
+    try {
+      final byte[] result = new byte[getSerializedSize()];
+      final CodedOutputStream output = CodedOutputStream.newInstance(result);
+      writeTo(output);
+      output.checkNoSpaceLeft();
+      return result;
+    } catch (final IOException e) {
+      throw new RuntimeException(
+        "Serializing to a byte array threw an IOException " +
+        "(should never happen).", e);
+    }
+  }
+
+  /**
+   * Serializes the message and writes it to {@code output}.  This is just a
+   * trivial wrapper around {@link #writeTo(CodedOutputStream)}.
+   */
+  public void writeTo(final OutputStream output) throws IOException {
+    final CodedOutputStream codedOutput = CodedOutputStream.newInstance(output);
+    writeTo(codedOutput);
+    codedOutput.flush();
+  }
+
+  public void writeDelimitedTo(OutputStream output) throws IOException {
+    final CodedOutputStream codedOutput = CodedOutputStream.newInstance(output);
+    codedOutput.writeRawVarint32(getSerializedSize());
+    writeTo(codedOutput);
+    codedOutput.flush();
+  }
+
+  /** Get the number of bytes required to encode this set. */
+  public int getSerializedSize() {
+    int result = 0;
+    for (final Map.Entry<Integer, Field> entry : fields.entrySet()) {
+      result += entry.getValue().getSerializedSize(entry.getKey());
+    }
+    return result;
+  }
+
+  /**
+   * Serializes the set and writes it to {@code output} using
+   * {@code MessageSet} wire format.
+   */
+  public void writeAsMessageSetTo(final CodedOutputStream output)
+      throws IOException {
+    for (final Map.Entry<Integer, Field> entry : fields.entrySet()) {
+      entry.getValue().writeAsMessageSetExtensionTo(
+        entry.getKey(), output);
+    }
+  }
+
+  /**
+   * Get the number of bytes required to encode this set using
+   * {@code MessageSet} wire format.
+   */
+  public int getSerializedSizeAsMessageSet() {
+    int result = 0;
+    for (final Map.Entry<Integer, Field> entry : fields.entrySet()) {
+      result += entry.getValue().getSerializedSizeAsMessageSetExtension(
+        entry.getKey());
+    }
+    return result;
+  }
+
+  public boolean isInitialized() {
+    // UnknownFieldSets do not have required fields, so they are always
+    // initialized.
+    return true;
+  }
+
+  /** Parse an {@code UnknownFieldSet} from the given input stream. */
+  public static UnknownFieldSet parseFrom(final CodedInputStream input)
+                                          throws IOException {
+    return newBuilder().mergeFrom(input).build();
+  }
+
+  /** Parse {@code data} as an {@code UnknownFieldSet} and return it. */
+  public static UnknownFieldSet parseFrom(final ByteString data)
+      throws InvalidProtocolBufferException {
+    return newBuilder().mergeFrom(data).build();
+  }
+
+  /** Parse {@code data} as an {@code UnknownFieldSet} and return it. */
+  public static UnknownFieldSet parseFrom(final byte[] data)
+      throws InvalidProtocolBufferException {
+    return newBuilder().mergeFrom(data).build();
+  }
+
+  /** Parse an {@code UnknownFieldSet} from {@code input} and return it. */
+  public static UnknownFieldSet parseFrom(final InputStream input)
+                                          throws IOException {
+    return newBuilder().mergeFrom(input).build();
+  }
+
+  public Builder newBuilderForType() {
+    return newBuilder();
+  }
+
+  public Builder toBuilder() {
+    return newBuilder().mergeFrom(this);
+  }
+
+  /**
+   * Builder for {@link UnknownFieldSet}s.
+   *
+   * <p>Note that this class maintains {@link Field.Builder}s for all fields
+   * in the set.  Thus, adding one element to an existing {@link Field} does not
+   * require making a copy.  This is important for efficient parsing of
+   * unknown repeated fields.  However, it implies that {@link Field}s cannot
+   * be constructed independently, nor can two {@link UnknownFieldSet}s share
+   * the same {@code Field} object.
+   *
+   * <p>Use {@link UnknownFieldSet#newBuilder()} to construct a {@code Builder}.
+   */
+  public static final class Builder implements MessageLite.Builder {
+    // This constructor should never be called directly (except from 'create').
+    private Builder() {}
+
+    private Map<Integer, Field> fields;
+
+    // Optimization:  We keep around a builder for the last field that was
+    //   modified so that we can efficiently add to it multiple times in a
+    //   row (important when parsing an unknown repeated field).
+    private int lastFieldNumber;
+    private Field.Builder lastField;
+
+    private static Builder create() {
+      Builder builder = new Builder();
+      builder.reinitialize();
+      return builder;
+    }
+
+    /**
+     * Get a field builder for the given field number which includes any
+     * values that already exist.
+     */
+    private Field.Builder getFieldBuilder(final int number) {
+      if (lastField != null) {
+        if (number == lastFieldNumber) {
+          return lastField;
+        }
+        // Note:  addField() will reset lastField and lastFieldNumber.
+        addField(lastFieldNumber, lastField.build());
+      }
+      if (number == 0) {
+        return null;
+      } else {
+        final Field existing = fields.get(number);
+        lastFieldNumber = number;
+        lastField = Field.newBuilder();
+        if (existing != null) {
+          lastField.mergeFrom(existing);
+        }
+        return lastField;
+      }
+    }
+
+    /**
+     * Build the {@link UnknownFieldSet} and return it.
+     *
+     * <p>Once {@code build()} has been called, the {@code Builder} will no
+     * longer be usable.  Calling any method after {@code build()} will result
+     * in undefined behavior and can cause a {@code NullPointerException} to be
+     * thrown.
+     */
+    public UnknownFieldSet build() {
+      getFieldBuilder(0);  // Force lastField to be built.
+      final UnknownFieldSet result;
+      if (fields.isEmpty()) {
+        result = getDefaultInstance();
+      } else {
+        result = new UnknownFieldSet(Collections.unmodifiableMap(fields));
+      }
+      fields = null;
+      return result;
+    }
+
+    public UnknownFieldSet buildPartial() {
+      // No required fields, so this is the same as build().
+      return build();
+    }
+
+    @Override
+    public Builder clone() {
+      getFieldBuilder(0);  // Force lastField to be built.
+      return UnknownFieldSet.newBuilder().mergeFrom(
+          new UnknownFieldSet(fields));
+    }
+
+    public UnknownFieldSet getDefaultInstanceForType() {
+      return UnknownFieldSet.getDefaultInstance();
+    }
+
+    private void reinitialize() {
+      fields = Collections.emptyMap();
+      lastFieldNumber = 0;
+      lastField = null;
+    }
+
+    /** Reset the builder to an empty set. */
+    public Builder clear() {
+      reinitialize();
+      return this;
+    }
+
+    /**
+     * Merge the fields from {@code other} into this set.  If a field number
+     * exists in both sets, {@code other}'s values for that field will be
+     * appended to the values in this set.
+     */
+    public Builder mergeFrom(final UnknownFieldSet other) {
+      if (other != getDefaultInstance()) {
+        for (final Map.Entry<Integer, Field> entry : other.fields.entrySet()) {
+          mergeField(entry.getKey(), entry.getValue());
+        }
+      }
+      return this;
+    }
+
+    /**
+     * Add a field to the {@code UnknownFieldSet}.  If a field with the same
+     * number already exists, the two are merged.
+     */
+    public Builder mergeField(final int number, final Field field) {
+      if (number == 0) {
+        throw new IllegalArgumentException("Zero is not a valid field number.");
+      }
+      if (hasField(number)) {
+        getFieldBuilder(number).mergeFrom(field);
+      } else {
+        // Optimization:  We could call getFieldBuilder(number).mergeFrom(field)
+        // in this case, but that would create a copy of the Field object.
+        // We'd rather reuse the one passed to us, so call addField() instead.
+        addField(number, field);
+      }
+      return this;
+    }
+
+    /**
+     * Convenience method for merging a new field containing a single varint
+     * value.  This is used in particular when an unknown enum value is
+     * encountered.
+     */
+    public Builder mergeVarintField(final int number, final int value) {
+      if (number == 0) {
+        throw new IllegalArgumentException("Zero is not a valid field number.");
+      }
+      getFieldBuilder(number).addVarint(value);
+      return this;
+    }
+
+    /** Check if the given field number is present in the set. */
+    public boolean hasField(final int number) {
+      if (number == 0) {
+        throw new IllegalArgumentException("Zero is not a valid field number.");
+      }
+      return number == lastFieldNumber || fields.containsKey(number);
+    }
+
+    /**
+     * Add a field to the {@code UnknownFieldSet}.  If a field with the same
+     * number already exists, it is removed.
+     */
+    public Builder addField(final int number, final Field field) {
+      if (number == 0) {
+        throw new IllegalArgumentException("Zero is not a valid field number.");
+      }
+      if (lastField != null && lastFieldNumber == number) {
+        // Discard this.
+        lastField = null;
+        lastFieldNumber = 0;
+      }
+      if (fields.isEmpty()) {
+        fields = new TreeMap<Integer,Field>();
+      }
+      fields.put(number, field);
+      return this;
+    }
+
+    /**
+     * Get all present {@code Field}s as an immutable {@code Map}.  If more
+     * fields are added, the changes may or may not be reflected in this map.
+     */
+    public Map<Integer, Field> asMap() {
+      getFieldBuilder(0);  // Force lastField to be built.
+      return Collections.unmodifiableMap(fields);
+    }
+
+    /**
+     * Parse an entire message from {@code input} and merge its fields into
+     * this set.
+     */
+    public Builder mergeFrom(final CodedInputStream input) throws IOException {
+      while (true) {
+        final int tag = input.readTag();
+        if (tag == 0 || !mergeFieldFrom(tag, input)) {
+          break;
+        }
+      }
+      return this;
+    }
+
+    /**
+     * Parse a single field from {@code input} and merge it into this set.
+     * @param tag The field's tag number, which was already parsed.
+     * @return {@code false} if the tag is an engroup tag.
+     */
+    public boolean mergeFieldFrom(final int tag, final CodedInputStream input)
+                                  throws IOException {
+      final int number = WireFormat.getTagFieldNumber(tag);
+      switch (WireFormat.getTagWireType(tag)) {
+        case WireFormat.WIRETYPE_VARINT:
+          getFieldBuilder(number).addVarint(input.readInt64());
+          return true;
+        case WireFormat.WIRETYPE_FIXED64:
+          getFieldBuilder(number).addFixed64(input.readFixed64());
+          return true;
+        case WireFormat.WIRETYPE_LENGTH_DELIMITED:
+          getFieldBuilder(number).addLengthDelimited(input.readBytes());
+          return true;
+        case WireFormat.WIRETYPE_START_GROUP:
+          final Builder subBuilder = newBuilder();
+          input.readGroup(number, subBuilder,
+                          ExtensionRegistry.getEmptyRegistry());
+          getFieldBuilder(number).addGroup(subBuilder.build());
+          return true;
+        case WireFormat.WIRETYPE_END_GROUP:
+          return false;
+        case WireFormat.WIRETYPE_FIXED32:
+          getFieldBuilder(number).addFixed32(input.readFixed32());
+          return true;
+        default:
+          throw InvalidProtocolBufferException.invalidWireType();
+      }
+    }
+
+    /**
+     * Parse {@code data} as an {@code UnknownFieldSet} and merge it with the
+     * set being built.  This is just a small wrapper around
+     * {@link #mergeFrom(CodedInputStream)}.
+     */
+    public Builder mergeFrom(final ByteString data)
+        throws InvalidProtocolBufferException {
+      try {
+        final CodedInputStream input = data.newCodedInput();
+        mergeFrom(input);
+        input.checkLastTagWas(0);
+        return this;
+      } catch (final InvalidProtocolBufferException e) {
+        throw e;
+      } catch (final IOException e) {
+        throw new RuntimeException(
+          "Reading from a ByteString threw an IOException (should " +
+          "never happen).", e);
+      }
+    }
+
+    /**
+     * Parse {@code data} as an {@code UnknownFieldSet} and merge it with the
+     * set being built.  This is just a small wrapper around
+     * {@link #mergeFrom(CodedInputStream)}.
+     */
+    public Builder mergeFrom(final byte[] data)
+        throws InvalidProtocolBufferException {
+      try {
+        final CodedInputStream input = CodedInputStream.newInstance(data);
+        mergeFrom(input);
+        input.checkLastTagWas(0);
+        return this;
+      } catch (final InvalidProtocolBufferException e) {
+        throw e;
+      } catch (final IOException e) {
+        throw new RuntimeException(
+          "Reading from a byte array threw an IOException (should " +
+          "never happen).", e);
+      }
+    }
+
+    /**
+     * Parse an {@code UnknownFieldSet} from {@code input} and merge it with the
+     * set being built.  This is just a small wrapper around
+     * {@link #mergeFrom(CodedInputStream)}.
+     */
+    public Builder mergeFrom(final InputStream input) throws IOException {
+      final CodedInputStream codedInput = CodedInputStream.newInstance(input);
+      mergeFrom(codedInput);
+      codedInput.checkLastTagWas(0);
+      return this;
+    }
+
+    public boolean mergeDelimitedFrom(InputStream input)
+        throws IOException {
+      final int firstByte = input.read();
+      if (firstByte == -1) {
+        return false;
+      }
+      final int size = CodedInputStream.readRawVarint32(firstByte, input);
+      final InputStream limitedInput = new LimitedInputStream(input, size);
+      mergeFrom(limitedInput);
+      return true;
+    }
+
+    public boolean mergeDelimitedFrom(
+        InputStream input,
+        ExtensionRegistryLite extensionRegistry) throws IOException {
+      // UnknownFieldSet has no extensions.
+      return mergeDelimitedFrom(input);
+    }
+
+    public Builder mergeFrom(
+        CodedInputStream input,
+        ExtensionRegistryLite extensionRegistry) throws IOException {
+      // UnknownFieldSet has no extensions.
+      return mergeFrom(input);
+    }
+
+    public Builder mergeFrom(
+        ByteString data,
+        ExtensionRegistryLite extensionRegistry)
+        throws InvalidProtocolBufferException {
+      // UnknownFieldSet has no extensions.
+      return mergeFrom(data);
+    }
+
+    public Builder mergeFrom(byte[] data, int off, int len)
+        throws InvalidProtocolBufferException {
+      try {
+        final CodedInputStream input =
+            CodedInputStream.newInstance(data, off, len);
+        mergeFrom(input);
+        input.checkLastTagWas(0);
+        return this;
+      } catch (InvalidProtocolBufferException e) {
+        throw e;
+      } catch (IOException e) {
+        throw new RuntimeException(
+          "Reading from a byte array threw an IOException (should " +
+          "never happen).", e);
+      }
+    }
+
+    public Builder mergeFrom(
+        byte[] data,
+        ExtensionRegistryLite extensionRegistry)
+        throws InvalidProtocolBufferException {
+      // UnknownFieldSet has no extensions.
+      return mergeFrom(data);
+    }
+
+    public Builder mergeFrom(
+        byte[] data, int off, int len,
+        ExtensionRegistryLite extensionRegistry)
+        throws InvalidProtocolBufferException {
+      // UnknownFieldSet has no extensions.
+      return mergeFrom(data, off, len);
+    }
+
+    public Builder mergeFrom(
+        InputStream input,
+        ExtensionRegistryLite extensionRegistry) throws IOException {
+      // UnknownFieldSet has no extensions.
+      return mergeFrom(input);
+    }
+
+    public boolean isInitialized() {
+      // UnknownFieldSets do not have required fields, so they are always
+      // initialized.
+      return true;
+    }
+  }
+
+  /**
+   * Represents a single field in an {@code UnknownFieldSet}.
+   *
+   * <p>A {@code Field} consists of five lists of values.  The lists correspond
+   * to the five "wire types" used in the protocol buffer binary format.
+   * The wire type of each field can be determined from the encoded form alone,
+   * without knowing the field's declared type.  So, we are able to parse
+   * unknown values at least this far and separate them.  Normally, only one
+   * of the five lists will contain any values, since it is impossible to
+   * define a valid message type that declares two different types for the
+   * same field number.  However, the code is designed to allow for the case
+   * where the same unknown field number is encountered using multiple different
+   * wire types.
+   *
+   * <p>{@code Field} is an immutable class.  To construct one, you must use a
+   * {@link Builder}.
+   *
+   * @see UnknownFieldSet
+   */
+  public static final class Field {
+    private Field() {}
+
+    /** Construct a new {@link Builder}. */
+    public static Builder newBuilder() {
+      return Builder.create();
+    }
+
+    /**
+     * Construct a new {@link Builder} and initialize it to a copy of
+     * {@code copyFrom}.
+     */
+    public static Builder newBuilder(final Field copyFrom) {
+      return newBuilder().mergeFrom(copyFrom);
+    }
+
+    /** Get an empty {@code Field}. */
+    public static Field getDefaultInstance() {
+      return fieldDefaultInstance;
+    }
+    private static final Field fieldDefaultInstance = newBuilder().build();
+
+    /** Get the list of varint values for this field. */
+    public List<Long> getVarintList()               { return varint;          }
+
+    /** Get the list of fixed32 values for this field. */
+    public List<Integer> getFixed32List()           { return fixed32;         }
+
+    /** Get the list of fixed64 values for this field. */
+    public List<Long> getFixed64List()              { return fixed64;         }
+
+    /** Get the list of length-delimited values for this field. */
+    public List<ByteString> getLengthDelimitedList() { return lengthDelimited; }
+
+    /**
+     * Get the list of embedded group values for this field.  These are
+     * represented using {@link UnknownFieldSet}s rather than {@link Message}s
+     * since the group's type is presumably unknown.
+     */
+    public List<UnknownFieldSet> getGroupList()      { return group;           }
+
+    @Override
+    public boolean equals(final Object other) {
+      if (this == other) {
+        return true;
+      }
+      if (!(other instanceof Field)) {
+        return false;
+      }
+      return Arrays.equals(getIdentityArray(),
+          ((Field) other).getIdentityArray());
+    }
+
+    @Override
+    public int hashCode() {
+      return Arrays.hashCode(getIdentityArray());
+    }
+
+    /**
+     * Returns the array of objects to be used to uniquely identify this
+     * {@link Field} instance.
+     */
+    private Object[] getIdentityArray() {
+      return new Object[] {
+          varint,
+          fixed32,
+          fixed64,
+          lengthDelimited,
+          group};
+    }
+
+    /**
+     * Serializes the field, including field number, and writes it to
+     * {@code output}.
+     */
+    public void writeTo(final int fieldNumber, final CodedOutputStream output)
+                        throws IOException {
+      for (final long value : varint) {
+        output.writeUInt64(fieldNumber, value);
+      }
+      for (final int value : fixed32) {
+        output.writeFixed32(fieldNumber, value);
+      }
+      for (final long value : fixed64) {
+        output.writeFixed64(fieldNumber, value);
+      }
+      for (final ByteString value : lengthDelimited) {
+        output.writeBytes(fieldNumber, value);
+      }
+      for (final UnknownFieldSet value : group) {
+        output.writeGroup(fieldNumber, value);
+      }
+    }
+
+    /**
+     * Get the number of bytes required to encode this field, including field
+     * number.
+     */
+    public int getSerializedSize(final int fieldNumber) {
+      int result = 0;
+      for (final long value : varint) {
+        result += CodedOutputStream.computeUInt64Size(fieldNumber, value);
+      }
+      for (final int value : fixed32) {
+        result += CodedOutputStream.computeFixed32Size(fieldNumber, value);
+      }
+      for (final long value : fixed64) {
+        result += CodedOutputStream.computeFixed64Size(fieldNumber, value);
+      }
+      for (final ByteString value : lengthDelimited) {
+        result += CodedOutputStream.computeBytesSize(fieldNumber, value);
+      }
+      for (final UnknownFieldSet value : group) {
+        result += CodedOutputStream.computeGroupSize(fieldNumber, value);
+      }
+      return result;
+    }
+
+    /**
+     * Serializes the field, including field number, and writes it to
+     * {@code output}, using {@code MessageSet} wire format.
+     */
+    public void writeAsMessageSetExtensionTo(
+        final int fieldNumber,
+        final CodedOutputStream output)
+        throws IOException {
+      for (final ByteString value : lengthDelimited) {
+        output.writeRawMessageSetExtension(fieldNumber, value);
+      }
+    }
+
+    /**
+     * Get the number of bytes required to encode this field, including field
+     * number, using {@code MessageSet} wire format.
+     */
+    public int getSerializedSizeAsMessageSetExtension(final int fieldNumber) {
+      int result = 0;
+      for (final ByteString value : lengthDelimited) {
+        result += CodedOutputStream.computeRawMessageSetExtensionSize(
+          fieldNumber, value);
+      }
+      return result;
+    }
+
+    private List<Long> varint;
+    private List<Integer> fixed32;
+    private List<Long> fixed64;
+    private List<ByteString> lengthDelimited;
+    private List<UnknownFieldSet> group;
+
+    /**
+     * Used to build a {@link Field} within an {@link UnknownFieldSet}.
+     *
+     * <p>Use {@link Field#newBuilder()} to construct a {@code Builder}.
+     */
+    public static final class Builder {
+      // This constructor should never be called directly (except from 'create').
+      private Builder() {}
+
+      private static Builder create() {
+        Builder builder = new Builder();
+        builder.result = new Field();
+        return builder;
+      }
+
+      private Field result;
+
+      /**
+       * Build the field.  After {@code build()} has been called, the
+       * {@code Builder} is no longer usable.  Calling any other method will
+       * result in undefined behavior and can cause a
+       * {@code NullPointerException} to be thrown.
+       */
+      public Field build() {
+        if (result.varint == null) {
+          result.varint = Collections.emptyList();
+        } else {
+          result.varint = Collections.unmodifiableList(result.varint);
+        }
+        if (result.fixed32 == null) {
+          result.fixed32 = Collections.emptyList();
+        } else {
+          result.fixed32 = Collections.unmodifiableList(result.fixed32);
+        }
+        if (result.fixed64 == null) {
+          result.fixed64 = Collections.emptyList();
+        } else {
+          result.fixed64 = Collections.unmodifiableList(result.fixed64);
+        }
+        if (result.lengthDelimited == null) {
+          result.lengthDelimited = Collections.emptyList();
+        } else {
+          result.lengthDelimited =
+            Collections.unmodifiableList(result.lengthDelimited);
+        }
+        if (result.group == null) {
+          result.group = Collections.emptyList();
+        } else {
+          result.group = Collections.unmodifiableList(result.group);
+        }
+
+        final Field returnMe = result;
+        result = null;
+        return returnMe;
+      }
+
+      /** Discard the field's contents. */
+      public Builder clear() {
+        result = new Field();
+        return this;
+      }
+
+      /**
+       * Merge the values in {@code other} into this field.  For each list
+       * of values, {@code other}'s values are append to the ones in this
+       * field.
+       */
+      public Builder mergeFrom(final Field other) {
+        if (!other.varint.isEmpty()) {
+          if (result.varint == null) {
+            result.varint = new ArrayList<Long>();
+          }
+          result.varint.addAll(other.varint);
+        }
+        if (!other.fixed32.isEmpty()) {
+          if (result.fixed32 == null) {
+            result.fixed32 = new ArrayList<Integer>();
+          }
+          result.fixed32.addAll(other.fixed32);
+        }
+        if (!other.fixed64.isEmpty()) {
+          if (result.fixed64 == null) {
+            result.fixed64 = new ArrayList<Long>();
+          }
+          result.fixed64.addAll(other.fixed64);
+        }
+        if (!other.lengthDelimited.isEmpty()) {
+          if (result.lengthDelimited == null) {
+            result.lengthDelimited = new ArrayList<ByteString>();
+          }
+          result.lengthDelimited.addAll(other.lengthDelimited);
+        }
+        if (!other.group.isEmpty()) {
+          if (result.group == null) {
+            result.group = new ArrayList<UnknownFieldSet>();
+          }
+          result.group.addAll(other.group);
+        }
+        return this;
+      }
+
+      /** Add a varint value. */
+      public Builder addVarint(final long value) {
+        if (result.varint == null) {
+          result.varint = new ArrayList<Long>();
+        }
+        result.varint.add(value);
+        return this;
+      }
+
+      /** Add a fixed32 value. */
+      public Builder addFixed32(final int value) {
+        if (result.fixed32 == null) {
+          result.fixed32 = new ArrayList<Integer>();
+        }
+        result.fixed32.add(value);
+        return this;
+      }
+
+      /** Add a fixed64 value. */
+      public Builder addFixed64(final long value) {
+        if (result.fixed64 == null) {
+          result.fixed64 = new ArrayList<Long>();
+        }
+        result.fixed64.add(value);
+        return this;
+      }
+
+      /** Add a length-delimited value. */
+      public Builder addLengthDelimited(final ByteString value) {
+        if (result.lengthDelimited == null) {
+          result.lengthDelimited = new ArrayList<ByteString>();
+        }
+        result.lengthDelimited.add(value);
+        return this;
+      }
+
+      /** Add an embedded group. */
+      public Builder addGroup(final UnknownFieldSet value) {
+        if (result.group == null) {
+          result.group = new ArrayList<UnknownFieldSet>();
+        }
+        result.group.add(value);
+        return this;
+      }
+    }
+  }
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/UnmodifiableLazyStringList.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/UnmodifiableLazyStringList.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/UnmodifiableLazyStringList.java	(revision 15014)
@@ -0,0 +1,146 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import java.util.AbstractList;
+import java.util.RandomAccess;
+import java.util.ListIterator;
+import java.util.Iterator;
+
+/**
+ * An implementation of {@link LazyStringList} that wraps another
+ * {@link LazyStringList} such that it cannot be modified via the wrapper.
+ *
+ * @author jonp@google.com (Jon Perlow)
+ */
+public class UnmodifiableLazyStringList extends AbstractList<String>
+    implements LazyStringList, RandomAccess {
+
+  private final LazyStringList list;
+
+  public UnmodifiableLazyStringList(LazyStringList list) {
+    this.list = list;
+  }
+
+  @Override
+  public String get(int index) {
+    return list.get(index);
+  }
+
+  @Override
+  public int size() {
+    return list.size();
+  }
+
+  //@Override (Java 1.6 override semantics, but we must support 1.5)
+  public ByteString getByteString(int index) {
+    return list.getByteString(index);
+  }
+
+  //@Override (Java 1.6 override semantics, but we must support 1.5)
+  public void add(ByteString element) {
+    throw new UnsupportedOperationException();
+  }
+
+  //@Override (Java 1.6 override semantics, but we must support 1.5)
+  public ListIterator<String> listIterator(final int index) {
+    return new ListIterator<String>() {
+      ListIterator<String> iter = list.listIterator(index);
+
+      //@Override (Java 1.6 override semantics, but we must support 1.5)
+      public boolean hasNext() {
+        return iter.hasNext();
+      }
+
+      //@Override (Java 1.6 override semantics, but we must support 1.5)
+      public String next() {
+        return iter.next();
+      }
+
+      //@Override (Java 1.6 override semantics, but we must support 1.5)
+      public boolean hasPrevious() {
+        return iter.hasPrevious();
+      }
+
+      //@Override (Java 1.6 override semantics, but we must support 1.5)
+      public String previous() {
+        return iter.previous();
+      }
+
+      //@Override (Java 1.6 override semantics, but we must support 1.5)
+      public int nextIndex() {
+        return iter.nextIndex();
+      }
+
+      //@Override (Java 1.6 override semantics, but we must support 1.5)
+      public int previousIndex() {
+        return iter.previousIndex();
+      }
+
+      //@Override (Java 1.6 override semantics, but we must support 1.5)
+      public void remove() {
+        throw new UnsupportedOperationException();
+      }
+
+      //@Override (Java 1.6 override semantics, but we must support 1.5)
+      public void set(String o) {
+        throw new UnsupportedOperationException();
+      }
+
+      //@Override (Java 1.6 override semantics, but we must support 1.5)
+      public void add(String o) {
+        throw new UnsupportedOperationException();
+      }
+    };
+  }
+
+  @Override
+  public Iterator<String> iterator() {
+    return new Iterator<String>() {
+      Iterator<String> iter = list.iterator();
+
+      //@Override (Java 1.6 override semantics, but we must support 1.5)
+      public boolean hasNext() {
+        return iter.hasNext();
+      }
+
+      //@Override (Java 1.6 override semantics, but we must support 1.5)
+      public String next() {
+        return iter.next();
+      }
+
+      //@Override (Java 1.6 override semantics, but we must support 1.5)
+      public void remove() {
+        throw new UnsupportedOperationException();
+      }
+    };
+  }
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/WireFormat.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/WireFormat.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/google/protobuf/WireFormat.java	(revision 15014)
@@ -0,0 +1,163 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+/**
+ * This class is used internally by the Protocol Buffer library and generated
+ * message implementations.  It is public only because those generated messages
+ * do not reside in the {@code protobuf} package.  Others should not use this
+ * class directly.
+ *
+ * This class contains constants and helper functions useful for dealing with
+ * the Protocol Buffer wire format.
+ *
+ * @author kenton@google.com Kenton Varda
+ */
+public final class WireFormat {
+  // Do not allow instantiation.
+  private WireFormat() {}
+
+  public static final int WIRETYPE_VARINT           = 0;
+  public static final int WIRETYPE_FIXED64          = 1;
+  public static final int WIRETYPE_LENGTH_DELIMITED = 2;
+  public static final int WIRETYPE_START_GROUP      = 3;
+  public static final int WIRETYPE_END_GROUP        = 4;
+  public static final int WIRETYPE_FIXED32          = 5;
+
+  static final int TAG_TYPE_BITS = 3;
+  static final int TAG_TYPE_MASK = (1 << TAG_TYPE_BITS) - 1;
+
+  /** Given a tag value, determines the wire type (the lower 3 bits). */
+  static int getTagWireType(final int tag) {
+    return tag & TAG_TYPE_MASK;
+  }
+
+  /** Given a tag value, determines the field number (the upper 29 bits). */
+  public static int getTagFieldNumber(final int tag) {
+    return tag >>> TAG_TYPE_BITS;
+  }
+
+  /** Makes a tag value given a field number and wire type. */
+  static int makeTag(final int fieldNumber, final int wireType) {
+    return (fieldNumber << TAG_TYPE_BITS) | wireType;
+  }
+
+  /**
+   * Lite equivalent to {@link Descriptors.FieldDescriptor.JavaType}.  This is
+   * only here to support the lite runtime and should not be used by users.
+   */
+  public enum JavaType {
+    INT(0),
+    LONG(0L),
+    FLOAT(0F),
+    DOUBLE(0D),
+    BOOLEAN(false),
+    STRING(""),
+    BYTE_STRING(ByteString.EMPTY),
+    ENUM(null),
+    MESSAGE(null);
+
+    JavaType(final Object defaultDefault) {
+      this.defaultDefault = defaultDefault;
+    }
+
+    /**
+     * The default default value for fields of this type, if it's a primitive
+     * type.
+     */
+    Object getDefaultDefault() {
+      return defaultDefault;
+    }
+
+    private final Object defaultDefault;
+  }
+
+  /**
+   * Lite equivalent to {@link Descriptors.FieldDescriptor.Type}.  This is
+   * only here to support the lite runtime and should not be used by users.
+   */
+  public enum FieldType {
+    DOUBLE  (JavaType.DOUBLE     , WIRETYPE_FIXED64         ),
+    FLOAT   (JavaType.FLOAT      , WIRETYPE_FIXED32         ),
+    INT64   (JavaType.LONG       , WIRETYPE_VARINT          ),
+    UINT64  (JavaType.LONG       , WIRETYPE_VARINT          ),
+    INT32   (JavaType.INT        , WIRETYPE_VARINT          ),
+    FIXED64 (JavaType.LONG       , WIRETYPE_FIXED64         ),
+    FIXED32 (JavaType.INT        , WIRETYPE_FIXED32         ),
+    BOOL    (JavaType.BOOLEAN    , WIRETYPE_VARINT          ),
+    STRING  (JavaType.STRING     , WIRETYPE_LENGTH_DELIMITED) {
+      public boolean isPackable() { return false; }
+    },
+    GROUP   (JavaType.MESSAGE    , WIRETYPE_START_GROUP     ) {
+      public boolean isPackable() { return false; }
+    },
+    MESSAGE (JavaType.MESSAGE    , WIRETYPE_LENGTH_DELIMITED) {
+      public boolean isPackable() { return false; }
+    },
+    BYTES   (JavaType.BYTE_STRING, WIRETYPE_LENGTH_DELIMITED) {
+      public boolean isPackable() { return false; }
+    },
+    UINT32  (JavaType.INT        , WIRETYPE_VARINT          ),
+    ENUM    (JavaType.ENUM       , WIRETYPE_VARINT          ),
+    SFIXED32(JavaType.INT        , WIRETYPE_FIXED32         ),
+    SFIXED64(JavaType.LONG       , WIRETYPE_FIXED64         ),
+    SINT32  (JavaType.INT        , WIRETYPE_VARINT          ),
+    SINT64  (JavaType.LONG       , WIRETYPE_VARINT          );
+
+    FieldType(final JavaType javaType, final int wireType) {
+      this.javaType = javaType;
+      this.wireType = wireType;
+    }
+
+    private final JavaType javaType;
+    private final int wireType;
+
+    public JavaType getJavaType() { return javaType; }
+    public int getWireType() { return wireType; }
+
+    public boolean isPackable() { return true; }
+  }
+
+  // Field numbers for feilds in MessageSet wire format.
+  static final int MESSAGE_SET_ITEM    = 1;
+  static final int MESSAGE_SET_TYPE_ID = 2;
+  static final int MESSAGE_SET_MESSAGE = 3;
+
+  // Tag numbers.
+  static final int MESSAGE_SET_ITEM_TAG =
+    makeTag(MESSAGE_SET_ITEM, WIRETYPE_START_GROUP);
+  static final int MESSAGE_SET_ITEM_END_TAG =
+    makeTag(MESSAGE_SET_ITEM, WIRETYPE_END_GROUP);
+  static final int MESSAGE_SET_TYPE_ID_TAG =
+    makeTag(MESSAGE_SET_TYPE_ID, WIRETYPE_VARINT);
+  static final int MESSAGE_SET_MESSAGE_TAG =
+    makeTag(MESSAGE_SET_MESSAGE, WIRETYPE_LENGTH_DELIMITED);
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/Channel.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/Channel.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/Channel.java	(revision 15014)
@@ -0,0 +1,32 @@
+package com.heuristiclab.problems.externalevaluation;
+
+import java.io.*;
+import com.google.protobuf.*;
+
+public abstract class Channel implements IChannel {
+    protected boolean initialized;
+    
+    protected Channel() {
+    }
+    
+	@Override
+	public boolean isInitialized() {
+		return initialized;
+	}
+	
+	@Override
+	public void open() throws IOException {
+		initialized = true;
+	}
+
+	@Override
+	public abstract void send(Message msg) throws IOException;
+
+	@Override
+	public abstract Message receive(Message.Builder builder) throws IOException;
+
+	@Override
+	public void close() throws IOException {
+		initialized = false;
+	}
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/ChannelDiscoveredEventListener.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/ChannelDiscoveredEventListener.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/ChannelDiscoveredEventListener.java	(revision 15014)
@@ -0,0 +1,7 @@
+package com.heuristiclab.problems.externalevaluation;
+
+import java.util.*;
+
+public interface ChannelDiscoveredEventListener extends EventListener {
+    void discovered(EventObject evt);
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/ExternalEvaluationMessages.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/ExternalEvaluationMessages.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/ExternalEvaluationMessages.java	(revision 15014)
@@ -0,0 +1,8863 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: ExternalEvaluationMessages.proto
+
+package com.heuristiclab.problems.externalevaluation;
+
+public final class ExternalEvaluationMessages {
+  private ExternalEvaluationMessages() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+    registry.add(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage.qualityMessage);
+    registry.add(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage.qualityMessage);
+  }
+  public interface SolutionMessageOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+    
+    // required int32 solutionId = 1;
+    boolean hasSolutionId();
+    int getSolutionId();
+    
+    // repeated .HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.IntegerVariable integerVars = 2;
+    java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable> 
+        getIntegerVarsList();
+    com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable getIntegerVars(int index);
+    int getIntegerVarsCount();
+    java.util.List<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariableOrBuilder> 
+        getIntegerVarsOrBuilderList();
+    com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariableOrBuilder getIntegerVarsOrBuilder(
+        int index);
+    
+    // repeated .HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.IntegerArrayVariable integerArrayVars = 3;
+    java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable> 
+        getIntegerArrayVarsList();
+    com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable getIntegerArrayVars(int index);
+    int getIntegerArrayVarsCount();
+    java.util.List<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariableOrBuilder> 
+        getIntegerArrayVarsOrBuilderList();
+    com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariableOrBuilder getIntegerArrayVarsOrBuilder(
+        int index);
+    
+    // repeated .HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.DoubleVariable doubleVars = 4;
+    java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable> 
+        getDoubleVarsList();
+    com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable getDoubleVars(int index);
+    int getDoubleVarsCount();
+    java.util.List<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariableOrBuilder> 
+        getDoubleVarsOrBuilderList();
+    com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariableOrBuilder getDoubleVarsOrBuilder(
+        int index);
+    
+    // repeated .HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.DoubleArrayVariable doubleArrayVars = 5;
+    java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable> 
+        getDoubleArrayVarsList();
+    com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable getDoubleArrayVars(int index);
+    int getDoubleArrayVarsCount();
+    java.util.List<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariableOrBuilder> 
+        getDoubleArrayVarsOrBuilderList();
+    com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariableOrBuilder getDoubleArrayVarsOrBuilder(
+        int index);
+    
+    // repeated .HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.BoolVariable boolVars = 6;
+    java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable> 
+        getBoolVarsList();
+    com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable getBoolVars(int index);
+    int getBoolVarsCount();
+    java.util.List<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariableOrBuilder> 
+        getBoolVarsOrBuilderList();
+    com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariableOrBuilder getBoolVarsOrBuilder(
+        int index);
+    
+    // repeated .HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.BoolArrayVariable boolArrayVars = 7;
+    java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable> 
+        getBoolArrayVarsList();
+    com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable getBoolArrayVars(int index);
+    int getBoolArrayVarsCount();
+    java.util.List<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariableOrBuilder> 
+        getBoolArrayVarsOrBuilderList();
+    com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariableOrBuilder getBoolArrayVarsOrBuilder(
+        int index);
+    
+    // repeated .HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.StringVariable stringVars = 8;
+    java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable> 
+        getStringVarsList();
+    com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable getStringVars(int index);
+    int getStringVarsCount();
+    java.util.List<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariableOrBuilder> 
+        getStringVarsOrBuilderList();
+    com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariableOrBuilder getStringVarsOrBuilder(
+        int index);
+    
+    // repeated .HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.StringArrayVariable stringArrayVars = 9;
+    java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable> 
+        getStringArrayVarsList();
+    com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable getStringArrayVars(int index);
+    int getStringArrayVarsCount();
+    java.util.List<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariableOrBuilder> 
+        getStringArrayVarsOrBuilderList();
+    com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariableOrBuilder getStringArrayVarsOrBuilder(
+        int index);
+    
+    // repeated .HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.RawVariable rawVars = 10;
+    java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable> 
+        getRawVarsList();
+    com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable getRawVars(int index);
+    int getRawVarsCount();
+    java.util.List<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariableOrBuilder> 
+        getRawVarsOrBuilderList();
+    com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariableOrBuilder getRawVarsOrBuilder(
+        int index);
+  }
+  public static final class SolutionMessage extends
+      com.google.protobuf.GeneratedMessage
+      implements SolutionMessageOrBuilder {
+    // Use SolutionMessage.newBuilder() to construct.
+    private SolutionMessage(Builder builder) {
+      super(builder);
+    }
+    private SolutionMessage(boolean noInit) {}
+    
+    private static final SolutionMessage defaultInstance;
+    public static SolutionMessage getDefaultInstance() {
+      return defaultInstance;
+    }
+    
+    public SolutionMessage getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+    
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_descriptor;
+    }
+    
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_fieldAccessorTable;
+    }
+    
+    public interface IntegerVariableOrBuilder
+        extends com.google.protobuf.MessageOrBuilder {
+      
+      // required string name = 1;
+      boolean hasName();
+      String getName();
+      
+      // optional int32 data = 2;
+      boolean hasData();
+      int getData();
+    }
+    public static final class IntegerVariable extends
+        com.google.protobuf.GeneratedMessage
+        implements IntegerVariableOrBuilder {
+      // Use IntegerVariable.newBuilder() to construct.
+      private IntegerVariable(Builder builder) {
+        super(builder);
+      }
+      private IntegerVariable(boolean noInit) {}
+      
+      private static final IntegerVariable defaultInstance;
+      public static IntegerVariable getDefaultInstance() {
+        return defaultInstance;
+      }
+      
+      public IntegerVariable getDefaultInstanceForType() {
+        return defaultInstance;
+      }
+      
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerVariable_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerVariable_fieldAccessorTable;
+      }
+      
+      private int bitField0_;
+      // required string name = 1;
+      public static final int NAME_FIELD_NUMBER = 1;
+      private java.lang.Object name_;
+      public boolean hasName() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      public String getName() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          return (String) ref;
+        } else {
+          com.google.protobuf.ByteString bs = 
+              (com.google.protobuf.ByteString) ref;
+          String s = bs.toStringUtf8();
+          if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+            name_ = s;
+          }
+          return s;
+        }
+      }
+      private com.google.protobuf.ByteString getNameBytes() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+          name_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      
+      // optional int32 data = 2;
+      public static final int DATA_FIELD_NUMBER = 2;
+      private int data_;
+      public boolean hasData() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      public int getData() {
+        return data_;
+      }
+      
+      private void initFields() {
+        name_ = "";
+        data_ = 0;
+      }
+      private byte memoizedIsInitialized = -1;
+      public final boolean isInitialized() {
+        byte isInitialized = memoizedIsInitialized;
+        if (isInitialized != -1) return isInitialized == 1;
+        
+        if (!hasName()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+        memoizedIsInitialized = 1;
+        return true;
+      }
+      
+      public void writeTo(com.google.protobuf.CodedOutputStream output)
+                          throws java.io.IOException {
+        getSerializedSize();
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          output.writeBytes(1, getNameBytes());
+        }
+        if (((bitField0_ & 0x00000002) == 0x00000002)) {
+          output.writeInt32(2, data_);
+        }
+        getUnknownFields().writeTo(output);
+      }
+      
+      private int memoizedSerializedSize = -1;
+      public int getSerializedSize() {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+      
+        size = 0;
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeBytesSize(1, getNameBytes());
+        }
+        if (((bitField0_ & 0x00000002) == 0x00000002)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeInt32Size(2, data_);
+        }
+        size += getUnknownFields().getSerializedSize();
+        memoizedSerializedSize = size;
+        return size;
+      }
+      
+      private static final long serialVersionUID = 0L;
+      @java.lang.Override
+      protected java.lang.Object writeReplace()
+          throws java.io.ObjectStreamException {
+        return super.writeReplace();
+      }
+      
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable parseFrom(
+          com.google.protobuf.ByteString data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable parseFrom(
+          com.google.protobuf.ByteString data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable parseFrom(byte[] data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable parseFrom(
+          byte[] data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable parseFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable parseFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable parseDelimitedFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        Builder builder = newBuilder();
+        if (builder.mergeDelimitedFrom(input)) {
+          return builder.buildParsed();
+        } else {
+          return null;
+        }
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable parseDelimitedFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        Builder builder = newBuilder();
+        if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+          return builder.buildParsed();
+        } else {
+          return null;
+        }
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable parseFrom(
+          com.google.protobuf.CodedInputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable parseFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      
+      public static Builder newBuilder() { return Builder.create(); }
+      public Builder newBuilderForType() { return newBuilder(); }
+      public static Builder newBuilder(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable prototype) {
+        return newBuilder().mergeFrom(prototype);
+      }
+      public Builder toBuilder() { return newBuilder(this); }
+      
+      @java.lang.Override
+      protected Builder newBuilderForType(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        Builder builder = new Builder(parent);
+        return builder;
+      }
+      public static final class Builder extends
+          com.google.protobuf.GeneratedMessage.Builder<Builder>
+         implements com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariableOrBuilder {
+        public static final com.google.protobuf.Descriptors.Descriptor
+            getDescriptor() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerVariable_descriptor;
+        }
+        
+        protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+            internalGetFieldAccessorTable() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerVariable_fieldAccessorTable;
+        }
+        
+        // Construct using com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable.newBuilder()
+        private Builder() {
+          maybeForceBuilderInitialization();
+        }
+        
+        private Builder(BuilderParent parent) {
+          super(parent);
+          maybeForceBuilderInitialization();
+        }
+        private void maybeForceBuilderInitialization() {
+          if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          }
+        }
+        private static Builder create() {
+          return new Builder();
+        }
+        
+        public Builder clear() {
+          super.clear();
+          name_ = "";
+          bitField0_ = (bitField0_ & ~0x00000001);
+          data_ = 0;
+          bitField0_ = (bitField0_ & ~0x00000002);
+          return this;
+        }
+        
+        public Builder clone() {
+          return create().mergeFrom(buildPartial());
+        }
+        
+        public com.google.protobuf.Descriptors.Descriptor
+            getDescriptorForType() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable.getDescriptor();
+        }
+        
+        public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable getDefaultInstanceForType() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable.getDefaultInstance();
+        }
+        
+        public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable build() {
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(result);
+          }
+          return result;
+        }
+        
+        private com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable buildParsed()
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(
+              result).asInvalidProtocolBufferException();
+          }
+          return result;
+        }
+        
+        public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable buildPartial() {
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable result = new com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable(this);
+          int from_bitField0_ = bitField0_;
+          int to_bitField0_ = 0;
+          if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+            to_bitField0_ |= 0x00000001;
+          }
+          result.name_ = name_;
+          if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+            to_bitField0_ |= 0x00000002;
+          }
+          result.data_ = data_;
+          result.bitField0_ = to_bitField0_;
+          onBuilt();
+          return result;
+        }
+        
+        public Builder mergeFrom(com.google.protobuf.Message other) {
+          if (other instanceof com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable) {
+            return mergeFrom((com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable)other);
+          } else {
+            super.mergeFrom(other);
+            return this;
+          }
+        }
+        
+        public Builder mergeFrom(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable other) {
+          if (other == com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable.getDefaultInstance()) return this;
+          if (other.hasName()) {
+            setName(other.getName());
+          }
+          if (other.hasData()) {
+            setData(other.getData());
+          }
+          this.mergeUnknownFields(other.getUnknownFields());
+          return this;
+        }
+        
+        public final boolean isInitialized() {
+          if (!hasName()) {
+            
+            return false;
+          }
+          return true;
+        }
+        
+        public Builder mergeFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+            com.google.protobuf.UnknownFieldSet.newBuilder(
+              this.getUnknownFields());
+          while (true) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              default: {
+                if (!parseUnknownField(input, unknownFields,
+                                       extensionRegistry, tag)) {
+                  this.setUnknownFields(unknownFields.build());
+                  onChanged();
+                  return this;
+                }
+                break;
+              }
+              case 10: {
+                bitField0_ |= 0x00000001;
+                name_ = input.readBytes();
+                break;
+              }
+              case 16: {
+                bitField0_ |= 0x00000002;
+                data_ = input.readInt32();
+                break;
+              }
+            }
+          }
+        }
+        
+        private int bitField0_;
+        
+        // required string name = 1;
+        private java.lang.Object name_ = "";
+        public boolean hasName() {
+          return ((bitField0_ & 0x00000001) == 0x00000001);
+        }
+        public String getName() {
+          java.lang.Object ref = name_;
+          if (!(ref instanceof String)) {
+            String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+            name_ = s;
+            return s;
+          } else {
+            return (String) ref;
+          }
+        }
+        public Builder setName(String value) {
+          if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+          name_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearName() {
+          bitField0_ = (bitField0_ & ~0x00000001);
+          name_ = getDefaultInstance().getName();
+          onChanged();
+          return this;
+        }
+        void setName(com.google.protobuf.ByteString value) {
+          bitField0_ |= 0x00000001;
+          name_ = value;
+          onChanged();
+        }
+        
+        // optional int32 data = 2;
+        private int data_ ;
+        public boolean hasData() {
+          return ((bitField0_ & 0x00000002) == 0x00000002);
+        }
+        public int getData() {
+          return data_;
+        }
+        public Builder setData(int value) {
+          bitField0_ |= 0x00000002;
+          data_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearData() {
+          bitField0_ = (bitField0_ & ~0x00000002);
+          data_ = 0;
+          onChanged();
+          return this;
+        }
+        
+        // @@protoc_insertion_point(builder_scope:HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.IntegerVariable)
+      }
+      
+      static {
+        defaultInstance = new IntegerVariable(true);
+        defaultInstance.initFields();
+      }
+      
+      // @@protoc_insertion_point(class_scope:HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.IntegerVariable)
+    }
+    
+    public interface IntegerArrayVariableOrBuilder
+        extends com.google.protobuf.MessageOrBuilder {
+      
+      // required string name = 1;
+      boolean hasName();
+      String getName();
+      
+      // repeated int32 data = 2;
+      java.util.List<java.lang.Integer> getDataList();
+      int getDataCount();
+      int getData(int index);
+      
+      // optional int32 length = 3;
+      boolean hasLength();
+      int getLength();
+    }
+    public static final class IntegerArrayVariable extends
+        com.google.protobuf.GeneratedMessage
+        implements IntegerArrayVariableOrBuilder {
+      // Use IntegerArrayVariable.newBuilder() to construct.
+      private IntegerArrayVariable(Builder builder) {
+        super(builder);
+      }
+      private IntegerArrayVariable(boolean noInit) {}
+      
+      private static final IntegerArrayVariable defaultInstance;
+      public static IntegerArrayVariable getDefaultInstance() {
+        return defaultInstance;
+      }
+      
+      public IntegerArrayVariable getDefaultInstanceForType() {
+        return defaultInstance;
+      }
+      
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerArrayVariable_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerArrayVariable_fieldAccessorTable;
+      }
+      
+      private int bitField0_;
+      // required string name = 1;
+      public static final int NAME_FIELD_NUMBER = 1;
+      private java.lang.Object name_;
+      public boolean hasName() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      public String getName() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          return (String) ref;
+        } else {
+          com.google.protobuf.ByteString bs = 
+              (com.google.protobuf.ByteString) ref;
+          String s = bs.toStringUtf8();
+          if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+            name_ = s;
+          }
+          return s;
+        }
+      }
+      private com.google.protobuf.ByteString getNameBytes() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+          name_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      
+      // repeated int32 data = 2;
+      public static final int DATA_FIELD_NUMBER = 2;
+      private java.util.List<java.lang.Integer> data_;
+      public java.util.List<java.lang.Integer>
+          getDataList() {
+        return data_;
+      }
+      public int getDataCount() {
+        return data_.size();
+      }
+      public int getData(int index) {
+        return data_.get(index);
+      }
+      
+      // optional int32 length = 3;
+      public static final int LENGTH_FIELD_NUMBER = 3;
+      private int length_;
+      public boolean hasLength() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      public int getLength() {
+        return length_;
+      }
+      
+      private void initFields() {
+        name_ = "";
+        data_ = java.util.Collections.emptyList();;
+        length_ = 0;
+      }
+      private byte memoizedIsInitialized = -1;
+      public final boolean isInitialized() {
+        byte isInitialized = memoizedIsInitialized;
+        if (isInitialized != -1) return isInitialized == 1;
+        
+        if (!hasName()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+        memoizedIsInitialized = 1;
+        return true;
+      }
+      
+      public void writeTo(com.google.protobuf.CodedOutputStream output)
+                          throws java.io.IOException {
+        getSerializedSize();
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          output.writeBytes(1, getNameBytes());
+        }
+        for (int i = 0; i < data_.size(); i++) {
+          output.writeInt32(2, data_.get(i));
+        }
+        if (((bitField0_ & 0x00000002) == 0x00000002)) {
+          output.writeInt32(3, length_);
+        }
+        getUnknownFields().writeTo(output);
+      }
+      
+      private int memoizedSerializedSize = -1;
+      public int getSerializedSize() {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+      
+        size = 0;
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeBytesSize(1, getNameBytes());
+        }
+        {
+          int dataSize = 0;
+          for (int i = 0; i < data_.size(); i++) {
+            dataSize += com.google.protobuf.CodedOutputStream
+              .computeInt32SizeNoTag(data_.get(i));
+          }
+          size += dataSize;
+          size += 1 * getDataList().size();
+        }
+        if (((bitField0_ & 0x00000002) == 0x00000002)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeInt32Size(3, length_);
+        }
+        size += getUnknownFields().getSerializedSize();
+        memoizedSerializedSize = size;
+        return size;
+      }
+      
+      private static final long serialVersionUID = 0L;
+      @java.lang.Override
+      protected java.lang.Object writeReplace()
+          throws java.io.ObjectStreamException {
+        return super.writeReplace();
+      }
+      
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable parseFrom(
+          com.google.protobuf.ByteString data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable parseFrom(
+          com.google.protobuf.ByteString data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable parseFrom(byte[] data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable parseFrom(
+          byte[] data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable parseFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable parseFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable parseDelimitedFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        Builder builder = newBuilder();
+        if (builder.mergeDelimitedFrom(input)) {
+          return builder.buildParsed();
+        } else {
+          return null;
+        }
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable parseDelimitedFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        Builder builder = newBuilder();
+        if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+          return builder.buildParsed();
+        } else {
+          return null;
+        }
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable parseFrom(
+          com.google.protobuf.CodedInputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable parseFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      
+      public static Builder newBuilder() { return Builder.create(); }
+      public Builder newBuilderForType() { return newBuilder(); }
+      public static Builder newBuilder(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable prototype) {
+        return newBuilder().mergeFrom(prototype);
+      }
+      public Builder toBuilder() { return newBuilder(this); }
+      
+      @java.lang.Override
+      protected Builder newBuilderForType(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        Builder builder = new Builder(parent);
+        return builder;
+      }
+      public static final class Builder extends
+          com.google.protobuf.GeneratedMessage.Builder<Builder>
+         implements com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariableOrBuilder {
+        public static final com.google.protobuf.Descriptors.Descriptor
+            getDescriptor() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerArrayVariable_descriptor;
+        }
+        
+        protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+            internalGetFieldAccessorTable() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerArrayVariable_fieldAccessorTable;
+        }
+        
+        // Construct using com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable.newBuilder()
+        private Builder() {
+          maybeForceBuilderInitialization();
+        }
+        
+        private Builder(BuilderParent parent) {
+          super(parent);
+          maybeForceBuilderInitialization();
+        }
+        private void maybeForceBuilderInitialization() {
+          if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          }
+        }
+        private static Builder create() {
+          return new Builder();
+        }
+        
+        public Builder clear() {
+          super.clear();
+          name_ = "";
+          bitField0_ = (bitField0_ & ~0x00000001);
+          data_ = java.util.Collections.emptyList();;
+          bitField0_ = (bitField0_ & ~0x00000002);
+          length_ = 0;
+          bitField0_ = (bitField0_ & ~0x00000004);
+          return this;
+        }
+        
+        public Builder clone() {
+          return create().mergeFrom(buildPartial());
+        }
+        
+        public com.google.protobuf.Descriptors.Descriptor
+            getDescriptorForType() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable.getDescriptor();
+        }
+        
+        public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable getDefaultInstanceForType() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable.getDefaultInstance();
+        }
+        
+        public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable build() {
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(result);
+          }
+          return result;
+        }
+        
+        private com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable buildParsed()
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(
+              result).asInvalidProtocolBufferException();
+          }
+          return result;
+        }
+        
+        public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable buildPartial() {
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable result = new com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable(this);
+          int from_bitField0_ = bitField0_;
+          int to_bitField0_ = 0;
+          if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+            to_bitField0_ |= 0x00000001;
+          }
+          result.name_ = name_;
+          if (((bitField0_ & 0x00000002) == 0x00000002)) {
+            data_ = java.util.Collections.unmodifiableList(data_);
+            bitField0_ = (bitField0_ & ~0x00000002);
+          }
+          result.data_ = data_;
+          if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
+            to_bitField0_ |= 0x00000002;
+          }
+          result.length_ = length_;
+          result.bitField0_ = to_bitField0_;
+          onBuilt();
+          return result;
+        }
+        
+        public Builder mergeFrom(com.google.protobuf.Message other) {
+          if (other instanceof com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable) {
+            return mergeFrom((com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable)other);
+          } else {
+            super.mergeFrom(other);
+            return this;
+          }
+        }
+        
+        public Builder mergeFrom(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable other) {
+          if (other == com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable.getDefaultInstance()) return this;
+          if (other.hasName()) {
+            setName(other.getName());
+          }
+          if (!other.data_.isEmpty()) {
+            if (data_.isEmpty()) {
+              data_ = other.data_;
+              bitField0_ = (bitField0_ & ~0x00000002);
+            } else {
+              ensureDataIsMutable();
+              data_.addAll(other.data_);
+            }
+            onChanged();
+          }
+          if (other.hasLength()) {
+            setLength(other.getLength());
+          }
+          this.mergeUnknownFields(other.getUnknownFields());
+          return this;
+        }
+        
+        public final boolean isInitialized() {
+          if (!hasName()) {
+            
+            return false;
+          }
+          return true;
+        }
+        
+        public Builder mergeFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+            com.google.protobuf.UnknownFieldSet.newBuilder(
+              this.getUnknownFields());
+          while (true) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              default: {
+                if (!parseUnknownField(input, unknownFields,
+                                       extensionRegistry, tag)) {
+                  this.setUnknownFields(unknownFields.build());
+                  onChanged();
+                  return this;
+                }
+                break;
+              }
+              case 10: {
+                bitField0_ |= 0x00000001;
+                name_ = input.readBytes();
+                break;
+              }
+              case 16: {
+                ensureDataIsMutable();
+                data_.add(input.readInt32());
+                break;
+              }
+              case 18: {
+                int length = input.readRawVarint32();
+                int limit = input.pushLimit(length);
+                while (input.getBytesUntilLimit() > 0) {
+                  addData(input.readInt32());
+                }
+                input.popLimit(limit);
+                break;
+              }
+              case 24: {
+                bitField0_ |= 0x00000004;
+                length_ = input.readInt32();
+                break;
+              }
+            }
+          }
+        }
+        
+        private int bitField0_;
+        
+        // required string name = 1;
+        private java.lang.Object name_ = "";
+        public boolean hasName() {
+          return ((bitField0_ & 0x00000001) == 0x00000001);
+        }
+        public String getName() {
+          java.lang.Object ref = name_;
+          if (!(ref instanceof String)) {
+            String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+            name_ = s;
+            return s;
+          } else {
+            return (String) ref;
+          }
+        }
+        public Builder setName(String value) {
+          if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+          name_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearName() {
+          bitField0_ = (bitField0_ & ~0x00000001);
+          name_ = getDefaultInstance().getName();
+          onChanged();
+          return this;
+        }
+        void setName(com.google.protobuf.ByteString value) {
+          bitField0_ |= 0x00000001;
+          name_ = value;
+          onChanged();
+        }
+        
+        // repeated int32 data = 2;
+        private java.util.List<java.lang.Integer> data_ = java.util.Collections.emptyList();;
+        private void ensureDataIsMutable() {
+          if (!((bitField0_ & 0x00000002) == 0x00000002)) {
+            data_ = new java.util.ArrayList<java.lang.Integer>(data_);
+            bitField0_ |= 0x00000002;
+           }
+        }
+        public java.util.List<java.lang.Integer>
+            getDataList() {
+          return java.util.Collections.unmodifiableList(data_);
+        }
+        public int getDataCount() {
+          return data_.size();
+        }
+        public int getData(int index) {
+          return data_.get(index);
+        }
+        public Builder setData(
+            int index, int value) {
+          ensureDataIsMutable();
+          data_.set(index, value);
+          onChanged();
+          return this;
+        }
+        public Builder addData(int value) {
+          ensureDataIsMutable();
+          data_.add(value);
+          onChanged();
+          return this;
+        }
+        public Builder addAllData(
+            java.lang.Iterable<? extends java.lang.Integer> values) {
+          ensureDataIsMutable();
+          super.addAll(values, data_);
+          onChanged();
+          return this;
+        }
+        public Builder clearData() {
+          data_ = java.util.Collections.emptyList();;
+          bitField0_ = (bitField0_ & ~0x00000002);
+          onChanged();
+          return this;
+        }
+        
+        // optional int32 length = 3;
+        private int length_ ;
+        public boolean hasLength() {
+          return ((bitField0_ & 0x00000004) == 0x00000004);
+        }
+        public int getLength() {
+          return length_;
+        }
+        public Builder setLength(int value) {
+          bitField0_ |= 0x00000004;
+          length_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearLength() {
+          bitField0_ = (bitField0_ & ~0x00000004);
+          length_ = 0;
+          onChanged();
+          return this;
+        }
+        
+        // @@protoc_insertion_point(builder_scope:HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.IntegerArrayVariable)
+      }
+      
+      static {
+        defaultInstance = new IntegerArrayVariable(true);
+        defaultInstance.initFields();
+      }
+      
+      // @@protoc_insertion_point(class_scope:HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.IntegerArrayVariable)
+    }
+    
+    public interface DoubleVariableOrBuilder
+        extends com.google.protobuf.MessageOrBuilder {
+      
+      // required string name = 1;
+      boolean hasName();
+      String getName();
+      
+      // optional double data = 2;
+      boolean hasData();
+      double getData();
+    }
+    public static final class DoubleVariable extends
+        com.google.protobuf.GeneratedMessage
+        implements DoubleVariableOrBuilder {
+      // Use DoubleVariable.newBuilder() to construct.
+      private DoubleVariable(Builder builder) {
+        super(builder);
+      }
+      private DoubleVariable(boolean noInit) {}
+      
+      private static final DoubleVariable defaultInstance;
+      public static DoubleVariable getDefaultInstance() {
+        return defaultInstance;
+      }
+      
+      public DoubleVariable getDefaultInstanceForType() {
+        return defaultInstance;
+      }
+      
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleVariable_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleVariable_fieldAccessorTable;
+      }
+      
+      private int bitField0_;
+      // required string name = 1;
+      public static final int NAME_FIELD_NUMBER = 1;
+      private java.lang.Object name_;
+      public boolean hasName() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      public String getName() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          return (String) ref;
+        } else {
+          com.google.protobuf.ByteString bs = 
+              (com.google.protobuf.ByteString) ref;
+          String s = bs.toStringUtf8();
+          if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+            name_ = s;
+          }
+          return s;
+        }
+      }
+      private com.google.protobuf.ByteString getNameBytes() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+          name_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      
+      // optional double data = 2;
+      public static final int DATA_FIELD_NUMBER = 2;
+      private double data_;
+      public boolean hasData() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      public double getData() {
+        return data_;
+      }
+      
+      private void initFields() {
+        name_ = "";
+        data_ = 0D;
+      }
+      private byte memoizedIsInitialized = -1;
+      public final boolean isInitialized() {
+        byte isInitialized = memoizedIsInitialized;
+        if (isInitialized != -1) return isInitialized == 1;
+        
+        if (!hasName()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+        memoizedIsInitialized = 1;
+        return true;
+      }
+      
+      public void writeTo(com.google.protobuf.CodedOutputStream output)
+                          throws java.io.IOException {
+        getSerializedSize();
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          output.writeBytes(1, getNameBytes());
+        }
+        if (((bitField0_ & 0x00000002) == 0x00000002)) {
+          output.writeDouble(2, data_);
+        }
+        getUnknownFields().writeTo(output);
+      }
+      
+      private int memoizedSerializedSize = -1;
+      public int getSerializedSize() {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+      
+        size = 0;
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeBytesSize(1, getNameBytes());
+        }
+        if (((bitField0_ & 0x00000002) == 0x00000002)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeDoubleSize(2, data_);
+        }
+        size += getUnknownFields().getSerializedSize();
+        memoizedSerializedSize = size;
+        return size;
+      }
+      
+      private static final long serialVersionUID = 0L;
+      @java.lang.Override
+      protected java.lang.Object writeReplace()
+          throws java.io.ObjectStreamException {
+        return super.writeReplace();
+      }
+      
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable parseFrom(
+          com.google.protobuf.ByteString data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable parseFrom(
+          com.google.protobuf.ByteString data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable parseFrom(byte[] data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable parseFrom(
+          byte[] data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable parseFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable parseFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable parseDelimitedFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        Builder builder = newBuilder();
+        if (builder.mergeDelimitedFrom(input)) {
+          return builder.buildParsed();
+        } else {
+          return null;
+        }
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable parseDelimitedFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        Builder builder = newBuilder();
+        if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+          return builder.buildParsed();
+        } else {
+          return null;
+        }
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable parseFrom(
+          com.google.protobuf.CodedInputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable parseFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      
+      public static Builder newBuilder() { return Builder.create(); }
+      public Builder newBuilderForType() { return newBuilder(); }
+      public static Builder newBuilder(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable prototype) {
+        return newBuilder().mergeFrom(prototype);
+      }
+      public Builder toBuilder() { return newBuilder(this); }
+      
+      @java.lang.Override
+      protected Builder newBuilderForType(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        Builder builder = new Builder(parent);
+        return builder;
+      }
+      public static final class Builder extends
+          com.google.protobuf.GeneratedMessage.Builder<Builder>
+         implements com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariableOrBuilder {
+        public static final com.google.protobuf.Descriptors.Descriptor
+            getDescriptor() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleVariable_descriptor;
+        }
+        
+        protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+            internalGetFieldAccessorTable() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleVariable_fieldAccessorTable;
+        }
+        
+        // Construct using com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable.newBuilder()
+        private Builder() {
+          maybeForceBuilderInitialization();
+        }
+        
+        private Builder(BuilderParent parent) {
+          super(parent);
+          maybeForceBuilderInitialization();
+        }
+        private void maybeForceBuilderInitialization() {
+          if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          }
+        }
+        private static Builder create() {
+          return new Builder();
+        }
+        
+        public Builder clear() {
+          super.clear();
+          name_ = "";
+          bitField0_ = (bitField0_ & ~0x00000001);
+          data_ = 0D;
+          bitField0_ = (bitField0_ & ~0x00000002);
+          return this;
+        }
+        
+        public Builder clone() {
+          return create().mergeFrom(buildPartial());
+        }
+        
+        public com.google.protobuf.Descriptors.Descriptor
+            getDescriptorForType() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable.getDescriptor();
+        }
+        
+        public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable getDefaultInstanceForType() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable.getDefaultInstance();
+        }
+        
+        public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable build() {
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(result);
+          }
+          return result;
+        }
+        
+        private com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable buildParsed()
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(
+              result).asInvalidProtocolBufferException();
+          }
+          return result;
+        }
+        
+        public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable buildPartial() {
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable result = new com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable(this);
+          int from_bitField0_ = bitField0_;
+          int to_bitField0_ = 0;
+          if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+            to_bitField0_ |= 0x00000001;
+          }
+          result.name_ = name_;
+          if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+            to_bitField0_ |= 0x00000002;
+          }
+          result.data_ = data_;
+          result.bitField0_ = to_bitField0_;
+          onBuilt();
+          return result;
+        }
+        
+        public Builder mergeFrom(com.google.protobuf.Message other) {
+          if (other instanceof com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable) {
+            return mergeFrom((com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable)other);
+          } else {
+            super.mergeFrom(other);
+            return this;
+          }
+        }
+        
+        public Builder mergeFrom(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable other) {
+          if (other == com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable.getDefaultInstance()) return this;
+          if (other.hasName()) {
+            setName(other.getName());
+          }
+          if (other.hasData()) {
+            setData(other.getData());
+          }
+          this.mergeUnknownFields(other.getUnknownFields());
+          return this;
+        }
+        
+        public final boolean isInitialized() {
+          if (!hasName()) {
+            
+            return false;
+          }
+          return true;
+        }
+        
+        public Builder mergeFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+            com.google.protobuf.UnknownFieldSet.newBuilder(
+              this.getUnknownFields());
+          while (true) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              default: {
+                if (!parseUnknownField(input, unknownFields,
+                                       extensionRegistry, tag)) {
+                  this.setUnknownFields(unknownFields.build());
+                  onChanged();
+                  return this;
+                }
+                break;
+              }
+              case 10: {
+                bitField0_ |= 0x00000001;
+                name_ = input.readBytes();
+                break;
+              }
+              case 17: {
+                bitField0_ |= 0x00000002;
+                data_ = input.readDouble();
+                break;
+              }
+            }
+          }
+        }
+        
+        private int bitField0_;
+        
+        // required string name = 1;
+        private java.lang.Object name_ = "";
+        public boolean hasName() {
+          return ((bitField0_ & 0x00000001) == 0x00000001);
+        }
+        public String getName() {
+          java.lang.Object ref = name_;
+          if (!(ref instanceof String)) {
+            String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+            name_ = s;
+            return s;
+          } else {
+            return (String) ref;
+          }
+        }
+        public Builder setName(String value) {
+          if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+          name_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearName() {
+          bitField0_ = (bitField0_ & ~0x00000001);
+          name_ = getDefaultInstance().getName();
+          onChanged();
+          return this;
+        }
+        void setName(com.google.protobuf.ByteString value) {
+          bitField0_ |= 0x00000001;
+          name_ = value;
+          onChanged();
+        }
+        
+        // optional double data = 2;
+        private double data_ ;
+        public boolean hasData() {
+          return ((bitField0_ & 0x00000002) == 0x00000002);
+        }
+        public double getData() {
+          return data_;
+        }
+        public Builder setData(double value) {
+          bitField0_ |= 0x00000002;
+          data_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearData() {
+          bitField0_ = (bitField0_ & ~0x00000002);
+          data_ = 0D;
+          onChanged();
+          return this;
+        }
+        
+        // @@protoc_insertion_point(builder_scope:HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.DoubleVariable)
+      }
+      
+      static {
+        defaultInstance = new DoubleVariable(true);
+        defaultInstance.initFields();
+      }
+      
+      // @@protoc_insertion_point(class_scope:HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.DoubleVariable)
+    }
+    
+    public interface DoubleArrayVariableOrBuilder
+        extends com.google.protobuf.MessageOrBuilder {
+      
+      // required string name = 1;
+      boolean hasName();
+      String getName();
+      
+      // repeated double data = 2;
+      java.util.List<java.lang.Double> getDataList();
+      int getDataCount();
+      double getData(int index);
+      
+      // optional int32 length = 3;
+      boolean hasLength();
+      int getLength();
+    }
+    public static final class DoubleArrayVariable extends
+        com.google.protobuf.GeneratedMessage
+        implements DoubleArrayVariableOrBuilder {
+      // Use DoubleArrayVariable.newBuilder() to construct.
+      private DoubleArrayVariable(Builder builder) {
+        super(builder);
+      }
+      private DoubleArrayVariable(boolean noInit) {}
+      
+      private static final DoubleArrayVariable defaultInstance;
+      public static DoubleArrayVariable getDefaultInstance() {
+        return defaultInstance;
+      }
+      
+      public DoubleArrayVariable getDefaultInstanceForType() {
+        return defaultInstance;
+      }
+      
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleArrayVariable_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleArrayVariable_fieldAccessorTable;
+      }
+      
+      private int bitField0_;
+      // required string name = 1;
+      public static final int NAME_FIELD_NUMBER = 1;
+      private java.lang.Object name_;
+      public boolean hasName() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      public String getName() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          return (String) ref;
+        } else {
+          com.google.protobuf.ByteString bs = 
+              (com.google.protobuf.ByteString) ref;
+          String s = bs.toStringUtf8();
+          if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+            name_ = s;
+          }
+          return s;
+        }
+      }
+      private com.google.protobuf.ByteString getNameBytes() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+          name_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      
+      // repeated double data = 2;
+      public static final int DATA_FIELD_NUMBER = 2;
+      private java.util.List<java.lang.Double> data_;
+      public java.util.List<java.lang.Double>
+          getDataList() {
+        return data_;
+      }
+      public int getDataCount() {
+        return data_.size();
+      }
+      public double getData(int index) {
+        return data_.get(index);
+      }
+      
+      // optional int32 length = 3;
+      public static final int LENGTH_FIELD_NUMBER = 3;
+      private int length_;
+      public boolean hasLength() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      public int getLength() {
+        return length_;
+      }
+      
+      private void initFields() {
+        name_ = "";
+        data_ = java.util.Collections.emptyList();;
+        length_ = 0;
+      }
+      private byte memoizedIsInitialized = -1;
+      public final boolean isInitialized() {
+        byte isInitialized = memoizedIsInitialized;
+        if (isInitialized != -1) return isInitialized == 1;
+        
+        if (!hasName()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+        memoizedIsInitialized = 1;
+        return true;
+      }
+      
+      public void writeTo(com.google.protobuf.CodedOutputStream output)
+                          throws java.io.IOException {
+        getSerializedSize();
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          output.writeBytes(1, getNameBytes());
+        }
+        for (int i = 0; i < data_.size(); i++) {
+          output.writeDouble(2, data_.get(i));
+        }
+        if (((bitField0_ & 0x00000002) == 0x00000002)) {
+          output.writeInt32(3, length_);
+        }
+        getUnknownFields().writeTo(output);
+      }
+      
+      private int memoizedSerializedSize = -1;
+      public int getSerializedSize() {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+      
+        size = 0;
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeBytesSize(1, getNameBytes());
+        }
+        {
+          int dataSize = 0;
+          dataSize = 8 * getDataList().size();
+          size += dataSize;
+          size += 1 * getDataList().size();
+        }
+        if (((bitField0_ & 0x00000002) == 0x00000002)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeInt32Size(3, length_);
+        }
+        size += getUnknownFields().getSerializedSize();
+        memoizedSerializedSize = size;
+        return size;
+      }
+      
+      private static final long serialVersionUID = 0L;
+      @java.lang.Override
+      protected java.lang.Object writeReplace()
+          throws java.io.ObjectStreamException {
+        return super.writeReplace();
+      }
+      
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable parseFrom(
+          com.google.protobuf.ByteString data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable parseFrom(
+          com.google.protobuf.ByteString data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable parseFrom(byte[] data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable parseFrom(
+          byte[] data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable parseFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable parseFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable parseDelimitedFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        Builder builder = newBuilder();
+        if (builder.mergeDelimitedFrom(input)) {
+          return builder.buildParsed();
+        } else {
+          return null;
+        }
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable parseDelimitedFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        Builder builder = newBuilder();
+        if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+          return builder.buildParsed();
+        } else {
+          return null;
+        }
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable parseFrom(
+          com.google.protobuf.CodedInputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable parseFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      
+      public static Builder newBuilder() { return Builder.create(); }
+      public Builder newBuilderForType() { return newBuilder(); }
+      public static Builder newBuilder(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable prototype) {
+        return newBuilder().mergeFrom(prototype);
+      }
+      public Builder toBuilder() { return newBuilder(this); }
+      
+      @java.lang.Override
+      protected Builder newBuilderForType(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        Builder builder = new Builder(parent);
+        return builder;
+      }
+      public static final class Builder extends
+          com.google.protobuf.GeneratedMessage.Builder<Builder>
+         implements com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariableOrBuilder {
+        public static final com.google.protobuf.Descriptors.Descriptor
+            getDescriptor() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleArrayVariable_descriptor;
+        }
+        
+        protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+            internalGetFieldAccessorTable() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleArrayVariable_fieldAccessorTable;
+        }
+        
+        // Construct using com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable.newBuilder()
+        private Builder() {
+          maybeForceBuilderInitialization();
+        }
+        
+        private Builder(BuilderParent parent) {
+          super(parent);
+          maybeForceBuilderInitialization();
+        }
+        private void maybeForceBuilderInitialization() {
+          if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          }
+        }
+        private static Builder create() {
+          return new Builder();
+        }
+        
+        public Builder clear() {
+          super.clear();
+          name_ = "";
+          bitField0_ = (bitField0_ & ~0x00000001);
+          data_ = java.util.Collections.emptyList();;
+          bitField0_ = (bitField0_ & ~0x00000002);
+          length_ = 0;
+          bitField0_ = (bitField0_ & ~0x00000004);
+          return this;
+        }
+        
+        public Builder clone() {
+          return create().mergeFrom(buildPartial());
+        }
+        
+        public com.google.protobuf.Descriptors.Descriptor
+            getDescriptorForType() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable.getDescriptor();
+        }
+        
+        public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable getDefaultInstanceForType() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable.getDefaultInstance();
+        }
+        
+        public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable build() {
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(result);
+          }
+          return result;
+        }
+        
+        private com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable buildParsed()
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(
+              result).asInvalidProtocolBufferException();
+          }
+          return result;
+        }
+        
+        public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable buildPartial() {
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable result = new com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable(this);
+          int from_bitField0_ = bitField0_;
+          int to_bitField0_ = 0;
+          if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+            to_bitField0_ |= 0x00000001;
+          }
+          result.name_ = name_;
+          if (((bitField0_ & 0x00000002) == 0x00000002)) {
+            data_ = java.util.Collections.unmodifiableList(data_);
+            bitField0_ = (bitField0_ & ~0x00000002);
+          }
+          result.data_ = data_;
+          if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
+            to_bitField0_ |= 0x00000002;
+          }
+          result.length_ = length_;
+          result.bitField0_ = to_bitField0_;
+          onBuilt();
+          return result;
+        }
+        
+        public Builder mergeFrom(com.google.protobuf.Message other) {
+          if (other instanceof com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable) {
+            return mergeFrom((com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable)other);
+          } else {
+            super.mergeFrom(other);
+            return this;
+          }
+        }
+        
+        public Builder mergeFrom(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable other) {
+          if (other == com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable.getDefaultInstance()) return this;
+          if (other.hasName()) {
+            setName(other.getName());
+          }
+          if (!other.data_.isEmpty()) {
+            if (data_.isEmpty()) {
+              data_ = other.data_;
+              bitField0_ = (bitField0_ & ~0x00000002);
+            } else {
+              ensureDataIsMutable();
+              data_.addAll(other.data_);
+            }
+            onChanged();
+          }
+          if (other.hasLength()) {
+            setLength(other.getLength());
+          }
+          this.mergeUnknownFields(other.getUnknownFields());
+          return this;
+        }
+        
+        public final boolean isInitialized() {
+          if (!hasName()) {
+            
+            return false;
+          }
+          return true;
+        }
+        
+        public Builder mergeFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+            com.google.protobuf.UnknownFieldSet.newBuilder(
+              this.getUnknownFields());
+          while (true) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              default: {
+                if (!parseUnknownField(input, unknownFields,
+                                       extensionRegistry, tag)) {
+                  this.setUnknownFields(unknownFields.build());
+                  onChanged();
+                  return this;
+                }
+                break;
+              }
+              case 10: {
+                bitField0_ |= 0x00000001;
+                name_ = input.readBytes();
+                break;
+              }
+              case 17: {
+                ensureDataIsMutable();
+                data_.add(input.readDouble());
+                break;
+              }
+              case 18: {
+                int length = input.readRawVarint32();
+                int limit = input.pushLimit(length);
+                while (input.getBytesUntilLimit() > 0) {
+                  addData(input.readDouble());
+                }
+                input.popLimit(limit);
+                break;
+              }
+              case 24: {
+                bitField0_ |= 0x00000004;
+                length_ = input.readInt32();
+                break;
+              }
+            }
+          }
+        }
+        
+        private int bitField0_;
+        
+        // required string name = 1;
+        private java.lang.Object name_ = "";
+        public boolean hasName() {
+          return ((bitField0_ & 0x00000001) == 0x00000001);
+        }
+        public String getName() {
+          java.lang.Object ref = name_;
+          if (!(ref instanceof String)) {
+            String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+            name_ = s;
+            return s;
+          } else {
+            return (String) ref;
+          }
+        }
+        public Builder setName(String value) {
+          if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+          name_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearName() {
+          bitField0_ = (bitField0_ & ~0x00000001);
+          name_ = getDefaultInstance().getName();
+          onChanged();
+          return this;
+        }
+        void setName(com.google.protobuf.ByteString value) {
+          bitField0_ |= 0x00000001;
+          name_ = value;
+          onChanged();
+        }
+        
+        // repeated double data = 2;
+        private java.util.List<java.lang.Double> data_ = java.util.Collections.emptyList();;
+        private void ensureDataIsMutable() {
+          if (!((bitField0_ & 0x00000002) == 0x00000002)) {
+            data_ = new java.util.ArrayList<java.lang.Double>(data_);
+            bitField0_ |= 0x00000002;
+           }
+        }
+        public java.util.List<java.lang.Double>
+            getDataList() {
+          return java.util.Collections.unmodifiableList(data_);
+        }
+        public int getDataCount() {
+          return data_.size();
+        }
+        public double getData(int index) {
+          return data_.get(index);
+        }
+        public Builder setData(
+            int index, double value) {
+          ensureDataIsMutable();
+          data_.set(index, value);
+          onChanged();
+          return this;
+        }
+        public Builder addData(double value) {
+          ensureDataIsMutable();
+          data_.add(value);
+          onChanged();
+          return this;
+        }
+        public Builder addAllData(
+            java.lang.Iterable<? extends java.lang.Double> values) {
+          ensureDataIsMutable();
+          super.addAll(values, data_);
+          onChanged();
+          return this;
+        }
+        public Builder clearData() {
+          data_ = java.util.Collections.emptyList();;
+          bitField0_ = (bitField0_ & ~0x00000002);
+          onChanged();
+          return this;
+        }
+        
+        // optional int32 length = 3;
+        private int length_ ;
+        public boolean hasLength() {
+          return ((bitField0_ & 0x00000004) == 0x00000004);
+        }
+        public int getLength() {
+          return length_;
+        }
+        public Builder setLength(int value) {
+          bitField0_ |= 0x00000004;
+          length_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearLength() {
+          bitField0_ = (bitField0_ & ~0x00000004);
+          length_ = 0;
+          onChanged();
+          return this;
+        }
+        
+        // @@protoc_insertion_point(builder_scope:HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.DoubleArrayVariable)
+      }
+      
+      static {
+        defaultInstance = new DoubleArrayVariable(true);
+        defaultInstance.initFields();
+      }
+      
+      // @@protoc_insertion_point(class_scope:HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.DoubleArrayVariable)
+    }
+    
+    public interface BoolVariableOrBuilder
+        extends com.google.protobuf.MessageOrBuilder {
+      
+      // required string name = 1;
+      boolean hasName();
+      String getName();
+      
+      // optional bool data = 2;
+      boolean hasData();
+      boolean getData();
+    }
+    public static final class BoolVariable extends
+        com.google.protobuf.GeneratedMessage
+        implements BoolVariableOrBuilder {
+      // Use BoolVariable.newBuilder() to construct.
+      private BoolVariable(Builder builder) {
+        super(builder);
+      }
+      private BoolVariable(boolean noInit) {}
+      
+      private static final BoolVariable defaultInstance;
+      public static BoolVariable getDefaultInstance() {
+        return defaultInstance;
+      }
+      
+      public BoolVariable getDefaultInstanceForType() {
+        return defaultInstance;
+      }
+      
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolVariable_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolVariable_fieldAccessorTable;
+      }
+      
+      private int bitField0_;
+      // required string name = 1;
+      public static final int NAME_FIELD_NUMBER = 1;
+      private java.lang.Object name_;
+      public boolean hasName() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      public String getName() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          return (String) ref;
+        } else {
+          com.google.protobuf.ByteString bs = 
+              (com.google.protobuf.ByteString) ref;
+          String s = bs.toStringUtf8();
+          if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+            name_ = s;
+          }
+          return s;
+        }
+      }
+      private com.google.protobuf.ByteString getNameBytes() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+          name_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      
+      // optional bool data = 2;
+      public static final int DATA_FIELD_NUMBER = 2;
+      private boolean data_;
+      public boolean hasData() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      public boolean getData() {
+        return data_;
+      }
+      
+      private void initFields() {
+        name_ = "";
+        data_ = false;
+      }
+      private byte memoizedIsInitialized = -1;
+      public final boolean isInitialized() {
+        byte isInitialized = memoizedIsInitialized;
+        if (isInitialized != -1) return isInitialized == 1;
+        
+        if (!hasName()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+        memoizedIsInitialized = 1;
+        return true;
+      }
+      
+      public void writeTo(com.google.protobuf.CodedOutputStream output)
+                          throws java.io.IOException {
+        getSerializedSize();
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          output.writeBytes(1, getNameBytes());
+        }
+        if (((bitField0_ & 0x00000002) == 0x00000002)) {
+          output.writeBool(2, data_);
+        }
+        getUnknownFields().writeTo(output);
+      }
+      
+      private int memoizedSerializedSize = -1;
+      public int getSerializedSize() {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+      
+        size = 0;
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeBytesSize(1, getNameBytes());
+        }
+        if (((bitField0_ & 0x00000002) == 0x00000002)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeBoolSize(2, data_);
+        }
+        size += getUnknownFields().getSerializedSize();
+        memoizedSerializedSize = size;
+        return size;
+      }
+      
+      private static final long serialVersionUID = 0L;
+      @java.lang.Override
+      protected java.lang.Object writeReplace()
+          throws java.io.ObjectStreamException {
+        return super.writeReplace();
+      }
+      
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable parseFrom(
+          com.google.protobuf.ByteString data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable parseFrom(
+          com.google.protobuf.ByteString data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable parseFrom(byte[] data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable parseFrom(
+          byte[] data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable parseFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable parseFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable parseDelimitedFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        Builder builder = newBuilder();
+        if (builder.mergeDelimitedFrom(input)) {
+          return builder.buildParsed();
+        } else {
+          return null;
+        }
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable parseDelimitedFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        Builder builder = newBuilder();
+        if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+          return builder.buildParsed();
+        } else {
+          return null;
+        }
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable parseFrom(
+          com.google.protobuf.CodedInputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable parseFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      
+      public static Builder newBuilder() { return Builder.create(); }
+      public Builder newBuilderForType() { return newBuilder(); }
+      public static Builder newBuilder(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable prototype) {
+        return newBuilder().mergeFrom(prototype);
+      }
+      public Builder toBuilder() { return newBuilder(this); }
+      
+      @java.lang.Override
+      protected Builder newBuilderForType(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        Builder builder = new Builder(parent);
+        return builder;
+      }
+      public static final class Builder extends
+          com.google.protobuf.GeneratedMessage.Builder<Builder>
+         implements com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariableOrBuilder {
+        public static final com.google.protobuf.Descriptors.Descriptor
+            getDescriptor() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolVariable_descriptor;
+        }
+        
+        protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+            internalGetFieldAccessorTable() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolVariable_fieldAccessorTable;
+        }
+        
+        // Construct using com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable.newBuilder()
+        private Builder() {
+          maybeForceBuilderInitialization();
+        }
+        
+        private Builder(BuilderParent parent) {
+          super(parent);
+          maybeForceBuilderInitialization();
+        }
+        private void maybeForceBuilderInitialization() {
+          if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          }
+        }
+        private static Builder create() {
+          return new Builder();
+        }
+        
+        public Builder clear() {
+          super.clear();
+          name_ = "";
+          bitField0_ = (bitField0_ & ~0x00000001);
+          data_ = false;
+          bitField0_ = (bitField0_ & ~0x00000002);
+          return this;
+        }
+        
+        public Builder clone() {
+          return create().mergeFrom(buildPartial());
+        }
+        
+        public com.google.protobuf.Descriptors.Descriptor
+            getDescriptorForType() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable.getDescriptor();
+        }
+        
+        public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable getDefaultInstanceForType() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable.getDefaultInstance();
+        }
+        
+        public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable build() {
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(result);
+          }
+          return result;
+        }
+        
+        private com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable buildParsed()
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(
+              result).asInvalidProtocolBufferException();
+          }
+          return result;
+        }
+        
+        public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable buildPartial() {
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable result = new com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable(this);
+          int from_bitField0_ = bitField0_;
+          int to_bitField0_ = 0;
+          if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+            to_bitField0_ |= 0x00000001;
+          }
+          result.name_ = name_;
+          if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+            to_bitField0_ |= 0x00000002;
+          }
+          result.data_ = data_;
+          result.bitField0_ = to_bitField0_;
+          onBuilt();
+          return result;
+        }
+        
+        public Builder mergeFrom(com.google.protobuf.Message other) {
+          if (other instanceof com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable) {
+            return mergeFrom((com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable)other);
+          } else {
+            super.mergeFrom(other);
+            return this;
+          }
+        }
+        
+        public Builder mergeFrom(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable other) {
+          if (other == com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable.getDefaultInstance()) return this;
+          if (other.hasName()) {
+            setName(other.getName());
+          }
+          if (other.hasData()) {
+            setData(other.getData());
+          }
+          this.mergeUnknownFields(other.getUnknownFields());
+          return this;
+        }
+        
+        public final boolean isInitialized() {
+          if (!hasName()) {
+            
+            return false;
+          }
+          return true;
+        }
+        
+        public Builder mergeFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+            com.google.protobuf.UnknownFieldSet.newBuilder(
+              this.getUnknownFields());
+          while (true) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              default: {
+                if (!parseUnknownField(input, unknownFields,
+                                       extensionRegistry, tag)) {
+                  this.setUnknownFields(unknownFields.build());
+                  onChanged();
+                  return this;
+                }
+                break;
+              }
+              case 10: {
+                bitField0_ |= 0x00000001;
+                name_ = input.readBytes();
+                break;
+              }
+              case 16: {
+                bitField0_ |= 0x00000002;
+                data_ = input.readBool();
+                break;
+              }
+            }
+          }
+        }
+        
+        private int bitField0_;
+        
+        // required string name = 1;
+        private java.lang.Object name_ = "";
+        public boolean hasName() {
+          return ((bitField0_ & 0x00000001) == 0x00000001);
+        }
+        public String getName() {
+          java.lang.Object ref = name_;
+          if (!(ref instanceof String)) {
+            String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+            name_ = s;
+            return s;
+          } else {
+            return (String) ref;
+          }
+        }
+        public Builder setName(String value) {
+          if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+          name_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearName() {
+          bitField0_ = (bitField0_ & ~0x00000001);
+          name_ = getDefaultInstance().getName();
+          onChanged();
+          return this;
+        }
+        void setName(com.google.protobuf.ByteString value) {
+          bitField0_ |= 0x00000001;
+          name_ = value;
+          onChanged();
+        }
+        
+        // optional bool data = 2;
+        private boolean data_ ;
+        public boolean hasData() {
+          return ((bitField0_ & 0x00000002) == 0x00000002);
+        }
+        public boolean getData() {
+          return data_;
+        }
+        public Builder setData(boolean value) {
+          bitField0_ |= 0x00000002;
+          data_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearData() {
+          bitField0_ = (bitField0_ & ~0x00000002);
+          data_ = false;
+          onChanged();
+          return this;
+        }
+        
+        // @@protoc_insertion_point(builder_scope:HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.BoolVariable)
+      }
+      
+      static {
+        defaultInstance = new BoolVariable(true);
+        defaultInstance.initFields();
+      }
+      
+      // @@protoc_insertion_point(class_scope:HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.BoolVariable)
+    }
+    
+    public interface BoolArrayVariableOrBuilder
+        extends com.google.protobuf.MessageOrBuilder {
+      
+      // required string name = 1;
+      boolean hasName();
+      String getName();
+      
+      // repeated bool data = 2;
+      java.util.List<java.lang.Boolean> getDataList();
+      int getDataCount();
+      boolean getData(int index);
+      
+      // optional int32 length = 3;
+      boolean hasLength();
+      int getLength();
+    }
+    public static final class BoolArrayVariable extends
+        com.google.protobuf.GeneratedMessage
+        implements BoolArrayVariableOrBuilder {
+      // Use BoolArrayVariable.newBuilder() to construct.
+      private BoolArrayVariable(Builder builder) {
+        super(builder);
+      }
+      private BoolArrayVariable(boolean noInit) {}
+      
+      private static final BoolArrayVariable defaultInstance;
+      public static BoolArrayVariable getDefaultInstance() {
+        return defaultInstance;
+      }
+      
+      public BoolArrayVariable getDefaultInstanceForType() {
+        return defaultInstance;
+      }
+      
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolArrayVariable_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolArrayVariable_fieldAccessorTable;
+      }
+      
+      private int bitField0_;
+      // required string name = 1;
+      public static final int NAME_FIELD_NUMBER = 1;
+      private java.lang.Object name_;
+      public boolean hasName() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      public String getName() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          return (String) ref;
+        } else {
+          com.google.protobuf.ByteString bs = 
+              (com.google.protobuf.ByteString) ref;
+          String s = bs.toStringUtf8();
+          if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+            name_ = s;
+          }
+          return s;
+        }
+      }
+      private com.google.protobuf.ByteString getNameBytes() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+          name_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      
+      // repeated bool data = 2;
+      public static final int DATA_FIELD_NUMBER = 2;
+      private java.util.List<java.lang.Boolean> data_;
+      public java.util.List<java.lang.Boolean>
+          getDataList() {
+        return data_;
+      }
+      public int getDataCount() {
+        return data_.size();
+      }
+      public boolean getData(int index) {
+        return data_.get(index);
+      }
+      
+      // optional int32 length = 3;
+      public static final int LENGTH_FIELD_NUMBER = 3;
+      private int length_;
+      public boolean hasLength() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      public int getLength() {
+        return length_;
+      }
+      
+      private void initFields() {
+        name_ = "";
+        data_ = java.util.Collections.emptyList();;
+        length_ = 0;
+      }
+      private byte memoizedIsInitialized = -1;
+      public final boolean isInitialized() {
+        byte isInitialized = memoizedIsInitialized;
+        if (isInitialized != -1) return isInitialized == 1;
+        
+        if (!hasName()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+        memoizedIsInitialized = 1;
+        return true;
+      }
+      
+      public void writeTo(com.google.protobuf.CodedOutputStream output)
+                          throws java.io.IOException {
+        getSerializedSize();
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          output.writeBytes(1, getNameBytes());
+        }
+        for (int i = 0; i < data_.size(); i++) {
+          output.writeBool(2, data_.get(i));
+        }
+        if (((bitField0_ & 0x00000002) == 0x00000002)) {
+          output.writeInt32(3, length_);
+        }
+        getUnknownFields().writeTo(output);
+      }
+      
+      private int memoizedSerializedSize = -1;
+      public int getSerializedSize() {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+      
+        size = 0;
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeBytesSize(1, getNameBytes());
+        }
+        {
+          int dataSize = 0;
+          dataSize = 1 * getDataList().size();
+          size += dataSize;
+          size += 1 * getDataList().size();
+        }
+        if (((bitField0_ & 0x00000002) == 0x00000002)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeInt32Size(3, length_);
+        }
+        size += getUnknownFields().getSerializedSize();
+        memoizedSerializedSize = size;
+        return size;
+      }
+      
+      private static final long serialVersionUID = 0L;
+      @java.lang.Override
+      protected java.lang.Object writeReplace()
+          throws java.io.ObjectStreamException {
+        return super.writeReplace();
+      }
+      
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable parseFrom(
+          com.google.protobuf.ByteString data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable parseFrom(
+          com.google.protobuf.ByteString data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable parseFrom(byte[] data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable parseFrom(
+          byte[] data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable parseFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable parseFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable parseDelimitedFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        Builder builder = newBuilder();
+        if (builder.mergeDelimitedFrom(input)) {
+          return builder.buildParsed();
+        } else {
+          return null;
+        }
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable parseDelimitedFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        Builder builder = newBuilder();
+        if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+          return builder.buildParsed();
+        } else {
+          return null;
+        }
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable parseFrom(
+          com.google.protobuf.CodedInputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable parseFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      
+      public static Builder newBuilder() { return Builder.create(); }
+      public Builder newBuilderForType() { return newBuilder(); }
+      public static Builder newBuilder(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable prototype) {
+        return newBuilder().mergeFrom(prototype);
+      }
+      public Builder toBuilder() { return newBuilder(this); }
+      
+      @java.lang.Override
+      protected Builder newBuilderForType(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        Builder builder = new Builder(parent);
+        return builder;
+      }
+      public static final class Builder extends
+          com.google.protobuf.GeneratedMessage.Builder<Builder>
+         implements com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariableOrBuilder {
+        public static final com.google.protobuf.Descriptors.Descriptor
+            getDescriptor() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolArrayVariable_descriptor;
+        }
+        
+        protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+            internalGetFieldAccessorTable() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolArrayVariable_fieldAccessorTable;
+        }
+        
+        // Construct using com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable.newBuilder()
+        private Builder() {
+          maybeForceBuilderInitialization();
+        }
+        
+        private Builder(BuilderParent parent) {
+          super(parent);
+          maybeForceBuilderInitialization();
+        }
+        private void maybeForceBuilderInitialization() {
+          if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          }
+        }
+        private static Builder create() {
+          return new Builder();
+        }
+        
+        public Builder clear() {
+          super.clear();
+          name_ = "";
+          bitField0_ = (bitField0_ & ~0x00000001);
+          data_ = java.util.Collections.emptyList();;
+          bitField0_ = (bitField0_ & ~0x00000002);
+          length_ = 0;
+          bitField0_ = (bitField0_ & ~0x00000004);
+          return this;
+        }
+        
+        public Builder clone() {
+          return create().mergeFrom(buildPartial());
+        }
+        
+        public com.google.protobuf.Descriptors.Descriptor
+            getDescriptorForType() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable.getDescriptor();
+        }
+        
+        public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable getDefaultInstanceForType() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable.getDefaultInstance();
+        }
+        
+        public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable build() {
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(result);
+          }
+          return result;
+        }
+        
+        private com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable buildParsed()
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(
+              result).asInvalidProtocolBufferException();
+          }
+          return result;
+        }
+        
+        public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable buildPartial() {
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable result = new com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable(this);
+          int from_bitField0_ = bitField0_;
+          int to_bitField0_ = 0;
+          if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+            to_bitField0_ |= 0x00000001;
+          }
+          result.name_ = name_;
+          if (((bitField0_ & 0x00000002) == 0x00000002)) {
+            data_ = java.util.Collections.unmodifiableList(data_);
+            bitField0_ = (bitField0_ & ~0x00000002);
+          }
+          result.data_ = data_;
+          if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
+            to_bitField0_ |= 0x00000002;
+          }
+          result.length_ = length_;
+          result.bitField0_ = to_bitField0_;
+          onBuilt();
+          return result;
+        }
+        
+        public Builder mergeFrom(com.google.protobuf.Message other) {
+          if (other instanceof com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable) {
+            return mergeFrom((com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable)other);
+          } else {
+            super.mergeFrom(other);
+            return this;
+          }
+        }
+        
+        public Builder mergeFrom(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable other) {
+          if (other == com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable.getDefaultInstance()) return this;
+          if (other.hasName()) {
+            setName(other.getName());
+          }
+          if (!other.data_.isEmpty()) {
+            if (data_.isEmpty()) {
+              data_ = other.data_;
+              bitField0_ = (bitField0_ & ~0x00000002);
+            } else {
+              ensureDataIsMutable();
+              data_.addAll(other.data_);
+            }
+            onChanged();
+          }
+          if (other.hasLength()) {
+            setLength(other.getLength());
+          }
+          this.mergeUnknownFields(other.getUnknownFields());
+          return this;
+        }
+        
+        public final boolean isInitialized() {
+          if (!hasName()) {
+            
+            return false;
+          }
+          return true;
+        }
+        
+        public Builder mergeFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+            com.google.protobuf.UnknownFieldSet.newBuilder(
+              this.getUnknownFields());
+          while (true) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              default: {
+                if (!parseUnknownField(input, unknownFields,
+                                       extensionRegistry, tag)) {
+                  this.setUnknownFields(unknownFields.build());
+                  onChanged();
+                  return this;
+                }
+                break;
+              }
+              case 10: {
+                bitField0_ |= 0x00000001;
+                name_ = input.readBytes();
+                break;
+              }
+              case 16: {
+                ensureDataIsMutable();
+                data_.add(input.readBool());
+                break;
+              }
+              case 18: {
+                int length = input.readRawVarint32();
+                int limit = input.pushLimit(length);
+                while (input.getBytesUntilLimit() > 0) {
+                  addData(input.readBool());
+                }
+                input.popLimit(limit);
+                break;
+              }
+              case 24: {
+                bitField0_ |= 0x00000004;
+                length_ = input.readInt32();
+                break;
+              }
+            }
+          }
+        }
+        
+        private int bitField0_;
+        
+        // required string name = 1;
+        private java.lang.Object name_ = "";
+        public boolean hasName() {
+          return ((bitField0_ & 0x00000001) == 0x00000001);
+        }
+        public String getName() {
+          java.lang.Object ref = name_;
+          if (!(ref instanceof String)) {
+            String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+            name_ = s;
+            return s;
+          } else {
+            return (String) ref;
+          }
+        }
+        public Builder setName(String value) {
+          if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+          name_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearName() {
+          bitField0_ = (bitField0_ & ~0x00000001);
+          name_ = getDefaultInstance().getName();
+          onChanged();
+          return this;
+        }
+        void setName(com.google.protobuf.ByteString value) {
+          bitField0_ |= 0x00000001;
+          name_ = value;
+          onChanged();
+        }
+        
+        // repeated bool data = 2;
+        private java.util.List<java.lang.Boolean> data_ = java.util.Collections.emptyList();;
+        private void ensureDataIsMutable() {
+          if (!((bitField0_ & 0x00000002) == 0x00000002)) {
+            data_ = new java.util.ArrayList<java.lang.Boolean>(data_);
+            bitField0_ |= 0x00000002;
+           }
+        }
+        public java.util.List<java.lang.Boolean>
+            getDataList() {
+          return java.util.Collections.unmodifiableList(data_);
+        }
+        public int getDataCount() {
+          return data_.size();
+        }
+        public boolean getData(int index) {
+          return data_.get(index);
+        }
+        public Builder setData(
+            int index, boolean value) {
+          ensureDataIsMutable();
+          data_.set(index, value);
+          onChanged();
+          return this;
+        }
+        public Builder addData(boolean value) {
+          ensureDataIsMutable();
+          data_.add(value);
+          onChanged();
+          return this;
+        }
+        public Builder addAllData(
+            java.lang.Iterable<? extends java.lang.Boolean> values) {
+          ensureDataIsMutable();
+          super.addAll(values, data_);
+          onChanged();
+          return this;
+        }
+        public Builder clearData() {
+          data_ = java.util.Collections.emptyList();;
+          bitField0_ = (bitField0_ & ~0x00000002);
+          onChanged();
+          return this;
+        }
+        
+        // optional int32 length = 3;
+        private int length_ ;
+        public boolean hasLength() {
+          return ((bitField0_ & 0x00000004) == 0x00000004);
+        }
+        public int getLength() {
+          return length_;
+        }
+        public Builder setLength(int value) {
+          bitField0_ |= 0x00000004;
+          length_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearLength() {
+          bitField0_ = (bitField0_ & ~0x00000004);
+          length_ = 0;
+          onChanged();
+          return this;
+        }
+        
+        // @@protoc_insertion_point(builder_scope:HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.BoolArrayVariable)
+      }
+      
+      static {
+        defaultInstance = new BoolArrayVariable(true);
+        defaultInstance.initFields();
+      }
+      
+      // @@protoc_insertion_point(class_scope:HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.BoolArrayVariable)
+    }
+    
+    public interface StringVariableOrBuilder
+        extends com.google.protobuf.MessageOrBuilder {
+      
+      // required string name = 1;
+      boolean hasName();
+      String getName();
+      
+      // optional string data = 2;
+      boolean hasData();
+      String getData();
+    }
+    public static final class StringVariable extends
+        com.google.protobuf.GeneratedMessage
+        implements StringVariableOrBuilder {
+      // Use StringVariable.newBuilder() to construct.
+      private StringVariable(Builder builder) {
+        super(builder);
+      }
+      private StringVariable(boolean noInit) {}
+      
+      private static final StringVariable defaultInstance;
+      public static StringVariable getDefaultInstance() {
+        return defaultInstance;
+      }
+      
+      public StringVariable getDefaultInstanceForType() {
+        return defaultInstance;
+      }
+      
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringVariable_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringVariable_fieldAccessorTable;
+      }
+      
+      private int bitField0_;
+      // required string name = 1;
+      public static final int NAME_FIELD_NUMBER = 1;
+      private java.lang.Object name_;
+      public boolean hasName() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      public String getName() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          return (String) ref;
+        } else {
+          com.google.protobuf.ByteString bs = 
+              (com.google.protobuf.ByteString) ref;
+          String s = bs.toStringUtf8();
+          if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+            name_ = s;
+          }
+          return s;
+        }
+      }
+      private com.google.protobuf.ByteString getNameBytes() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+          name_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      
+      // optional string data = 2;
+      public static final int DATA_FIELD_NUMBER = 2;
+      private java.lang.Object data_;
+      public boolean hasData() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      public String getData() {
+        java.lang.Object ref = data_;
+        if (ref instanceof String) {
+          return (String) ref;
+        } else {
+          com.google.protobuf.ByteString bs = 
+              (com.google.protobuf.ByteString) ref;
+          String s = bs.toStringUtf8();
+          if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+            data_ = s;
+          }
+          return s;
+        }
+      }
+      private com.google.protobuf.ByteString getDataBytes() {
+        java.lang.Object ref = data_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+          data_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      
+      private void initFields() {
+        name_ = "";
+        data_ = "";
+      }
+      private byte memoizedIsInitialized = -1;
+      public final boolean isInitialized() {
+        byte isInitialized = memoizedIsInitialized;
+        if (isInitialized != -1) return isInitialized == 1;
+        
+        if (!hasName()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+        memoizedIsInitialized = 1;
+        return true;
+      }
+      
+      public void writeTo(com.google.protobuf.CodedOutputStream output)
+                          throws java.io.IOException {
+        getSerializedSize();
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          output.writeBytes(1, getNameBytes());
+        }
+        if (((bitField0_ & 0x00000002) == 0x00000002)) {
+          output.writeBytes(2, getDataBytes());
+        }
+        getUnknownFields().writeTo(output);
+      }
+      
+      private int memoizedSerializedSize = -1;
+      public int getSerializedSize() {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+      
+        size = 0;
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeBytesSize(1, getNameBytes());
+        }
+        if (((bitField0_ & 0x00000002) == 0x00000002)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeBytesSize(2, getDataBytes());
+        }
+        size += getUnknownFields().getSerializedSize();
+        memoizedSerializedSize = size;
+        return size;
+      }
+      
+      private static final long serialVersionUID = 0L;
+      @java.lang.Override
+      protected java.lang.Object writeReplace()
+          throws java.io.ObjectStreamException {
+        return super.writeReplace();
+      }
+      
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable parseFrom(
+          com.google.protobuf.ByteString data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable parseFrom(
+          com.google.protobuf.ByteString data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable parseFrom(byte[] data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable parseFrom(
+          byte[] data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable parseFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable parseFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable parseDelimitedFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        Builder builder = newBuilder();
+        if (builder.mergeDelimitedFrom(input)) {
+          return builder.buildParsed();
+        } else {
+          return null;
+        }
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable parseDelimitedFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        Builder builder = newBuilder();
+        if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+          return builder.buildParsed();
+        } else {
+          return null;
+        }
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable parseFrom(
+          com.google.protobuf.CodedInputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable parseFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      
+      public static Builder newBuilder() { return Builder.create(); }
+      public Builder newBuilderForType() { return newBuilder(); }
+      public static Builder newBuilder(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable prototype) {
+        return newBuilder().mergeFrom(prototype);
+      }
+      public Builder toBuilder() { return newBuilder(this); }
+      
+      @java.lang.Override
+      protected Builder newBuilderForType(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        Builder builder = new Builder(parent);
+        return builder;
+      }
+      public static final class Builder extends
+          com.google.protobuf.GeneratedMessage.Builder<Builder>
+         implements com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariableOrBuilder {
+        public static final com.google.protobuf.Descriptors.Descriptor
+            getDescriptor() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringVariable_descriptor;
+        }
+        
+        protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+            internalGetFieldAccessorTable() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringVariable_fieldAccessorTable;
+        }
+        
+        // Construct using com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable.newBuilder()
+        private Builder() {
+          maybeForceBuilderInitialization();
+        }
+        
+        private Builder(BuilderParent parent) {
+          super(parent);
+          maybeForceBuilderInitialization();
+        }
+        private void maybeForceBuilderInitialization() {
+          if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          }
+        }
+        private static Builder create() {
+          return new Builder();
+        }
+        
+        public Builder clear() {
+          super.clear();
+          name_ = "";
+          bitField0_ = (bitField0_ & ~0x00000001);
+          data_ = "";
+          bitField0_ = (bitField0_ & ~0x00000002);
+          return this;
+        }
+        
+        public Builder clone() {
+          return create().mergeFrom(buildPartial());
+        }
+        
+        public com.google.protobuf.Descriptors.Descriptor
+            getDescriptorForType() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable.getDescriptor();
+        }
+        
+        public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable getDefaultInstanceForType() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable.getDefaultInstance();
+        }
+        
+        public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable build() {
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(result);
+          }
+          return result;
+        }
+        
+        private com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable buildParsed()
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(
+              result).asInvalidProtocolBufferException();
+          }
+          return result;
+        }
+        
+        public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable buildPartial() {
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable result = new com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable(this);
+          int from_bitField0_ = bitField0_;
+          int to_bitField0_ = 0;
+          if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+            to_bitField0_ |= 0x00000001;
+          }
+          result.name_ = name_;
+          if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+            to_bitField0_ |= 0x00000002;
+          }
+          result.data_ = data_;
+          result.bitField0_ = to_bitField0_;
+          onBuilt();
+          return result;
+        }
+        
+        public Builder mergeFrom(com.google.protobuf.Message other) {
+          if (other instanceof com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable) {
+            return mergeFrom((com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable)other);
+          } else {
+            super.mergeFrom(other);
+            return this;
+          }
+        }
+        
+        public Builder mergeFrom(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable other) {
+          if (other == com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable.getDefaultInstance()) return this;
+          if (other.hasName()) {
+            setName(other.getName());
+          }
+          if (other.hasData()) {
+            setData(other.getData());
+          }
+          this.mergeUnknownFields(other.getUnknownFields());
+          return this;
+        }
+        
+        public final boolean isInitialized() {
+          if (!hasName()) {
+            
+            return false;
+          }
+          return true;
+        }
+        
+        public Builder mergeFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+            com.google.protobuf.UnknownFieldSet.newBuilder(
+              this.getUnknownFields());
+          while (true) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              default: {
+                if (!parseUnknownField(input, unknownFields,
+                                       extensionRegistry, tag)) {
+                  this.setUnknownFields(unknownFields.build());
+                  onChanged();
+                  return this;
+                }
+                break;
+              }
+              case 10: {
+                bitField0_ |= 0x00000001;
+                name_ = input.readBytes();
+                break;
+              }
+              case 18: {
+                bitField0_ |= 0x00000002;
+                data_ = input.readBytes();
+                break;
+              }
+            }
+          }
+        }
+        
+        private int bitField0_;
+        
+        // required string name = 1;
+        private java.lang.Object name_ = "";
+        public boolean hasName() {
+          return ((bitField0_ & 0x00000001) == 0x00000001);
+        }
+        public String getName() {
+          java.lang.Object ref = name_;
+          if (!(ref instanceof String)) {
+            String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+            name_ = s;
+            return s;
+          } else {
+            return (String) ref;
+          }
+        }
+        public Builder setName(String value) {
+          if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+          name_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearName() {
+          bitField0_ = (bitField0_ & ~0x00000001);
+          name_ = getDefaultInstance().getName();
+          onChanged();
+          return this;
+        }
+        void setName(com.google.protobuf.ByteString value) {
+          bitField0_ |= 0x00000001;
+          name_ = value;
+          onChanged();
+        }
+        
+        // optional string data = 2;
+        private java.lang.Object data_ = "";
+        public boolean hasData() {
+          return ((bitField0_ & 0x00000002) == 0x00000002);
+        }
+        public String getData() {
+          java.lang.Object ref = data_;
+          if (!(ref instanceof String)) {
+            String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+            data_ = s;
+            return s;
+          } else {
+            return (String) ref;
+          }
+        }
+        public Builder setData(String value) {
+          if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000002;
+          data_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearData() {
+          bitField0_ = (bitField0_ & ~0x00000002);
+          data_ = getDefaultInstance().getData();
+          onChanged();
+          return this;
+        }
+        void setData(com.google.protobuf.ByteString value) {
+          bitField0_ |= 0x00000002;
+          data_ = value;
+          onChanged();
+        }
+        
+        // @@protoc_insertion_point(builder_scope:HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.StringVariable)
+      }
+      
+      static {
+        defaultInstance = new StringVariable(true);
+        defaultInstance.initFields();
+      }
+      
+      // @@protoc_insertion_point(class_scope:HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.StringVariable)
+    }
+    
+    public interface StringArrayVariableOrBuilder
+        extends com.google.protobuf.MessageOrBuilder {
+      
+      // required string name = 1;
+      boolean hasName();
+      String getName();
+      
+      // repeated string data = 2;
+      java.util.List<String> getDataList();
+      int getDataCount();
+      String getData(int index);
+      
+      // optional int32 length = 3;
+      boolean hasLength();
+      int getLength();
+    }
+    public static final class StringArrayVariable extends
+        com.google.protobuf.GeneratedMessage
+        implements StringArrayVariableOrBuilder {
+      // Use StringArrayVariable.newBuilder() to construct.
+      private StringArrayVariable(Builder builder) {
+        super(builder);
+      }
+      private StringArrayVariable(boolean noInit) {}
+      
+      private static final StringArrayVariable defaultInstance;
+      public static StringArrayVariable getDefaultInstance() {
+        return defaultInstance;
+      }
+      
+      public StringArrayVariable getDefaultInstanceForType() {
+        return defaultInstance;
+      }
+      
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringArrayVariable_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringArrayVariable_fieldAccessorTable;
+      }
+      
+      private int bitField0_;
+      // required string name = 1;
+      public static final int NAME_FIELD_NUMBER = 1;
+      private java.lang.Object name_;
+      public boolean hasName() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      public String getName() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          return (String) ref;
+        } else {
+          com.google.protobuf.ByteString bs = 
+              (com.google.protobuf.ByteString) ref;
+          String s = bs.toStringUtf8();
+          if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+            name_ = s;
+          }
+          return s;
+        }
+      }
+      private com.google.protobuf.ByteString getNameBytes() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+          name_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      
+      // repeated string data = 2;
+      public static final int DATA_FIELD_NUMBER = 2;
+      private com.google.protobuf.LazyStringList data_;
+      public java.util.List<String>
+          getDataList() {
+        return data_;
+      }
+      public int getDataCount() {
+        return data_.size();
+      }
+      public String getData(int index) {
+        return data_.get(index);
+      }
+      
+      // optional int32 length = 3;
+      public static final int LENGTH_FIELD_NUMBER = 3;
+      private int length_;
+      public boolean hasLength() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      public int getLength() {
+        return length_;
+      }
+      
+      private void initFields() {
+        name_ = "";
+        data_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+        length_ = 0;
+      }
+      private byte memoizedIsInitialized = -1;
+      public final boolean isInitialized() {
+        byte isInitialized = memoizedIsInitialized;
+        if (isInitialized != -1) return isInitialized == 1;
+        
+        if (!hasName()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+        memoizedIsInitialized = 1;
+        return true;
+      }
+      
+      public void writeTo(com.google.protobuf.CodedOutputStream output)
+                          throws java.io.IOException {
+        getSerializedSize();
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          output.writeBytes(1, getNameBytes());
+        }
+        for (int i = 0; i < data_.size(); i++) {
+          output.writeBytes(2, data_.getByteString(i));
+        }
+        if (((bitField0_ & 0x00000002) == 0x00000002)) {
+          output.writeInt32(3, length_);
+        }
+        getUnknownFields().writeTo(output);
+      }
+      
+      private int memoizedSerializedSize = -1;
+      public int getSerializedSize() {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+      
+        size = 0;
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeBytesSize(1, getNameBytes());
+        }
+        {
+          int dataSize = 0;
+          for (int i = 0; i < data_.size(); i++) {
+            dataSize += com.google.protobuf.CodedOutputStream
+              .computeBytesSizeNoTag(data_.getByteString(i));
+          }
+          size += dataSize;
+          size += 1 * getDataList().size();
+        }
+        if (((bitField0_ & 0x00000002) == 0x00000002)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeInt32Size(3, length_);
+        }
+        size += getUnknownFields().getSerializedSize();
+        memoizedSerializedSize = size;
+        return size;
+      }
+      
+      private static final long serialVersionUID = 0L;
+      @java.lang.Override
+      protected java.lang.Object writeReplace()
+          throws java.io.ObjectStreamException {
+        return super.writeReplace();
+      }
+      
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable parseFrom(
+          com.google.protobuf.ByteString data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable parseFrom(
+          com.google.protobuf.ByteString data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable parseFrom(byte[] data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable parseFrom(
+          byte[] data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable parseFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable parseFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable parseDelimitedFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        Builder builder = newBuilder();
+        if (builder.mergeDelimitedFrom(input)) {
+          return builder.buildParsed();
+        } else {
+          return null;
+        }
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable parseDelimitedFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        Builder builder = newBuilder();
+        if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+          return builder.buildParsed();
+        } else {
+          return null;
+        }
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable parseFrom(
+          com.google.protobuf.CodedInputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable parseFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      
+      public static Builder newBuilder() { return Builder.create(); }
+      public Builder newBuilderForType() { return newBuilder(); }
+      public static Builder newBuilder(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable prototype) {
+        return newBuilder().mergeFrom(prototype);
+      }
+      public Builder toBuilder() { return newBuilder(this); }
+      
+      @java.lang.Override
+      protected Builder newBuilderForType(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        Builder builder = new Builder(parent);
+        return builder;
+      }
+      public static final class Builder extends
+          com.google.protobuf.GeneratedMessage.Builder<Builder>
+         implements com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariableOrBuilder {
+        public static final com.google.protobuf.Descriptors.Descriptor
+            getDescriptor() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringArrayVariable_descriptor;
+        }
+        
+        protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+            internalGetFieldAccessorTable() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringArrayVariable_fieldAccessorTable;
+        }
+        
+        // Construct using com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable.newBuilder()
+        private Builder() {
+          maybeForceBuilderInitialization();
+        }
+        
+        private Builder(BuilderParent parent) {
+          super(parent);
+          maybeForceBuilderInitialization();
+        }
+        private void maybeForceBuilderInitialization() {
+          if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          }
+        }
+        private static Builder create() {
+          return new Builder();
+        }
+        
+        public Builder clear() {
+          super.clear();
+          name_ = "";
+          bitField0_ = (bitField0_ & ~0x00000001);
+          data_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+          bitField0_ = (bitField0_ & ~0x00000002);
+          length_ = 0;
+          bitField0_ = (bitField0_ & ~0x00000004);
+          return this;
+        }
+        
+        public Builder clone() {
+          return create().mergeFrom(buildPartial());
+        }
+        
+        public com.google.protobuf.Descriptors.Descriptor
+            getDescriptorForType() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable.getDescriptor();
+        }
+        
+        public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable getDefaultInstanceForType() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable.getDefaultInstance();
+        }
+        
+        public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable build() {
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(result);
+          }
+          return result;
+        }
+        
+        private com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable buildParsed()
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(
+              result).asInvalidProtocolBufferException();
+          }
+          return result;
+        }
+        
+        public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable buildPartial() {
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable result = new com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable(this);
+          int from_bitField0_ = bitField0_;
+          int to_bitField0_ = 0;
+          if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+            to_bitField0_ |= 0x00000001;
+          }
+          result.name_ = name_;
+          if (((bitField0_ & 0x00000002) == 0x00000002)) {
+            data_ = new com.google.protobuf.UnmodifiableLazyStringList(
+                data_);
+            bitField0_ = (bitField0_ & ~0x00000002);
+          }
+          result.data_ = data_;
+          if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
+            to_bitField0_ |= 0x00000002;
+          }
+          result.length_ = length_;
+          result.bitField0_ = to_bitField0_;
+          onBuilt();
+          return result;
+        }
+        
+        public Builder mergeFrom(com.google.protobuf.Message other) {
+          if (other instanceof com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable) {
+            return mergeFrom((com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable)other);
+          } else {
+            super.mergeFrom(other);
+            return this;
+          }
+        }
+        
+        public Builder mergeFrom(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable other) {
+          if (other == com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable.getDefaultInstance()) return this;
+          if (other.hasName()) {
+            setName(other.getName());
+          }
+          if (!other.data_.isEmpty()) {
+            if (data_.isEmpty()) {
+              data_ = other.data_;
+              bitField0_ = (bitField0_ & ~0x00000002);
+            } else {
+              ensureDataIsMutable();
+              data_.addAll(other.data_);
+            }
+            onChanged();
+          }
+          if (other.hasLength()) {
+            setLength(other.getLength());
+          }
+          this.mergeUnknownFields(other.getUnknownFields());
+          return this;
+        }
+        
+        public final boolean isInitialized() {
+          if (!hasName()) {
+            
+            return false;
+          }
+          return true;
+        }
+        
+        public Builder mergeFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+            com.google.protobuf.UnknownFieldSet.newBuilder(
+              this.getUnknownFields());
+          while (true) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              default: {
+                if (!parseUnknownField(input, unknownFields,
+                                       extensionRegistry, tag)) {
+                  this.setUnknownFields(unknownFields.build());
+                  onChanged();
+                  return this;
+                }
+                break;
+              }
+              case 10: {
+                bitField0_ |= 0x00000001;
+                name_ = input.readBytes();
+                break;
+              }
+              case 18: {
+                ensureDataIsMutable();
+                data_.add(input.readBytes());
+                break;
+              }
+              case 24: {
+                bitField0_ |= 0x00000004;
+                length_ = input.readInt32();
+                break;
+              }
+            }
+          }
+        }
+        
+        private int bitField0_;
+        
+        // required string name = 1;
+        private java.lang.Object name_ = "";
+        public boolean hasName() {
+          return ((bitField0_ & 0x00000001) == 0x00000001);
+        }
+        public String getName() {
+          java.lang.Object ref = name_;
+          if (!(ref instanceof String)) {
+            String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+            name_ = s;
+            return s;
+          } else {
+            return (String) ref;
+          }
+        }
+        public Builder setName(String value) {
+          if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+          name_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearName() {
+          bitField0_ = (bitField0_ & ~0x00000001);
+          name_ = getDefaultInstance().getName();
+          onChanged();
+          return this;
+        }
+        void setName(com.google.protobuf.ByteString value) {
+          bitField0_ |= 0x00000001;
+          name_ = value;
+          onChanged();
+        }
+        
+        // repeated string data = 2;
+        private com.google.protobuf.LazyStringList data_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+        private void ensureDataIsMutable() {
+          if (!((bitField0_ & 0x00000002) == 0x00000002)) {
+            data_ = new com.google.protobuf.LazyStringArrayList(data_);
+            bitField0_ |= 0x00000002;
+           }
+        }
+        public java.util.List<String>
+            getDataList() {
+          return java.util.Collections.unmodifiableList(data_);
+        }
+        public int getDataCount() {
+          return data_.size();
+        }
+        public String getData(int index) {
+          return data_.get(index);
+        }
+        public Builder setData(
+            int index, String value) {
+          if (value == null) {
+    throw new NullPointerException();
+  }
+  ensureDataIsMutable();
+          data_.set(index, value);
+          onChanged();
+          return this;
+        }
+        public Builder addData(String value) {
+          if (value == null) {
+    throw new NullPointerException();
+  }
+  ensureDataIsMutable();
+          data_.add(value);
+          onChanged();
+          return this;
+        }
+        public Builder addAllData(
+            java.lang.Iterable<String> values) {
+          ensureDataIsMutable();
+          super.addAll(values, data_);
+          onChanged();
+          return this;
+        }
+        public Builder clearData() {
+          data_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+          bitField0_ = (bitField0_ & ~0x00000002);
+          onChanged();
+          return this;
+        }
+        void addData(com.google.protobuf.ByteString value) {
+          ensureDataIsMutable();
+          data_.add(value);
+          onChanged();
+        }
+        
+        // optional int32 length = 3;
+        private int length_ ;
+        public boolean hasLength() {
+          return ((bitField0_ & 0x00000004) == 0x00000004);
+        }
+        public int getLength() {
+          return length_;
+        }
+        public Builder setLength(int value) {
+          bitField0_ |= 0x00000004;
+          length_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearLength() {
+          bitField0_ = (bitField0_ & ~0x00000004);
+          length_ = 0;
+          onChanged();
+          return this;
+        }
+        
+        // @@protoc_insertion_point(builder_scope:HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.StringArrayVariable)
+      }
+      
+      static {
+        defaultInstance = new StringArrayVariable(true);
+        defaultInstance.initFields();
+      }
+      
+      // @@protoc_insertion_point(class_scope:HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.StringArrayVariable)
+    }
+    
+    public interface RawVariableOrBuilder
+        extends com.google.protobuf.MessageOrBuilder {
+      
+      // required string name = 1;
+      boolean hasName();
+      String getName();
+      
+      // optional bytes data = 2;
+      boolean hasData();
+      com.google.protobuf.ByteString getData();
+    }
+    public static final class RawVariable extends
+        com.google.protobuf.GeneratedMessage
+        implements RawVariableOrBuilder {
+      // Use RawVariable.newBuilder() to construct.
+      private RawVariable(Builder builder) {
+        super(builder);
+      }
+      private RawVariable(boolean noInit) {}
+      
+      private static final RawVariable defaultInstance;
+      public static RawVariable getDefaultInstance() {
+        return defaultInstance;
+      }
+      
+      public RawVariable getDefaultInstanceForType() {
+        return defaultInstance;
+      }
+      
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_RawVariable_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_RawVariable_fieldAccessorTable;
+      }
+      
+      private int bitField0_;
+      // required string name = 1;
+      public static final int NAME_FIELD_NUMBER = 1;
+      private java.lang.Object name_;
+      public boolean hasName() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      public String getName() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          return (String) ref;
+        } else {
+          com.google.protobuf.ByteString bs = 
+              (com.google.protobuf.ByteString) ref;
+          String s = bs.toStringUtf8();
+          if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+            name_ = s;
+          }
+          return s;
+        }
+      }
+      private com.google.protobuf.ByteString getNameBytes() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+          name_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      
+      // optional bytes data = 2;
+      public static final int DATA_FIELD_NUMBER = 2;
+      private com.google.protobuf.ByteString data_;
+      public boolean hasData() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      public com.google.protobuf.ByteString getData() {
+        return data_;
+      }
+      
+      private void initFields() {
+        name_ = "";
+        data_ = com.google.protobuf.ByteString.EMPTY;
+      }
+      private byte memoizedIsInitialized = -1;
+      public final boolean isInitialized() {
+        byte isInitialized = memoizedIsInitialized;
+        if (isInitialized != -1) return isInitialized == 1;
+        
+        if (!hasName()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+        memoizedIsInitialized = 1;
+        return true;
+      }
+      
+      public void writeTo(com.google.protobuf.CodedOutputStream output)
+                          throws java.io.IOException {
+        getSerializedSize();
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          output.writeBytes(1, getNameBytes());
+        }
+        if (((bitField0_ & 0x00000002) == 0x00000002)) {
+          output.writeBytes(2, data_);
+        }
+        getUnknownFields().writeTo(output);
+      }
+      
+      private int memoizedSerializedSize = -1;
+      public int getSerializedSize() {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+      
+        size = 0;
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeBytesSize(1, getNameBytes());
+        }
+        if (((bitField0_ & 0x00000002) == 0x00000002)) {
+          size += com.google.protobuf.CodedOutputStream
+            .computeBytesSize(2, data_);
+        }
+        size += getUnknownFields().getSerializedSize();
+        memoizedSerializedSize = size;
+        return size;
+      }
+      
+      private static final long serialVersionUID = 0L;
+      @java.lang.Override
+      protected java.lang.Object writeReplace()
+          throws java.io.ObjectStreamException {
+        return super.writeReplace();
+      }
+      
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable parseFrom(
+          com.google.protobuf.ByteString data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable parseFrom(
+          com.google.protobuf.ByteString data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable parseFrom(byte[] data)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable parseFrom(
+          byte[] data,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return newBuilder().mergeFrom(data, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable parseFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable parseFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable parseDelimitedFrom(java.io.InputStream input)
+          throws java.io.IOException {
+        Builder builder = newBuilder();
+        if (builder.mergeDelimitedFrom(input)) {
+          return builder.buildParsed();
+        } else {
+          return null;
+        }
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable parseDelimitedFrom(
+          java.io.InputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        Builder builder = newBuilder();
+        if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+          return builder.buildParsed();
+        } else {
+          return null;
+        }
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable parseFrom(
+          com.google.protobuf.CodedInputStream input)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input).buildParsed();
+      }
+      public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable parseFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        return newBuilder().mergeFrom(input, extensionRegistry)
+                 .buildParsed();
+      }
+      
+      public static Builder newBuilder() { return Builder.create(); }
+      public Builder newBuilderForType() { return newBuilder(); }
+      public static Builder newBuilder(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable prototype) {
+        return newBuilder().mergeFrom(prototype);
+      }
+      public Builder toBuilder() { return newBuilder(this); }
+      
+      @java.lang.Override
+      protected Builder newBuilderForType(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        Builder builder = new Builder(parent);
+        return builder;
+      }
+      public static final class Builder extends
+          com.google.protobuf.GeneratedMessage.Builder<Builder>
+         implements com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariableOrBuilder {
+        public static final com.google.protobuf.Descriptors.Descriptor
+            getDescriptor() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_RawVariable_descriptor;
+        }
+        
+        protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+            internalGetFieldAccessorTable() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_RawVariable_fieldAccessorTable;
+        }
+        
+        // Construct using com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable.newBuilder()
+        private Builder() {
+          maybeForceBuilderInitialization();
+        }
+        
+        private Builder(BuilderParent parent) {
+          super(parent);
+          maybeForceBuilderInitialization();
+        }
+        private void maybeForceBuilderInitialization() {
+          if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          }
+        }
+        private static Builder create() {
+          return new Builder();
+        }
+        
+        public Builder clear() {
+          super.clear();
+          name_ = "";
+          bitField0_ = (bitField0_ & ~0x00000001);
+          data_ = com.google.protobuf.ByteString.EMPTY;
+          bitField0_ = (bitField0_ & ~0x00000002);
+          return this;
+        }
+        
+        public Builder clone() {
+          return create().mergeFrom(buildPartial());
+        }
+        
+        public com.google.protobuf.Descriptors.Descriptor
+            getDescriptorForType() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable.getDescriptor();
+        }
+        
+        public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable getDefaultInstanceForType() {
+          return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable.getDefaultInstance();
+        }
+        
+        public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable build() {
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(result);
+          }
+          return result;
+        }
+        
+        private com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable buildParsed()
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable result = buildPartial();
+          if (!result.isInitialized()) {
+            throw newUninitializedMessageException(
+              result).asInvalidProtocolBufferException();
+          }
+          return result;
+        }
+        
+        public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable buildPartial() {
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable result = new com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable(this);
+          int from_bitField0_ = bitField0_;
+          int to_bitField0_ = 0;
+          if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+            to_bitField0_ |= 0x00000001;
+          }
+          result.name_ = name_;
+          if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+            to_bitField0_ |= 0x00000002;
+          }
+          result.data_ = data_;
+          result.bitField0_ = to_bitField0_;
+          onBuilt();
+          return result;
+        }
+        
+        public Builder mergeFrom(com.google.protobuf.Message other) {
+          if (other instanceof com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable) {
+            return mergeFrom((com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable)other);
+          } else {
+            super.mergeFrom(other);
+            return this;
+          }
+        }
+        
+        public Builder mergeFrom(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable other) {
+          if (other == com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable.getDefaultInstance()) return this;
+          if (other.hasName()) {
+            setName(other.getName());
+          }
+          if (other.hasData()) {
+            setData(other.getData());
+          }
+          this.mergeUnknownFields(other.getUnknownFields());
+          return this;
+        }
+        
+        public final boolean isInitialized() {
+          if (!hasName()) {
+            
+            return false;
+          }
+          return true;
+        }
+        
+        public Builder mergeFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+            com.google.protobuf.UnknownFieldSet.newBuilder(
+              this.getUnknownFields());
+          while (true) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              default: {
+                if (!parseUnknownField(input, unknownFields,
+                                       extensionRegistry, tag)) {
+                  this.setUnknownFields(unknownFields.build());
+                  onChanged();
+                  return this;
+                }
+                break;
+              }
+              case 10: {
+                bitField0_ |= 0x00000001;
+                name_ = input.readBytes();
+                break;
+              }
+              case 18: {
+                bitField0_ |= 0x00000002;
+                data_ = input.readBytes();
+                break;
+              }
+            }
+          }
+        }
+        
+        private int bitField0_;
+        
+        // required string name = 1;
+        private java.lang.Object name_ = "";
+        public boolean hasName() {
+          return ((bitField0_ & 0x00000001) == 0x00000001);
+        }
+        public String getName() {
+          java.lang.Object ref = name_;
+          if (!(ref instanceof String)) {
+            String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+            name_ = s;
+            return s;
+          } else {
+            return (String) ref;
+          }
+        }
+        public Builder setName(String value) {
+          if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+          name_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearName() {
+          bitField0_ = (bitField0_ & ~0x00000001);
+          name_ = getDefaultInstance().getName();
+          onChanged();
+          return this;
+        }
+        void setName(com.google.protobuf.ByteString value) {
+          bitField0_ |= 0x00000001;
+          name_ = value;
+          onChanged();
+        }
+        
+        // optional bytes data = 2;
+        private com.google.protobuf.ByteString data_ = com.google.protobuf.ByteString.EMPTY;
+        public boolean hasData() {
+          return ((bitField0_ & 0x00000002) == 0x00000002);
+        }
+        public com.google.protobuf.ByteString getData() {
+          return data_;
+        }
+        public Builder setData(com.google.protobuf.ByteString value) {
+          if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000002;
+          data_ = value;
+          onChanged();
+          return this;
+        }
+        public Builder clearData() {
+          bitField0_ = (bitField0_ & ~0x00000002);
+          data_ = getDefaultInstance().getData();
+          onChanged();
+          return this;
+        }
+        
+        // @@protoc_insertion_point(builder_scope:HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.RawVariable)
+      }
+      
+      static {
+        defaultInstance = new RawVariable(true);
+        defaultInstance.initFields();
+      }
+      
+      // @@protoc_insertion_point(class_scope:HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.RawVariable)
+    }
+    
+    private int bitField0_;
+    // required int32 solutionId = 1;
+    public static final int SOLUTIONID_FIELD_NUMBER = 1;
+    private int solutionId_;
+    public boolean hasSolutionId() {
+      return ((bitField0_ & 0x00000001) == 0x00000001);
+    }
+    public int getSolutionId() {
+      return solutionId_;
+    }
+    
+    // repeated .HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.IntegerVariable integerVars = 2;
+    public static final int INTEGERVARS_FIELD_NUMBER = 2;
+    private java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable> integerVars_;
+    public java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable> getIntegerVarsList() {
+      return integerVars_;
+    }
+    public java.util.List<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariableOrBuilder> 
+        getIntegerVarsOrBuilderList() {
+      return integerVars_;
+    }
+    public int getIntegerVarsCount() {
+      return integerVars_.size();
+    }
+    public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable getIntegerVars(int index) {
+      return integerVars_.get(index);
+    }
+    public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariableOrBuilder getIntegerVarsOrBuilder(
+        int index) {
+      return integerVars_.get(index);
+    }
+    
+    // repeated .HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.IntegerArrayVariable integerArrayVars = 3;
+    public static final int INTEGERARRAYVARS_FIELD_NUMBER = 3;
+    private java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable> integerArrayVars_;
+    public java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable> getIntegerArrayVarsList() {
+      return integerArrayVars_;
+    }
+    public java.util.List<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariableOrBuilder> 
+        getIntegerArrayVarsOrBuilderList() {
+      return integerArrayVars_;
+    }
+    public int getIntegerArrayVarsCount() {
+      return integerArrayVars_.size();
+    }
+    public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable getIntegerArrayVars(int index) {
+      return integerArrayVars_.get(index);
+    }
+    public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariableOrBuilder getIntegerArrayVarsOrBuilder(
+        int index) {
+      return integerArrayVars_.get(index);
+    }
+    
+    // repeated .HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.DoubleVariable doubleVars = 4;
+    public static final int DOUBLEVARS_FIELD_NUMBER = 4;
+    private java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable> doubleVars_;
+    public java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable> getDoubleVarsList() {
+      return doubleVars_;
+    }
+    public java.util.List<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariableOrBuilder> 
+        getDoubleVarsOrBuilderList() {
+      return doubleVars_;
+    }
+    public int getDoubleVarsCount() {
+      return doubleVars_.size();
+    }
+    public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable getDoubleVars(int index) {
+      return doubleVars_.get(index);
+    }
+    public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariableOrBuilder getDoubleVarsOrBuilder(
+        int index) {
+      return doubleVars_.get(index);
+    }
+    
+    // repeated .HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.DoubleArrayVariable doubleArrayVars = 5;
+    public static final int DOUBLEARRAYVARS_FIELD_NUMBER = 5;
+    private java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable> doubleArrayVars_;
+    public java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable> getDoubleArrayVarsList() {
+      return doubleArrayVars_;
+    }
+    public java.util.List<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariableOrBuilder> 
+        getDoubleArrayVarsOrBuilderList() {
+      return doubleArrayVars_;
+    }
+    public int getDoubleArrayVarsCount() {
+      return doubleArrayVars_.size();
+    }
+    public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable getDoubleArrayVars(int index) {
+      return doubleArrayVars_.get(index);
+    }
+    public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariableOrBuilder getDoubleArrayVarsOrBuilder(
+        int index) {
+      return doubleArrayVars_.get(index);
+    }
+    
+    // repeated .HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.BoolVariable boolVars = 6;
+    public static final int BOOLVARS_FIELD_NUMBER = 6;
+    private java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable> boolVars_;
+    public java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable> getBoolVarsList() {
+      return boolVars_;
+    }
+    public java.util.List<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariableOrBuilder> 
+        getBoolVarsOrBuilderList() {
+      return boolVars_;
+    }
+    public int getBoolVarsCount() {
+      return boolVars_.size();
+    }
+    public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable getBoolVars(int index) {
+      return boolVars_.get(index);
+    }
+    public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariableOrBuilder getBoolVarsOrBuilder(
+        int index) {
+      return boolVars_.get(index);
+    }
+    
+    // repeated .HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.BoolArrayVariable boolArrayVars = 7;
+    public static final int BOOLARRAYVARS_FIELD_NUMBER = 7;
+    private java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable> boolArrayVars_;
+    public java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable> getBoolArrayVarsList() {
+      return boolArrayVars_;
+    }
+    public java.util.List<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariableOrBuilder> 
+        getBoolArrayVarsOrBuilderList() {
+      return boolArrayVars_;
+    }
+    public int getBoolArrayVarsCount() {
+      return boolArrayVars_.size();
+    }
+    public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable getBoolArrayVars(int index) {
+      return boolArrayVars_.get(index);
+    }
+    public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariableOrBuilder getBoolArrayVarsOrBuilder(
+        int index) {
+      return boolArrayVars_.get(index);
+    }
+    
+    // repeated .HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.StringVariable stringVars = 8;
+    public static final int STRINGVARS_FIELD_NUMBER = 8;
+    private java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable> stringVars_;
+    public java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable> getStringVarsList() {
+      return stringVars_;
+    }
+    public java.util.List<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariableOrBuilder> 
+        getStringVarsOrBuilderList() {
+      return stringVars_;
+    }
+    public int getStringVarsCount() {
+      return stringVars_.size();
+    }
+    public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable getStringVars(int index) {
+      return stringVars_.get(index);
+    }
+    public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariableOrBuilder getStringVarsOrBuilder(
+        int index) {
+      return stringVars_.get(index);
+    }
+    
+    // repeated .HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.StringArrayVariable stringArrayVars = 9;
+    public static final int STRINGARRAYVARS_FIELD_NUMBER = 9;
+    private java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable> stringArrayVars_;
+    public java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable> getStringArrayVarsList() {
+      return stringArrayVars_;
+    }
+    public java.util.List<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariableOrBuilder> 
+        getStringArrayVarsOrBuilderList() {
+      return stringArrayVars_;
+    }
+    public int getStringArrayVarsCount() {
+      return stringArrayVars_.size();
+    }
+    public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable getStringArrayVars(int index) {
+      return stringArrayVars_.get(index);
+    }
+    public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariableOrBuilder getStringArrayVarsOrBuilder(
+        int index) {
+      return stringArrayVars_.get(index);
+    }
+    
+    // repeated .HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.RawVariable rawVars = 10;
+    public static final int RAWVARS_FIELD_NUMBER = 10;
+    private java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable> rawVars_;
+    public java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable> getRawVarsList() {
+      return rawVars_;
+    }
+    public java.util.List<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariableOrBuilder> 
+        getRawVarsOrBuilderList() {
+      return rawVars_;
+    }
+    public int getRawVarsCount() {
+      return rawVars_.size();
+    }
+    public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable getRawVars(int index) {
+      return rawVars_.get(index);
+    }
+    public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariableOrBuilder getRawVarsOrBuilder(
+        int index) {
+      return rawVars_.get(index);
+    }
+    
+    private void initFields() {
+      solutionId_ = 0;
+      integerVars_ = java.util.Collections.emptyList();
+      integerArrayVars_ = java.util.Collections.emptyList();
+      doubleVars_ = java.util.Collections.emptyList();
+      doubleArrayVars_ = java.util.Collections.emptyList();
+      boolVars_ = java.util.Collections.emptyList();
+      boolArrayVars_ = java.util.Collections.emptyList();
+      stringVars_ = java.util.Collections.emptyList();
+      stringArrayVars_ = java.util.Collections.emptyList();
+      rawVars_ = java.util.Collections.emptyList();
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+      
+      if (!hasSolutionId()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      for (int i = 0; i < getIntegerVarsCount(); i++) {
+        if (!getIntegerVars(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      for (int i = 0; i < getIntegerArrayVarsCount(); i++) {
+        if (!getIntegerArrayVars(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      for (int i = 0; i < getDoubleVarsCount(); i++) {
+        if (!getDoubleVars(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      for (int i = 0; i < getDoubleArrayVarsCount(); i++) {
+        if (!getDoubleArrayVars(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      for (int i = 0; i < getBoolVarsCount(); i++) {
+        if (!getBoolVars(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      for (int i = 0; i < getBoolArrayVarsCount(); i++) {
+        if (!getBoolArrayVars(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      for (int i = 0; i < getStringVarsCount(); i++) {
+        if (!getStringVars(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      for (int i = 0; i < getStringArrayVarsCount(); i++) {
+        if (!getStringArrayVars(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      for (int i = 0; i < getRawVarsCount(); i++) {
+        if (!getRawVars(i).isInitialized()) {
+          memoizedIsInitialized = 0;
+          return false;
+        }
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+    
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        output.writeInt32(1, solutionId_);
+      }
+      for (int i = 0; i < integerVars_.size(); i++) {
+        output.writeMessage(2, integerVars_.get(i));
+      }
+      for (int i = 0; i < integerArrayVars_.size(); i++) {
+        output.writeMessage(3, integerArrayVars_.get(i));
+      }
+      for (int i = 0; i < doubleVars_.size(); i++) {
+        output.writeMessage(4, doubleVars_.get(i));
+      }
+      for (int i = 0; i < doubleArrayVars_.size(); i++) {
+        output.writeMessage(5, doubleArrayVars_.get(i));
+      }
+      for (int i = 0; i < boolVars_.size(); i++) {
+        output.writeMessage(6, boolVars_.get(i));
+      }
+      for (int i = 0; i < boolArrayVars_.size(); i++) {
+        output.writeMessage(7, boolArrayVars_.get(i));
+      }
+      for (int i = 0; i < stringVars_.size(); i++) {
+        output.writeMessage(8, stringVars_.get(i));
+      }
+      for (int i = 0; i < stringArrayVars_.size(); i++) {
+        output.writeMessage(9, stringArrayVars_.get(i));
+      }
+      for (int i = 0; i < rawVars_.size(); i++) {
+        output.writeMessage(10, rawVars_.get(i));
+      }
+      getUnknownFields().writeTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+    
+      size = 0;
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeInt32Size(1, solutionId_);
+      }
+      for (int i = 0; i < integerVars_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(2, integerVars_.get(i));
+      }
+      for (int i = 0; i < integerArrayVars_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(3, integerArrayVars_.get(i));
+      }
+      for (int i = 0; i < doubleVars_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(4, doubleVars_.get(i));
+      }
+      for (int i = 0; i < doubleArrayVars_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(5, doubleArrayVars_.get(i));
+      }
+      for (int i = 0; i < boolVars_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(6, boolVars_.get(i));
+      }
+      for (int i = 0; i < boolArrayVars_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(7, boolArrayVars_.get(i));
+      }
+      for (int i = 0; i < stringVars_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(8, stringVars_.get(i));
+      }
+      for (int i = 0; i < stringArrayVars_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(9, stringArrayVars_.get(i));
+      }
+      for (int i = 0; i < rawVars_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(10, rawVars_.get(i));
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+    
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+    
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+    
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessageOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_fieldAccessorTable;
+      }
+      
+      // Construct using com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+      
+      private Builder(BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          getIntegerVarsFieldBuilder();
+          getIntegerArrayVarsFieldBuilder();
+          getDoubleVarsFieldBuilder();
+          getDoubleArrayVarsFieldBuilder();
+          getBoolVarsFieldBuilder();
+          getBoolArrayVarsFieldBuilder();
+          getStringVarsFieldBuilder();
+          getStringArrayVarsFieldBuilder();
+          getRawVarsFieldBuilder();
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+      
+      public Builder clear() {
+        super.clear();
+        solutionId_ = 0;
+        bitField0_ = (bitField0_ & ~0x00000001);
+        if (integerVarsBuilder_ == null) {
+          integerVars_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000002);
+        } else {
+          integerVarsBuilder_.clear();
+        }
+        if (integerArrayVarsBuilder_ == null) {
+          integerArrayVars_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000004);
+        } else {
+          integerArrayVarsBuilder_.clear();
+        }
+        if (doubleVarsBuilder_ == null) {
+          doubleVars_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000008);
+        } else {
+          doubleVarsBuilder_.clear();
+        }
+        if (doubleArrayVarsBuilder_ == null) {
+          doubleArrayVars_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000010);
+        } else {
+          doubleArrayVarsBuilder_.clear();
+        }
+        if (boolVarsBuilder_ == null) {
+          boolVars_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000020);
+        } else {
+          boolVarsBuilder_.clear();
+        }
+        if (boolArrayVarsBuilder_ == null) {
+          boolArrayVars_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000040);
+        } else {
+          boolArrayVarsBuilder_.clear();
+        }
+        if (stringVarsBuilder_ == null) {
+          stringVars_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000080);
+        } else {
+          stringVarsBuilder_.clear();
+        }
+        if (stringArrayVarsBuilder_ == null) {
+          stringArrayVars_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000100);
+        } else {
+          stringArrayVarsBuilder_.clear();
+        }
+        if (rawVarsBuilder_ == null) {
+          rawVars_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000200);
+        } else {
+          rawVarsBuilder_.clear();
+        }
+        return this;
+      }
+      
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+      
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.getDescriptor();
+      }
+      
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage getDefaultInstanceForType() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.getDefaultInstance();
+      }
+      
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage build() {
+        com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+      
+      private com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage buildParsed()
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(
+            result).asInvalidProtocolBufferException();
+        }
+        return result;
+      }
+      
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage buildPartial() {
+        com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage result = new com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+          to_bitField0_ |= 0x00000001;
+        }
+        result.solutionId_ = solutionId_;
+        if (integerVarsBuilder_ == null) {
+          if (((bitField0_ & 0x00000002) == 0x00000002)) {
+            integerVars_ = java.util.Collections.unmodifiableList(integerVars_);
+            bitField0_ = (bitField0_ & ~0x00000002);
+          }
+          result.integerVars_ = integerVars_;
+        } else {
+          result.integerVars_ = integerVarsBuilder_.build();
+        }
+        if (integerArrayVarsBuilder_ == null) {
+          if (((bitField0_ & 0x00000004) == 0x00000004)) {
+            integerArrayVars_ = java.util.Collections.unmodifiableList(integerArrayVars_);
+            bitField0_ = (bitField0_ & ~0x00000004);
+          }
+          result.integerArrayVars_ = integerArrayVars_;
+        } else {
+          result.integerArrayVars_ = integerArrayVarsBuilder_.build();
+        }
+        if (doubleVarsBuilder_ == null) {
+          if (((bitField0_ & 0x00000008) == 0x00000008)) {
+            doubleVars_ = java.util.Collections.unmodifiableList(doubleVars_);
+            bitField0_ = (bitField0_ & ~0x00000008);
+          }
+          result.doubleVars_ = doubleVars_;
+        } else {
+          result.doubleVars_ = doubleVarsBuilder_.build();
+        }
+        if (doubleArrayVarsBuilder_ == null) {
+          if (((bitField0_ & 0x00000010) == 0x00000010)) {
+            doubleArrayVars_ = java.util.Collections.unmodifiableList(doubleArrayVars_);
+            bitField0_ = (bitField0_ & ~0x00000010);
+          }
+          result.doubleArrayVars_ = doubleArrayVars_;
+        } else {
+          result.doubleArrayVars_ = doubleArrayVarsBuilder_.build();
+        }
+        if (boolVarsBuilder_ == null) {
+          if (((bitField0_ & 0x00000020) == 0x00000020)) {
+            boolVars_ = java.util.Collections.unmodifiableList(boolVars_);
+            bitField0_ = (bitField0_ & ~0x00000020);
+          }
+          result.boolVars_ = boolVars_;
+        } else {
+          result.boolVars_ = boolVarsBuilder_.build();
+        }
+        if (boolArrayVarsBuilder_ == null) {
+          if (((bitField0_ & 0x00000040) == 0x00000040)) {
+            boolArrayVars_ = java.util.Collections.unmodifiableList(boolArrayVars_);
+            bitField0_ = (bitField0_ & ~0x00000040);
+          }
+          result.boolArrayVars_ = boolArrayVars_;
+        } else {
+          result.boolArrayVars_ = boolArrayVarsBuilder_.build();
+        }
+        if (stringVarsBuilder_ == null) {
+          if (((bitField0_ & 0x00000080) == 0x00000080)) {
+            stringVars_ = java.util.Collections.unmodifiableList(stringVars_);
+            bitField0_ = (bitField0_ & ~0x00000080);
+          }
+          result.stringVars_ = stringVars_;
+        } else {
+          result.stringVars_ = stringVarsBuilder_.build();
+        }
+        if (stringArrayVarsBuilder_ == null) {
+          if (((bitField0_ & 0x00000100) == 0x00000100)) {
+            stringArrayVars_ = java.util.Collections.unmodifiableList(stringArrayVars_);
+            bitField0_ = (bitField0_ & ~0x00000100);
+          }
+          result.stringArrayVars_ = stringArrayVars_;
+        } else {
+          result.stringArrayVars_ = stringArrayVarsBuilder_.build();
+        }
+        if (rawVarsBuilder_ == null) {
+          if (((bitField0_ & 0x00000200) == 0x00000200)) {
+            rawVars_ = java.util.Collections.unmodifiableList(rawVars_);
+            bitField0_ = (bitField0_ & ~0x00000200);
+          }
+          result.rawVars_ = rawVars_;
+        } else {
+          result.rawVars_ = rawVarsBuilder_.build();
+        }
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage) {
+          return mergeFrom((com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+      
+      public Builder mergeFrom(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage other) {
+        if (other == com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.getDefaultInstance()) return this;
+        if (other.hasSolutionId()) {
+          setSolutionId(other.getSolutionId());
+        }
+        if (integerVarsBuilder_ == null) {
+          if (!other.integerVars_.isEmpty()) {
+            if (integerVars_.isEmpty()) {
+              integerVars_ = other.integerVars_;
+              bitField0_ = (bitField0_ & ~0x00000002);
+            } else {
+              ensureIntegerVarsIsMutable();
+              integerVars_.addAll(other.integerVars_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.integerVars_.isEmpty()) {
+            if (integerVarsBuilder_.isEmpty()) {
+              integerVarsBuilder_.dispose();
+              integerVarsBuilder_ = null;
+              integerVars_ = other.integerVars_;
+              bitField0_ = (bitField0_ & ~0x00000002);
+              integerVarsBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getIntegerVarsFieldBuilder() : null;
+            } else {
+              integerVarsBuilder_.addAllMessages(other.integerVars_);
+            }
+          }
+        }
+        if (integerArrayVarsBuilder_ == null) {
+          if (!other.integerArrayVars_.isEmpty()) {
+            if (integerArrayVars_.isEmpty()) {
+              integerArrayVars_ = other.integerArrayVars_;
+              bitField0_ = (bitField0_ & ~0x00000004);
+            } else {
+              ensureIntegerArrayVarsIsMutable();
+              integerArrayVars_.addAll(other.integerArrayVars_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.integerArrayVars_.isEmpty()) {
+            if (integerArrayVarsBuilder_.isEmpty()) {
+              integerArrayVarsBuilder_.dispose();
+              integerArrayVarsBuilder_ = null;
+              integerArrayVars_ = other.integerArrayVars_;
+              bitField0_ = (bitField0_ & ~0x00000004);
+              integerArrayVarsBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getIntegerArrayVarsFieldBuilder() : null;
+            } else {
+              integerArrayVarsBuilder_.addAllMessages(other.integerArrayVars_);
+            }
+          }
+        }
+        if (doubleVarsBuilder_ == null) {
+          if (!other.doubleVars_.isEmpty()) {
+            if (doubleVars_.isEmpty()) {
+              doubleVars_ = other.doubleVars_;
+              bitField0_ = (bitField0_ & ~0x00000008);
+            } else {
+              ensureDoubleVarsIsMutable();
+              doubleVars_.addAll(other.doubleVars_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.doubleVars_.isEmpty()) {
+            if (doubleVarsBuilder_.isEmpty()) {
+              doubleVarsBuilder_.dispose();
+              doubleVarsBuilder_ = null;
+              doubleVars_ = other.doubleVars_;
+              bitField0_ = (bitField0_ & ~0x00000008);
+              doubleVarsBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getDoubleVarsFieldBuilder() : null;
+            } else {
+              doubleVarsBuilder_.addAllMessages(other.doubleVars_);
+            }
+          }
+        }
+        if (doubleArrayVarsBuilder_ == null) {
+          if (!other.doubleArrayVars_.isEmpty()) {
+            if (doubleArrayVars_.isEmpty()) {
+              doubleArrayVars_ = other.doubleArrayVars_;
+              bitField0_ = (bitField0_ & ~0x00000010);
+            } else {
+              ensureDoubleArrayVarsIsMutable();
+              doubleArrayVars_.addAll(other.doubleArrayVars_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.doubleArrayVars_.isEmpty()) {
+            if (doubleArrayVarsBuilder_.isEmpty()) {
+              doubleArrayVarsBuilder_.dispose();
+              doubleArrayVarsBuilder_ = null;
+              doubleArrayVars_ = other.doubleArrayVars_;
+              bitField0_ = (bitField0_ & ~0x00000010);
+              doubleArrayVarsBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getDoubleArrayVarsFieldBuilder() : null;
+            } else {
+              doubleArrayVarsBuilder_.addAllMessages(other.doubleArrayVars_);
+            }
+          }
+        }
+        if (boolVarsBuilder_ == null) {
+          if (!other.boolVars_.isEmpty()) {
+            if (boolVars_.isEmpty()) {
+              boolVars_ = other.boolVars_;
+              bitField0_ = (bitField0_ & ~0x00000020);
+            } else {
+              ensureBoolVarsIsMutable();
+              boolVars_.addAll(other.boolVars_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.boolVars_.isEmpty()) {
+            if (boolVarsBuilder_.isEmpty()) {
+              boolVarsBuilder_.dispose();
+              boolVarsBuilder_ = null;
+              boolVars_ = other.boolVars_;
+              bitField0_ = (bitField0_ & ~0x00000020);
+              boolVarsBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getBoolVarsFieldBuilder() : null;
+            } else {
+              boolVarsBuilder_.addAllMessages(other.boolVars_);
+            }
+          }
+        }
+        if (boolArrayVarsBuilder_ == null) {
+          if (!other.boolArrayVars_.isEmpty()) {
+            if (boolArrayVars_.isEmpty()) {
+              boolArrayVars_ = other.boolArrayVars_;
+              bitField0_ = (bitField0_ & ~0x00000040);
+            } else {
+              ensureBoolArrayVarsIsMutable();
+              boolArrayVars_.addAll(other.boolArrayVars_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.boolArrayVars_.isEmpty()) {
+            if (boolArrayVarsBuilder_.isEmpty()) {
+              boolArrayVarsBuilder_.dispose();
+              boolArrayVarsBuilder_ = null;
+              boolArrayVars_ = other.boolArrayVars_;
+              bitField0_ = (bitField0_ & ~0x00000040);
+              boolArrayVarsBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getBoolArrayVarsFieldBuilder() : null;
+            } else {
+              boolArrayVarsBuilder_.addAllMessages(other.boolArrayVars_);
+            }
+          }
+        }
+        if (stringVarsBuilder_ == null) {
+          if (!other.stringVars_.isEmpty()) {
+            if (stringVars_.isEmpty()) {
+              stringVars_ = other.stringVars_;
+              bitField0_ = (bitField0_ & ~0x00000080);
+            } else {
+              ensureStringVarsIsMutable();
+              stringVars_.addAll(other.stringVars_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.stringVars_.isEmpty()) {
+            if (stringVarsBuilder_.isEmpty()) {
+              stringVarsBuilder_.dispose();
+              stringVarsBuilder_ = null;
+              stringVars_ = other.stringVars_;
+              bitField0_ = (bitField0_ & ~0x00000080);
+              stringVarsBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getStringVarsFieldBuilder() : null;
+            } else {
+              stringVarsBuilder_.addAllMessages(other.stringVars_);
+            }
+          }
+        }
+        if (stringArrayVarsBuilder_ == null) {
+          if (!other.stringArrayVars_.isEmpty()) {
+            if (stringArrayVars_.isEmpty()) {
+              stringArrayVars_ = other.stringArrayVars_;
+              bitField0_ = (bitField0_ & ~0x00000100);
+            } else {
+              ensureStringArrayVarsIsMutable();
+              stringArrayVars_.addAll(other.stringArrayVars_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.stringArrayVars_.isEmpty()) {
+            if (stringArrayVarsBuilder_.isEmpty()) {
+              stringArrayVarsBuilder_.dispose();
+              stringArrayVarsBuilder_ = null;
+              stringArrayVars_ = other.stringArrayVars_;
+              bitField0_ = (bitField0_ & ~0x00000100);
+              stringArrayVarsBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getStringArrayVarsFieldBuilder() : null;
+            } else {
+              stringArrayVarsBuilder_.addAllMessages(other.stringArrayVars_);
+            }
+          }
+        }
+        if (rawVarsBuilder_ == null) {
+          if (!other.rawVars_.isEmpty()) {
+            if (rawVars_.isEmpty()) {
+              rawVars_ = other.rawVars_;
+              bitField0_ = (bitField0_ & ~0x00000200);
+            } else {
+              ensureRawVarsIsMutable();
+              rawVars_.addAll(other.rawVars_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.rawVars_.isEmpty()) {
+            if (rawVarsBuilder_.isEmpty()) {
+              rawVarsBuilder_.dispose();
+              rawVarsBuilder_ = null;
+              rawVars_ = other.rawVars_;
+              bitField0_ = (bitField0_ & ~0x00000200);
+              rawVarsBuilder_ = 
+                com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
+                   getRawVarsFieldBuilder() : null;
+            } else {
+              rawVarsBuilder_.addAllMessages(other.rawVars_);
+            }
+          }
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+      
+      public final boolean isInitialized() {
+        if (!hasSolutionId()) {
+          
+          return false;
+        }
+        for (int i = 0; i < getIntegerVarsCount(); i++) {
+          if (!getIntegerVars(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        for (int i = 0; i < getIntegerArrayVarsCount(); i++) {
+          if (!getIntegerArrayVars(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        for (int i = 0; i < getDoubleVarsCount(); i++) {
+          if (!getDoubleVars(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        for (int i = 0; i < getDoubleArrayVarsCount(); i++) {
+          if (!getDoubleArrayVars(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        for (int i = 0; i < getBoolVarsCount(); i++) {
+          if (!getBoolVars(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        for (int i = 0; i < getBoolArrayVarsCount(); i++) {
+          if (!getBoolArrayVars(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        for (int i = 0; i < getStringVarsCount(); i++) {
+          if (!getStringVars(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        for (int i = 0; i < getStringArrayVarsCount(); i++) {
+          if (!getStringArrayVars(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        for (int i = 0; i < getRawVarsCount(); i++) {
+          if (!getRawVars(i).isInitialized()) {
+            
+            return false;
+          }
+        }
+        return true;
+      }
+      
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder(
+            this.getUnknownFields());
+        while (true) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              this.setUnknownFields(unknownFields.build());
+              onChanged();
+              return this;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              }
+              break;
+            }
+            case 8: {
+              bitField0_ |= 0x00000001;
+              solutionId_ = input.readInt32();
+              break;
+            }
+            case 18: {
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable.Builder subBuilder = com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addIntegerVars(subBuilder.buildPartial());
+              break;
+            }
+            case 26: {
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable.Builder subBuilder = com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addIntegerArrayVars(subBuilder.buildPartial());
+              break;
+            }
+            case 34: {
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable.Builder subBuilder = com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addDoubleVars(subBuilder.buildPartial());
+              break;
+            }
+            case 42: {
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable.Builder subBuilder = com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addDoubleArrayVars(subBuilder.buildPartial());
+              break;
+            }
+            case 50: {
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable.Builder subBuilder = com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addBoolVars(subBuilder.buildPartial());
+              break;
+            }
+            case 58: {
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable.Builder subBuilder = com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addBoolArrayVars(subBuilder.buildPartial());
+              break;
+            }
+            case 66: {
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable.Builder subBuilder = com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addStringVars(subBuilder.buildPartial());
+              break;
+            }
+            case 74: {
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable.Builder subBuilder = com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addStringArrayVars(subBuilder.buildPartial());
+              break;
+            }
+            case 82: {
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable.Builder subBuilder = com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable.newBuilder();
+              input.readMessage(subBuilder, extensionRegistry);
+              addRawVars(subBuilder.buildPartial());
+              break;
+            }
+          }
+        }
+      }
+      
+      private int bitField0_;
+      
+      // required int32 solutionId = 1;
+      private int solutionId_ ;
+      public boolean hasSolutionId() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      public int getSolutionId() {
+        return solutionId_;
+      }
+      public Builder setSolutionId(int value) {
+        bitField0_ |= 0x00000001;
+        solutionId_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearSolutionId() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        solutionId_ = 0;
+        onChanged();
+        return this;
+      }
+      
+      // repeated .HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.IntegerVariable integerVars = 2;
+      private java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable> integerVars_ =
+        java.util.Collections.emptyList();
+      private void ensureIntegerVarsIsMutable() {
+        if (!((bitField0_ & 0x00000002) == 0x00000002)) {
+          integerVars_ = new java.util.ArrayList<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable>(integerVars_);
+          bitField0_ |= 0x00000002;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable.Builder, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariableOrBuilder> integerVarsBuilder_;
+      
+      public java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable> getIntegerVarsList() {
+        if (integerVarsBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(integerVars_);
+        } else {
+          return integerVarsBuilder_.getMessageList();
+        }
+      }
+      public int getIntegerVarsCount() {
+        if (integerVarsBuilder_ == null) {
+          return integerVars_.size();
+        } else {
+          return integerVarsBuilder_.getCount();
+        }
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable getIntegerVars(int index) {
+        if (integerVarsBuilder_ == null) {
+          return integerVars_.get(index);
+        } else {
+          return integerVarsBuilder_.getMessage(index);
+        }
+      }
+      public Builder setIntegerVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable value) {
+        if (integerVarsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureIntegerVarsIsMutable();
+          integerVars_.set(index, value);
+          onChanged();
+        } else {
+          integerVarsBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setIntegerVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable.Builder builderForValue) {
+        if (integerVarsBuilder_ == null) {
+          ensureIntegerVarsIsMutable();
+          integerVars_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          integerVarsBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addIntegerVars(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable value) {
+        if (integerVarsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureIntegerVarsIsMutable();
+          integerVars_.add(value);
+          onChanged();
+        } else {
+          integerVarsBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addIntegerVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable value) {
+        if (integerVarsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureIntegerVarsIsMutable();
+          integerVars_.add(index, value);
+          onChanged();
+        } else {
+          integerVarsBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addIntegerVars(
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable.Builder builderForValue) {
+        if (integerVarsBuilder_ == null) {
+          ensureIntegerVarsIsMutable();
+          integerVars_.add(builderForValue.build());
+          onChanged();
+        } else {
+          integerVarsBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addIntegerVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable.Builder builderForValue) {
+        if (integerVarsBuilder_ == null) {
+          ensureIntegerVarsIsMutable();
+          integerVars_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          integerVarsBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllIntegerVars(
+          java.lang.Iterable<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable> values) {
+        if (integerVarsBuilder_ == null) {
+          ensureIntegerVarsIsMutable();
+          super.addAll(values, integerVars_);
+          onChanged();
+        } else {
+          integerVarsBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearIntegerVars() {
+        if (integerVarsBuilder_ == null) {
+          integerVars_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000002);
+          onChanged();
+        } else {
+          integerVarsBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeIntegerVars(int index) {
+        if (integerVarsBuilder_ == null) {
+          ensureIntegerVarsIsMutable();
+          integerVars_.remove(index);
+          onChanged();
+        } else {
+          integerVarsBuilder_.remove(index);
+        }
+        return this;
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable.Builder getIntegerVarsBuilder(
+          int index) {
+        return getIntegerVarsFieldBuilder().getBuilder(index);
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariableOrBuilder getIntegerVarsOrBuilder(
+          int index) {
+        if (integerVarsBuilder_ == null) {
+          return integerVars_.get(index);  } else {
+          return integerVarsBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariableOrBuilder> 
+           getIntegerVarsOrBuilderList() {
+        if (integerVarsBuilder_ != null) {
+          return integerVarsBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(integerVars_);
+        }
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable.Builder addIntegerVarsBuilder() {
+        return getIntegerVarsFieldBuilder().addBuilder(
+            com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable.getDefaultInstance());
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable.Builder addIntegerVarsBuilder(
+          int index) {
+        return getIntegerVarsFieldBuilder().addBuilder(
+            index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable.getDefaultInstance());
+      }
+      public java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable.Builder> 
+           getIntegerVarsBuilderList() {
+        return getIntegerVarsFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable.Builder, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariableOrBuilder> 
+          getIntegerVarsFieldBuilder() {
+        if (integerVarsBuilder_ == null) {
+          integerVarsBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable.Builder, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariableOrBuilder>(
+                  integerVars_,
+                  ((bitField0_ & 0x00000002) == 0x00000002),
+                  getParentForChildren(),
+                  isClean());
+          integerVars_ = null;
+        }
+        return integerVarsBuilder_;
+      }
+      
+      // repeated .HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.IntegerArrayVariable integerArrayVars = 3;
+      private java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable> integerArrayVars_ =
+        java.util.Collections.emptyList();
+      private void ensureIntegerArrayVarsIsMutable() {
+        if (!((bitField0_ & 0x00000004) == 0x00000004)) {
+          integerArrayVars_ = new java.util.ArrayList<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable>(integerArrayVars_);
+          bitField0_ |= 0x00000004;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable.Builder, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariableOrBuilder> integerArrayVarsBuilder_;
+      
+      public java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable> getIntegerArrayVarsList() {
+        if (integerArrayVarsBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(integerArrayVars_);
+        } else {
+          return integerArrayVarsBuilder_.getMessageList();
+        }
+      }
+      public int getIntegerArrayVarsCount() {
+        if (integerArrayVarsBuilder_ == null) {
+          return integerArrayVars_.size();
+        } else {
+          return integerArrayVarsBuilder_.getCount();
+        }
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable getIntegerArrayVars(int index) {
+        if (integerArrayVarsBuilder_ == null) {
+          return integerArrayVars_.get(index);
+        } else {
+          return integerArrayVarsBuilder_.getMessage(index);
+        }
+      }
+      public Builder setIntegerArrayVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable value) {
+        if (integerArrayVarsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureIntegerArrayVarsIsMutable();
+          integerArrayVars_.set(index, value);
+          onChanged();
+        } else {
+          integerArrayVarsBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setIntegerArrayVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable.Builder builderForValue) {
+        if (integerArrayVarsBuilder_ == null) {
+          ensureIntegerArrayVarsIsMutable();
+          integerArrayVars_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          integerArrayVarsBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addIntegerArrayVars(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable value) {
+        if (integerArrayVarsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureIntegerArrayVarsIsMutable();
+          integerArrayVars_.add(value);
+          onChanged();
+        } else {
+          integerArrayVarsBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addIntegerArrayVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable value) {
+        if (integerArrayVarsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureIntegerArrayVarsIsMutable();
+          integerArrayVars_.add(index, value);
+          onChanged();
+        } else {
+          integerArrayVarsBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addIntegerArrayVars(
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable.Builder builderForValue) {
+        if (integerArrayVarsBuilder_ == null) {
+          ensureIntegerArrayVarsIsMutable();
+          integerArrayVars_.add(builderForValue.build());
+          onChanged();
+        } else {
+          integerArrayVarsBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addIntegerArrayVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable.Builder builderForValue) {
+        if (integerArrayVarsBuilder_ == null) {
+          ensureIntegerArrayVarsIsMutable();
+          integerArrayVars_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          integerArrayVarsBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllIntegerArrayVars(
+          java.lang.Iterable<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable> values) {
+        if (integerArrayVarsBuilder_ == null) {
+          ensureIntegerArrayVarsIsMutable();
+          super.addAll(values, integerArrayVars_);
+          onChanged();
+        } else {
+          integerArrayVarsBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearIntegerArrayVars() {
+        if (integerArrayVarsBuilder_ == null) {
+          integerArrayVars_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000004);
+          onChanged();
+        } else {
+          integerArrayVarsBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeIntegerArrayVars(int index) {
+        if (integerArrayVarsBuilder_ == null) {
+          ensureIntegerArrayVarsIsMutable();
+          integerArrayVars_.remove(index);
+          onChanged();
+        } else {
+          integerArrayVarsBuilder_.remove(index);
+        }
+        return this;
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable.Builder getIntegerArrayVarsBuilder(
+          int index) {
+        return getIntegerArrayVarsFieldBuilder().getBuilder(index);
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariableOrBuilder getIntegerArrayVarsOrBuilder(
+          int index) {
+        if (integerArrayVarsBuilder_ == null) {
+          return integerArrayVars_.get(index);  } else {
+          return integerArrayVarsBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariableOrBuilder> 
+           getIntegerArrayVarsOrBuilderList() {
+        if (integerArrayVarsBuilder_ != null) {
+          return integerArrayVarsBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(integerArrayVars_);
+        }
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable.Builder addIntegerArrayVarsBuilder() {
+        return getIntegerArrayVarsFieldBuilder().addBuilder(
+            com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable.getDefaultInstance());
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable.Builder addIntegerArrayVarsBuilder(
+          int index) {
+        return getIntegerArrayVarsFieldBuilder().addBuilder(
+            index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable.getDefaultInstance());
+      }
+      public java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable.Builder> 
+           getIntegerArrayVarsBuilderList() {
+        return getIntegerArrayVarsFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable.Builder, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariableOrBuilder> 
+          getIntegerArrayVarsFieldBuilder() {
+        if (integerArrayVarsBuilder_ == null) {
+          integerArrayVarsBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable.Builder, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariableOrBuilder>(
+                  integerArrayVars_,
+                  ((bitField0_ & 0x00000004) == 0x00000004),
+                  getParentForChildren(),
+                  isClean());
+          integerArrayVars_ = null;
+        }
+        return integerArrayVarsBuilder_;
+      }
+      
+      // repeated .HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.DoubleVariable doubleVars = 4;
+      private java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable> doubleVars_ =
+        java.util.Collections.emptyList();
+      private void ensureDoubleVarsIsMutable() {
+        if (!((bitField0_ & 0x00000008) == 0x00000008)) {
+          doubleVars_ = new java.util.ArrayList<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable>(doubleVars_);
+          bitField0_ |= 0x00000008;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable.Builder, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariableOrBuilder> doubleVarsBuilder_;
+      
+      public java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable> getDoubleVarsList() {
+        if (doubleVarsBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(doubleVars_);
+        } else {
+          return doubleVarsBuilder_.getMessageList();
+        }
+      }
+      public int getDoubleVarsCount() {
+        if (doubleVarsBuilder_ == null) {
+          return doubleVars_.size();
+        } else {
+          return doubleVarsBuilder_.getCount();
+        }
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable getDoubleVars(int index) {
+        if (doubleVarsBuilder_ == null) {
+          return doubleVars_.get(index);
+        } else {
+          return doubleVarsBuilder_.getMessage(index);
+        }
+      }
+      public Builder setDoubleVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable value) {
+        if (doubleVarsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureDoubleVarsIsMutable();
+          doubleVars_.set(index, value);
+          onChanged();
+        } else {
+          doubleVarsBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setDoubleVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable.Builder builderForValue) {
+        if (doubleVarsBuilder_ == null) {
+          ensureDoubleVarsIsMutable();
+          doubleVars_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          doubleVarsBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addDoubleVars(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable value) {
+        if (doubleVarsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureDoubleVarsIsMutable();
+          doubleVars_.add(value);
+          onChanged();
+        } else {
+          doubleVarsBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addDoubleVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable value) {
+        if (doubleVarsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureDoubleVarsIsMutable();
+          doubleVars_.add(index, value);
+          onChanged();
+        } else {
+          doubleVarsBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addDoubleVars(
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable.Builder builderForValue) {
+        if (doubleVarsBuilder_ == null) {
+          ensureDoubleVarsIsMutable();
+          doubleVars_.add(builderForValue.build());
+          onChanged();
+        } else {
+          doubleVarsBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addDoubleVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable.Builder builderForValue) {
+        if (doubleVarsBuilder_ == null) {
+          ensureDoubleVarsIsMutable();
+          doubleVars_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          doubleVarsBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllDoubleVars(
+          java.lang.Iterable<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable> values) {
+        if (doubleVarsBuilder_ == null) {
+          ensureDoubleVarsIsMutable();
+          super.addAll(values, doubleVars_);
+          onChanged();
+        } else {
+          doubleVarsBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearDoubleVars() {
+        if (doubleVarsBuilder_ == null) {
+          doubleVars_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000008);
+          onChanged();
+        } else {
+          doubleVarsBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeDoubleVars(int index) {
+        if (doubleVarsBuilder_ == null) {
+          ensureDoubleVarsIsMutable();
+          doubleVars_.remove(index);
+          onChanged();
+        } else {
+          doubleVarsBuilder_.remove(index);
+        }
+        return this;
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable.Builder getDoubleVarsBuilder(
+          int index) {
+        return getDoubleVarsFieldBuilder().getBuilder(index);
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariableOrBuilder getDoubleVarsOrBuilder(
+          int index) {
+        if (doubleVarsBuilder_ == null) {
+          return doubleVars_.get(index);  } else {
+          return doubleVarsBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariableOrBuilder> 
+           getDoubleVarsOrBuilderList() {
+        if (doubleVarsBuilder_ != null) {
+          return doubleVarsBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(doubleVars_);
+        }
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable.Builder addDoubleVarsBuilder() {
+        return getDoubleVarsFieldBuilder().addBuilder(
+            com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable.getDefaultInstance());
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable.Builder addDoubleVarsBuilder(
+          int index) {
+        return getDoubleVarsFieldBuilder().addBuilder(
+            index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable.getDefaultInstance());
+      }
+      public java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable.Builder> 
+           getDoubleVarsBuilderList() {
+        return getDoubleVarsFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable.Builder, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariableOrBuilder> 
+          getDoubleVarsFieldBuilder() {
+        if (doubleVarsBuilder_ == null) {
+          doubleVarsBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable.Builder, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariableOrBuilder>(
+                  doubleVars_,
+                  ((bitField0_ & 0x00000008) == 0x00000008),
+                  getParentForChildren(),
+                  isClean());
+          doubleVars_ = null;
+        }
+        return doubleVarsBuilder_;
+      }
+      
+      // repeated .HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.DoubleArrayVariable doubleArrayVars = 5;
+      private java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable> doubleArrayVars_ =
+        java.util.Collections.emptyList();
+      private void ensureDoubleArrayVarsIsMutable() {
+        if (!((bitField0_ & 0x00000010) == 0x00000010)) {
+          doubleArrayVars_ = new java.util.ArrayList<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable>(doubleArrayVars_);
+          bitField0_ |= 0x00000010;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable.Builder, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariableOrBuilder> doubleArrayVarsBuilder_;
+      
+      public java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable> getDoubleArrayVarsList() {
+        if (doubleArrayVarsBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(doubleArrayVars_);
+        } else {
+          return doubleArrayVarsBuilder_.getMessageList();
+        }
+      }
+      public int getDoubleArrayVarsCount() {
+        if (doubleArrayVarsBuilder_ == null) {
+          return doubleArrayVars_.size();
+        } else {
+          return doubleArrayVarsBuilder_.getCount();
+        }
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable getDoubleArrayVars(int index) {
+        if (doubleArrayVarsBuilder_ == null) {
+          return doubleArrayVars_.get(index);
+        } else {
+          return doubleArrayVarsBuilder_.getMessage(index);
+        }
+      }
+      public Builder setDoubleArrayVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable value) {
+        if (doubleArrayVarsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureDoubleArrayVarsIsMutable();
+          doubleArrayVars_.set(index, value);
+          onChanged();
+        } else {
+          doubleArrayVarsBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setDoubleArrayVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable.Builder builderForValue) {
+        if (doubleArrayVarsBuilder_ == null) {
+          ensureDoubleArrayVarsIsMutable();
+          doubleArrayVars_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          doubleArrayVarsBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addDoubleArrayVars(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable value) {
+        if (doubleArrayVarsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureDoubleArrayVarsIsMutable();
+          doubleArrayVars_.add(value);
+          onChanged();
+        } else {
+          doubleArrayVarsBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addDoubleArrayVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable value) {
+        if (doubleArrayVarsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureDoubleArrayVarsIsMutable();
+          doubleArrayVars_.add(index, value);
+          onChanged();
+        } else {
+          doubleArrayVarsBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addDoubleArrayVars(
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable.Builder builderForValue) {
+        if (doubleArrayVarsBuilder_ == null) {
+          ensureDoubleArrayVarsIsMutable();
+          doubleArrayVars_.add(builderForValue.build());
+          onChanged();
+        } else {
+          doubleArrayVarsBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addDoubleArrayVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable.Builder builderForValue) {
+        if (doubleArrayVarsBuilder_ == null) {
+          ensureDoubleArrayVarsIsMutable();
+          doubleArrayVars_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          doubleArrayVarsBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllDoubleArrayVars(
+          java.lang.Iterable<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable> values) {
+        if (doubleArrayVarsBuilder_ == null) {
+          ensureDoubleArrayVarsIsMutable();
+          super.addAll(values, doubleArrayVars_);
+          onChanged();
+        } else {
+          doubleArrayVarsBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearDoubleArrayVars() {
+        if (doubleArrayVarsBuilder_ == null) {
+          doubleArrayVars_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000010);
+          onChanged();
+        } else {
+          doubleArrayVarsBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeDoubleArrayVars(int index) {
+        if (doubleArrayVarsBuilder_ == null) {
+          ensureDoubleArrayVarsIsMutable();
+          doubleArrayVars_.remove(index);
+          onChanged();
+        } else {
+          doubleArrayVarsBuilder_.remove(index);
+        }
+        return this;
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable.Builder getDoubleArrayVarsBuilder(
+          int index) {
+        return getDoubleArrayVarsFieldBuilder().getBuilder(index);
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariableOrBuilder getDoubleArrayVarsOrBuilder(
+          int index) {
+        if (doubleArrayVarsBuilder_ == null) {
+          return doubleArrayVars_.get(index);  } else {
+          return doubleArrayVarsBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariableOrBuilder> 
+           getDoubleArrayVarsOrBuilderList() {
+        if (doubleArrayVarsBuilder_ != null) {
+          return doubleArrayVarsBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(doubleArrayVars_);
+        }
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable.Builder addDoubleArrayVarsBuilder() {
+        return getDoubleArrayVarsFieldBuilder().addBuilder(
+            com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable.getDefaultInstance());
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable.Builder addDoubleArrayVarsBuilder(
+          int index) {
+        return getDoubleArrayVarsFieldBuilder().addBuilder(
+            index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable.getDefaultInstance());
+      }
+      public java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable.Builder> 
+           getDoubleArrayVarsBuilderList() {
+        return getDoubleArrayVarsFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable.Builder, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariableOrBuilder> 
+          getDoubleArrayVarsFieldBuilder() {
+        if (doubleArrayVarsBuilder_ == null) {
+          doubleArrayVarsBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable.Builder, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariableOrBuilder>(
+                  doubleArrayVars_,
+                  ((bitField0_ & 0x00000010) == 0x00000010),
+                  getParentForChildren(),
+                  isClean());
+          doubleArrayVars_ = null;
+        }
+        return doubleArrayVarsBuilder_;
+      }
+      
+      // repeated .HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.BoolVariable boolVars = 6;
+      private java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable> boolVars_ =
+        java.util.Collections.emptyList();
+      private void ensureBoolVarsIsMutable() {
+        if (!((bitField0_ & 0x00000020) == 0x00000020)) {
+          boolVars_ = new java.util.ArrayList<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable>(boolVars_);
+          bitField0_ |= 0x00000020;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable.Builder, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariableOrBuilder> boolVarsBuilder_;
+      
+      public java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable> getBoolVarsList() {
+        if (boolVarsBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(boolVars_);
+        } else {
+          return boolVarsBuilder_.getMessageList();
+        }
+      }
+      public int getBoolVarsCount() {
+        if (boolVarsBuilder_ == null) {
+          return boolVars_.size();
+        } else {
+          return boolVarsBuilder_.getCount();
+        }
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable getBoolVars(int index) {
+        if (boolVarsBuilder_ == null) {
+          return boolVars_.get(index);
+        } else {
+          return boolVarsBuilder_.getMessage(index);
+        }
+      }
+      public Builder setBoolVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable value) {
+        if (boolVarsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureBoolVarsIsMutable();
+          boolVars_.set(index, value);
+          onChanged();
+        } else {
+          boolVarsBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setBoolVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable.Builder builderForValue) {
+        if (boolVarsBuilder_ == null) {
+          ensureBoolVarsIsMutable();
+          boolVars_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          boolVarsBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addBoolVars(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable value) {
+        if (boolVarsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureBoolVarsIsMutable();
+          boolVars_.add(value);
+          onChanged();
+        } else {
+          boolVarsBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addBoolVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable value) {
+        if (boolVarsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureBoolVarsIsMutable();
+          boolVars_.add(index, value);
+          onChanged();
+        } else {
+          boolVarsBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addBoolVars(
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable.Builder builderForValue) {
+        if (boolVarsBuilder_ == null) {
+          ensureBoolVarsIsMutable();
+          boolVars_.add(builderForValue.build());
+          onChanged();
+        } else {
+          boolVarsBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addBoolVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable.Builder builderForValue) {
+        if (boolVarsBuilder_ == null) {
+          ensureBoolVarsIsMutable();
+          boolVars_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          boolVarsBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllBoolVars(
+          java.lang.Iterable<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable> values) {
+        if (boolVarsBuilder_ == null) {
+          ensureBoolVarsIsMutable();
+          super.addAll(values, boolVars_);
+          onChanged();
+        } else {
+          boolVarsBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearBoolVars() {
+        if (boolVarsBuilder_ == null) {
+          boolVars_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000020);
+          onChanged();
+        } else {
+          boolVarsBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeBoolVars(int index) {
+        if (boolVarsBuilder_ == null) {
+          ensureBoolVarsIsMutable();
+          boolVars_.remove(index);
+          onChanged();
+        } else {
+          boolVarsBuilder_.remove(index);
+        }
+        return this;
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable.Builder getBoolVarsBuilder(
+          int index) {
+        return getBoolVarsFieldBuilder().getBuilder(index);
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariableOrBuilder getBoolVarsOrBuilder(
+          int index) {
+        if (boolVarsBuilder_ == null) {
+          return boolVars_.get(index);  } else {
+          return boolVarsBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariableOrBuilder> 
+           getBoolVarsOrBuilderList() {
+        if (boolVarsBuilder_ != null) {
+          return boolVarsBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(boolVars_);
+        }
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable.Builder addBoolVarsBuilder() {
+        return getBoolVarsFieldBuilder().addBuilder(
+            com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable.getDefaultInstance());
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable.Builder addBoolVarsBuilder(
+          int index) {
+        return getBoolVarsFieldBuilder().addBuilder(
+            index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable.getDefaultInstance());
+      }
+      public java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable.Builder> 
+           getBoolVarsBuilderList() {
+        return getBoolVarsFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable.Builder, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariableOrBuilder> 
+          getBoolVarsFieldBuilder() {
+        if (boolVarsBuilder_ == null) {
+          boolVarsBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable.Builder, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariableOrBuilder>(
+                  boolVars_,
+                  ((bitField0_ & 0x00000020) == 0x00000020),
+                  getParentForChildren(),
+                  isClean());
+          boolVars_ = null;
+        }
+        return boolVarsBuilder_;
+      }
+      
+      // repeated .HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.BoolArrayVariable boolArrayVars = 7;
+      private java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable> boolArrayVars_ =
+        java.util.Collections.emptyList();
+      private void ensureBoolArrayVarsIsMutable() {
+        if (!((bitField0_ & 0x00000040) == 0x00000040)) {
+          boolArrayVars_ = new java.util.ArrayList<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable>(boolArrayVars_);
+          bitField0_ |= 0x00000040;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable.Builder, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariableOrBuilder> boolArrayVarsBuilder_;
+      
+      public java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable> getBoolArrayVarsList() {
+        if (boolArrayVarsBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(boolArrayVars_);
+        } else {
+          return boolArrayVarsBuilder_.getMessageList();
+        }
+      }
+      public int getBoolArrayVarsCount() {
+        if (boolArrayVarsBuilder_ == null) {
+          return boolArrayVars_.size();
+        } else {
+          return boolArrayVarsBuilder_.getCount();
+        }
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable getBoolArrayVars(int index) {
+        if (boolArrayVarsBuilder_ == null) {
+          return boolArrayVars_.get(index);
+        } else {
+          return boolArrayVarsBuilder_.getMessage(index);
+        }
+      }
+      public Builder setBoolArrayVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable value) {
+        if (boolArrayVarsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureBoolArrayVarsIsMutable();
+          boolArrayVars_.set(index, value);
+          onChanged();
+        } else {
+          boolArrayVarsBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setBoolArrayVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable.Builder builderForValue) {
+        if (boolArrayVarsBuilder_ == null) {
+          ensureBoolArrayVarsIsMutable();
+          boolArrayVars_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          boolArrayVarsBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addBoolArrayVars(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable value) {
+        if (boolArrayVarsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureBoolArrayVarsIsMutable();
+          boolArrayVars_.add(value);
+          onChanged();
+        } else {
+          boolArrayVarsBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addBoolArrayVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable value) {
+        if (boolArrayVarsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureBoolArrayVarsIsMutable();
+          boolArrayVars_.add(index, value);
+          onChanged();
+        } else {
+          boolArrayVarsBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addBoolArrayVars(
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable.Builder builderForValue) {
+        if (boolArrayVarsBuilder_ == null) {
+          ensureBoolArrayVarsIsMutable();
+          boolArrayVars_.add(builderForValue.build());
+          onChanged();
+        } else {
+          boolArrayVarsBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addBoolArrayVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable.Builder builderForValue) {
+        if (boolArrayVarsBuilder_ == null) {
+          ensureBoolArrayVarsIsMutable();
+          boolArrayVars_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          boolArrayVarsBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllBoolArrayVars(
+          java.lang.Iterable<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable> values) {
+        if (boolArrayVarsBuilder_ == null) {
+          ensureBoolArrayVarsIsMutable();
+          super.addAll(values, boolArrayVars_);
+          onChanged();
+        } else {
+          boolArrayVarsBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearBoolArrayVars() {
+        if (boolArrayVarsBuilder_ == null) {
+          boolArrayVars_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000040);
+          onChanged();
+        } else {
+          boolArrayVarsBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeBoolArrayVars(int index) {
+        if (boolArrayVarsBuilder_ == null) {
+          ensureBoolArrayVarsIsMutable();
+          boolArrayVars_.remove(index);
+          onChanged();
+        } else {
+          boolArrayVarsBuilder_.remove(index);
+        }
+        return this;
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable.Builder getBoolArrayVarsBuilder(
+          int index) {
+        return getBoolArrayVarsFieldBuilder().getBuilder(index);
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariableOrBuilder getBoolArrayVarsOrBuilder(
+          int index) {
+        if (boolArrayVarsBuilder_ == null) {
+          return boolArrayVars_.get(index);  } else {
+          return boolArrayVarsBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariableOrBuilder> 
+           getBoolArrayVarsOrBuilderList() {
+        if (boolArrayVarsBuilder_ != null) {
+          return boolArrayVarsBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(boolArrayVars_);
+        }
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable.Builder addBoolArrayVarsBuilder() {
+        return getBoolArrayVarsFieldBuilder().addBuilder(
+            com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable.getDefaultInstance());
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable.Builder addBoolArrayVarsBuilder(
+          int index) {
+        return getBoolArrayVarsFieldBuilder().addBuilder(
+            index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable.getDefaultInstance());
+      }
+      public java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable.Builder> 
+           getBoolArrayVarsBuilderList() {
+        return getBoolArrayVarsFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable.Builder, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariableOrBuilder> 
+          getBoolArrayVarsFieldBuilder() {
+        if (boolArrayVarsBuilder_ == null) {
+          boolArrayVarsBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable.Builder, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariableOrBuilder>(
+                  boolArrayVars_,
+                  ((bitField0_ & 0x00000040) == 0x00000040),
+                  getParentForChildren(),
+                  isClean());
+          boolArrayVars_ = null;
+        }
+        return boolArrayVarsBuilder_;
+      }
+      
+      // repeated .HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.StringVariable stringVars = 8;
+      private java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable> stringVars_ =
+        java.util.Collections.emptyList();
+      private void ensureStringVarsIsMutable() {
+        if (!((bitField0_ & 0x00000080) == 0x00000080)) {
+          stringVars_ = new java.util.ArrayList<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable>(stringVars_);
+          bitField0_ |= 0x00000080;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable.Builder, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariableOrBuilder> stringVarsBuilder_;
+      
+      public java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable> getStringVarsList() {
+        if (stringVarsBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(stringVars_);
+        } else {
+          return stringVarsBuilder_.getMessageList();
+        }
+      }
+      public int getStringVarsCount() {
+        if (stringVarsBuilder_ == null) {
+          return stringVars_.size();
+        } else {
+          return stringVarsBuilder_.getCount();
+        }
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable getStringVars(int index) {
+        if (stringVarsBuilder_ == null) {
+          return stringVars_.get(index);
+        } else {
+          return stringVarsBuilder_.getMessage(index);
+        }
+      }
+      public Builder setStringVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable value) {
+        if (stringVarsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureStringVarsIsMutable();
+          stringVars_.set(index, value);
+          onChanged();
+        } else {
+          stringVarsBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setStringVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable.Builder builderForValue) {
+        if (stringVarsBuilder_ == null) {
+          ensureStringVarsIsMutable();
+          stringVars_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          stringVarsBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addStringVars(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable value) {
+        if (stringVarsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureStringVarsIsMutable();
+          stringVars_.add(value);
+          onChanged();
+        } else {
+          stringVarsBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addStringVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable value) {
+        if (stringVarsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureStringVarsIsMutable();
+          stringVars_.add(index, value);
+          onChanged();
+        } else {
+          stringVarsBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addStringVars(
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable.Builder builderForValue) {
+        if (stringVarsBuilder_ == null) {
+          ensureStringVarsIsMutable();
+          stringVars_.add(builderForValue.build());
+          onChanged();
+        } else {
+          stringVarsBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addStringVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable.Builder builderForValue) {
+        if (stringVarsBuilder_ == null) {
+          ensureStringVarsIsMutable();
+          stringVars_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          stringVarsBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllStringVars(
+          java.lang.Iterable<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable> values) {
+        if (stringVarsBuilder_ == null) {
+          ensureStringVarsIsMutable();
+          super.addAll(values, stringVars_);
+          onChanged();
+        } else {
+          stringVarsBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearStringVars() {
+        if (stringVarsBuilder_ == null) {
+          stringVars_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000080);
+          onChanged();
+        } else {
+          stringVarsBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeStringVars(int index) {
+        if (stringVarsBuilder_ == null) {
+          ensureStringVarsIsMutable();
+          stringVars_.remove(index);
+          onChanged();
+        } else {
+          stringVarsBuilder_.remove(index);
+        }
+        return this;
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable.Builder getStringVarsBuilder(
+          int index) {
+        return getStringVarsFieldBuilder().getBuilder(index);
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariableOrBuilder getStringVarsOrBuilder(
+          int index) {
+        if (stringVarsBuilder_ == null) {
+          return stringVars_.get(index);  } else {
+          return stringVarsBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariableOrBuilder> 
+           getStringVarsOrBuilderList() {
+        if (stringVarsBuilder_ != null) {
+          return stringVarsBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(stringVars_);
+        }
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable.Builder addStringVarsBuilder() {
+        return getStringVarsFieldBuilder().addBuilder(
+            com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable.getDefaultInstance());
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable.Builder addStringVarsBuilder(
+          int index) {
+        return getStringVarsFieldBuilder().addBuilder(
+            index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable.getDefaultInstance());
+      }
+      public java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable.Builder> 
+           getStringVarsBuilderList() {
+        return getStringVarsFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable.Builder, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariableOrBuilder> 
+          getStringVarsFieldBuilder() {
+        if (stringVarsBuilder_ == null) {
+          stringVarsBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable.Builder, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariableOrBuilder>(
+                  stringVars_,
+                  ((bitField0_ & 0x00000080) == 0x00000080),
+                  getParentForChildren(),
+                  isClean());
+          stringVars_ = null;
+        }
+        return stringVarsBuilder_;
+      }
+      
+      // repeated .HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.StringArrayVariable stringArrayVars = 9;
+      private java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable> stringArrayVars_ =
+        java.util.Collections.emptyList();
+      private void ensureStringArrayVarsIsMutable() {
+        if (!((bitField0_ & 0x00000100) == 0x00000100)) {
+          stringArrayVars_ = new java.util.ArrayList<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable>(stringArrayVars_);
+          bitField0_ |= 0x00000100;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable.Builder, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariableOrBuilder> stringArrayVarsBuilder_;
+      
+      public java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable> getStringArrayVarsList() {
+        if (stringArrayVarsBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(stringArrayVars_);
+        } else {
+          return stringArrayVarsBuilder_.getMessageList();
+        }
+      }
+      public int getStringArrayVarsCount() {
+        if (stringArrayVarsBuilder_ == null) {
+          return stringArrayVars_.size();
+        } else {
+          return stringArrayVarsBuilder_.getCount();
+        }
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable getStringArrayVars(int index) {
+        if (stringArrayVarsBuilder_ == null) {
+          return stringArrayVars_.get(index);
+        } else {
+          return stringArrayVarsBuilder_.getMessage(index);
+        }
+      }
+      public Builder setStringArrayVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable value) {
+        if (stringArrayVarsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureStringArrayVarsIsMutable();
+          stringArrayVars_.set(index, value);
+          onChanged();
+        } else {
+          stringArrayVarsBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setStringArrayVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable.Builder builderForValue) {
+        if (stringArrayVarsBuilder_ == null) {
+          ensureStringArrayVarsIsMutable();
+          stringArrayVars_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          stringArrayVarsBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addStringArrayVars(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable value) {
+        if (stringArrayVarsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureStringArrayVarsIsMutable();
+          stringArrayVars_.add(value);
+          onChanged();
+        } else {
+          stringArrayVarsBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addStringArrayVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable value) {
+        if (stringArrayVarsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureStringArrayVarsIsMutable();
+          stringArrayVars_.add(index, value);
+          onChanged();
+        } else {
+          stringArrayVarsBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addStringArrayVars(
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable.Builder builderForValue) {
+        if (stringArrayVarsBuilder_ == null) {
+          ensureStringArrayVarsIsMutable();
+          stringArrayVars_.add(builderForValue.build());
+          onChanged();
+        } else {
+          stringArrayVarsBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addStringArrayVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable.Builder builderForValue) {
+        if (stringArrayVarsBuilder_ == null) {
+          ensureStringArrayVarsIsMutable();
+          stringArrayVars_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          stringArrayVarsBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllStringArrayVars(
+          java.lang.Iterable<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable> values) {
+        if (stringArrayVarsBuilder_ == null) {
+          ensureStringArrayVarsIsMutable();
+          super.addAll(values, stringArrayVars_);
+          onChanged();
+        } else {
+          stringArrayVarsBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearStringArrayVars() {
+        if (stringArrayVarsBuilder_ == null) {
+          stringArrayVars_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000100);
+          onChanged();
+        } else {
+          stringArrayVarsBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeStringArrayVars(int index) {
+        if (stringArrayVarsBuilder_ == null) {
+          ensureStringArrayVarsIsMutable();
+          stringArrayVars_.remove(index);
+          onChanged();
+        } else {
+          stringArrayVarsBuilder_.remove(index);
+        }
+        return this;
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable.Builder getStringArrayVarsBuilder(
+          int index) {
+        return getStringArrayVarsFieldBuilder().getBuilder(index);
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariableOrBuilder getStringArrayVarsOrBuilder(
+          int index) {
+        if (stringArrayVarsBuilder_ == null) {
+          return stringArrayVars_.get(index);  } else {
+          return stringArrayVarsBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariableOrBuilder> 
+           getStringArrayVarsOrBuilderList() {
+        if (stringArrayVarsBuilder_ != null) {
+          return stringArrayVarsBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(stringArrayVars_);
+        }
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable.Builder addStringArrayVarsBuilder() {
+        return getStringArrayVarsFieldBuilder().addBuilder(
+            com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable.getDefaultInstance());
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable.Builder addStringArrayVarsBuilder(
+          int index) {
+        return getStringArrayVarsFieldBuilder().addBuilder(
+            index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable.getDefaultInstance());
+      }
+      public java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable.Builder> 
+           getStringArrayVarsBuilderList() {
+        return getStringArrayVarsFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable.Builder, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariableOrBuilder> 
+          getStringArrayVarsFieldBuilder() {
+        if (stringArrayVarsBuilder_ == null) {
+          stringArrayVarsBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable.Builder, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariableOrBuilder>(
+                  stringArrayVars_,
+                  ((bitField0_ & 0x00000100) == 0x00000100),
+                  getParentForChildren(),
+                  isClean());
+          stringArrayVars_ = null;
+        }
+        return stringArrayVarsBuilder_;
+      }
+      
+      // repeated .HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.RawVariable rawVars = 10;
+      private java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable> rawVars_ =
+        java.util.Collections.emptyList();
+      private void ensureRawVarsIsMutable() {
+        if (!((bitField0_ & 0x00000200) == 0x00000200)) {
+          rawVars_ = new java.util.ArrayList<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable>(rawVars_);
+          bitField0_ |= 0x00000200;
+         }
+      }
+      
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable.Builder, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariableOrBuilder> rawVarsBuilder_;
+      
+      public java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable> getRawVarsList() {
+        if (rawVarsBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(rawVars_);
+        } else {
+          return rawVarsBuilder_.getMessageList();
+        }
+      }
+      public int getRawVarsCount() {
+        if (rawVarsBuilder_ == null) {
+          return rawVars_.size();
+        } else {
+          return rawVarsBuilder_.getCount();
+        }
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable getRawVars(int index) {
+        if (rawVarsBuilder_ == null) {
+          return rawVars_.get(index);
+        } else {
+          return rawVarsBuilder_.getMessage(index);
+        }
+      }
+      public Builder setRawVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable value) {
+        if (rawVarsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureRawVarsIsMutable();
+          rawVars_.set(index, value);
+          onChanged();
+        } else {
+          rawVarsBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      public Builder setRawVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable.Builder builderForValue) {
+        if (rawVarsBuilder_ == null) {
+          ensureRawVarsIsMutable();
+          rawVars_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          rawVarsBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addRawVars(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable value) {
+        if (rawVarsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureRawVarsIsMutable();
+          rawVars_.add(value);
+          onChanged();
+        } else {
+          rawVarsBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      public Builder addRawVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable value) {
+        if (rawVarsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureRawVarsIsMutable();
+          rawVars_.add(index, value);
+          onChanged();
+        } else {
+          rawVarsBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      public Builder addRawVars(
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable.Builder builderForValue) {
+        if (rawVarsBuilder_ == null) {
+          ensureRawVarsIsMutable();
+          rawVars_.add(builderForValue.build());
+          onChanged();
+        } else {
+          rawVarsBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addRawVars(
+          int index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable.Builder builderForValue) {
+        if (rawVarsBuilder_ == null) {
+          ensureRawVarsIsMutable();
+          rawVars_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          rawVarsBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      public Builder addAllRawVars(
+          java.lang.Iterable<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable> values) {
+        if (rawVarsBuilder_ == null) {
+          ensureRawVarsIsMutable();
+          super.addAll(values, rawVars_);
+          onChanged();
+        } else {
+          rawVarsBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      public Builder clearRawVars() {
+        if (rawVarsBuilder_ == null) {
+          rawVars_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000200);
+          onChanged();
+        } else {
+          rawVarsBuilder_.clear();
+        }
+        return this;
+      }
+      public Builder removeRawVars(int index) {
+        if (rawVarsBuilder_ == null) {
+          ensureRawVarsIsMutable();
+          rawVars_.remove(index);
+          onChanged();
+        } else {
+          rawVarsBuilder_.remove(index);
+        }
+        return this;
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable.Builder getRawVarsBuilder(
+          int index) {
+        return getRawVarsFieldBuilder().getBuilder(index);
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariableOrBuilder getRawVarsOrBuilder(
+          int index) {
+        if (rawVarsBuilder_ == null) {
+          return rawVars_.get(index);  } else {
+          return rawVarsBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      public java.util.List<? extends com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariableOrBuilder> 
+           getRawVarsOrBuilderList() {
+        if (rawVarsBuilder_ != null) {
+          return rawVarsBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(rawVars_);
+        }
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable.Builder addRawVarsBuilder() {
+        return getRawVarsFieldBuilder().addBuilder(
+            com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable.getDefaultInstance());
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable.Builder addRawVarsBuilder(
+          int index) {
+        return getRawVarsFieldBuilder().addBuilder(
+            index, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable.getDefaultInstance());
+      }
+      public java.util.List<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable.Builder> 
+           getRawVarsBuilderList() {
+        return getRawVarsFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilder<
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable.Builder, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariableOrBuilder> 
+          getRawVarsFieldBuilder() {
+        if (rawVarsBuilder_ == null) {
+          rawVarsBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable.Builder, com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariableOrBuilder>(
+                  rawVars_,
+                  ((bitField0_ & 0x00000200) == 0x00000200),
+                  getParentForChildren(),
+                  isClean());
+          rawVars_ = null;
+        }
+        return rawVarsBuilder_;
+      }
+      
+      // @@protoc_insertion_point(builder_scope:HeuristicLab.Problems.ExternalEvaluation.SolutionMessage)
+    }
+    
+    static {
+      defaultInstance = new SolutionMessage(true);
+      defaultInstance.initFields();
+    }
+    
+    // @@protoc_insertion_point(class_scope:HeuristicLab.Problems.ExternalEvaluation.SolutionMessage)
+  }
+  
+  public interface QualityMessageOrBuilder extends
+      com.google.protobuf.GeneratedMessage.
+          ExtendableMessageOrBuilder<QualityMessage> {
+    
+    // required int32 solutionId = 1;
+    boolean hasSolutionId();
+    int getSolutionId();
+    
+    // required .HeuristicLab.Problems.ExternalEvaluation.QualityMessage.Type type = 2;
+    boolean hasType();
+    com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage.Type getType();
+  }
+  public static final class QualityMessage extends
+      com.google.protobuf.GeneratedMessage.ExtendableMessage<
+        QualityMessage> implements QualityMessageOrBuilder {
+    // Use QualityMessage.newBuilder() to construct.
+    private QualityMessage(Builder builder) {
+      super(builder);
+    }
+    private QualityMessage(boolean noInit) {}
+    
+    private static final QualityMessage defaultInstance;
+    public static QualityMessage getDefaultInstance() {
+      return defaultInstance;
+    }
+    
+    public QualityMessage getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+    
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_QualityMessage_descriptor;
+    }
+    
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_QualityMessage_fieldAccessorTable;
+    }
+    
+    public enum Type
+        implements com.google.protobuf.ProtocolMessageEnum {
+      SingleObjectiveQualityMessage(0, 1),
+      MultiObjectiveQualityMessage(1, 2),
+      ;
+      
+      public static final int SingleObjectiveQualityMessage_VALUE = 1;
+      public static final int MultiObjectiveQualityMessage_VALUE = 2;
+      
+      
+      public final int getNumber() { return value; }
+      
+      public static Type valueOf(int value) {
+        switch (value) {
+          case 1: return SingleObjectiveQualityMessage;
+          case 2: return MultiObjectiveQualityMessage;
+          default: return null;
+        }
+      }
+      
+      public static com.google.protobuf.Internal.EnumLiteMap<Type>
+          internalGetValueMap() {
+        return internalValueMap;
+      }
+      private static com.google.protobuf.Internal.EnumLiteMap<Type>
+          internalValueMap =
+            new com.google.protobuf.Internal.EnumLiteMap<Type>() {
+              public Type findValueByNumber(int number) {
+                return Type.valueOf(number);
+              }
+            };
+      
+      public final com.google.protobuf.Descriptors.EnumValueDescriptor
+          getValueDescriptor() {
+        return getDescriptor().getValues().get(index);
+      }
+      public final com.google.protobuf.Descriptors.EnumDescriptor
+          getDescriptorForType() {
+        return getDescriptor();
+      }
+      public static final com.google.protobuf.Descriptors.EnumDescriptor
+          getDescriptor() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage.getDescriptor().getEnumTypes().get(0);
+      }
+      
+      private static final Type[] VALUES = {
+        SingleObjectiveQualityMessage, MultiObjectiveQualityMessage, 
+      };
+      
+      public static Type valueOf(
+          com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+        if (desc.getType() != getDescriptor()) {
+          throw new java.lang.IllegalArgumentException(
+            "EnumValueDescriptor is not for this type.");
+        }
+        return VALUES[desc.getIndex()];
+      }
+      
+      private final int index;
+      private final int value;
+      
+      private Type(int index, int value) {
+        this.index = index;
+        this.value = value;
+      }
+      
+      // @@protoc_insertion_point(enum_scope:HeuristicLab.Problems.ExternalEvaluation.QualityMessage.Type)
+    }
+    
+    private int bitField0_;
+    // required int32 solutionId = 1;
+    public static final int SOLUTIONID_FIELD_NUMBER = 1;
+    private int solutionId_;
+    public boolean hasSolutionId() {
+      return ((bitField0_ & 0x00000001) == 0x00000001);
+    }
+    public int getSolutionId() {
+      return solutionId_;
+    }
+    
+    // required .HeuristicLab.Problems.ExternalEvaluation.QualityMessage.Type type = 2;
+    public static final int TYPE_FIELD_NUMBER = 2;
+    private com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage.Type type_;
+    public boolean hasType() {
+      return ((bitField0_ & 0x00000002) == 0x00000002);
+    }
+    public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage.Type getType() {
+      return type_;
+    }
+    
+    private void initFields() {
+      solutionId_ = 0;
+      type_ = com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage.Type.SingleObjectiveQualityMessage;
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+      
+      if (!hasSolutionId()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      if (!hasType()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      if (!extensionsAreInitialized()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+    
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      com.google.protobuf.GeneratedMessage
+        .ExtendableMessage<com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage>.ExtensionWriter extensionWriter =
+          newExtensionWriter();
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        output.writeInt32(1, solutionId_);
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        output.writeEnum(2, type_.getNumber());
+      }
+      extensionWriter.writeUntil(536870912, output);
+      getUnknownFields().writeTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+    
+      size = 0;
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeInt32Size(1, solutionId_);
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeEnumSize(2, type_.getNumber());
+      }
+      size += extensionsSerializedSize();
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+    
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+    
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+    
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.ExtendableBuilder<
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage, Builder> implements com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessageOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_QualityMessage_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_QualityMessage_fieldAccessorTable;
+      }
+      
+      // Construct using com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+      
+      private Builder(BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+      
+      public Builder clear() {
+        super.clear();
+        solutionId_ = 0;
+        bitField0_ = (bitField0_ & ~0x00000001);
+        type_ = com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage.Type.SingleObjectiveQualityMessage;
+        bitField0_ = (bitField0_ & ~0x00000002);
+        return this;
+      }
+      
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+      
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage.getDescriptor();
+      }
+      
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage getDefaultInstanceForType() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage.getDefaultInstance();
+      }
+      
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage build() {
+        com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+      
+      private com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage buildParsed()
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(
+            result).asInvalidProtocolBufferException();
+        }
+        return result;
+      }
+      
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage buildPartial() {
+        com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage result = new com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+          to_bitField0_ |= 0x00000001;
+        }
+        result.solutionId_ = solutionId_;
+        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+          to_bitField0_ |= 0x00000002;
+        }
+        result.type_ = type_;
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage) {
+          return mergeFrom((com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+      
+      public Builder mergeFrom(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage other) {
+        if (other == com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage.getDefaultInstance()) return this;
+        if (other.hasSolutionId()) {
+          setSolutionId(other.getSolutionId());
+        }
+        if (other.hasType()) {
+          setType(other.getType());
+        }
+        this.mergeExtensionFields(other);
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+      
+      public final boolean isInitialized() {
+        if (!hasSolutionId()) {
+          
+          return false;
+        }
+        if (!hasType()) {
+          
+          return false;
+        }
+        if (!extensionsAreInitialized()) {
+          
+          return false;
+        }
+        return true;
+      }
+      
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder(
+            this.getUnknownFields());
+        while (true) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              this.setUnknownFields(unknownFields.build());
+              onChanged();
+              return this;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              }
+              break;
+            }
+            case 8: {
+              bitField0_ |= 0x00000001;
+              solutionId_ = input.readInt32();
+              break;
+            }
+            case 16: {
+              int rawValue = input.readEnum();
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage.Type value = com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage.Type.valueOf(rawValue);
+              if (value == null) {
+                unknownFields.mergeVarintField(2, rawValue);
+              } else {
+                bitField0_ |= 0x00000002;
+                type_ = value;
+              }
+              break;
+            }
+          }
+        }
+      }
+      
+      private int bitField0_;
+      
+      // required int32 solutionId = 1;
+      private int solutionId_ ;
+      public boolean hasSolutionId() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      public int getSolutionId() {
+        return solutionId_;
+      }
+      public Builder setSolutionId(int value) {
+        bitField0_ |= 0x00000001;
+        solutionId_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearSolutionId() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        solutionId_ = 0;
+        onChanged();
+        return this;
+      }
+      
+      // required .HeuristicLab.Problems.ExternalEvaluation.QualityMessage.Type type = 2;
+      private com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage.Type type_ = com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage.Type.SingleObjectiveQualityMessage;
+      public boolean hasType() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage.Type getType() {
+        return type_;
+      }
+      public Builder setType(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage.Type value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        bitField0_ |= 0x00000002;
+        type_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearType() {
+        bitField0_ = (bitField0_ & ~0x00000002);
+        type_ = com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage.Type.SingleObjectiveQualityMessage;
+        onChanged();
+        return this;
+      }
+      
+      // @@protoc_insertion_point(builder_scope:HeuristicLab.Problems.ExternalEvaluation.QualityMessage)
+    }
+    
+    static {
+      defaultInstance = new QualityMessage(true);
+      defaultInstance.initFields();
+    }
+    
+    // @@protoc_insertion_point(class_scope:HeuristicLab.Problems.ExternalEvaluation.QualityMessage)
+  }
+  
+  public interface SingleObjectiveQualityMessageOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+    
+    // required double quality = 1;
+    boolean hasQuality();
+    double getQuality();
+  }
+  public static final class SingleObjectiveQualityMessage extends
+      com.google.protobuf.GeneratedMessage
+      implements SingleObjectiveQualityMessageOrBuilder {
+    // Use SingleObjectiveQualityMessage.newBuilder() to construct.
+    private SingleObjectiveQualityMessage(Builder builder) {
+      super(builder);
+    }
+    private SingleObjectiveQualityMessage(boolean noInit) {}
+    
+    private static final SingleObjectiveQualityMessage defaultInstance;
+    public static SingleObjectiveQualityMessage getDefaultInstance() {
+      return defaultInstance;
+    }
+    
+    public SingleObjectiveQualityMessage getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+    
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SingleObjectiveQualityMessage_descriptor;
+    }
+    
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SingleObjectiveQualityMessage_fieldAccessorTable;
+    }
+    
+    private int bitField0_;
+    // required double quality = 1;
+    public static final int QUALITY_FIELD_NUMBER = 1;
+    private double quality_;
+    public boolean hasQuality() {
+      return ((bitField0_ & 0x00000001) == 0x00000001);
+    }
+    public double getQuality() {
+      return quality_;
+    }
+    
+    private void initFields() {
+      quality_ = 0D;
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+      
+      if (!hasQuality()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
+      memoizedIsInitialized = 1;
+      return true;
+    }
+    
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        output.writeDouble(1, quality_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+    
+      size = 0;
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeDoubleSize(1, quality_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+    
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+    
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+    
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessageOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SingleObjectiveQualityMessage_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_SingleObjectiveQualityMessage_fieldAccessorTable;
+      }
+      
+      // Construct using com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+      
+      private Builder(BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+      
+      public Builder clear() {
+        super.clear();
+        quality_ = 0D;
+        bitField0_ = (bitField0_ & ~0x00000001);
+        return this;
+      }
+      
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+      
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage.getDescriptor();
+      }
+      
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage getDefaultInstanceForType() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage.getDefaultInstance();
+      }
+      
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage build() {
+        com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+      
+      private com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage buildParsed()
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(
+            result).asInvalidProtocolBufferException();
+        }
+        return result;
+      }
+      
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage buildPartial() {
+        com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage result = new com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+          to_bitField0_ |= 0x00000001;
+        }
+        result.quality_ = quality_;
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage) {
+          return mergeFrom((com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+      
+      public Builder mergeFrom(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage other) {
+        if (other == com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage.getDefaultInstance()) return this;
+        if (other.hasQuality()) {
+          setQuality(other.getQuality());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+      
+      public final boolean isInitialized() {
+        if (!hasQuality()) {
+          
+          return false;
+        }
+        return true;
+      }
+      
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder(
+            this.getUnknownFields());
+        while (true) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              this.setUnknownFields(unknownFields.build());
+              onChanged();
+              return this;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              }
+              break;
+            }
+            case 9: {
+              bitField0_ |= 0x00000001;
+              quality_ = input.readDouble();
+              break;
+            }
+          }
+        }
+      }
+      
+      private int bitField0_;
+      
+      // required double quality = 1;
+      private double quality_ ;
+      public boolean hasQuality() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      public double getQuality() {
+        return quality_;
+      }
+      public Builder setQuality(double value) {
+        bitField0_ |= 0x00000001;
+        quality_ = value;
+        onChanged();
+        return this;
+      }
+      public Builder clearQuality() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        quality_ = 0D;
+        onChanged();
+        return this;
+      }
+      
+      // @@protoc_insertion_point(builder_scope:HeuristicLab.Problems.ExternalEvaluation.SingleObjectiveQualityMessage)
+    }
+    
+    static {
+      defaultInstance = new SingleObjectiveQualityMessage(true);
+      defaultInstance.initFields();
+    }
+    
+    // @@protoc_insertion_point(class_scope:HeuristicLab.Problems.ExternalEvaluation.SingleObjectiveQualityMessage)
+    public static final int QUALITYMESSAGE_FIELD_NUMBER = 1000;
+    public static final
+      com.google.protobuf.GeneratedMessage.GeneratedExtension<
+        com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage,
+        com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage> qualityMessage = com.google.protobuf.GeneratedMessage
+            .newMessageScopedGeneratedExtension(
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage.getDefaultInstance(),
+          0,
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage.class,
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage.getDefaultInstance());
+  }
+  
+  public interface MultiObjectiveQualityMessageOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+    
+    // repeated double qualities = 1;
+    java.util.List<java.lang.Double> getQualitiesList();
+    int getQualitiesCount();
+    double getQualities(int index);
+  }
+  public static final class MultiObjectiveQualityMessage extends
+      com.google.protobuf.GeneratedMessage
+      implements MultiObjectiveQualityMessageOrBuilder {
+    // Use MultiObjectiveQualityMessage.newBuilder() to construct.
+    private MultiObjectiveQualityMessage(Builder builder) {
+      super(builder);
+    }
+    private MultiObjectiveQualityMessage(boolean noInit) {}
+    
+    private static final MultiObjectiveQualityMessage defaultInstance;
+    public static MultiObjectiveQualityMessage getDefaultInstance() {
+      return defaultInstance;
+    }
+    
+    public MultiObjectiveQualityMessage getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+    
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_MultiObjectiveQualityMessage_descriptor;
+    }
+    
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_MultiObjectiveQualityMessage_fieldAccessorTable;
+    }
+    
+    // repeated double qualities = 1;
+    public static final int QUALITIES_FIELD_NUMBER = 1;
+    private java.util.List<java.lang.Double> qualities_;
+    public java.util.List<java.lang.Double>
+        getQualitiesList() {
+      return qualities_;
+    }
+    public int getQualitiesCount() {
+      return qualities_.size();
+    }
+    public double getQualities(int index) {
+      return qualities_.get(index);
+    }
+    
+    private void initFields() {
+      qualities_ = java.util.Collections.emptyList();;
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+      
+      memoizedIsInitialized = 1;
+      return true;
+    }
+    
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      for (int i = 0; i < qualities_.size(); i++) {
+        output.writeDouble(1, qualities_.get(i));
+      }
+      getUnknownFields().writeTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+    
+      size = 0;
+      {
+        int dataSize = 0;
+        dataSize = 8 * getQualitiesList().size();
+        size += dataSize;
+        size += 1 * getQualitiesList().size();
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+    
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+    
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data).buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return newBuilder().mergeFrom(data, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      Builder builder = newBuilder();
+      if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+        return builder.buildParsed();
+      } else {
+        return null;
+      }
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input).buildParsed();
+    }
+    public static com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return newBuilder().mergeFrom(input, extensionRegistry)
+               .buildParsed();
+    }
+    
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+    
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessageOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_MultiObjectiveQualityMessage_descriptor;
+      }
+      
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.internal_static_HeuristicLab_Problems_ExternalEvaluation_MultiObjectiveQualityMessage_fieldAccessorTable;
+      }
+      
+      // Construct using com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+      
+      private Builder(BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+      
+      public Builder clear() {
+        super.clear();
+        qualities_ = java.util.Collections.emptyList();;
+        bitField0_ = (bitField0_ & ~0x00000001);
+        return this;
+      }
+      
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+      
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage.getDescriptor();
+      }
+      
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage getDefaultInstanceForType() {
+        return com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage.getDefaultInstance();
+      }
+      
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage build() {
+        com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+      
+      private com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage buildParsed()
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(
+            result).asInvalidProtocolBufferException();
+        }
+        return result;
+      }
+      
+      public com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage buildPartial() {
+        com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage result = new com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage(this);
+        int from_bitField0_ = bitField0_;
+        if (((bitField0_ & 0x00000001) == 0x00000001)) {
+          qualities_ = java.util.Collections.unmodifiableList(qualities_);
+          bitField0_ = (bitField0_ & ~0x00000001);
+        }
+        result.qualities_ = qualities_;
+        onBuilt();
+        return result;
+      }
+      
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage) {
+          return mergeFrom((com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+      
+      public Builder mergeFrom(com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage other) {
+        if (other == com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage.getDefaultInstance()) return this;
+        if (!other.qualities_.isEmpty()) {
+          if (qualities_.isEmpty()) {
+            qualities_ = other.qualities_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+          } else {
+            ensureQualitiesIsMutable();
+            qualities_.addAll(other.qualities_);
+          }
+          onChanged();
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+      
+      public final boolean isInitialized() {
+        return true;
+      }
+      
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder(
+            this.getUnknownFields());
+        while (true) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              this.setUnknownFields(unknownFields.build());
+              onChanged();
+              return this;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                this.setUnknownFields(unknownFields.build());
+                onChanged();
+                return this;
+              }
+              break;
+            }
+            case 9: {
+              ensureQualitiesIsMutable();
+              qualities_.add(input.readDouble());
+              break;
+            }
+            case 10: {
+              int length = input.readRawVarint32();
+              int limit = input.pushLimit(length);
+              while (input.getBytesUntilLimit() > 0) {
+                addQualities(input.readDouble());
+              }
+              input.popLimit(limit);
+              break;
+            }
+          }
+        }
+      }
+      
+      private int bitField0_;
+      
+      // repeated double qualities = 1;
+      private java.util.List<java.lang.Double> qualities_ = java.util.Collections.emptyList();;
+      private void ensureQualitiesIsMutable() {
+        if (!((bitField0_ & 0x00000001) == 0x00000001)) {
+          qualities_ = new java.util.ArrayList<java.lang.Double>(qualities_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+      public java.util.List<java.lang.Double>
+          getQualitiesList() {
+        return java.util.Collections.unmodifiableList(qualities_);
+      }
+      public int getQualitiesCount() {
+        return qualities_.size();
+      }
+      public double getQualities(int index) {
+        return qualities_.get(index);
+      }
+      public Builder setQualities(
+          int index, double value) {
+        ensureQualitiesIsMutable();
+        qualities_.set(index, value);
+        onChanged();
+        return this;
+      }
+      public Builder addQualities(double value) {
+        ensureQualitiesIsMutable();
+        qualities_.add(value);
+        onChanged();
+        return this;
+      }
+      public Builder addAllQualities(
+          java.lang.Iterable<? extends java.lang.Double> values) {
+        ensureQualitiesIsMutable();
+        super.addAll(values, qualities_);
+        onChanged();
+        return this;
+      }
+      public Builder clearQualities() {
+        qualities_ = java.util.Collections.emptyList();;
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+        return this;
+      }
+      
+      // @@protoc_insertion_point(builder_scope:HeuristicLab.Problems.ExternalEvaluation.MultiObjectiveQualityMessage)
+    }
+    
+    static {
+      defaultInstance = new MultiObjectiveQualityMessage(true);
+      defaultInstance.initFields();
+    }
+    
+    // @@protoc_insertion_point(class_scope:HeuristicLab.Problems.ExternalEvaluation.MultiObjectiveQualityMessage)
+    public static final int QUALITYMESSAGE_FIELD_NUMBER = 1001;
+    public static final
+      com.google.protobuf.GeneratedMessage.GeneratedExtension<
+        com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage,
+        com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage> qualityMessage = com.google.protobuf.GeneratedMessage
+            .newMessageScopedGeneratedExtension(
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage.getDefaultInstance(),
+          0,
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage.class,
+          com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage.getDefaultInstance());
+  }
+  
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerVariable_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerVariable_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerArrayVariable_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerArrayVariable_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleVariable_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleVariable_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleArrayVariable_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleArrayVariable_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolVariable_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolVariable_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolArrayVariable_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolArrayVariable_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringVariable_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringVariable_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringArrayVariable_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringArrayVariable_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_RawVariable_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_RawVariable_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_HeuristicLab_Problems_ExternalEvaluation_QualityMessage_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_HeuristicLab_Problems_ExternalEvaluation_QualityMessage_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_HeuristicLab_Problems_ExternalEvaluation_SingleObjectiveQualityMessage_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_HeuristicLab_Problems_ExternalEvaluation_SingleObjectiveQualityMessage_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_HeuristicLab_Problems_ExternalEvaluation_MultiObjectiveQualityMessage_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_HeuristicLab_Problems_ExternalEvaluation_MultiObjectiveQualityMessage_fieldAccessorTable;
+  
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n ExternalEvaluationMessages.proto\022(Heur" +
+      "isticLab.Problems.ExternalEvaluation\"\376\n\n" +
+      "\017SolutionMessage\022\022\n\nsolutionId\030\001 \002(\005\022^\n\013" +
+      "integerVars\030\002 \003(\0132I.HeuristicLab.Problem" +
+      "s.ExternalEvaluation.SolutionMessage.Int" +
+      "egerVariable\022h\n\020integerArrayVars\030\003 \003(\0132N" +
+      ".HeuristicLab.Problems.ExternalEvaluatio" +
+      "n.SolutionMessage.IntegerArrayVariable\022\\" +
+      "\n\ndoubleVars\030\004 \003(\0132H.HeuristicLab.Proble" +
+      "ms.ExternalEvaluation.SolutionMessage.Do",
+      "ubleVariable\022f\n\017doubleArrayVars\030\005 \003(\0132M." +
+      "HeuristicLab.Problems.ExternalEvaluation" +
+      ".SolutionMessage.DoubleArrayVariable\022X\n\010" +
+      "boolVars\030\006 \003(\0132F.HeuristicLab.Problems.E" +
+      "xternalEvaluation.SolutionMessage.BoolVa" +
+      "riable\022b\n\rboolArrayVars\030\007 \003(\0132K.Heuristi" +
+      "cLab.Problems.ExternalEvaluation.Solutio" +
+      "nMessage.BoolArrayVariable\022\\\n\nstringVars" +
+      "\030\010 \003(\0132H.HeuristicLab.Problems.ExternalE" +
+      "valuation.SolutionMessage.StringVariable",
+      "\022f\n\017stringArrayVars\030\t \003(\0132M.HeuristicLab" +
+      ".Problems.ExternalEvaluation.SolutionMes" +
+      "sage.StringArrayVariable\022V\n\007rawVars\030\n \003(" +
+      "\0132E.HeuristicLab.Problems.ExternalEvalua" +
+      "tion.SolutionMessage.RawVariable\032-\n\017Inte" +
+      "gerVariable\022\014\n\004name\030\001 \002(\t\022\014\n\004data\030\002 \001(\005\032" +
+      "B\n\024IntegerArrayVariable\022\014\n\004name\030\001 \002(\t\022\014\n" +
+      "\004data\030\002 \003(\005\022\016\n\006length\030\003 \001(\005\032,\n\016DoubleVar" +
+      "iable\022\014\n\004name\030\001 \002(\t\022\014\n\004data\030\002 \001(\001\032A\n\023Dou" +
+      "bleArrayVariable\022\014\n\004name\030\001 \002(\t\022\014\n\004data\030\002",
+      " \003(\001\022\016\n\006length\030\003 \001(\005\032*\n\014BoolVariable\022\014\n\004" +
+      "name\030\001 \002(\t\022\014\n\004data\030\002 \001(\010\032?\n\021BoolArrayVar" +
+      "iable\022\014\n\004name\030\001 \002(\t\022\014\n\004data\030\002 \003(\010\022\016\n\006len" +
+      "gth\030\003 \001(\005\032,\n\016StringVariable\022\014\n\004name\030\001 \002(" +
+      "\t\022\014\n\004data\030\002 \001(\t\032A\n\023StringArrayVariable\022\014" +
+      "\n\004name\030\001 \002(\t\022\014\n\004data\030\002 \003(\t\022\016\n\006length\030\003 \001" +
+      "(\005\032)\n\013RawVariable\022\014\n\004name\030\001 \002(\t\022\014\n\004data\030" +
+      "\002 \001(\014\"\311\001\n\016QualityMessage\022\022\n\nsolutionId\030\001" +
+      " \002(\005\022K\n\004type\030\002 \002(\0162=.HeuristicLab.Proble" +
+      "ms.ExternalEvaluation.QualityMessage.Typ",
+      "e\"K\n\004Type\022!\n\035SingleObjectiveQualityMessa" +
+      "ge\020\001\022 \n\034MultiObjectiveQualityMessage\020\002*\t" +
+      "\010\350\007\020\200\200\200\200\002\"\315\001\n\035SingleObjectiveQualityMess" +
+      "age\022\017\n\007quality\030\001 \002(\0012\232\001\n\016qualityMessage\022" +
+      "8.HeuristicLab.Problems.ExternalEvaluati" +
+      "on.QualityMessage\030\350\007 \002(\0132G.HeuristicLab." +
+      "Problems.ExternalEvaluation.SingleObject" +
+      "iveQualityMessage\"\315\001\n\034MultiObjectiveQual" +
+      "ityMessage\022\021\n\tqualities\030\001 \003(\0012\231\001\n\016qualit" +
+      "yMessage\0228.HeuristicLab.Problems.Externa",
+      "lEvaluation.QualityMessage\030\351\007 \002(\0132F.Heur" +
+      "isticLab.Problems.ExternalEvaluation.Mul" +
+      "tiObjectiveQualityMessage2\322\002\n\021Evaluation" +
+      "Service\022\235\001\n\027EvaluateSingleObjective\0229.He" +
+      "uristicLab.Problems.ExternalEvaluation.S" +
+      "olutionMessage\032G.HeuristicLab.Problems.E" +
+      "xternalEvaluation.SingleObjectiveQuality" +
+      "Message\022\234\001\n\027EvaluateMultiObjectives\0229.He" +
+      "uristicLab.Problems.ExternalEvaluation.S" +
+      "olutionMessage\032F.HeuristicLab.Problems.E",
+      "xternalEvaluation.MultiObjectiveQualityM" +
+      "essageB.\n,com.heuristiclab.problems.exte" +
+      "rnalevaluation"
+    };
+    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
+      new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
+        public com.google.protobuf.ExtensionRegistry assignDescriptors(
+            com.google.protobuf.Descriptors.FileDescriptor root) {
+          descriptor = root;
+          internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_descriptor =
+            getDescriptor().getMessageTypes().get(0);
+          internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_descriptor,
+              new java.lang.String[] { "SolutionId", "IntegerVars", "IntegerArrayVars", "DoubleVars", "DoubleArrayVars", "BoolVars", "BoolArrayVars", "StringVars", "StringArrayVars", "RawVars", },
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.class,
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.Builder.class);
+          internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerVariable_descriptor =
+            internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_descriptor.getNestedTypes().get(0);
+          internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerVariable_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerVariable_descriptor,
+              new java.lang.String[] { "Name", "Data", },
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable.class,
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerVariable.Builder.class);
+          internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerArrayVariable_descriptor =
+            internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_descriptor.getNestedTypes().get(1);
+          internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerArrayVariable_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerArrayVariable_descriptor,
+              new java.lang.String[] { "Name", "Data", "Length", },
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable.class,
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.IntegerArrayVariable.Builder.class);
+          internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleVariable_descriptor =
+            internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_descriptor.getNestedTypes().get(2);
+          internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleVariable_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleVariable_descriptor,
+              new java.lang.String[] { "Name", "Data", },
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable.class,
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleVariable.Builder.class);
+          internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleArrayVariable_descriptor =
+            internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_descriptor.getNestedTypes().get(3);
+          internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleArrayVariable_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleArrayVariable_descriptor,
+              new java.lang.String[] { "Name", "Data", "Length", },
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable.class,
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.DoubleArrayVariable.Builder.class);
+          internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolVariable_descriptor =
+            internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_descriptor.getNestedTypes().get(4);
+          internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolVariable_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolVariable_descriptor,
+              new java.lang.String[] { "Name", "Data", },
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable.class,
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolVariable.Builder.class);
+          internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolArrayVariable_descriptor =
+            internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_descriptor.getNestedTypes().get(5);
+          internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolArrayVariable_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolArrayVariable_descriptor,
+              new java.lang.String[] { "Name", "Data", "Length", },
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable.class,
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.BoolArrayVariable.Builder.class);
+          internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringVariable_descriptor =
+            internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_descriptor.getNestedTypes().get(6);
+          internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringVariable_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringVariable_descriptor,
+              new java.lang.String[] { "Name", "Data", },
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable.class,
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringVariable.Builder.class);
+          internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringArrayVariable_descriptor =
+            internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_descriptor.getNestedTypes().get(7);
+          internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringArrayVariable_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringArrayVariable_descriptor,
+              new java.lang.String[] { "Name", "Data", "Length", },
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable.class,
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.StringArrayVariable.Builder.class);
+          internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_RawVariable_descriptor =
+            internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_descriptor.getNestedTypes().get(8);
+          internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_RawVariable_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_RawVariable_descriptor,
+              new java.lang.String[] { "Name", "Data", },
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable.class,
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage.RawVariable.Builder.class);
+          internal_static_HeuristicLab_Problems_ExternalEvaluation_QualityMessage_descriptor =
+            getDescriptor().getMessageTypes().get(1);
+          internal_static_HeuristicLab_Problems_ExternalEvaluation_QualityMessage_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_HeuristicLab_Problems_ExternalEvaluation_QualityMessage_descriptor,
+              new java.lang.String[] { "SolutionId", "Type", },
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage.class,
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage.Builder.class);
+          internal_static_HeuristicLab_Problems_ExternalEvaluation_SingleObjectiveQualityMessage_descriptor =
+            getDescriptor().getMessageTypes().get(2);
+          internal_static_HeuristicLab_Problems_ExternalEvaluation_SingleObjectiveQualityMessage_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_HeuristicLab_Problems_ExternalEvaluation_SingleObjectiveQualityMessage_descriptor,
+              new java.lang.String[] { "Quality", },
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage.class,
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage.Builder.class);
+          internal_static_HeuristicLab_Problems_ExternalEvaluation_MultiObjectiveQualityMessage_descriptor =
+            getDescriptor().getMessageTypes().get(3);
+          internal_static_HeuristicLab_Problems_ExternalEvaluation_MultiObjectiveQualityMessage_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_HeuristicLab_Problems_ExternalEvaluation_MultiObjectiveQualityMessage_descriptor,
+              new java.lang.String[] { "Qualities", },
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage.class,
+              com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.MultiObjectiveQualityMessage.Builder.class);
+          return null;
+        }
+      };
+    com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+        }, assigner);
+  }
+  
+  // @@protoc_insertion_point(outer_class_scope)
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/IChannel.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/IChannel.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/IChannel.java	(revision 15014)
@@ -0,0 +1,12 @@
+package com.heuristiclab.problems.externalevaluation;
+
+import java.io.*;
+import com.google.protobuf.*;
+
+public interface IChannel {
+	boolean isInitialized();
+	void open() throws IOException;
+	void send(Message msg) throws IOException;
+	Message receive(Message.Builder builder) throws IOException;
+	void close() throws IOException;
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/IEvaluationService.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/IEvaluationService.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/IEvaluationService.java	(revision 15014)
@@ -0,0 +1,7 @@
+package com.heuristiclab.problems.externalevaluation;
+
+import com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.*;
+
+public interface IEvaluationService {
+	double evaluate(SolutionMessage request, QualityMessage.Builder responseBuilder);
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/IListener.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/IListener.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/IListener.java	(revision 15014)
@@ -0,0 +1,8 @@
+package com.heuristiclab.problems.externalevaluation;
+
+public interface IListener {
+	void listen();
+    void stop();
+    void addChannelDiscoveredEventListener(ChannelDiscoveredEventListener l);
+    void removeChannelDiscoveredEventListener(ChannelDiscoveredEventListener l);
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/IListenerFactory.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/IListenerFactory.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/IListenerFactory.java	(revision 15014)
@@ -0,0 +1,5 @@
+package com.heuristiclab.problems.externalevaluation;
+
+public interface IListenerFactory {
+	IListener createListener();
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/PollService.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/PollService.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/PollService.java	(revision 15014)
@@ -0,0 +1,93 @@
+package com.heuristiclab.problems.externalevaluation;
+
+import java.io.*;
+import java.util.*;
+import java.util.concurrent.*;
+import com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.*;
+import com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage.Type;
+
+public class PollService extends Service {
+	private LinkedBlockingQueue<SolutionMessage> messageQueue;
+	private ArrayList<SolutionEventListener> listenerList;
+	
+	public PollService(IListenerFactory listenerFactory, int nThreads) {
+		super(listenerFactory, nThreads);
+		messageQueue = new LinkedBlockingQueue<SolutionMessage>();
+		listenerList = new ArrayList<SolutionEventListener>();
+	}
+	
+	@Override
+	public void stop() {
+		messageQueue.clear();
+		super.stop();
+	}
+	
+	public synchronized SolutionMessage getSolution() {
+		try {
+			return messageQueue.take();
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+	
+	public void sendQualityMessage(SolutionMessage sMsg, QualityMessage qMsg) throws IOException {
+		send(qMsg, sMsg);
+	}
+	
+	public QualityMessage.Builder prepareQualityMessage(SolutionMessage msg, double quality) {
+		return QualityMessage.newBuilder()
+			.setSolutionId(msg.getSolutionId())
+			.setType(Type.SingleObjectiveQualityMessage)
+			.setExtension(
+					SingleObjectiveQualityMessage.qualityMessage, 
+					SingleObjectiveQualityMessage.newBuilder().setQuality(quality).build());
+	}
+		
+	public void sendQuality(SolutionMessage msg, double quality) throws IOException {
+		send(prepareQualityMessage(msg, quality).build(), msg);
+	}
+	
+	public QualityMessage.Builder prepareQualitiesMessage(SolutionMessage msg, double[] qualities) {
+		List<Double> qualitiesList = new ArrayList<Double>(qualities.length);
+		for (double quality : qualities) qualitiesList.add(quality);
+		return QualityMessage.newBuilder()
+				.setSolutionId(msg.getSolutionId())
+				.setType(Type.MultiObjectiveQualityMessage)
+				.setExtension(
+						MultiObjectiveQualityMessage.qualityMessage, 
+						MultiObjectiveQualityMessage.newBuilder().addAllQualities(qualitiesList).build());
+	}
+		
+	public void sendQualities(SolutionMessage msg, double[] qualities) throws IOException {
+		send(prepareQualitiesMessage(msg, qualities).build(), msg);
+	}
+	
+	public void addSolutionEventListener(SolutionEventListener l) {
+		synchronized(listenerList) {
+			listenerList.add(l);
+		}
+	}
+	public void removeSolutionEventListener(SolutionEventListener l) {
+		synchronized(listenerList) {
+			listenerList.remove(l);
+		}
+	}
+	
+	@Override
+	protected void onSolutionProduced(SolutionMessage msg, IChannel channel) {
+		super.onSolutionProduced(msg, channel);
+		try {
+			messageQueue.put(msg);
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+			return;
+		}
+		synchronized(listenerList) {
+			Iterator<SolutionEventListener> listeners = listenerList.iterator();
+			while( listeners.hasNext() ) {
+				listeners.next().solutionReceived(new EventObject(this));
+			}
+		}
+	}
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/PushService.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/PushService.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/PushService.java	(revision 15014)
@@ -0,0 +1,36 @@
+package com.heuristiclab.problems.externalevaluation;
+
+import java.io.IOException;
+
+import com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage;
+import com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.QualityMessage.Type;
+import com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SingleObjectiveQualityMessage;
+import com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.SolutionMessage;
+
+public class PushService extends Service {
+	private IEvaluationService customService;
+	
+	public PushService(IListenerFactory listenerFactory, int nThreads, IEvaluationService customService) {
+		super(listenerFactory, nThreads);
+		this.customService = customService;
+	}
+
+	@Override
+	protected void onSolutionProduced(SolutionMessage msg, IChannel channel) {
+		super.onSolutionProduced(msg, channel);
+		try {
+			QualityMessage.Builder qualityMessage = QualityMessage.newBuilder();
+			double quality = customService.evaluate(msg, qualityMessage);
+			qualityMessage
+				.setSolutionId(msg.getSolutionId())
+				.setType(Type.SingleObjectiveQualityMessage)
+				.setExtension(
+					SingleObjectiveQualityMessage.qualityMessage, 
+					SingleObjectiveQualityMessage.newBuilder().setQuality(quality).build());
+			send(qualityMessage.build(), msg);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/ServerSocketChannel.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/ServerSocketChannel.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/ServerSocketChannel.java	(revision 15014)
@@ -0,0 +1,69 @@
+package com.heuristiclab.problems.externalevaluation;
+
+import java.io.*;
+import java.net.*;
+
+import com.google.protobuf.Message;
+import com.google.protobuf.Message.Builder;
+
+public class ServerSocketChannel extends Channel {
+	private ServerSocket serverSocket;
+	private Socket clientSocket;
+	private int port;
+	private InetAddress bindAddress;
+	private StreamChannel streamChannel;
+	
+	public ServerSocketChannel(int port) {
+		this.port = port;
+		this.bindAddress = null;
+	}
+	
+	public ServerSocketChannel(int port, String ipAddress) {
+		this.port = port;
+		try {
+			this.bindAddress = InetAddress.getByName(ipAddress);
+		} catch (UnknownHostException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+	
+	@Override
+	public void open() throws IOException {
+		super.open();
+		if (serverSocket == null) {
+			if (bindAddress == null)
+				serverSocket = new ServerSocket(port, 1);
+			else
+				serverSocket = new ServerSocket(port, 1, bindAddress);
+		}
+		listenForClient();
+	}
+	
+	private void listenForClient() throws IOException {
+		clientSocket = serverSocket.accept();
+		streamChannel = new StreamChannel(clientSocket.getInputStream(), clientSocket.getOutputStream());
+		streamChannel.open();	
+	}
+	
+	@Override
+	public Message receive(Builder builder) throws IOException {
+		return streamChannel.receive(builder);
+	}
+
+	@Override
+	public void send(Message msg) throws IOException {
+		streamChannel.send(msg);
+	}
+	
+	@Override
+	public void close() throws IOException {
+		streamChannel.close();
+		streamChannel = null;
+		clientSocket.close();
+		clientSocket = null;
+		serverSocket.close();
+		serverSocket = null;
+	}
+
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/ServerSocketListener.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/ServerSocketListener.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/ServerSocketListener.java	(revision 15014)
@@ -0,0 +1,106 @@
+package com.heuristiclab.problems.externalevaluation;
+
+import java.io.*;
+import java.net.*;
+import java.util.*;
+
+public class ServerSocketListener implements IListener {
+	private ServerSocket serverSocket;
+	private int port;
+	private InetAddress bindAddress;
+    private Thread listenerThread;
+	private ListenerThread producer;
+	private ArrayList<ChannelDiscoveredEventListener> listenerList;
+
+    public ServerSocketListener(int port) {
+		this.port = port;
+		this.bindAddress = null;
+		this.producer = new ListenerThread();
+		this.listenerList = new ArrayList<ChannelDiscoveredEventListener>();
+	}
+	
+	public ServerSocketListener(int port, String ipAddress) {
+		this.port = port;
+		try {
+			this.bindAddress = InetAddress.getByName(ipAddress);
+		} catch (UnknownHostException e) {
+			e.printStackTrace();
+		}
+		this.producer = new ListenerThread();
+		this.listenerList = new ArrayList<ChannelDiscoveredEventListener>();
+	}
+
+	@Override
+    public void listen() {
+		if (serverSocket == null) {
+			try {
+			if (bindAddress == null)
+				serverSocket = new ServerSocket(port, 1);
+			else
+				serverSocket = new ServerSocket(port, 1, bindAddress);
+			} catch (IOException e) {
+				e.printStackTrace();
+				return;
+			}
+		}
+        listenerThread = new Thread(this.producer);
+        listenerThread.start();
+    }
+	
+	@Override
+	public void stop() {
+		listenerThread.interrupt();
+	    if (serverSocket != null) {
+	        try {
+				serverSocket.close();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+	        serverSocket = null;
+	    }
+	}
+
+	@Override
+	public void addChannelDiscoveredEventListener(ChannelDiscoveredEventListener l) {
+		synchronized(listenerList) {
+			listenerList.add(l);
+		}
+	}
+	
+	@Override
+	public void removeChannelDiscoveredEventListener(ChannelDiscoveredEventListener l) {
+		synchronized(listenerList) {
+			listenerList.remove(l);
+		}
+	}
+	
+	private void onDiscovered(IChannel channel) {
+		synchronized(listenerList) {
+			Iterator<ChannelDiscoveredEventListener> listeners = listenerList.iterator();
+			while( listeners.hasNext() ) {
+				listeners.next().discovered(new EventObject(channel));
+			}
+		}
+	}
+	
+	private class ListenerThread implements Runnable {
+
+		@Override
+		public void run() {
+			while (true) {
+			    try {
+			    	Socket client = serverSocket.accept();
+			    	StreamChannel streamChannel = new StreamChannel(client.getInputStream(), client.getOutputStream());
+			    	onDiscovered(streamChannel);
+			    } catch (Exception e) {
+			    	try {
+			    		stop();
+			    	} catch (Exception tae) {
+			    		break;
+			    	}
+			    }
+			}
+		}
+	}
+	
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/ServerSocketListenerFactory.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/ServerSocketListenerFactory.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/ServerSocketListenerFactory.java	(revision 15014)
@@ -0,0 +1,26 @@
+package com.heuristiclab.problems.externalevaluation;
+
+public class ServerSocketListenerFactory implements IListenerFactory {
+
+	private String ipAddress;
+	private int port;
+	
+	public ServerSocketListenerFactory(int port) {
+		this.ipAddress = null;
+		this.port = port;
+	}
+	
+	public ServerSocketListenerFactory(int port, String ipAddress) {
+		this.ipAddress = ipAddress;
+		this.port = port;
+	}
+	
+	@Override
+	public IListener createListener() {
+		if (ipAddress == null)
+			return new ServerSocketListener(port);
+		else
+			return new ServerSocketListener(port, ipAddress);
+	}
+
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/Service.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/Service.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/Service.java	(revision 15014)
@@ -0,0 +1,126 @@
+package com.heuristiclab.problems.externalevaluation;
+
+import java.io.*;
+import java.util.*;
+import java.util.concurrent.*;
+import com.google.protobuf.*;
+import com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.*;
+
+public abstract class Service implements ChannelDiscoveredEventListener {
+	public static final int MAXCONNECTIONS = 10;
+	private IListener listener;
+	private int nThreads;
+	private ArrayList<IChannel> channels;
+	private HashMap<SolutionMessage, IChannel> recipientMemory;
+	
+	public Service(IListenerFactory listenerFactory, int nThreads) {
+		listener = listenerFactory.createListener();
+		this.nThreads = Math.max(nThreads, 1);
+		channels = new ArrayList<IChannel>();
+		recipientMemory = new HashMap<SolutionMessage, IChannel>();
+		listener.addChannelDiscoveredEventListener(this);
+	}
+	
+	@Override
+	public void discovered(EventObject channel) {
+		synchronized (channels) {
+			if (channels.size() < MAXCONNECTIONS) {
+				IChannel c = (IChannel)channel.getSource();
+				channels.add(c);
+				SolutionProducer producer = new SolutionProducer(c);
+				Thread tmp = new Thread(producer);
+				tmp.start();
+			} else {
+				try {
+					((IChannel)channel.getSource()).close();
+				} catch (IOException e) { e.printStackTrace(); }
+			}
+		}
+	}
+	
+	public void start() {
+		listener.listen();
+	}
+	
+	public void stop() {
+		listener.stop();
+		synchronized (channels) {
+			for (IChannel channel : channels) {
+				try {
+					channel.close();
+				} catch (IOException e) { e.printStackTrace(); }
+			}
+			channels.clear();
+		}
+		synchronized (recipientMemory) {
+			recipientMemory.clear();
+		}
+	}
+	
+	private void producerFinished(SolutionProducer producer) {
+		synchronized (channels) {
+			channels.remove(producer.channel);
+		}
+		synchronized (recipientMemory) {
+			for (Iterator<Map.Entry<SolutionMessage, IChannel>> iter = recipientMemory.entrySet().iterator(); iter.hasNext();) {
+				if (iter.next().getValue() == producer.channel)
+					iter.remove();
+			}
+		}
+	}
+	
+	protected void send(Message qualityMessage, Message solutionMessage) throws IOException {
+		synchronized (recipientMemory) {
+			if (recipientMemory.containsKey(solutionMessage)) {
+				recipientMemory.get(solutionMessage).send(qualityMessage);
+				recipientMemory.remove(solutionMessage);
+			}
+		}
+	}
+	
+	protected void onSolutionProduced(SolutionMessage msg, IChannel channel) {
+		synchronized (recipientMemory) {
+			recipientMemory.put(msg, channel);
+		}
+	}
+	
+	private class SolutionProducer implements Runnable {
+		private Executor threadPool;
+		private IChannel channel;
+		
+		public SolutionProducer(IChannel channel) {
+			this.channel = channel;
+			if (nThreads == 1)
+				threadPool = Executors.newSingleThreadExecutor();
+			else
+				threadPool = Executors.newFixedThreadPool(nThreads);
+		}
+		@Override
+		public void run() {
+			while (true) {
+				SolutionMessage.Builder builder = SolutionMessage.newBuilder();
+				try {
+					SolutionMessage msg = (SolutionMessage)channel.receive(builder);
+					threadPool.execute(new MessageNotifier(msg, channel));
+				} catch (Exception e) {
+					break;
+				}
+			}
+			producerFinished(this);
+		}
+		
+		private class MessageNotifier implements Runnable {
+			SolutionMessage msg;
+			IChannel channel;
+			public MessageNotifier(SolutionMessage msg, IChannel channel) {
+				this.msg = msg;
+				this.channel = channel;
+			}
+			@Override
+			public void run() {
+				onSolutionProduced(msg, channel);
+			}
+			
+		}
+	}
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/SolutionEventListener.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/SolutionEventListener.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/SolutionEventListener.java	(revision 15014)
@@ -0,0 +1,7 @@
+package com.heuristiclab.problems.externalevaluation;
+
+import java.util.*;
+
+public interface SolutionEventListener extends EventListener {
+	void solutionReceived(EventObject evt);
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/StreamChannel.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/StreamChannel.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/StreamChannel.java	(revision 15014)
@@ -0,0 +1,48 @@
+package com.heuristiclab.problems.externalevaluation;
+
+import java.io.*;
+import com.google.protobuf.*;
+
+public class StreamChannel extends Channel {
+	private InputStream input;
+	private OutputStream output;
+	
+	public StreamChannel(InputStream input, OutputStream output) {
+		super();
+		this.input = input;
+		this.output = output;
+	}
+
+	@Override
+	public void open() throws IOException {
+		super.open();
+	}
+	
+	@Override
+	public void send(Message msg)
+		throws IOException {
+		synchronized (output) {
+			msg.writeDelimitedTo(output);
+	        output.flush(); // very important!
+	    }
+	}
+	
+	@Override
+	public Message receive(Message.Builder builder)
+		throws IOException {
+		synchronized(input) {
+			builder.mergeDelimitedFrom(input);
+			if (builder.isInitialized())
+				return builder.build();
+			else throw new EOFException("EOF reached, but message is incomplete.");
+		}
+	}
+	
+	@Override
+	public void close() throws IOException {
+		super.close();
+		input.close();
+		output.close();
+	}
+}
+
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/StreamListener.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/StreamListener.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/StreamListener.java	(revision 15014)
@@ -0,0 +1,51 @@
+package com.heuristiclab.problems.externalevaluation;
+
+import java.io.*;
+import java.util.*;
+
+public class StreamListener implements IListener {
+	private InputStream input;
+	private OutputStream output;
+	private ArrayList<ChannelDiscoveredEventListener> listenerList;
+	
+	public StreamListener(InputStream input, OutputStream output) {
+		this.input = input;
+		this.output = output;
+		this.listenerList = new ArrayList<ChannelDiscoveredEventListener>();
+	}
+	
+	@Override
+	public void listen() {
+		onDiscovered(new StreamChannel(this.input, this.output));
+	}
+
+	@Override
+	public void stop() {
+	}
+
+	@Override
+	public void addChannelDiscoveredEventListener(
+			ChannelDiscoveredEventListener l) {
+		synchronized (listenerList) {
+			listenerList.add(l);
+		}
+	}
+
+	@Override
+	public void removeChannelDiscoveredEventListener(
+			ChannelDiscoveredEventListener l) {
+		synchronized (listenerList) {
+			listenerList.remove(l);
+		}
+	}
+	
+	private void onDiscovered(IChannel channel) {
+		synchronized(listenerList) {
+			Iterator<ChannelDiscoveredEventListener> listeners = listenerList.iterator();
+			while( listeners.hasNext() ) {
+				listeners.next().discovered(new EventObject(channel));
+			}
+		}
+	}
+
+}
Index: trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/StreamListenerFactory.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/StreamListenerFactory.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/ExternalEvaluation.Service/src/com/heuristiclab/problems/externalevaluation/StreamListenerFactory.java	(revision 15014)
@@ -0,0 +1,20 @@
+package com.heuristiclab.problems.externalevaluation;
+
+import java.io.*;
+
+public class StreamListenerFactory implements IListenerFactory {
+
+	InputStream input;
+	OutputStream output;
+	
+	public StreamListenerFactory(InputStream input, OutputStream output) {
+		this.input = input;
+		this.output = output;
+	}
+	
+	@Override
+	public IListener createListener() {
+		return new StreamListener(input, output);
+	}
+
+}
Index: trunk/tools/ExternalEvaluation/Java/RegularExternalApplication/.classpath
===================================================================
--- trunk/tools/ExternalEvaluation/Java/RegularExternalApplication/.classpath	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/RegularExternalApplication/.classpath	(revision 15014)
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/HL3ExternalEvaluation"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
Index: trunk/tools/ExternalEvaluation/Java/RegularExternalApplication/.project
===================================================================
--- trunk/tools/ExternalEvaluation/Java/RegularExternalApplication/.project	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/RegularExternalApplication/.project	(revision 15014)
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>RegularExternalApplication</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
Index: trunk/tools/ExternalEvaluation/Java/RegularExternalApplication/src/com/heuristiclab/problems/externalevaluation/test/RandomSocketPollEvaluator.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/RegularExternalApplication/src/com/heuristiclab/problems/externalevaluation/test/RandomSocketPollEvaluator.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/RegularExternalApplication/src/com/heuristiclab/problems/externalevaluation/test/RandomSocketPollEvaluator.java	(revision 15014)
@@ -0,0 +1,39 @@
+package com.heuristiclab.problems.externalevaluation.test;
+
+import java.io.IOException;
+import java.util.*;
+import com.heuristiclab.problems.externalevaluation.*;
+import com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.*;
+
+public class RandomSocketPollEvaluator {
+
+	public static void main(String[] args) {
+		ServerSocketListenerFactory factory = new ServerSocketListenerFactory(8842);
+		PollService service = new PollService(factory, 1);
+		service.start();
+		System.out.println("service started");
+		
+		Random random = new Random();
+		while (true) {
+			SolutionMessage msg = service.getSolution();
+			double quality = 0;
+			double[] qualities = new double[3];
+			
+			// single-objective
+			quality = random.nextDouble();
+			// multi-objective
+			//for (int i = 0; i < qualities.length; i++)
+			//	qualities[i] = random.nextDouble();
+			
+			try {
+				// single-objective
+				service.sendQuality(msg, quality);
+				// multi-objective
+				//service.sendQualities(msg, qualities);
+				System.out.println("Quality sended");
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+	}
+}
Index: trunk/tools/ExternalEvaluation/Java/RegularExternalApplication/src/com/heuristiclab/problems/externalevaluation/test/RandomSocketPushEvaluator.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/RegularExternalApplication/src/com/heuristiclab/problems/externalevaluation/test/RandomSocketPushEvaluator.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/RegularExternalApplication/src/com/heuristiclab/problems/externalevaluation/test/RandomSocketPushEvaluator.java	(revision 15014)
@@ -0,0 +1,49 @@
+package com.heuristiclab.problems.externalevaluation.test;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Random;
+import com.heuristiclab.problems.externalevaluation.*;
+import com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.*;
+
+public class RandomSocketPushEvaluator {
+	private PushService service;
+	
+	public static void main(String[] args) {
+		RandomSocketPushEvaluator main = new RandomSocketPushEvaluator();
+		main.run();
+		System.out.println("Service is running, terminate by pressing <Return> or <Enter>.");
+		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+		try {
+			br.readLine();
+			br.close();
+		} catch (IOException e) { e.printStackTrace(); }
+		main.terminate();
+	}
+	
+	private void run() {
+		ServerSocketListenerFactory factory = new ServerSocketListenerFactory(8842);
+		service = new PushService(factory, 1, new RandomEvaluator());
+		service.start();
+	}
+	
+	private void terminate() {
+		service.stop();
+	}
+	
+	private class RandomEvaluator implements IEvaluationService {
+		Random random;
+		
+		public RandomEvaluator() {
+			random = new Random();
+		}
+		
+		@Override
+		public double evaluate(SolutionMessage msg, QualityMessage.Builder responseBuilder) {
+			// we could set additional extensions in the responseBuilder
+			return random.nextDouble();
+		}
+		
+	}
+}
Index: trunk/tools/ExternalEvaluation/Java/RegularExternalApplication/src/com/heuristiclab/problems/externalevaluation/test/RandomStreamingPollEvaluator.java
===================================================================
--- trunk/tools/ExternalEvaluation/Java/RegularExternalApplication/src/com/heuristiclab/problems/externalevaluation/test/RandomStreamingPollEvaluator.java	(revision 15014)
+++ trunk/tools/ExternalEvaluation/Java/RegularExternalApplication/src/com/heuristiclab/problems/externalevaluation/test/RandomStreamingPollEvaluator.java	(revision 15014)
@@ -0,0 +1,28 @@
+package com.heuristiclab.problems.externalevaluation.test;
+
+import java.io.IOException;
+import java.util.Random;
+import com.heuristiclab.problems.externalevaluation.*;
+import com.heuristiclab.problems.externalevaluation.ExternalEvaluationMessages.*;
+
+public class RandomStreamingPollEvaluator {
+
+	public static void main(String[] args) {
+		StreamListenerFactory factory = new StreamListenerFactory(System.in, System.out);
+		PollService service = new PollService(factory, 1);
+		service.start();
+		
+		Random random = new Random();
+		while (true) {
+			SolutionMessage msg = service.getSolution();
+			// parse the message and retrieve the variables there
+			try {
+				service.sendQuality(msg, random.nextDouble());
+			} catch (IOException e) {
+				break;
+			}
+		}
+		
+		service.stop();
+	}
+}
Index: trunk/tools/ExternalEvaluation/MyExtension/ExternalEvaluationMessages.proto
===================================================================
--- trunk/tools/ExternalEvaluation/MyExtension/ExternalEvaluationMessages.proto	(revision 15014)
+++ trunk/tools/ExternalEvaluation/MyExtension/ExternalEvaluationMessages.proto	(revision 15014)
@@ -0,0 +1,75 @@
+package HeuristicLab.Problems.ExternalEvaluation;
+option java_package = "com.heuristiclab.problems.externalevaluation";
+
+message SolutionMessage {
+  required int32 solutionId = 1;
+  
+  message IntegerVariable {
+    required string name = 1;
+    optional int32 data = 2;
+  }
+  repeated IntegerVariable integerVars = 2;
+  
+  message IntegerArrayVariable {
+    required string name = 1;
+    repeated int32 data = 2;
+    optional int32 length = 3;
+  }
+  repeated IntegerArrayVariable integerArrayVars = 3;
+  
+  message DoubleVariable {
+    required string name = 1;
+    optional double data = 2;
+  }
+  repeated DoubleVariable doubleVars = 4;
+  
+  message DoubleArrayVariable {
+    required string name = 1;
+    repeated double data = 2;
+    optional int32 length = 3;
+  }
+  repeated DoubleArrayVariable doubleArrayVars = 5;
+  
+  message BoolVariable {
+    required string name = 1;
+    optional bool data = 2;
+  }
+  repeated BoolVariable boolVars = 6;
+  
+  message BoolArrayVariable {
+    required string name = 1;
+    repeated bool data = 2;
+    optional int32 length = 3;
+  }
+  repeated BoolArrayVariable boolArrayVars = 7;
+  
+  message StringVariable {
+    required string name = 1;
+    optional string data = 2;
+  }
+  repeated StringVariable stringVars = 8;
+  
+  message StringArrayVariable {
+    required string name = 1;
+    repeated string data = 2;
+    optional int32 length = 3;
+  }
+  repeated StringArrayVariable stringArrayVars = 9;
+  
+  message RawVariable {
+    required string name = 1;
+    optional bytes data = 2;
+  }
+  repeated RawVariable rawVars = 10;
+}
+
+message QualityMessage {
+  required int32 solutionId = 1;
+  required double quality = 2;
+
+  extensions 1000 to max;
+}
+  
+service EvaluationService {
+  rpc Evaluate (SolutionMessage) returns (QualityMessage);
+}
Index: trunk/tools/ExternalEvaluation/MyExtension/Google.ProtocolBuffers-license-2.4.1.473.txt
===================================================================
--- trunk/tools/ExternalEvaluation/MyExtension/Google.ProtocolBuffers-license-2.4.1.473.txt	(revision 15014)
+++ trunk/tools/ExternalEvaluation/MyExtension/Google.ProtocolBuffers-license-2.4.1.473.txt	(revision 15014)
@@ -0,0 +1,31 @@
+Protocol Buffers - Google's data interchange format
+Copyright 2008-2010 Google Inc.  All rights reserved.
+http://github.com/jskeet/dotnet-protobufs/
+Original C++/Java/Python code:
+http://code.google.com/p/protobuf/
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+    * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Index: trunk/tools/ExternalEvaluation/MyExtension/MyExtension.sln
===================================================================
--- trunk/tools/ExternalEvaluation/MyExtension/MyExtension.sln	(revision 15014)
+++ trunk/tools/ExternalEvaluation/MyExtension/MyExtension.sln	(revision 15014)
@@ -0,0 +1,30 @@
+﻿
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Plugin", "Plugin\Plugin.csproj", "{73064F29-50DE-47EC-B10D-2197B12EE28B}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{D2A52FA2-D627-4610-BF8A-B7CA369AEAD3}"
+	ProjectSection(SolutionItems) = preProject
+		ExternalEvaluationMessages.proto = ExternalEvaluationMessages.proto
+		Google.ProtocolBuffers-2.4.1.473.dll = Google.ProtocolBuffers-2.4.1.473.dll
+		Google.ProtocolBuffers-license-2.4.1.473.txt = Google.ProtocolBuffers-license-2.4.1.473.txt
+		ProcessProtos.cmd = ProcessProtos.cmd
+		protoc.exe = protoc.exe
+		ProtoGen.exe = ProtoGen.exe
+	EndProjectSection
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{73064F29-50DE-47EC-B10D-2197B12EE28B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{73064F29-50DE-47EC-B10D-2197B12EE28B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{73064F29-50DE-47EC-B10D-2197B12EE28B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{73064F29-50DE-47EC-B10D-2197B12EE28B}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
Index: trunk/tools/ExternalEvaluation/MyExtension/Plugin/ExtendedExternalEvaluationProblem.cs
===================================================================
--- trunk/tools/ExternalEvaluation/MyExtension/Plugin/ExtendedExternalEvaluationProblem.cs	(revision 15014)
+++ trunk/tools/ExternalEvaluation/MyExtension/Plugin/ExtendedExternalEvaluationProblem.cs	(revision 15014)
@@ -0,0 +1,144 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
+using System.Linq;
+using Google.ProtocolBuffers;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.ExternalEvaluation.RepetitionsExtension;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.MyExtension {
+
+  [Item("ExtendedExternalEvaluationProblem", "Creates a solution message, and communicates it via the driver to receive a quality message.")]
+  [StorableClass]
+  public class ExtendedExternalEvaluationProblem : ExternalEvaluationProblem, IStatefulItem {
+
+    private IDictionary<SolutionMessage, QualityMessage> messages;
+
+    [Storable(Name = "Messages")]
+    [SuppressMessage("ReSharper", "InconsistentlySynchronizedField")]
+    [SuppressMessage("ReSharper", "InconsistentNaming")]
+    private IEnumerable<KeyValuePair<byte[], byte[]>> Messages_Persistence {
+      get {
+        return messages.ToDictionary(
+          kvp => kvp.Key.ToByteArray(),
+          kvp => kvp.Value.ToByteArray());
+      }
+      set {
+        messages = value.ToDictionary(
+          kvp => SolutionMessage.ParseFrom(ByteString.CopyFrom(kvp.Key)),
+          kvp => QualityMessage.ParseFrom(ByteString.CopyFrom(kvp.Value), GetQualityMessageExtensions()));
+      }
+    }
+
+    #region Construction & Cloning
+    [StorableConstructor]
+    private ExtendedExternalEvaluationProblem(bool deserializing) : base(deserializing) { }
+
+    private ExtendedExternalEvaluationProblem(ExtendedExternalEvaluationProblem original, Cloner cloner)
+      : base(original, cloner) {
+      Messages_Persistence = original.Messages_Persistence;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExtendedExternalEvaluationProblem(this, cloner);
+    }
+    public ExtendedExternalEvaluationProblem()
+      : base() {
+      messages = new Dictionary<SolutionMessage, QualityMessage>();
+
+      Encoding = new RealVectorEncoding("r", length: 40, min: 0, max: 10);
+    }
+    #endregion
+
+    public override QualityMessage Evaluate(SolutionMessage solutionMessage) {
+      var qualityMessage = base.Evaluate(solutionMessage);
+      lock (messages) {
+        messages.Add(solutionMessage, qualityMessage);
+      }
+      return qualityMessage;
+    }
+    public override void Analyze(Individual[] individuals, double[] qualities, ResultCollection results, IRandom random) {
+      base.Analyze(individuals, qualities, results, random);
+
+      lock (messages) {
+        ExtendedAnalyze(messages.Keys.ToArray(), messages.Values.ToArray(), results, Encoding, random);
+        messages.Clear();
+      }
+    }
+
+    public virtual void ExtendedAnalyze(SolutionMessage[] solutionMessages, QualityMessage[] qualityMessages, ResultCollection results, IEncoding encoding, IRandom random) {
+      if (!results.ContainsKey("SolutionsHistory")) {
+        var dataTable = new DataTable("SolutionsHistory");
+        int solutionLength = ((RealVectorEncoding)encoding).Length;
+        for (int i = 0; i < solutionLength; i++)
+          dataTable.Rows.Add(new DataRow("a" + i, "Parameter " + i));
+        dataTable.Rows.Add(new DataRow("Quality"));
+        dataTable.Rows.Add(new DataRow("Repetitions"));
+        dataTable.Rows.Add(new DataRow("Variance"));
+        dataTable.Rows.Add(new DataRow("CanceledRuns"));
+        results.Add(new Result("SolutionsHistory", dataTable));
+      }
+
+      var solutions =
+        from result in solutionMessages.Zip(qualityMessages, (sm, qm) => new { sm, qm })
+        select new {
+          inputs = result.sm.GetDoubleArrayVars(0).DataList,
+          quality = result.qm.GetExtension(SingleObjectiveQualityMessage.QualityMessage_).Quality,
+          repititions = GetExtension(result.qm, RepetitionsResponse.Repetitions, 1),
+          variance = GetExtension(result.qm, RepetitionsResponse.Variance, 0),
+          canceledRuns = GetExtension(result.qm, RepetitionsResponse.NumFailed, 0)
+        };
+
+      var solutionsHistory = (DataTable)results["SolutionsHistory"].Value;
+
+      foreach (var solution in solutions.OrderBy(s => s.quality)) {
+        for (int i = 0; i < solution.inputs.Count; i++)
+          solutionsHistory.Rows["a" + i].Values.Add(solution.inputs[i]);
+        solutionsHistory.Rows["Quality"].Values.Add(solution.quality);
+        solutionsHistory.Rows["Repetitions"].Values.Add(solution.repititions);
+        solutionsHistory.Rows["Variance"].Values.Add(solution.variance);
+        solutionsHistory.Rows["CanceledRuns"].Values.Add(solution.canceledRuns);
+      }
+    }
+    private T GetExtension<T>(QualityMessage msg, GeneratedExtensionBase<T> extension, T @default = default(T)) {
+      return msg.HasExtension(extension) ? msg.GetExtension(extension) : @default;
+    }
+
+    public override ExtensionRegistry GetQualityMessageExtensions() {
+      var extensions = base.GetQualityMessageExtensions();
+      RepetitionsQualityMessage.RegisterAllExtensions(extensions);
+      return extensions;
+    }
+
+    public void InitializeState() {
+    }
+    public void ClearState() {
+      lock (messages)
+        messages.Clear();
+    }
+  }
+}
Index: trunk/tools/ExternalEvaluation/MyExtension/Plugin/Plugin.cs
===================================================================
--- trunk/tools/ExternalEvaluation/MyExtension/Plugin/Plugin.cs	(revision 15014)
+++ trunk/tools/ExternalEvaluation/MyExtension/Plugin/Plugin.cs	(revision 15014)
@@ -0,0 +1,38 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.MyExtension {
+  [Plugin("HeuristicLab.Problems.ExternalEvaluation.MyExtension", "3.3.7.0")]
+  [PluginFile("HeuristicLab.Problems.ExternalEvaluation.MyExtension-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.ExternalEvaluation", "3.3")]
+  public class HeuristicLabProblemsExternalEvaluationMyExtensionPlugin : PluginBase {
+  }
+}
Index: trunk/tools/ExternalEvaluation/MyExtension/Plugin/Plugin.csproj
===================================================================
--- trunk/tools/ExternalEvaluation/MyExtension/Plugin/Plugin.csproj	(revision 15014)
+++ trunk/tools/ExternalEvaluation/MyExtension/Plugin/Plugin.csproj	(revision 15014)
@@ -0,0 +1,121 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{73064F29-50DE-47EC-B10D-2197B12EE28B}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.ExternalEvaluation.MyExtension</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.ExternalEvaluation.MyExtension-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Google.ProtocolBuffers-2.4.1.473">
+      <HintPath>..\..\CSharp\Google.ProtocolBuffers-2.4.1.473.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Analysis-3.3">
+      <HintPath>..\..\..\HeuristicLab\trunk\sources\bin\HeuristicLab.Analysis-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\HeuristicLab\trunk\sources\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\HeuristicLab\trunk\sources\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\HeuristicLab\trunk\sources\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3">
+      <HintPath>..\..\..\HeuristicLab\trunk\sources\bin\HeuristicLab.Data-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.RealVectorEncoding-3.3">
+      <HintPath>..\..\..\HeuristicLab\trunk\sources\bin\HeuristicLab.Encodings.RealVectorEncoding-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3">
+      <HintPath>..\..\..\HeuristicLab\trunk\sources\bin\HeuristicLab.Operators-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3">
+      <HintPath>..\..\..\HeuristicLab\trunk\sources\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3">
+      <HintPath>..\..\..\HeuristicLab\trunk\sources\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\HeuristicLab\trunk\sources\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\HeuristicLab\trunk\sources\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.ExternalEvaluation-3.4">
+      <HintPath>..\..\..\HeuristicLab\trunk\sources\bin\HeuristicLab.Problems.ExternalEvaluation-3.4.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="ExtendedExternalEvaluationProblem.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Protos\RepetitionsQualityMessage.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Protos\RepetitionsQualityMessage.proto" />
+    <None Include="Protos\ExternalEvaluationMessages.proto" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(SolutionDir)
+set SolutionDir=$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+
+call "$(SolutionDir)\ProcessProtos.cmd"</PreBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: trunk/tools/ExternalEvaluation/MyExtension/Plugin/Properties/AssemblyInfo.cs
===================================================================
--- trunk/tools/ExternalEvaluation/MyExtension/Plugin/Properties/AssemblyInfo.cs	(revision 15014)
+++ trunk/tools/ExternalEvaluation/MyExtension/Plugin/Properties/AssemblyInfo.cs	(revision 15014)
@@ -0,0 +1,35 @@
+﻿using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Problems.ExternalEvaluation.MyExtension")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("HEAL")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2012 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("7ef6b5b5-aa35-45bd-93a7-09acffbd1ea1")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.7.0")]
Index: trunk/tools/ExternalEvaluation/MyExtension/Plugin/Protos/ExternalEvaluationMessages.cs
===================================================================
--- trunk/tools/ExternalEvaluation/MyExtension/Plugin/Protos/ExternalEvaluationMessages.cs	(revision 15014)
+++ trunk/tools/ExternalEvaluation/MyExtension/Plugin/Protos/ExternalEvaluationMessages.cs	(revision 15014)
@@ -0,0 +1,4540 @@
+// Generated by ProtoGen, Version=2.4.1.473, Culture=neutral, PublicKeyToken=17b3b1f090c3ea48.  DO NOT EDIT!
+#pragma warning disable 1591, 0612
+#region Designer generated code
+
+using pb = global::Google.ProtocolBuffers;
+using pbc = global::Google.ProtocolBuffers.Collections;
+using pbd = global::Google.ProtocolBuffers.Descriptors;
+using scg = global::System.Collections.Generic;
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+  public static partial class ExternalEvaluationMessages {
+  
+    #region Extension registration
+    public static void RegisterAllExtensions(pb::ExtensionRegistry registry) {
+    }
+    #endregion
+    #region Static variables
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerVariable__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerVariable__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerArrayVariable__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerArrayVariable__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleVariable__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleVariable__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleArrayVariable__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleArrayVariable__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolVariable__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolVariable__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolArrayVariable__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolArrayVariable__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringVariable__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringVariable__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringArrayVariable__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringArrayVariable__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_RawVariable__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_RawVariable__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_QualityMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.QualityMessage, global::HeuristicLab.Problems.ExternalEvaluation.QualityMessage.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_QualityMessage__FieldAccessorTable;
+    #endregion
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbd::FileDescriptor descriptor;
+    
+    static ExternalEvaluationMessages() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          "CiBFeHRlcm5hbEV2YWx1YXRpb25NZXNzYWdlcy5wcm90bxIoSGV1cmlzdGlj" + 
+          "TGFiLlByb2JsZW1zLkV4dGVybmFsRXZhbHVhdGlvbiL+CgoPU29sdXRpb25N" + 
+          "ZXNzYWdlEhIKCnNvbHV0aW9uSWQYASACKAUSXgoLaW50ZWdlclZhcnMYAiAD" + 
+          "KAsySS5IZXVyaXN0aWNMYWIuUHJvYmxlbXMuRXh0ZXJuYWxFdmFsdWF0aW9u" + 
+          "LlNvbHV0aW9uTWVzc2FnZS5JbnRlZ2VyVmFyaWFibGUSaAoQaW50ZWdlckFy" + 
+          "cmF5VmFycxgDIAMoCzJOLkhldXJpc3RpY0xhYi5Qcm9ibGVtcy5FeHRlcm5h" + 
+          "bEV2YWx1YXRpb24uU29sdXRpb25NZXNzYWdlLkludGVnZXJBcnJheVZhcmlh" + 
+          "YmxlElwKCmRvdWJsZVZhcnMYBCADKAsySC5IZXVyaXN0aWNMYWIuUHJvYmxl" + 
+          "bXMuRXh0ZXJuYWxFdmFsdWF0aW9uLlNvbHV0aW9uTWVzc2FnZS5Eb3VibGVW" + 
+          "YXJpYWJsZRJmCg9kb3VibGVBcnJheVZhcnMYBSADKAsyTS5IZXVyaXN0aWNM" + 
+          "YWIuUHJvYmxlbXMuRXh0ZXJuYWxFdmFsdWF0aW9uLlNvbHV0aW9uTWVzc2Fn" + 
+          "ZS5Eb3VibGVBcnJheVZhcmlhYmxlElgKCGJvb2xWYXJzGAYgAygLMkYuSGV1" + 
+          "cmlzdGljTGFiLlByb2JsZW1zLkV4dGVybmFsRXZhbHVhdGlvbi5Tb2x1dGlv" + 
+          "bk1lc3NhZ2UuQm9vbFZhcmlhYmxlEmIKDWJvb2xBcnJheVZhcnMYByADKAsy" + 
+          "Sy5IZXVyaXN0aWNMYWIuUHJvYmxlbXMuRXh0ZXJuYWxFdmFsdWF0aW9uLlNv" + 
+          "bHV0aW9uTWVzc2FnZS5Cb29sQXJyYXlWYXJpYWJsZRJcCgpzdHJpbmdWYXJz" + 
+          "GAggAygLMkguSGV1cmlzdGljTGFiLlByb2JsZW1zLkV4dGVybmFsRXZhbHVh" + 
+          "dGlvbi5Tb2x1dGlvbk1lc3NhZ2UuU3RyaW5nVmFyaWFibGUSZgoPc3RyaW5n" + 
+          "QXJyYXlWYXJzGAkgAygLMk0uSGV1cmlzdGljTGFiLlByb2JsZW1zLkV4dGVy" + 
+          "bmFsRXZhbHVhdGlvbi5Tb2x1dGlvbk1lc3NhZ2UuU3RyaW5nQXJyYXlWYXJp" + 
+          "YWJsZRJWCgdyYXdWYXJzGAogAygLMkUuSGV1cmlzdGljTGFiLlByb2JsZW1z" + 
+          "LkV4dGVybmFsRXZhbHVhdGlvbi5Tb2x1dGlvbk1lc3NhZ2UuUmF3VmFyaWFi" + 
+          "bGUaLQoPSW50ZWdlclZhcmlhYmxlEgwKBG5hbWUYASACKAkSDAoEZGF0YRgC" + 
+          "IAEoBRpCChRJbnRlZ2VyQXJyYXlWYXJpYWJsZRIMCgRuYW1lGAEgAigJEgwK" + 
+          "BGRhdGEYAiADKAUSDgoGbGVuZ3RoGAMgASgFGiwKDkRvdWJsZVZhcmlhYmxl" + 
+          "EgwKBG5hbWUYASACKAkSDAoEZGF0YRgCIAEoARpBChNEb3VibGVBcnJheVZh" + 
+          "cmlhYmxlEgwKBG5hbWUYASACKAkSDAoEZGF0YRgCIAMoARIOCgZsZW5ndGgY" + 
+          "AyABKAUaKgoMQm9vbFZhcmlhYmxlEgwKBG5hbWUYASACKAkSDAoEZGF0YRgC" + 
+          "IAEoCBo/ChFCb29sQXJyYXlWYXJpYWJsZRIMCgRuYW1lGAEgAigJEgwKBGRh" + 
+          "dGEYAiADKAgSDgoGbGVuZ3RoGAMgASgFGiwKDlN0cmluZ1ZhcmlhYmxlEgwK" + 
+          "BG5hbWUYASACKAkSDAoEZGF0YRgCIAEoCRpBChNTdHJpbmdBcnJheVZhcmlh" + 
+          "YmxlEgwKBG5hbWUYASACKAkSDAoEZGF0YRgCIAMoCRIOCgZsZW5ndGgYAyAB" + 
+          "KAUaKQoLUmF3VmFyaWFibGUSDAoEbmFtZRgBIAIoCRIMCgRkYXRhGAIgASgM" + 
+          "IkAKDlF1YWxpdHlNZXNzYWdlEhIKCnNvbHV0aW9uSWQYASACKAUSDwoHcXVh" + 
+          "bGl0eRgCIAIoASoJCOgHEICAgIACMpQBChFFdmFsdWF0aW9uU2VydmljZRJ/" + 
+          "CghFdmFsdWF0ZRI5LkhldXJpc3RpY0xhYi5Qcm9ibGVtcy5FeHRlcm5hbEV2" + 
+          "YWx1YXRpb24uU29sdXRpb25NZXNzYWdlGjguSGV1cmlzdGljTGFiLlByb2Js" + 
+          "ZW1zLkV4dGVybmFsRXZhbHVhdGlvbi5RdWFsaXR5TWVzc2FnZUIuCixjb20u" + 
+          "aGV1cmlzdGljbGFiLnByb2JsZW1zLmV4dGVybmFsZXZhbHVhdGlvbg==");
+      pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) {
+        descriptor = root;
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor = Descriptor.MessageTypes[0];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor,
+                new string[] { "SolutionId", "IntegerVars", "IntegerArrayVars", "DoubleVars", "DoubleArrayVars", "BoolVars", "BoolArrayVars", "StringVars", "StringArrayVars", "RawVars", });
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerVariable__Descriptor = internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor.NestedTypes[0];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerVariable__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerVariable__Descriptor,
+                new string[] { "Name", "Data", });
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerArrayVariable__Descriptor = internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor.NestedTypes[1];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerArrayVariable__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerArrayVariable__Descriptor,
+                new string[] { "Name", "Data", "Length", });
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleVariable__Descriptor = internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor.NestedTypes[2];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleVariable__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleVariable__Descriptor,
+                new string[] { "Name", "Data", });
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleArrayVariable__Descriptor = internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor.NestedTypes[3];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleArrayVariable__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleArrayVariable__Descriptor,
+                new string[] { "Name", "Data", "Length", });
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolVariable__Descriptor = internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor.NestedTypes[4];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolVariable__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolVariable__Descriptor,
+                new string[] { "Name", "Data", });
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolArrayVariable__Descriptor = internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor.NestedTypes[5];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolArrayVariable__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolArrayVariable__Descriptor,
+                new string[] { "Name", "Data", "Length", });
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringVariable__Descriptor = internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor.NestedTypes[6];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringVariable__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringVariable__Descriptor,
+                new string[] { "Name", "Data", });
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringArrayVariable__Descriptor = internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor.NestedTypes[7];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringArrayVariable__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringArrayVariable__Descriptor,
+                new string[] { "Name", "Data", "Length", });
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_RawVariable__Descriptor = internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor.NestedTypes[8];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_RawVariable__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_RawVariable__Descriptor,
+                new string[] { "Name", "Data", });
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_QualityMessage__Descriptor = Descriptor.MessageTypes[1];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_QualityMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.QualityMessage, global::HeuristicLab.Problems.ExternalEvaluation.QualityMessage.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_QualityMessage__Descriptor,
+                new string[] { "SolutionId", "Quality", });
+        return null;
+      };
+      pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,
+          new pbd::FileDescriptor[] {
+          }, assigner);
+    }
+    #endregion
+    
+  }
+  #region Messages
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+  public sealed partial class SolutionMessage : pb::GeneratedMessage<SolutionMessage, SolutionMessage.Builder> {
+    private SolutionMessage() { }
+    private static readonly SolutionMessage defaultInstance = new SolutionMessage().MakeReadOnly();
+    private static readonly string[] _solutionMessageFieldNames = new string[] { "boolArrayVars", "boolVars", "doubleArrayVars", "doubleVars", "integerArrayVars", "integerVars", "rawVars", "solutionId", "stringArrayVars", "stringVars" };
+    private static readonly uint[] _solutionMessageFieldTags = new uint[] { 58, 50, 42, 34, 26, 18, 82, 8, 74, 66 };
+    public static SolutionMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override SolutionMessage DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override SolutionMessage ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<SolutionMessage, SolutionMessage.Builder> InternalFieldAccessors {
+      get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage__FieldAccessorTable; }
+    }
+    
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+    public static class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+      [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+      public sealed partial class IntegerVariable : pb::GeneratedMessage<IntegerVariable, IntegerVariable.Builder> {
+        private IntegerVariable() { }
+        private static readonly IntegerVariable defaultInstance = new IntegerVariable().MakeReadOnly();
+        private static readonly string[] _integerVariableFieldNames = new string[] { "data", "name" };
+        private static readonly uint[] _integerVariableFieldTags = new uint[] { 16, 10 };
+        public static IntegerVariable DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override IntegerVariable DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+        
+        protected override IntegerVariable ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerVariable__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<IntegerVariable, IntegerVariable.Builder> InternalFieldAccessors {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerVariable__FieldAccessorTable; }
+        }
+        
+        public const int NameFieldNumber = 1;
+        private bool hasName;
+        private string name_ = "";
+        public bool HasName {
+          get { return hasName; }
+        }
+        public string Name {
+          get { return name_; }
+        }
+        
+        public const int DataFieldNumber = 2;
+        private bool hasData;
+        private int data_;
+        public bool HasData {
+          get { return hasData; }
+        }
+        public int Data {
+          get { return data_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasName) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          int size = SerializedSize;
+          string[] field_names = _integerVariableFieldNames;
+          if (hasName) {
+            output.WriteString(1, field_names[1], Name);
+          }
+          if (hasData) {
+            output.WriteInt32(2, field_names[0], Data);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (hasName) {
+              size += pb::CodedOutputStream.ComputeStringSize(1, Name);
+            }
+            if (hasData) {
+              size += pb::CodedOutputStream.ComputeInt32Size(2, Data);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static IntegerVariable ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static IntegerVariable ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static IntegerVariable ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static IntegerVariable ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static IntegerVariable ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static IntegerVariable ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static IntegerVariable ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static IntegerVariable ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static IntegerVariable ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static IntegerVariable ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private IntegerVariable MakeReadOnly() {
+          return this;
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(IntegerVariable prototype) {
+          return new Builder(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+        public sealed partial class Builder : pb::GeneratedBuilder<IntegerVariable, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(IntegerVariable cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+          
+          private bool resultIsReadOnly;
+          private IntegerVariable result;
+          
+          private IntegerVariable PrepareBuilder() {
+            if (resultIsReadOnly) {
+              IntegerVariable original = result;
+              result = new IntegerVariable();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+          
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+          
+          protected override IntegerVariable MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+          
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+          
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable.Descriptor; }
+          }
+          
+          public override IntegerVariable DefaultInstanceForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable.DefaultInstance; }
+          }
+          
+          public override IntegerVariable BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is IntegerVariable) {
+              return MergeFrom((IntegerVariable) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(IntegerVariable other) {
+            if (other == global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasName) {
+              Name = other.Name;
+            }
+            if (other.HasData) {
+              Data = other.Data;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_integerVariableFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _integerVariableFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 10: {
+                  result.hasName = input.ReadString(ref result.name_);
+                  break;
+                }
+                case 16: {
+                  result.hasData = input.ReadInt32(ref result.data_);
+                  break;
+                }
+              }
+            }
+            
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+          
+          
+          public bool HasName {
+            get { return result.hasName; }
+          }
+          public string Name {
+            get { return result.Name; }
+            set { SetName(value); }
+          }
+          public Builder SetName(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasName = true;
+            result.name_ = value;
+            return this;
+          }
+          public Builder ClearName() {
+            PrepareBuilder();
+            result.hasName = false;
+            result.name_ = "";
+            return this;
+          }
+          
+          public bool HasData {
+            get { return result.hasData; }
+          }
+          public int Data {
+            get { return result.Data; }
+            set { SetData(value); }
+          }
+          public Builder SetData(int value) {
+            PrepareBuilder();
+            result.hasData = true;
+            result.data_ = value;
+            return this;
+          }
+          public Builder ClearData() {
+            PrepareBuilder();
+            result.hasData = false;
+            result.data_ = 0;
+            return this;
+          }
+        }
+        static IntegerVariable() {
+          object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+        }
+      }
+      
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+      [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+      public sealed partial class IntegerArrayVariable : pb::GeneratedMessage<IntegerArrayVariable, IntegerArrayVariable.Builder> {
+        private IntegerArrayVariable() { }
+        private static readonly IntegerArrayVariable defaultInstance = new IntegerArrayVariable().MakeReadOnly();
+        private static readonly string[] _integerArrayVariableFieldNames = new string[] { "data", "length", "name" };
+        private static readonly uint[] _integerArrayVariableFieldTags = new uint[] { 16, 24, 10 };
+        public static IntegerArrayVariable DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override IntegerArrayVariable DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+        
+        protected override IntegerArrayVariable ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerArrayVariable__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<IntegerArrayVariable, IntegerArrayVariable.Builder> InternalFieldAccessors {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_IntegerArrayVariable__FieldAccessorTable; }
+        }
+        
+        public const int NameFieldNumber = 1;
+        private bool hasName;
+        private string name_ = "";
+        public bool HasName {
+          get { return hasName; }
+        }
+        public string Name {
+          get { return name_; }
+        }
+        
+        public const int DataFieldNumber = 2;
+        private pbc::PopsicleList<int> data_ = new pbc::PopsicleList<int>();
+        public scg::IList<int> DataList {
+          get { return pbc::Lists.AsReadOnly(data_); }
+        }
+        public int DataCount {
+          get { return data_.Count; }
+        }
+        public int GetData(int index) {
+          return data_[index];
+        }
+        
+        public const int LengthFieldNumber = 3;
+        private bool hasLength;
+        private int length_;
+        public bool HasLength {
+          get { return hasLength; }
+        }
+        public int Length {
+          get { return length_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasName) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          int size = SerializedSize;
+          string[] field_names = _integerArrayVariableFieldNames;
+          if (hasName) {
+            output.WriteString(1, field_names[2], Name);
+          }
+          if (data_.Count > 0) {
+            output.WriteInt32Array(2, field_names[0], data_);
+          }
+          if (hasLength) {
+            output.WriteInt32(3, field_names[1], Length);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (hasName) {
+              size += pb::CodedOutputStream.ComputeStringSize(1, Name);
+            }
+            {
+              int dataSize = 0;
+              foreach (int element in DataList) {
+                dataSize += pb::CodedOutputStream.ComputeInt32SizeNoTag(element);
+              }
+              size += dataSize;
+              size += 1 * data_.Count;
+            }
+            if (hasLength) {
+              size += pb::CodedOutputStream.ComputeInt32Size(3, Length);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static IntegerArrayVariable ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static IntegerArrayVariable ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static IntegerArrayVariable ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static IntegerArrayVariable ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static IntegerArrayVariable ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static IntegerArrayVariable ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static IntegerArrayVariable ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static IntegerArrayVariable ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static IntegerArrayVariable ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static IntegerArrayVariable ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private IntegerArrayVariable MakeReadOnly() {
+          data_.MakeReadOnly();
+          return this;
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(IntegerArrayVariable prototype) {
+          return new Builder(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+        public sealed partial class Builder : pb::GeneratedBuilder<IntegerArrayVariable, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(IntegerArrayVariable cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+          
+          private bool resultIsReadOnly;
+          private IntegerArrayVariable result;
+          
+          private IntegerArrayVariable PrepareBuilder() {
+            if (resultIsReadOnly) {
+              IntegerArrayVariable original = result;
+              result = new IntegerArrayVariable();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+          
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+          
+          protected override IntegerArrayVariable MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+          
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+          
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable.Descriptor; }
+          }
+          
+          public override IntegerArrayVariable DefaultInstanceForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable.DefaultInstance; }
+          }
+          
+          public override IntegerArrayVariable BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is IntegerArrayVariable) {
+              return MergeFrom((IntegerArrayVariable) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(IntegerArrayVariable other) {
+            if (other == global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasName) {
+              Name = other.Name;
+            }
+            if (other.data_.Count != 0) {
+              result.data_.Add(other.data_);
+            }
+            if (other.HasLength) {
+              Length = other.Length;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_integerArrayVariableFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _integerArrayVariableFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 10: {
+                  result.hasName = input.ReadString(ref result.name_);
+                  break;
+                }
+                case 18:
+                case 16: {
+                  input.ReadInt32Array(tag, field_name, result.data_);
+                  break;
+                }
+                case 24: {
+                  result.hasLength = input.ReadInt32(ref result.length_);
+                  break;
+                }
+              }
+            }
+            
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+          
+          
+          public bool HasName {
+            get { return result.hasName; }
+          }
+          public string Name {
+            get { return result.Name; }
+            set { SetName(value); }
+          }
+          public Builder SetName(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasName = true;
+            result.name_ = value;
+            return this;
+          }
+          public Builder ClearName() {
+            PrepareBuilder();
+            result.hasName = false;
+            result.name_ = "";
+            return this;
+          }
+          
+          public pbc::IPopsicleList<int> DataList {
+            get { return PrepareBuilder().data_; }
+          }
+          public int DataCount {
+            get { return result.DataCount; }
+          }
+          public int GetData(int index) {
+            return result.GetData(index);
+          }
+          public Builder SetData(int index, int value) {
+            PrepareBuilder();
+            result.data_[index] = value;
+            return this;
+          }
+          public Builder AddData(int value) {
+            PrepareBuilder();
+            result.data_.Add(value);
+            return this;
+          }
+          public Builder AddRangeData(scg::IEnumerable<int> values) {
+            PrepareBuilder();
+            result.data_.Add(values);
+            return this;
+          }
+          public Builder ClearData() {
+            PrepareBuilder();
+            result.data_.Clear();
+            return this;
+          }
+          
+          public bool HasLength {
+            get { return result.hasLength; }
+          }
+          public int Length {
+            get { return result.Length; }
+            set { SetLength(value); }
+          }
+          public Builder SetLength(int value) {
+            PrepareBuilder();
+            result.hasLength = true;
+            result.length_ = value;
+            return this;
+          }
+          public Builder ClearLength() {
+            PrepareBuilder();
+            result.hasLength = false;
+            result.length_ = 0;
+            return this;
+          }
+        }
+        static IntegerArrayVariable() {
+          object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+        }
+      }
+      
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+      [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+      public sealed partial class DoubleVariable : pb::GeneratedMessage<DoubleVariable, DoubleVariable.Builder> {
+        private DoubleVariable() { }
+        private static readonly DoubleVariable defaultInstance = new DoubleVariable().MakeReadOnly();
+        private static readonly string[] _doubleVariableFieldNames = new string[] { "data", "name" };
+        private static readonly uint[] _doubleVariableFieldTags = new uint[] { 17, 10 };
+        public static DoubleVariable DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override DoubleVariable DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+        
+        protected override DoubleVariable ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleVariable__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<DoubleVariable, DoubleVariable.Builder> InternalFieldAccessors {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleVariable__FieldAccessorTable; }
+        }
+        
+        public const int NameFieldNumber = 1;
+        private bool hasName;
+        private string name_ = "";
+        public bool HasName {
+          get { return hasName; }
+        }
+        public string Name {
+          get { return name_; }
+        }
+        
+        public const int DataFieldNumber = 2;
+        private bool hasData;
+        private double data_;
+        public bool HasData {
+          get { return hasData; }
+        }
+        public double Data {
+          get { return data_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasName) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          int size = SerializedSize;
+          string[] field_names = _doubleVariableFieldNames;
+          if (hasName) {
+            output.WriteString(1, field_names[1], Name);
+          }
+          if (hasData) {
+            output.WriteDouble(2, field_names[0], Data);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (hasName) {
+              size += pb::CodedOutputStream.ComputeStringSize(1, Name);
+            }
+            if (hasData) {
+              size += pb::CodedOutputStream.ComputeDoubleSize(2, Data);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static DoubleVariable ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static DoubleVariable ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static DoubleVariable ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static DoubleVariable ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static DoubleVariable ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static DoubleVariable ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static DoubleVariable ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static DoubleVariable ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static DoubleVariable ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static DoubleVariable ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private DoubleVariable MakeReadOnly() {
+          return this;
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(DoubleVariable prototype) {
+          return new Builder(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+        public sealed partial class Builder : pb::GeneratedBuilder<DoubleVariable, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(DoubleVariable cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+          
+          private bool resultIsReadOnly;
+          private DoubleVariable result;
+          
+          private DoubleVariable PrepareBuilder() {
+            if (resultIsReadOnly) {
+              DoubleVariable original = result;
+              result = new DoubleVariable();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+          
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+          
+          protected override DoubleVariable MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+          
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+          
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable.Descriptor; }
+          }
+          
+          public override DoubleVariable DefaultInstanceForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable.DefaultInstance; }
+          }
+          
+          public override DoubleVariable BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is DoubleVariable) {
+              return MergeFrom((DoubleVariable) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(DoubleVariable other) {
+            if (other == global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasName) {
+              Name = other.Name;
+            }
+            if (other.HasData) {
+              Data = other.Data;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_doubleVariableFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _doubleVariableFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 10: {
+                  result.hasName = input.ReadString(ref result.name_);
+                  break;
+                }
+                case 17: {
+                  result.hasData = input.ReadDouble(ref result.data_);
+                  break;
+                }
+              }
+            }
+            
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+          
+          
+          public bool HasName {
+            get { return result.hasName; }
+          }
+          public string Name {
+            get { return result.Name; }
+            set { SetName(value); }
+          }
+          public Builder SetName(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasName = true;
+            result.name_ = value;
+            return this;
+          }
+          public Builder ClearName() {
+            PrepareBuilder();
+            result.hasName = false;
+            result.name_ = "";
+            return this;
+          }
+          
+          public bool HasData {
+            get { return result.hasData; }
+          }
+          public double Data {
+            get { return result.Data; }
+            set { SetData(value); }
+          }
+          public Builder SetData(double value) {
+            PrepareBuilder();
+            result.hasData = true;
+            result.data_ = value;
+            return this;
+          }
+          public Builder ClearData() {
+            PrepareBuilder();
+            result.hasData = false;
+            result.data_ = 0D;
+            return this;
+          }
+        }
+        static DoubleVariable() {
+          object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+        }
+      }
+      
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+      [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+      public sealed partial class DoubleArrayVariable : pb::GeneratedMessage<DoubleArrayVariable, DoubleArrayVariable.Builder> {
+        private DoubleArrayVariable() { }
+        private static readonly DoubleArrayVariable defaultInstance = new DoubleArrayVariable().MakeReadOnly();
+        private static readonly string[] _doubleArrayVariableFieldNames = new string[] { "data", "length", "name" };
+        private static readonly uint[] _doubleArrayVariableFieldTags = new uint[] { 17, 24, 10 };
+        public static DoubleArrayVariable DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override DoubleArrayVariable DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+        
+        protected override DoubleArrayVariable ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleArrayVariable__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<DoubleArrayVariable, DoubleArrayVariable.Builder> InternalFieldAccessors {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_DoubleArrayVariable__FieldAccessorTable; }
+        }
+        
+        public const int NameFieldNumber = 1;
+        private bool hasName;
+        private string name_ = "";
+        public bool HasName {
+          get { return hasName; }
+        }
+        public string Name {
+          get { return name_; }
+        }
+        
+        public const int DataFieldNumber = 2;
+        private pbc::PopsicleList<double> data_ = new pbc::PopsicleList<double>();
+        public scg::IList<double> DataList {
+          get { return pbc::Lists.AsReadOnly(data_); }
+        }
+        public int DataCount {
+          get { return data_.Count; }
+        }
+        public double GetData(int index) {
+          return data_[index];
+        }
+        
+        public const int LengthFieldNumber = 3;
+        private bool hasLength;
+        private int length_;
+        public bool HasLength {
+          get { return hasLength; }
+        }
+        public int Length {
+          get { return length_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasName) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          int size = SerializedSize;
+          string[] field_names = _doubleArrayVariableFieldNames;
+          if (hasName) {
+            output.WriteString(1, field_names[2], Name);
+          }
+          if (data_.Count > 0) {
+            output.WriteDoubleArray(2, field_names[0], data_);
+          }
+          if (hasLength) {
+            output.WriteInt32(3, field_names[1], Length);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (hasName) {
+              size += pb::CodedOutputStream.ComputeStringSize(1, Name);
+            }
+            {
+              int dataSize = 0;
+              dataSize = 8 * data_.Count;
+              size += dataSize;
+              size += 1 * data_.Count;
+            }
+            if (hasLength) {
+              size += pb::CodedOutputStream.ComputeInt32Size(3, Length);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static DoubleArrayVariable ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static DoubleArrayVariable ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static DoubleArrayVariable ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static DoubleArrayVariable ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static DoubleArrayVariable ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static DoubleArrayVariable ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static DoubleArrayVariable ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static DoubleArrayVariable ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static DoubleArrayVariable ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static DoubleArrayVariable ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private DoubleArrayVariable MakeReadOnly() {
+          data_.MakeReadOnly();
+          return this;
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(DoubleArrayVariable prototype) {
+          return new Builder(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+        public sealed partial class Builder : pb::GeneratedBuilder<DoubleArrayVariable, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(DoubleArrayVariable cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+          
+          private bool resultIsReadOnly;
+          private DoubleArrayVariable result;
+          
+          private DoubleArrayVariable PrepareBuilder() {
+            if (resultIsReadOnly) {
+              DoubleArrayVariable original = result;
+              result = new DoubleArrayVariable();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+          
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+          
+          protected override DoubleArrayVariable MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+          
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+          
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable.Descriptor; }
+          }
+          
+          public override DoubleArrayVariable DefaultInstanceForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable.DefaultInstance; }
+          }
+          
+          public override DoubleArrayVariable BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is DoubleArrayVariable) {
+              return MergeFrom((DoubleArrayVariable) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(DoubleArrayVariable other) {
+            if (other == global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasName) {
+              Name = other.Name;
+            }
+            if (other.data_.Count != 0) {
+              result.data_.Add(other.data_);
+            }
+            if (other.HasLength) {
+              Length = other.Length;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_doubleArrayVariableFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _doubleArrayVariableFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 10: {
+                  result.hasName = input.ReadString(ref result.name_);
+                  break;
+                }
+                case 18:
+                case 17: {
+                  input.ReadDoubleArray(tag, field_name, result.data_);
+                  break;
+                }
+                case 24: {
+                  result.hasLength = input.ReadInt32(ref result.length_);
+                  break;
+                }
+              }
+            }
+            
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+          
+          
+          public bool HasName {
+            get { return result.hasName; }
+          }
+          public string Name {
+            get { return result.Name; }
+            set { SetName(value); }
+          }
+          public Builder SetName(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasName = true;
+            result.name_ = value;
+            return this;
+          }
+          public Builder ClearName() {
+            PrepareBuilder();
+            result.hasName = false;
+            result.name_ = "";
+            return this;
+          }
+          
+          public pbc::IPopsicleList<double> DataList {
+            get { return PrepareBuilder().data_; }
+          }
+          public int DataCount {
+            get { return result.DataCount; }
+          }
+          public double GetData(int index) {
+            return result.GetData(index);
+          }
+          public Builder SetData(int index, double value) {
+            PrepareBuilder();
+            result.data_[index] = value;
+            return this;
+          }
+          public Builder AddData(double value) {
+            PrepareBuilder();
+            result.data_.Add(value);
+            return this;
+          }
+          public Builder AddRangeData(scg::IEnumerable<double> values) {
+            PrepareBuilder();
+            result.data_.Add(values);
+            return this;
+          }
+          public Builder ClearData() {
+            PrepareBuilder();
+            result.data_.Clear();
+            return this;
+          }
+          
+          public bool HasLength {
+            get { return result.hasLength; }
+          }
+          public int Length {
+            get { return result.Length; }
+            set { SetLength(value); }
+          }
+          public Builder SetLength(int value) {
+            PrepareBuilder();
+            result.hasLength = true;
+            result.length_ = value;
+            return this;
+          }
+          public Builder ClearLength() {
+            PrepareBuilder();
+            result.hasLength = false;
+            result.length_ = 0;
+            return this;
+          }
+        }
+        static DoubleArrayVariable() {
+          object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+        }
+      }
+      
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+      [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+      public sealed partial class BoolVariable : pb::GeneratedMessage<BoolVariable, BoolVariable.Builder> {
+        private BoolVariable() { }
+        private static readonly BoolVariable defaultInstance = new BoolVariable().MakeReadOnly();
+        private static readonly string[] _boolVariableFieldNames = new string[] { "data", "name" };
+        private static readonly uint[] _boolVariableFieldTags = new uint[] { 16, 10 };
+        public static BoolVariable DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override BoolVariable DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+        
+        protected override BoolVariable ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolVariable__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<BoolVariable, BoolVariable.Builder> InternalFieldAccessors {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolVariable__FieldAccessorTable; }
+        }
+        
+        public const int NameFieldNumber = 1;
+        private bool hasName;
+        private string name_ = "";
+        public bool HasName {
+          get { return hasName; }
+        }
+        public string Name {
+          get { return name_; }
+        }
+        
+        public const int DataFieldNumber = 2;
+        private bool hasData;
+        private bool data_;
+        public bool HasData {
+          get { return hasData; }
+        }
+        public bool Data {
+          get { return data_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasName) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          int size = SerializedSize;
+          string[] field_names = _boolVariableFieldNames;
+          if (hasName) {
+            output.WriteString(1, field_names[1], Name);
+          }
+          if (hasData) {
+            output.WriteBool(2, field_names[0], Data);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (hasName) {
+              size += pb::CodedOutputStream.ComputeStringSize(1, Name);
+            }
+            if (hasData) {
+              size += pb::CodedOutputStream.ComputeBoolSize(2, Data);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static BoolVariable ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static BoolVariable ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static BoolVariable ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static BoolVariable ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static BoolVariable ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static BoolVariable ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static BoolVariable ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static BoolVariable ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static BoolVariable ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static BoolVariable ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private BoolVariable MakeReadOnly() {
+          return this;
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(BoolVariable prototype) {
+          return new Builder(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+        public sealed partial class Builder : pb::GeneratedBuilder<BoolVariable, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(BoolVariable cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+          
+          private bool resultIsReadOnly;
+          private BoolVariable result;
+          
+          private BoolVariable PrepareBuilder() {
+            if (resultIsReadOnly) {
+              BoolVariable original = result;
+              result = new BoolVariable();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+          
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+          
+          protected override BoolVariable MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+          
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+          
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable.Descriptor; }
+          }
+          
+          public override BoolVariable DefaultInstanceForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable.DefaultInstance; }
+          }
+          
+          public override BoolVariable BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is BoolVariable) {
+              return MergeFrom((BoolVariable) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(BoolVariable other) {
+            if (other == global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasName) {
+              Name = other.Name;
+            }
+            if (other.HasData) {
+              Data = other.Data;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_boolVariableFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _boolVariableFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 10: {
+                  result.hasName = input.ReadString(ref result.name_);
+                  break;
+                }
+                case 16: {
+                  result.hasData = input.ReadBool(ref result.data_);
+                  break;
+                }
+              }
+            }
+            
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+          
+          
+          public bool HasName {
+            get { return result.hasName; }
+          }
+          public string Name {
+            get { return result.Name; }
+            set { SetName(value); }
+          }
+          public Builder SetName(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasName = true;
+            result.name_ = value;
+            return this;
+          }
+          public Builder ClearName() {
+            PrepareBuilder();
+            result.hasName = false;
+            result.name_ = "";
+            return this;
+          }
+          
+          public bool HasData {
+            get { return result.hasData; }
+          }
+          public bool Data {
+            get { return result.Data; }
+            set { SetData(value); }
+          }
+          public Builder SetData(bool value) {
+            PrepareBuilder();
+            result.hasData = true;
+            result.data_ = value;
+            return this;
+          }
+          public Builder ClearData() {
+            PrepareBuilder();
+            result.hasData = false;
+            result.data_ = false;
+            return this;
+          }
+        }
+        static BoolVariable() {
+          object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+        }
+      }
+      
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+      [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+      public sealed partial class BoolArrayVariable : pb::GeneratedMessage<BoolArrayVariable, BoolArrayVariable.Builder> {
+        private BoolArrayVariable() { }
+        private static readonly BoolArrayVariable defaultInstance = new BoolArrayVariable().MakeReadOnly();
+        private static readonly string[] _boolArrayVariableFieldNames = new string[] { "data", "length", "name" };
+        private static readonly uint[] _boolArrayVariableFieldTags = new uint[] { 16, 24, 10 };
+        public static BoolArrayVariable DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override BoolArrayVariable DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+        
+        protected override BoolArrayVariable ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolArrayVariable__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<BoolArrayVariable, BoolArrayVariable.Builder> InternalFieldAccessors {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_BoolArrayVariable__FieldAccessorTable; }
+        }
+        
+        public const int NameFieldNumber = 1;
+        private bool hasName;
+        private string name_ = "";
+        public bool HasName {
+          get { return hasName; }
+        }
+        public string Name {
+          get { return name_; }
+        }
+        
+        public const int DataFieldNumber = 2;
+        private pbc::PopsicleList<bool> data_ = new pbc::PopsicleList<bool>();
+        public scg::IList<bool> DataList {
+          get { return pbc::Lists.AsReadOnly(data_); }
+        }
+        public int DataCount {
+          get { return data_.Count; }
+        }
+        public bool GetData(int index) {
+          return data_[index];
+        }
+        
+        public const int LengthFieldNumber = 3;
+        private bool hasLength;
+        private int length_;
+        public bool HasLength {
+          get { return hasLength; }
+        }
+        public int Length {
+          get { return length_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasName) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          int size = SerializedSize;
+          string[] field_names = _boolArrayVariableFieldNames;
+          if (hasName) {
+            output.WriteString(1, field_names[2], Name);
+          }
+          if (data_.Count > 0) {
+            output.WriteBoolArray(2, field_names[0], data_);
+          }
+          if (hasLength) {
+            output.WriteInt32(3, field_names[1], Length);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (hasName) {
+              size += pb::CodedOutputStream.ComputeStringSize(1, Name);
+            }
+            {
+              int dataSize = 0;
+              dataSize = 1 * data_.Count;
+              size += dataSize;
+              size += 1 * data_.Count;
+            }
+            if (hasLength) {
+              size += pb::CodedOutputStream.ComputeInt32Size(3, Length);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static BoolArrayVariable ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static BoolArrayVariable ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static BoolArrayVariable ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static BoolArrayVariable ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static BoolArrayVariable ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static BoolArrayVariable ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static BoolArrayVariable ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static BoolArrayVariable ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static BoolArrayVariable ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static BoolArrayVariable ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private BoolArrayVariable MakeReadOnly() {
+          data_.MakeReadOnly();
+          return this;
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(BoolArrayVariable prototype) {
+          return new Builder(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+        public sealed partial class Builder : pb::GeneratedBuilder<BoolArrayVariable, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(BoolArrayVariable cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+          
+          private bool resultIsReadOnly;
+          private BoolArrayVariable result;
+          
+          private BoolArrayVariable PrepareBuilder() {
+            if (resultIsReadOnly) {
+              BoolArrayVariable original = result;
+              result = new BoolArrayVariable();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+          
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+          
+          protected override BoolArrayVariable MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+          
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+          
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable.Descriptor; }
+          }
+          
+          public override BoolArrayVariable DefaultInstanceForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable.DefaultInstance; }
+          }
+          
+          public override BoolArrayVariable BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is BoolArrayVariable) {
+              return MergeFrom((BoolArrayVariable) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(BoolArrayVariable other) {
+            if (other == global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasName) {
+              Name = other.Name;
+            }
+            if (other.data_.Count != 0) {
+              result.data_.Add(other.data_);
+            }
+            if (other.HasLength) {
+              Length = other.Length;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_boolArrayVariableFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _boolArrayVariableFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 10: {
+                  result.hasName = input.ReadString(ref result.name_);
+                  break;
+                }
+                case 18:
+                case 16: {
+                  input.ReadBoolArray(tag, field_name, result.data_);
+                  break;
+                }
+                case 24: {
+                  result.hasLength = input.ReadInt32(ref result.length_);
+                  break;
+                }
+              }
+            }
+            
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+          
+          
+          public bool HasName {
+            get { return result.hasName; }
+          }
+          public string Name {
+            get { return result.Name; }
+            set { SetName(value); }
+          }
+          public Builder SetName(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasName = true;
+            result.name_ = value;
+            return this;
+          }
+          public Builder ClearName() {
+            PrepareBuilder();
+            result.hasName = false;
+            result.name_ = "";
+            return this;
+          }
+          
+          public pbc::IPopsicleList<bool> DataList {
+            get { return PrepareBuilder().data_; }
+          }
+          public int DataCount {
+            get { return result.DataCount; }
+          }
+          public bool GetData(int index) {
+            return result.GetData(index);
+          }
+          public Builder SetData(int index, bool value) {
+            PrepareBuilder();
+            result.data_[index] = value;
+            return this;
+          }
+          public Builder AddData(bool value) {
+            PrepareBuilder();
+            result.data_.Add(value);
+            return this;
+          }
+          public Builder AddRangeData(scg::IEnumerable<bool> values) {
+            PrepareBuilder();
+            result.data_.Add(values);
+            return this;
+          }
+          public Builder ClearData() {
+            PrepareBuilder();
+            result.data_.Clear();
+            return this;
+          }
+          
+          public bool HasLength {
+            get { return result.hasLength; }
+          }
+          public int Length {
+            get { return result.Length; }
+            set { SetLength(value); }
+          }
+          public Builder SetLength(int value) {
+            PrepareBuilder();
+            result.hasLength = true;
+            result.length_ = value;
+            return this;
+          }
+          public Builder ClearLength() {
+            PrepareBuilder();
+            result.hasLength = false;
+            result.length_ = 0;
+            return this;
+          }
+        }
+        static BoolArrayVariable() {
+          object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+        }
+      }
+      
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+      [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+      public sealed partial class StringVariable : pb::GeneratedMessage<StringVariable, StringVariable.Builder> {
+        private StringVariable() { }
+        private static readonly StringVariable defaultInstance = new StringVariable().MakeReadOnly();
+        private static readonly string[] _stringVariableFieldNames = new string[] { "data", "name" };
+        private static readonly uint[] _stringVariableFieldTags = new uint[] { 18, 10 };
+        public static StringVariable DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override StringVariable DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+        
+        protected override StringVariable ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringVariable__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<StringVariable, StringVariable.Builder> InternalFieldAccessors {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringVariable__FieldAccessorTable; }
+        }
+        
+        public const int NameFieldNumber = 1;
+        private bool hasName;
+        private string name_ = "";
+        public bool HasName {
+          get { return hasName; }
+        }
+        public string Name {
+          get { return name_; }
+        }
+        
+        public const int DataFieldNumber = 2;
+        private bool hasData;
+        private string data_ = "";
+        public bool HasData {
+          get { return hasData; }
+        }
+        public string Data {
+          get { return data_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasName) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          int size = SerializedSize;
+          string[] field_names = _stringVariableFieldNames;
+          if (hasName) {
+            output.WriteString(1, field_names[1], Name);
+          }
+          if (hasData) {
+            output.WriteString(2, field_names[0], Data);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (hasName) {
+              size += pb::CodedOutputStream.ComputeStringSize(1, Name);
+            }
+            if (hasData) {
+              size += pb::CodedOutputStream.ComputeStringSize(2, Data);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static StringVariable ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static StringVariable ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static StringVariable ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static StringVariable ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static StringVariable ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static StringVariable ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static StringVariable ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static StringVariable ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static StringVariable ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static StringVariable ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private StringVariable MakeReadOnly() {
+          return this;
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(StringVariable prototype) {
+          return new Builder(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+        public sealed partial class Builder : pb::GeneratedBuilder<StringVariable, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(StringVariable cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+          
+          private bool resultIsReadOnly;
+          private StringVariable result;
+          
+          private StringVariable PrepareBuilder() {
+            if (resultIsReadOnly) {
+              StringVariable original = result;
+              result = new StringVariable();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+          
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+          
+          protected override StringVariable MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+          
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+          
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable.Descriptor; }
+          }
+          
+          public override StringVariable DefaultInstanceForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable.DefaultInstance; }
+          }
+          
+          public override StringVariable BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is StringVariable) {
+              return MergeFrom((StringVariable) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(StringVariable other) {
+            if (other == global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasName) {
+              Name = other.Name;
+            }
+            if (other.HasData) {
+              Data = other.Data;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_stringVariableFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _stringVariableFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 10: {
+                  result.hasName = input.ReadString(ref result.name_);
+                  break;
+                }
+                case 18: {
+                  result.hasData = input.ReadString(ref result.data_);
+                  break;
+                }
+              }
+            }
+            
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+          
+          
+          public bool HasName {
+            get { return result.hasName; }
+          }
+          public string Name {
+            get { return result.Name; }
+            set { SetName(value); }
+          }
+          public Builder SetName(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasName = true;
+            result.name_ = value;
+            return this;
+          }
+          public Builder ClearName() {
+            PrepareBuilder();
+            result.hasName = false;
+            result.name_ = "";
+            return this;
+          }
+          
+          public bool HasData {
+            get { return result.hasData; }
+          }
+          public string Data {
+            get { return result.Data; }
+            set { SetData(value); }
+          }
+          public Builder SetData(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasData = true;
+            result.data_ = value;
+            return this;
+          }
+          public Builder ClearData() {
+            PrepareBuilder();
+            result.hasData = false;
+            result.data_ = "";
+            return this;
+          }
+        }
+        static StringVariable() {
+          object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+        }
+      }
+      
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+      [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+      public sealed partial class StringArrayVariable : pb::GeneratedMessage<StringArrayVariable, StringArrayVariable.Builder> {
+        private StringArrayVariable() { }
+        private static readonly StringArrayVariable defaultInstance = new StringArrayVariable().MakeReadOnly();
+        private static readonly string[] _stringArrayVariableFieldNames = new string[] { "data", "length", "name" };
+        private static readonly uint[] _stringArrayVariableFieldTags = new uint[] { 18, 24, 10 };
+        public static StringArrayVariable DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override StringArrayVariable DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+        
+        protected override StringArrayVariable ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringArrayVariable__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<StringArrayVariable, StringArrayVariable.Builder> InternalFieldAccessors {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_StringArrayVariable__FieldAccessorTable; }
+        }
+        
+        public const int NameFieldNumber = 1;
+        private bool hasName;
+        private string name_ = "";
+        public bool HasName {
+          get { return hasName; }
+        }
+        public string Name {
+          get { return name_; }
+        }
+        
+        public const int DataFieldNumber = 2;
+        private pbc::PopsicleList<string> data_ = new pbc::PopsicleList<string>();
+        public scg::IList<string> DataList {
+          get { return pbc::Lists.AsReadOnly(data_); }
+        }
+        public int DataCount {
+          get { return data_.Count; }
+        }
+        public string GetData(int index) {
+          return data_[index];
+        }
+        
+        public const int LengthFieldNumber = 3;
+        private bool hasLength;
+        private int length_;
+        public bool HasLength {
+          get { return hasLength; }
+        }
+        public int Length {
+          get { return length_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasName) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          int size = SerializedSize;
+          string[] field_names = _stringArrayVariableFieldNames;
+          if (hasName) {
+            output.WriteString(1, field_names[2], Name);
+          }
+          if (data_.Count > 0) {
+            output.WriteStringArray(2, field_names[0], data_);
+          }
+          if (hasLength) {
+            output.WriteInt32(3, field_names[1], Length);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (hasName) {
+              size += pb::CodedOutputStream.ComputeStringSize(1, Name);
+            }
+            {
+              int dataSize = 0;
+              foreach (string element in DataList) {
+                dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+              }
+              size += dataSize;
+              size += 1 * data_.Count;
+            }
+            if (hasLength) {
+              size += pb::CodedOutputStream.ComputeInt32Size(3, Length);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static StringArrayVariable ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static StringArrayVariable ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static StringArrayVariable ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static StringArrayVariable ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static StringArrayVariable ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static StringArrayVariable ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static StringArrayVariable ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static StringArrayVariable ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static StringArrayVariable ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static StringArrayVariable ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private StringArrayVariable MakeReadOnly() {
+          data_.MakeReadOnly();
+          return this;
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(StringArrayVariable prototype) {
+          return new Builder(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+        public sealed partial class Builder : pb::GeneratedBuilder<StringArrayVariable, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(StringArrayVariable cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+          
+          private bool resultIsReadOnly;
+          private StringArrayVariable result;
+          
+          private StringArrayVariable PrepareBuilder() {
+            if (resultIsReadOnly) {
+              StringArrayVariable original = result;
+              result = new StringArrayVariable();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+          
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+          
+          protected override StringArrayVariable MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+          
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+          
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable.Descriptor; }
+          }
+          
+          public override StringArrayVariable DefaultInstanceForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable.DefaultInstance; }
+          }
+          
+          public override StringArrayVariable BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is StringArrayVariable) {
+              return MergeFrom((StringArrayVariable) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(StringArrayVariable other) {
+            if (other == global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasName) {
+              Name = other.Name;
+            }
+            if (other.data_.Count != 0) {
+              result.data_.Add(other.data_);
+            }
+            if (other.HasLength) {
+              Length = other.Length;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_stringArrayVariableFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _stringArrayVariableFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 10: {
+                  result.hasName = input.ReadString(ref result.name_);
+                  break;
+                }
+                case 18: {
+                  input.ReadStringArray(tag, field_name, result.data_);
+                  break;
+                }
+                case 24: {
+                  result.hasLength = input.ReadInt32(ref result.length_);
+                  break;
+                }
+              }
+            }
+            
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+          
+          
+          public bool HasName {
+            get { return result.hasName; }
+          }
+          public string Name {
+            get { return result.Name; }
+            set { SetName(value); }
+          }
+          public Builder SetName(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasName = true;
+            result.name_ = value;
+            return this;
+          }
+          public Builder ClearName() {
+            PrepareBuilder();
+            result.hasName = false;
+            result.name_ = "";
+            return this;
+          }
+          
+          public pbc::IPopsicleList<string> DataList {
+            get { return PrepareBuilder().data_; }
+          }
+          public int DataCount {
+            get { return result.DataCount; }
+          }
+          public string GetData(int index) {
+            return result.GetData(index);
+          }
+          public Builder SetData(int index, string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.data_[index] = value;
+            return this;
+          }
+          public Builder AddData(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.data_.Add(value);
+            return this;
+          }
+          public Builder AddRangeData(scg::IEnumerable<string> values) {
+            PrepareBuilder();
+            result.data_.Add(values);
+            return this;
+          }
+          public Builder ClearData() {
+            PrepareBuilder();
+            result.data_.Clear();
+            return this;
+          }
+          
+          public bool HasLength {
+            get { return result.hasLength; }
+          }
+          public int Length {
+            get { return result.Length; }
+            set { SetLength(value); }
+          }
+          public Builder SetLength(int value) {
+            PrepareBuilder();
+            result.hasLength = true;
+            result.length_ = value;
+            return this;
+          }
+          public Builder ClearLength() {
+            PrepareBuilder();
+            result.hasLength = false;
+            result.length_ = 0;
+            return this;
+          }
+        }
+        static StringArrayVariable() {
+          object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+        }
+      }
+      
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+      [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+      public sealed partial class RawVariable : pb::GeneratedMessage<RawVariable, RawVariable.Builder> {
+        private RawVariable() { }
+        private static readonly RawVariable defaultInstance = new RawVariable().MakeReadOnly();
+        private static readonly string[] _rawVariableFieldNames = new string[] { "data", "name" };
+        private static readonly uint[] _rawVariableFieldTags = new uint[] { 18, 10 };
+        public static RawVariable DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override RawVariable DefaultInstanceForType {
+          get { return DefaultInstance; }
+        }
+        
+        protected override RawVariable ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_RawVariable__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<RawVariable, RawVariable.Builder> InternalFieldAccessors {
+          get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_SolutionMessage_RawVariable__FieldAccessorTable; }
+        }
+        
+        public const int NameFieldNumber = 1;
+        private bool hasName;
+        private string name_ = "";
+        public bool HasName {
+          get { return hasName; }
+        }
+        public string Name {
+          get { return name_; }
+        }
+        
+        public const int DataFieldNumber = 2;
+        private bool hasData;
+        private pb::ByteString data_ = pb::ByteString.Empty;
+        public bool HasData {
+          get { return hasData; }
+        }
+        public pb::ByteString Data {
+          get { return data_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasName) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::ICodedOutputStream output) {
+          int size = SerializedSize;
+          string[] field_names = _rawVariableFieldNames;
+          if (hasName) {
+            output.WriteString(1, field_names[1], Name);
+          }
+          if (hasData) {
+            output.WriteBytes(2, field_names[0], Data);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (hasName) {
+              size += pb::CodedOutputStream.ComputeStringSize(1, Name);
+            }
+            if (hasData) {
+              size += pb::CodedOutputStream.ComputeBytesSize(2, Data);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static RawVariable ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static RawVariable ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static RawVariable ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static RawVariable ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static RawVariable ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static RawVariable ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static RawVariable ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static RawVariable ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static RawVariable ParseFrom(pb::ICodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static RawVariable ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        private RawVariable MakeReadOnly() {
+          return this;
+        }
+        
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(RawVariable prototype) {
+          return new Builder(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+        public sealed partial class Builder : pb::GeneratedBuilder<RawVariable, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+          }
+          internal Builder(RawVariable cloneFrom) {
+            result = cloneFrom;
+            resultIsReadOnly = true;
+          }
+          
+          private bool resultIsReadOnly;
+          private RawVariable result;
+          
+          private RawVariable PrepareBuilder() {
+            if (resultIsReadOnly) {
+              RawVariable original = result;
+              result = new RawVariable();
+              resultIsReadOnly = false;
+              MergeFrom(original);
+            }
+            return result;
+          }
+          
+          public override bool IsInitialized {
+            get { return result.IsInitialized; }
+          }
+          
+          protected override RawVariable MessageBeingBuilt {
+            get { return PrepareBuilder(); }
+          }
+          
+          public override Builder Clear() {
+            result = DefaultInstance;
+            resultIsReadOnly = true;
+            return this;
+          }
+          
+          public override Builder Clone() {
+            if (resultIsReadOnly) {
+              return new Builder(result);
+            } else {
+              return new Builder().MergeFrom(result);
+            }
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable.Descriptor; }
+          }
+          
+          public override RawVariable DefaultInstanceForType {
+            get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable.DefaultInstance; }
+          }
+          
+          public override RawVariable BuildPartial() {
+            if (resultIsReadOnly) {
+              return result;
+            }
+            resultIsReadOnly = true;
+            return result.MakeReadOnly();
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is RawVariable) {
+              return MergeFrom((RawVariable) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(RawVariable other) {
+            if (other == global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable.DefaultInstance) return this;
+            PrepareBuilder();
+            if (other.HasName) {
+              Name = other.Name;
+            }
+            if (other.HasData) {
+              Data = other.Data;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            PrepareBuilder();
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            uint tag;
+            string field_name;
+            while (input.ReadTag(out tag, out field_name)) {
+              if(tag == 0 && field_name != null) {
+                int field_ordinal = global::System.Array.BinarySearch(_rawVariableFieldNames, field_name, global::System.StringComparer.Ordinal);
+                if(field_ordinal >= 0)
+                  tag = _rawVariableFieldTags[field_ordinal];
+                else {
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  continue;
+                }
+              }
+              switch (tag) {
+                case 0: {
+                  throw pb::InvalidProtocolBufferException.InvalidTag();
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+                  break;
+                }
+                case 10: {
+                  result.hasName = input.ReadString(ref result.name_);
+                  break;
+                }
+                case 18: {
+                  result.hasData = input.ReadBytes(ref result.data_);
+                  break;
+                }
+              }
+            }
+            
+            if (unknownFields != null) {
+              this.UnknownFields = unknownFields.Build();
+            }
+            return this;
+          }
+          
+          
+          public bool HasName {
+            get { return result.hasName; }
+          }
+          public string Name {
+            get { return result.Name; }
+            set { SetName(value); }
+          }
+          public Builder SetName(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasName = true;
+            result.name_ = value;
+            return this;
+          }
+          public Builder ClearName() {
+            PrepareBuilder();
+            result.hasName = false;
+            result.name_ = "";
+            return this;
+          }
+          
+          public bool HasData {
+            get { return result.hasData; }
+          }
+          public pb::ByteString Data {
+            get { return result.Data; }
+            set { SetData(value); }
+          }
+          public Builder SetData(pb::ByteString value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            PrepareBuilder();
+            result.hasData = true;
+            result.data_ = value;
+            return this;
+          }
+          public Builder ClearData() {
+            PrepareBuilder();
+            result.hasData = false;
+            result.data_ = pb::ByteString.Empty;
+            return this;
+          }
+        }
+        static RawVariable() {
+          object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+        }
+      }
+      
+    }
+    #endregion
+    
+    public const int SolutionIdFieldNumber = 1;
+    private bool hasSolutionId;
+    private int solutionId_;
+    public bool HasSolutionId {
+      get { return hasSolutionId; }
+    }
+    public int SolutionId {
+      get { return solutionId_; }
+    }
+    
+    public const int IntegerVarsFieldNumber = 2;
+    private pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable> integerVars_ = new pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable>();
+    public scg::IList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable> IntegerVarsList {
+      get { return integerVars_; }
+    }
+    public int IntegerVarsCount {
+      get { return integerVars_.Count; }
+    }
+    public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable GetIntegerVars(int index) {
+      return integerVars_[index];
+    }
+    
+    public const int IntegerArrayVarsFieldNumber = 3;
+    private pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable> integerArrayVars_ = new pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable>();
+    public scg::IList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable> IntegerArrayVarsList {
+      get { return integerArrayVars_; }
+    }
+    public int IntegerArrayVarsCount {
+      get { return integerArrayVars_.Count; }
+    }
+    public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable GetIntegerArrayVars(int index) {
+      return integerArrayVars_[index];
+    }
+    
+    public const int DoubleVarsFieldNumber = 4;
+    private pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable> doubleVars_ = new pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable>();
+    public scg::IList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable> DoubleVarsList {
+      get { return doubleVars_; }
+    }
+    public int DoubleVarsCount {
+      get { return doubleVars_.Count; }
+    }
+    public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable GetDoubleVars(int index) {
+      return doubleVars_[index];
+    }
+    
+    public const int DoubleArrayVarsFieldNumber = 5;
+    private pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable> doubleArrayVars_ = new pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable>();
+    public scg::IList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable> DoubleArrayVarsList {
+      get { return doubleArrayVars_; }
+    }
+    public int DoubleArrayVarsCount {
+      get { return doubleArrayVars_.Count; }
+    }
+    public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable GetDoubleArrayVars(int index) {
+      return doubleArrayVars_[index];
+    }
+    
+    public const int BoolVarsFieldNumber = 6;
+    private pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable> boolVars_ = new pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable>();
+    public scg::IList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable> BoolVarsList {
+      get { return boolVars_; }
+    }
+    public int BoolVarsCount {
+      get { return boolVars_.Count; }
+    }
+    public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable GetBoolVars(int index) {
+      return boolVars_[index];
+    }
+    
+    public const int BoolArrayVarsFieldNumber = 7;
+    private pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable> boolArrayVars_ = new pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable>();
+    public scg::IList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable> BoolArrayVarsList {
+      get { return boolArrayVars_; }
+    }
+    public int BoolArrayVarsCount {
+      get { return boolArrayVars_.Count; }
+    }
+    public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable GetBoolArrayVars(int index) {
+      return boolArrayVars_[index];
+    }
+    
+    public const int StringVarsFieldNumber = 8;
+    private pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable> stringVars_ = new pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable>();
+    public scg::IList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable> StringVarsList {
+      get { return stringVars_; }
+    }
+    public int StringVarsCount {
+      get { return stringVars_.Count; }
+    }
+    public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable GetStringVars(int index) {
+      return stringVars_[index];
+    }
+    
+    public const int StringArrayVarsFieldNumber = 9;
+    private pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable> stringArrayVars_ = new pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable>();
+    public scg::IList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable> StringArrayVarsList {
+      get { return stringArrayVars_; }
+    }
+    public int StringArrayVarsCount {
+      get { return stringArrayVars_.Count; }
+    }
+    public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable GetStringArrayVars(int index) {
+      return stringArrayVars_[index];
+    }
+    
+    public const int RawVarsFieldNumber = 10;
+    private pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable> rawVars_ = new pbc::PopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable>();
+    public scg::IList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable> RawVarsList {
+      get { return rawVars_; }
+    }
+    public int RawVarsCount {
+      get { return rawVars_.Count; }
+    }
+    public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable GetRawVars(int index) {
+      return rawVars_[index];
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (!hasSolutionId) return false;
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable element in IntegerVarsList) {
+          if (!element.IsInitialized) return false;
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable element in IntegerArrayVarsList) {
+          if (!element.IsInitialized) return false;
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable element in DoubleVarsList) {
+          if (!element.IsInitialized) return false;
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable element in DoubleArrayVarsList) {
+          if (!element.IsInitialized) return false;
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable element in BoolVarsList) {
+          if (!element.IsInitialized) return false;
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable element in BoolArrayVarsList) {
+          if (!element.IsInitialized) return false;
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable element in StringVarsList) {
+          if (!element.IsInitialized) return false;
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable element in StringArrayVarsList) {
+          if (!element.IsInitialized) return false;
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable element in RawVarsList) {
+          if (!element.IsInitialized) return false;
+        }
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      int size = SerializedSize;
+      string[] field_names = _solutionMessageFieldNames;
+      if (hasSolutionId) {
+        output.WriteInt32(1, field_names[7], SolutionId);
+      }
+      if (integerVars_.Count > 0) {
+        output.WriteMessageArray(2, field_names[5], integerVars_);
+      }
+      if (integerArrayVars_.Count > 0) {
+        output.WriteMessageArray(3, field_names[4], integerArrayVars_);
+      }
+      if (doubleVars_.Count > 0) {
+        output.WriteMessageArray(4, field_names[3], doubleVars_);
+      }
+      if (doubleArrayVars_.Count > 0) {
+        output.WriteMessageArray(5, field_names[2], doubleArrayVars_);
+      }
+      if (boolVars_.Count > 0) {
+        output.WriteMessageArray(6, field_names[1], boolVars_);
+      }
+      if (boolArrayVars_.Count > 0) {
+        output.WriteMessageArray(7, field_names[0], boolArrayVars_);
+      }
+      if (stringVars_.Count > 0) {
+        output.WriteMessageArray(8, field_names[9], stringVars_);
+      }
+      if (stringArrayVars_.Count > 0) {
+        output.WriteMessageArray(9, field_names[8], stringArrayVars_);
+      }
+      if (rawVars_.Count > 0) {
+        output.WriteMessageArray(10, field_names[6], rawVars_);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (hasSolutionId) {
+          size += pb::CodedOutputStream.ComputeInt32Size(1, SolutionId);
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable element in IntegerVarsList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(2, element);
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable element in IntegerArrayVarsList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(3, element);
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable element in DoubleVarsList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(4, element);
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable element in DoubleArrayVarsList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(5, element);
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable element in BoolVarsList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(6, element);
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable element in BoolArrayVarsList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(7, element);
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable element in StringVarsList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(8, element);
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable element in StringArrayVarsList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(9, element);
+        }
+        foreach (global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable element in RawVarsList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(10, element);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static SolutionMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SolutionMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SolutionMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SolutionMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SolutionMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SolutionMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static SolutionMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static SolutionMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static SolutionMessage ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SolutionMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private SolutionMessage MakeReadOnly() {
+      integerVars_.MakeReadOnly();
+      integerArrayVars_.MakeReadOnly();
+      doubleVars_.MakeReadOnly();
+      doubleArrayVars_.MakeReadOnly();
+      boolVars_.MakeReadOnly();
+      boolArrayVars_.MakeReadOnly();
+      stringVars_.MakeReadOnly();
+      stringArrayVars_.MakeReadOnly();
+      rawVars_.MakeReadOnly();
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(SolutionMessage prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+    public sealed partial class Builder : pb::GeneratedBuilder<SolutionMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(SolutionMessage cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private SolutionMessage result;
+      
+      private SolutionMessage PrepareBuilder() {
+        if (resultIsReadOnly) {
+          SolutionMessage original = result;
+          result = new SolutionMessage();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override SolutionMessage MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Descriptor; }
+      }
+      
+      public override SolutionMessage DefaultInstanceForType {
+        get { return global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.DefaultInstance; }
+      }
+      
+      public override SolutionMessage BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is SolutionMessage) {
+          return MergeFrom((SolutionMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(SolutionMessage other) {
+        if (other == global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasSolutionId) {
+          SolutionId = other.SolutionId;
+        }
+        if (other.integerVars_.Count != 0) {
+          result.integerVars_.Add(other.integerVars_);
+        }
+        if (other.integerArrayVars_.Count != 0) {
+          result.integerArrayVars_.Add(other.integerArrayVars_);
+        }
+        if (other.doubleVars_.Count != 0) {
+          result.doubleVars_.Add(other.doubleVars_);
+        }
+        if (other.doubleArrayVars_.Count != 0) {
+          result.doubleArrayVars_.Add(other.doubleArrayVars_);
+        }
+        if (other.boolVars_.Count != 0) {
+          result.boolVars_.Add(other.boolVars_);
+        }
+        if (other.boolArrayVars_.Count != 0) {
+          result.boolArrayVars_.Add(other.boolArrayVars_);
+        }
+        if (other.stringVars_.Count != 0) {
+          result.stringVars_.Add(other.stringVars_);
+        }
+        if (other.stringArrayVars_.Count != 0) {
+          result.stringArrayVars_.Add(other.stringArrayVars_);
+        }
+        if (other.rawVars_.Count != 0) {
+          result.rawVars_.Add(other.rawVars_);
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_solutionMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _solutionMessageFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasSolutionId = input.ReadInt32(ref result.solutionId_);
+              break;
+            }
+            case 18: {
+              input.ReadMessageArray(tag, field_name, result.integerVars_, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 26: {
+              input.ReadMessageArray(tag, field_name, result.integerArrayVars_, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 34: {
+              input.ReadMessageArray(tag, field_name, result.doubleVars_, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 42: {
+              input.ReadMessageArray(tag, field_name, result.doubleArrayVars_, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 50: {
+              input.ReadMessageArray(tag, field_name, result.boolVars_, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 58: {
+              input.ReadMessageArray(tag, field_name, result.boolArrayVars_, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 66: {
+              input.ReadMessageArray(tag, field_name, result.stringVars_, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 74: {
+              input.ReadMessageArray(tag, field_name, result.stringArrayVars_, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable.DefaultInstance, extensionRegistry);
+              break;
+            }
+            case 82: {
+              input.ReadMessageArray(tag, field_name, result.rawVars_, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable.DefaultInstance, extensionRegistry);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public bool HasSolutionId {
+        get { return result.hasSolutionId; }
+      }
+      public int SolutionId {
+        get { return result.SolutionId; }
+        set { SetSolutionId(value); }
+      }
+      public Builder SetSolutionId(int value) {
+        PrepareBuilder();
+        result.hasSolutionId = true;
+        result.solutionId_ = value;
+        return this;
+      }
+      public Builder ClearSolutionId() {
+        PrepareBuilder();
+        result.hasSolutionId = false;
+        result.solutionId_ = 0;
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable> IntegerVarsList {
+        get { return PrepareBuilder().integerVars_; }
+      }
+      public int IntegerVarsCount {
+        get { return result.IntegerVarsCount; }
+      }
+      public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable GetIntegerVars(int index) {
+        return result.GetIntegerVars(index);
+      }
+      public Builder SetIntegerVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.integerVars_[index] = value;
+        return this;
+      }
+      public Builder SetIntegerVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.integerVars_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddIntegerVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.integerVars_.Add(value);
+        return this;
+      }
+      public Builder AddIntegerVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.integerVars_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeIntegerVars(scg::IEnumerable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerVariable> values) {
+        PrepareBuilder();
+        result.integerVars_.Add(values);
+        return this;
+      }
+      public Builder ClearIntegerVars() {
+        PrepareBuilder();
+        result.integerVars_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable> IntegerArrayVarsList {
+        get { return PrepareBuilder().integerArrayVars_; }
+      }
+      public int IntegerArrayVarsCount {
+        get { return result.IntegerArrayVarsCount; }
+      }
+      public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable GetIntegerArrayVars(int index) {
+        return result.GetIntegerArrayVars(index);
+      }
+      public Builder SetIntegerArrayVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.integerArrayVars_[index] = value;
+        return this;
+      }
+      public Builder SetIntegerArrayVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.integerArrayVars_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddIntegerArrayVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.integerArrayVars_.Add(value);
+        return this;
+      }
+      public Builder AddIntegerArrayVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.integerArrayVars_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeIntegerArrayVars(scg::IEnumerable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.IntegerArrayVariable> values) {
+        PrepareBuilder();
+        result.integerArrayVars_.Add(values);
+        return this;
+      }
+      public Builder ClearIntegerArrayVars() {
+        PrepareBuilder();
+        result.integerArrayVars_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable> DoubleVarsList {
+        get { return PrepareBuilder().doubleVars_; }
+      }
+      public int DoubleVarsCount {
+        get { return result.DoubleVarsCount; }
+      }
+      public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable GetDoubleVars(int index) {
+        return result.GetDoubleVars(index);
+      }
+      public Builder SetDoubleVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.doubleVars_[index] = value;
+        return this;
+      }
+      public Builder SetDoubleVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.doubleVars_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddDoubleVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.doubleVars_.Add(value);
+        return this;
+      }
+      public Builder AddDoubleVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.doubleVars_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeDoubleVars(scg::IEnumerable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleVariable> values) {
+        PrepareBuilder();
+        result.doubleVars_.Add(values);
+        return this;
+      }
+      public Builder ClearDoubleVars() {
+        PrepareBuilder();
+        result.doubleVars_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable> DoubleArrayVarsList {
+        get { return PrepareBuilder().doubleArrayVars_; }
+      }
+      public int DoubleArrayVarsCount {
+        get { return result.DoubleArrayVarsCount; }
+      }
+      public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable GetDoubleArrayVars(int index) {
+        return result.GetDoubleArrayVars(index);
+      }
+      public Builder SetDoubleArrayVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.doubleArrayVars_[index] = value;
+        return this;
+      }
+      public Builder SetDoubleArrayVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.doubleArrayVars_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddDoubleArrayVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.doubleArrayVars_.Add(value);
+        return this;
+      }
+      public Builder AddDoubleArrayVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.doubleArrayVars_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeDoubleArrayVars(scg::IEnumerable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.DoubleArrayVariable> values) {
+        PrepareBuilder();
+        result.doubleArrayVars_.Add(values);
+        return this;
+      }
+      public Builder ClearDoubleArrayVars() {
+        PrepareBuilder();
+        result.doubleArrayVars_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable> BoolVarsList {
+        get { return PrepareBuilder().boolVars_; }
+      }
+      public int BoolVarsCount {
+        get { return result.BoolVarsCount; }
+      }
+      public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable GetBoolVars(int index) {
+        return result.GetBoolVars(index);
+      }
+      public Builder SetBoolVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.boolVars_[index] = value;
+        return this;
+      }
+      public Builder SetBoolVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.boolVars_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddBoolVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.boolVars_.Add(value);
+        return this;
+      }
+      public Builder AddBoolVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.boolVars_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeBoolVars(scg::IEnumerable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolVariable> values) {
+        PrepareBuilder();
+        result.boolVars_.Add(values);
+        return this;
+      }
+      public Builder ClearBoolVars() {
+        PrepareBuilder();
+        result.boolVars_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable> BoolArrayVarsList {
+        get { return PrepareBuilder().boolArrayVars_; }
+      }
+      public int BoolArrayVarsCount {
+        get { return result.BoolArrayVarsCount; }
+      }
+      public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable GetBoolArrayVars(int index) {
+        return result.GetBoolArrayVars(index);
+      }
+      public Builder SetBoolArrayVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.boolArrayVars_[index] = value;
+        return this;
+      }
+      public Builder SetBoolArrayVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.boolArrayVars_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddBoolArrayVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.boolArrayVars_.Add(value);
+        return this;
+      }
+      public Builder AddBoolArrayVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.boolArrayVars_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeBoolArrayVars(scg::IEnumerable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.BoolArrayVariable> values) {
+        PrepareBuilder();
+        result.boolArrayVars_.Add(values);
+        return this;
+      }
+      public Builder ClearBoolArrayVars() {
+        PrepareBuilder();
+        result.boolArrayVars_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable> StringVarsList {
+        get { return PrepareBuilder().stringVars_; }
+      }
+      public int StringVarsCount {
+        get { return result.StringVarsCount; }
+      }
+      public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable GetStringVars(int index) {
+        return result.GetStringVars(index);
+      }
+      public Builder SetStringVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.stringVars_[index] = value;
+        return this;
+      }
+      public Builder SetStringVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.stringVars_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddStringVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.stringVars_.Add(value);
+        return this;
+      }
+      public Builder AddStringVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.stringVars_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeStringVars(scg::IEnumerable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringVariable> values) {
+        PrepareBuilder();
+        result.stringVars_.Add(values);
+        return this;
+      }
+      public Builder ClearStringVars() {
+        PrepareBuilder();
+        result.stringVars_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable> StringArrayVarsList {
+        get { return PrepareBuilder().stringArrayVars_; }
+      }
+      public int StringArrayVarsCount {
+        get { return result.StringArrayVarsCount; }
+      }
+      public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable GetStringArrayVars(int index) {
+        return result.GetStringArrayVars(index);
+      }
+      public Builder SetStringArrayVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.stringArrayVars_[index] = value;
+        return this;
+      }
+      public Builder SetStringArrayVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.stringArrayVars_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddStringArrayVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.stringArrayVars_.Add(value);
+        return this;
+      }
+      public Builder AddStringArrayVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.stringArrayVars_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeStringArrayVars(scg::IEnumerable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.StringArrayVariable> values) {
+        PrepareBuilder();
+        result.stringArrayVars_.Add(values);
+        return this;
+      }
+      public Builder ClearStringArrayVars() {
+        PrepareBuilder();
+        result.stringArrayVars_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable> RawVarsList {
+        get { return PrepareBuilder().rawVars_; }
+      }
+      public int RawVarsCount {
+        get { return result.RawVarsCount; }
+      }
+      public global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable GetRawVars(int index) {
+        return result.GetRawVars(index);
+      }
+      public Builder SetRawVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.rawVars_[index] = value;
+        return this;
+      }
+      public Builder SetRawVars(int index, global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.rawVars_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddRawVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        PrepareBuilder();
+        result.rawVars_.Add(value);
+        return this;
+      }
+      public Builder AddRawVars(global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        PrepareBuilder();
+        result.rawVars_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeRawVars(scg::IEnumerable<global::HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types.RawVariable> values) {
+        PrepareBuilder();
+        result.rawVars_.Add(values);
+        return this;
+      }
+      public Builder ClearRawVars() {
+        PrepareBuilder();
+        result.rawVars_.Clear();
+        return this;
+      }
+    }
+    static SolutionMessage() {
+      object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+  public sealed partial class QualityMessage : pb::ExtendableMessage<QualityMessage, QualityMessage.Builder> {
+    private QualityMessage() { }
+    private static readonly QualityMessage defaultInstance = new QualityMessage().MakeReadOnly();
+    private static readonly string[] _qualityMessageFieldNames = new string[] { "quality", "solutionId" };
+    private static readonly uint[] _qualityMessageFieldTags = new uint[] { 17, 8 };
+    public static QualityMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override QualityMessage DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override QualityMessage ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_QualityMessage__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<QualityMessage, QualityMessage.Builder> InternalFieldAccessors {
+      get { return global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.internal__static_HeuristicLab_Problems_ExternalEvaluation_QualityMessage__FieldAccessorTable; }
+    }
+    
+    public const int SolutionIdFieldNumber = 1;
+    private bool hasSolutionId;
+    private int solutionId_;
+    public bool HasSolutionId {
+      get { return hasSolutionId; }
+    }
+    public int SolutionId {
+      get { return solutionId_; }
+    }
+    
+    public const int QualityFieldNumber = 2;
+    private bool hasQuality;
+    private double quality_;
+    public bool HasQuality {
+      get { return hasQuality; }
+    }
+    public double Quality {
+      get { return quality_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (!hasSolutionId) return false;
+        if (!hasQuality) return false;
+        if (!ExtensionsAreInitialized) return false;
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      int size = SerializedSize;
+      string[] field_names = _qualityMessageFieldNames;
+      pb::ExtendableMessage<QualityMessage, QualityMessage.Builder>.ExtensionWriter extensionWriter = CreateExtensionWriter(this);
+      if (hasSolutionId) {
+        output.WriteInt32(1, field_names[1], SolutionId);
+      }
+      if (hasQuality) {
+        output.WriteDouble(2, field_names[0], Quality);
+      }
+      extensionWriter.WriteUntil(536870912, output);
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (hasSolutionId) {
+          size += pb::CodedOutputStream.ComputeInt32Size(1, SolutionId);
+        }
+        if (hasQuality) {
+          size += pb::CodedOutputStream.ComputeDoubleSize(2, Quality);
+        }
+        size += ExtensionsSerializedSize;
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static QualityMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static QualityMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static QualityMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static QualityMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static QualityMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static QualityMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static QualityMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static QualityMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static QualityMessage ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static QualityMessage ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private QualityMessage MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(QualityMessage prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+    public sealed partial class Builder : pb::ExtendableBuilder<QualityMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(QualityMessage cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private QualityMessage result;
+      
+      private QualityMessage PrepareBuilder() {
+        if (resultIsReadOnly) {
+          QualityMessage original = result;
+          result = new QualityMessage();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override QualityMessage MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::HeuristicLab.Problems.ExternalEvaluation.QualityMessage.Descriptor; }
+      }
+      
+      public override QualityMessage DefaultInstanceForType {
+        get { return global::HeuristicLab.Problems.ExternalEvaluation.QualityMessage.DefaultInstance; }
+      }
+      
+      public override QualityMessage BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is QualityMessage) {
+          return MergeFrom((QualityMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(QualityMessage other) {
+        if (other == global::HeuristicLab.Problems.ExternalEvaluation.QualityMessage.DefaultInstance) return this;
+        PrepareBuilder();
+        if (other.HasSolutionId) {
+          SolutionId = other.SolutionId;
+        }
+        if (other.HasQuality) {
+          Quality = other.Quality;
+        }
+          this.MergeExtensionFields(other);
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_qualityMessageFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _qualityMessageFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+            case 8: {
+              result.hasSolutionId = input.ReadInt32(ref result.solutionId_);
+              break;
+            }
+            case 17: {
+              result.hasQuality = input.ReadDouble(ref result.quality_);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+      
+      public bool HasSolutionId {
+        get { return result.hasSolutionId; }
+      }
+      public int SolutionId {
+        get { return result.SolutionId; }
+        set { SetSolutionId(value); }
+      }
+      public Builder SetSolutionId(int value) {
+        PrepareBuilder();
+        result.hasSolutionId = true;
+        result.solutionId_ = value;
+        return this;
+      }
+      public Builder ClearSolutionId() {
+        PrepareBuilder();
+        result.hasSolutionId = false;
+        result.solutionId_ = 0;
+        return this;
+      }
+      
+      public bool HasQuality {
+        get { return result.hasQuality; }
+      }
+      public double Quality {
+        get { return result.Quality; }
+        set { SetQuality(value); }
+      }
+      public Builder SetQuality(double value) {
+        PrepareBuilder();
+        result.hasQuality = true;
+        result.quality_ = value;
+        return this;
+      }
+      public Builder ClearQuality() {
+        PrepareBuilder();
+        result.hasQuality = false;
+        result.quality_ = 0D;
+        return this;
+      }
+    }
+    static QualityMessage() {
+      object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, null);
+    }
+  }
+  
+  #endregion
+  
+  #region Services
+  /*
+  * Service generation is now disabled by default, use the following option to enable:
+  * option (google.protobuf.csharp_file_options).service_generator_type = GENERIC;
+  */
+  #endregion
+  
+}
+
+#endregion Designer generated code
Index: trunk/tools/ExternalEvaluation/MyExtension/Plugin/Protos/ExternalEvaluationMessages.proto
===================================================================
--- trunk/tools/ExternalEvaluation/MyExtension/Plugin/Protos/ExternalEvaluationMessages.proto	(revision 15014)
+++ trunk/tools/ExternalEvaluation/MyExtension/Plugin/Protos/ExternalEvaluationMessages.proto	(revision 15014)
@@ -0,0 +1,75 @@
+package HeuristicLab.Problems.ExternalEvaluation;
+option java_package = "com.heuristiclab.problems.externalevaluation";
+
+message SolutionMessage {
+  required int32 solutionId = 1;
+  
+  message IntegerVariable {
+    required string name = 1;
+    optional int32 data = 2;
+  }
+  repeated IntegerVariable integerVars = 2;
+  
+  message IntegerArrayVariable {
+    required string name = 1;
+    repeated int32 data = 2;
+    optional int32 length = 3;
+  }
+  repeated IntegerArrayVariable integerArrayVars = 3;
+  
+  message DoubleVariable {
+    required string name = 1;
+    optional double data = 2;
+  }
+  repeated DoubleVariable doubleVars = 4;
+  
+  message DoubleArrayVariable {
+    required string name = 1;
+    repeated double data = 2;
+    optional int32 length = 3;
+  }
+  repeated DoubleArrayVariable doubleArrayVars = 5;
+  
+  message BoolVariable {
+    required string name = 1;
+    optional bool data = 2;
+  }
+  repeated BoolVariable boolVars = 6;
+  
+  message BoolArrayVariable {
+    required string name = 1;
+    repeated bool data = 2;
+    optional int32 length = 3;
+  }
+  repeated BoolArrayVariable boolArrayVars = 7;
+  
+  message StringVariable {
+    required string name = 1;
+    optional string data = 2;
+  }
+  repeated StringVariable stringVars = 8;
+  
+  message StringArrayVariable {
+    required string name = 1;
+    repeated string data = 2;
+    optional int32 length = 3;
+  }
+  repeated StringArrayVariable stringArrayVars = 9;
+  
+  message RawVariable {
+    required string name = 1;
+    optional bytes data = 2;
+  }
+  repeated RawVariable rawVars = 10;
+}
+
+message QualityMessage {
+  required int32 solutionId = 1;
+  required double quality = 2;
+
+  extensions 1000 to max;
+}
+  
+service EvaluationService {
+  rpc Evaluate (SolutionMessage) returns (QualityMessage);
+}
Index: trunk/tools/ExternalEvaluation/MyExtension/Plugin/Protos/RepetitionsQualityMessage.cs
===================================================================
--- trunk/tools/ExternalEvaluation/MyExtension/Plugin/Protos/RepetitionsQualityMessage.cs	(revision 15014)
+++ trunk/tools/ExternalEvaluation/MyExtension/Plugin/Protos/RepetitionsQualityMessage.cs	(revision 15014)
@@ -0,0 +1,307 @@
+// Generated by ProtoGen, Version=2.4.1.473, Culture=neutral, PublicKeyToken=17b3b1f090c3ea48.  DO NOT EDIT!
+#pragma warning disable 1591, 0612
+#region Designer generated code
+
+using pb = global::Google.ProtocolBuffers;
+using pbc = global::Google.ProtocolBuffers.Collections;
+using pbd = global::Google.ProtocolBuffers.Descriptors;
+using scg = global::System.Collections.Generic;
+namespace HeuristicLab.Problems.ExternalEvaluation.RepetitionsExtension {
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+  public static partial class RepetitionsQualityMessage {
+  
+    #region Extension registration
+    public static void RegisterAllExtensions(pb::ExtensionRegistry registry) {
+      registry.Add(global::HeuristicLab.Problems.ExternalEvaluation.RepetitionsExtension.RepetitionsResponse.Repetitions);
+      registry.Add(global::HeuristicLab.Problems.ExternalEvaluation.RepetitionsExtension.RepetitionsResponse.Variance);
+      registry.Add(global::HeuristicLab.Problems.ExternalEvaluation.RepetitionsExtension.RepetitionsResponse.NumFailed);
+    }
+    #endregion
+    #region Static variables
+    internal static pbd::MessageDescriptor internal__static_HeuristicLab_Problems_ExternalEvaluation_RepetitionsExtension_RepetitionsResponse__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.RepetitionsExtension.RepetitionsResponse, global::HeuristicLab.Problems.ExternalEvaluation.RepetitionsExtension.RepetitionsResponse.Builder> internal__static_HeuristicLab_Problems_ExternalEvaluation_RepetitionsExtension_RepetitionsResponse__FieldAccessorTable;
+    #endregion
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbd::FileDescriptor descriptor;
+    
+    static RepetitionsQualityMessage() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          "Ci1QbHVnaW4vUHJvdG9zL1JlcGV0aXRpb25zUXVhbGl0eU1lc3NhZ2UucHJv" + 
+          "dG8SPUhldXJpc3RpY0xhYi5Qcm9ibGVtcy5FeHRlcm5hbEV2YWx1YXRpb24u" + 
+          "UmVwZXRpdGlvbnNFeHRlbnNpb24aIEV4dGVybmFsRXZhbHVhdGlvbk1lc3Nh" + 
+          "Z2VzLnByb3RvIoACChNSZXBldGl0aW9uc1Jlc3BvbnNlMk4KC3JlcGV0aXRp" + 
+          "b25zEjguSGV1cmlzdGljTGFiLlByb2JsZW1zLkV4dGVybmFsRXZhbHVhdGlv" + 
+          "bi5RdWFsaXR5TWVzc2FnZRjyByACKAUySwoIdmFyaWFuY2USOC5IZXVyaXN0" + 
+          "aWNMYWIuUHJvYmxlbXMuRXh0ZXJuYWxFdmFsdWF0aW9uLlF1YWxpdHlNZXNz" + 
+          "YWdlGPwHIAEoATJMCgludW1GYWlsZWQSOC5IZXVyaXN0aWNMYWIuUHJvYmxl" + 
+          "bXMuRXh0ZXJuYWxFdmFsdWF0aW9uLlF1YWxpdHlNZXNzYWdlGIYIIAEoBUJD" + 
+          "CkFjb20uaGV1cmlzdGljbGFiLnByb2JsZW1zLmV4dGVybmFsZXZhbHVhdGlv" + 
+          "bi5yZXBldGl0aW9uc2V4dGVuc2lvbg==");
+      pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) {
+        descriptor = root;
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_RepetitionsExtension_RepetitionsResponse__Descriptor = Descriptor.MessageTypes[0];
+        internal__static_HeuristicLab_Problems_ExternalEvaluation_RepetitionsExtension_RepetitionsResponse__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::HeuristicLab.Problems.ExternalEvaluation.RepetitionsExtension.RepetitionsResponse, global::HeuristicLab.Problems.ExternalEvaluation.RepetitionsExtension.RepetitionsResponse.Builder>(internal__static_HeuristicLab_Problems_ExternalEvaluation_RepetitionsExtension_RepetitionsResponse__Descriptor,
+                new string[] { });
+        global::HeuristicLab.Problems.ExternalEvaluation.RepetitionsExtension.RepetitionsResponse.Repetitions = pb::GeneratedSingleExtension<int>.CreateInstance(global::HeuristicLab.Problems.ExternalEvaluation.RepetitionsExtension.RepetitionsResponse.Descriptor.Extensions[0]);
+        global::HeuristicLab.Problems.ExternalEvaluation.RepetitionsExtension.RepetitionsResponse.Variance = pb::GeneratedSingleExtension<double>.CreateInstance(global::HeuristicLab.Problems.ExternalEvaluation.RepetitionsExtension.RepetitionsResponse.Descriptor.Extensions[1]);
+        global::HeuristicLab.Problems.ExternalEvaluation.RepetitionsExtension.RepetitionsResponse.NumFailed = pb::GeneratedSingleExtension<int>.CreateInstance(global::HeuristicLab.Problems.ExternalEvaluation.RepetitionsExtension.RepetitionsResponse.Descriptor.Extensions[2]);
+        return null;
+      };
+      pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,
+          new pbd::FileDescriptor[] {
+          global::HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationMessages.Descriptor, 
+          }, assigner);
+    }
+    #endregion
+    
+  }
+  #region Messages
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+  public sealed partial class RepetitionsResponse : pb::GeneratedMessage<RepetitionsResponse, RepetitionsResponse.Builder> {
+    private RepetitionsResponse() { }
+    private static readonly RepetitionsResponse defaultInstance = new RepetitionsResponse().MakeReadOnly();
+    private static readonly string[] _repetitionsResponseFieldNames = new string[] {  };
+    private static readonly uint[] _repetitionsResponseFieldTags = new uint[] {  };
+    public static RepetitionsResponse DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override RepetitionsResponse DefaultInstanceForType {
+      get { return DefaultInstance; }
+    }
+    
+    protected override RepetitionsResponse ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::HeuristicLab.Problems.ExternalEvaluation.RepetitionsExtension.RepetitionsQualityMessage.internal__static_HeuristicLab_Problems_ExternalEvaluation_RepetitionsExtension_RepetitionsResponse__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<RepetitionsResponse, RepetitionsResponse.Builder> InternalFieldAccessors {
+      get { return global::HeuristicLab.Problems.ExternalEvaluation.RepetitionsExtension.RepetitionsQualityMessage.internal__static_HeuristicLab_Problems_ExternalEvaluation_RepetitionsExtension_RepetitionsResponse__FieldAccessorTable; }
+    }
+    
+    public const int RepetitionsFieldNumber = 1010;
+    public static pb::GeneratedExtensionBase<int> Repetitions;
+    public const int VarianceFieldNumber = 1020;
+    public static pb::GeneratedExtensionBase<double> Variance;
+    public const int NumFailedFieldNumber = 1030;
+    public static pb::GeneratedExtensionBase<int> NumFailed;
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::ICodedOutputStream output) {
+      int size = SerializedSize;
+      string[] field_names = _repetitionsResponseFieldNames;
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static RepetitionsResponse ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static RepetitionsResponse ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static RepetitionsResponse ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static RepetitionsResponse ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static RepetitionsResponse ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static RepetitionsResponse ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static RepetitionsResponse ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static RepetitionsResponse ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static RepetitionsResponse ParseFrom(pb::ICodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static RepetitionsResponse ParseFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    private RepetitionsResponse MakeReadOnly() {
+      return this;
+    }
+    
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(RepetitionsResponse prototype) {
+      return new Builder(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.4.1.473")]
+    public sealed partial class Builder : pb::GeneratedBuilder<RepetitionsResponse, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+      }
+      internal Builder(RepetitionsResponse cloneFrom) {
+        result = cloneFrom;
+        resultIsReadOnly = true;
+      }
+      
+      private bool resultIsReadOnly;
+      private RepetitionsResponse result;
+      
+      private RepetitionsResponse PrepareBuilder() {
+        if (resultIsReadOnly) {
+          RepetitionsResponse original = result;
+          result = new RepetitionsResponse();
+          resultIsReadOnly = false;
+          MergeFrom(original);
+        }
+        return result;
+      }
+      
+      public override bool IsInitialized {
+        get { return result.IsInitialized; }
+      }
+      
+      protected override RepetitionsResponse MessageBeingBuilt {
+        get { return PrepareBuilder(); }
+      }
+      
+      public override Builder Clear() {
+        result = DefaultInstance;
+        resultIsReadOnly = true;
+        return this;
+      }
+      
+      public override Builder Clone() {
+        if (resultIsReadOnly) {
+          return new Builder(result);
+        } else {
+          return new Builder().MergeFrom(result);
+        }
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::HeuristicLab.Problems.ExternalEvaluation.RepetitionsExtension.RepetitionsResponse.Descriptor; }
+      }
+      
+      public override RepetitionsResponse DefaultInstanceForType {
+        get { return global::HeuristicLab.Problems.ExternalEvaluation.RepetitionsExtension.RepetitionsResponse.DefaultInstance; }
+      }
+      
+      public override RepetitionsResponse BuildPartial() {
+        if (resultIsReadOnly) {
+          return result;
+        }
+        resultIsReadOnly = true;
+        return result.MakeReadOnly();
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is RepetitionsResponse) {
+          return MergeFrom((RepetitionsResponse) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(RepetitionsResponse other) {
+        if (other == global::HeuristicLab.Problems.ExternalEvaluation.RepetitionsExtension.RepetitionsResponse.DefaultInstance) return this;
+        PrepareBuilder();
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        PrepareBuilder();
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        uint tag;
+        string field_name;
+        while (input.ReadTag(out tag, out field_name)) {
+          if(tag == 0 && field_name != null) {
+            int field_ordinal = global::System.Array.BinarySearch(_repetitionsResponseFieldNames, field_name, global::System.StringComparer.Ordinal);
+            if(field_ordinal >= 0)
+              tag = _repetitionsResponseFieldTags[field_ordinal];
+            else {
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              continue;
+            }
+          }
+          switch (tag) {
+            case 0: {
+              throw pb::InvalidProtocolBufferException.InvalidTag();
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag, field_name);
+              break;
+            }
+          }
+        }
+        
+        if (unknownFields != null) {
+          this.UnknownFields = unknownFields.Build();
+        }
+        return this;
+      }
+      
+    }
+    static RepetitionsResponse() {
+      object.ReferenceEquals(global::HeuristicLab.Problems.ExternalEvaluation.RepetitionsExtension.RepetitionsQualityMessage.Descriptor, null);
+    }
+  }
+  
+  #endregion
+  
+}
+
+#endregion Designer generated code
Index: trunk/tools/ExternalEvaluation/MyExtension/Plugin/Protos/RepetitionsQualityMessage.proto
===================================================================
--- trunk/tools/ExternalEvaluation/MyExtension/Plugin/Protos/RepetitionsQualityMessage.proto	(revision 15014)
+++ trunk/tools/ExternalEvaluation/MyExtension/Plugin/Protos/RepetitionsQualityMessage.proto	(revision 15014)
@@ -0,0 +1,11 @@
+import "ExternalEvaluationMessages.proto";
+package HeuristicLab.Problems.ExternalEvaluation.RepetitionsExtension;
+option java_package = "com.heuristiclab.problems.externalevaluation.repetitionsextension";
+
+message RepetitionsResponse {
+	extend HeuristicLab.Problems.ExternalEvaluation.QualityMessage {
+		required int32 repetitions = 1010;
+		optional double variance = 1020;
+		optional int32 numFailed = 1030;
+	}
+}
Index: trunk/tools/ExternalEvaluation/MyExtension/ProcessProtos.cmd
===================================================================
--- trunk/tools/ExternalEvaluation/MyExtension/ProcessProtos.cmd	(revision 15014)
+++ trunk/tools/ExternalEvaluation/MyExtension/ProcessProtos.cmd	(revision 15014)
@@ -0,0 +1,4 @@
+for %%i in ("%ProjectDir%Protos\*.proto") do (
+  echo Processing %%i
+  ProtoGen --proto_path="%SolutionDir%\" "%%i" --include_imports -output_directory="%ProjectDir%Protos"
+)
Index: trunk/tools/ExternalEvaluation/MyExtension/ProtoGen-license.txt
===================================================================
--- trunk/tools/ExternalEvaluation/MyExtension/ProtoGen-license.txt	(revision 15014)
+++ trunk/tools/ExternalEvaluation/MyExtension/ProtoGen-license.txt	(revision 15014)
@@ -0,0 +1,31 @@
+Protocol Buffers - Google's data interchange format
+Copyright 2008-2010 Google Inc.  All rights reserved.
+http://github.com/jskeet/dotnet-protobufs/
+Original C++/Java/Python code:
+http://code.google.com/p/protobuf/
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+    * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Index: trunk/tools/ExternalEvaluation/MyExtension/protoc-license.txt
===================================================================
--- trunk/tools/ExternalEvaluation/MyExtension/protoc-license.txt	(revision 15014)
+++ trunk/tools/ExternalEvaluation/MyExtension/protoc-license.txt	(revision 15014)
@@ -0,0 +1,36 @@
+protoc.exe was built from the original source at http://code.google.com/p/protobuf/
+The licence for this code is as follows:
+
+Copyright 2008, Google Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+    * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Code generated by the Protocol Buffer compiler is owned by the owner
+of the input file used when generating it.  This code is not
+standalone and requires a support library to be linked with it.  This
+support library is itself covered by the above license.
