Make php generated code conform to PSR-4. (#2435)

1. Generate single file for each message.
2. Lazily initiate metadata.
diff --git a/php/composer.json b/php/composer.json
new file mode 100644
index 0000000..3dae286
--- /dev/null
+++ b/php/composer.json
@@ -0,0 +1,27 @@
+{
+  "name": "google/protobuf",
+  "type": "library",
+  "description": "proto library for PHP",
+  "keywords": ["proto"],
+  "homepage": "https://developers.google.com/protocol-buffers/",
+  "license": "BSD-3-Clause",
+  "require": {
+    "php": ">=5.5.0"
+  },
+  "require-dev": {
+    "phpunit/phpunit": ">=4.8.0"
+  },
+  "autoload": {
+    "psr-4": {
+      "Foo\\": "tests/generated/Foo",
+      "Bar\\": "tests/generated/Bar",
+      "Google\\Protobuf\\": "tests/generated/Google/Protobuf",
+      "Google\\Protobuf\\Internal\\": "src/Google/Protobuf/Internal",
+      "GPBMetadata\\": "tests/generated/GPBMetadata",
+      "GPBMetadata\\Google\\Protobuf\\Internal\\": "src/GPBMetadata/Google/Protobuf/Internal"
+    },
+    "files": [
+      "src/Google/Protobuf/descriptor.php"
+    ]
+  }
+}
diff --git a/php/ext/google/protobuf/message.c b/php/ext/google/protobuf/message.c
index d8fbbe1..16e397f 100644
--- a/php/ext/google/protobuf/message.c
+++ b/php/ext/google/protobuf/message.c
@@ -41,6 +41,7 @@
   PHP_ME(Message, decode, NULL, ZEND_ACC_PUBLIC)
   PHP_ME(Message, readOneof, NULL, ZEND_ACC_PROTECTED)
   PHP_ME(Message, writeOneof, NULL, ZEND_ACC_PROTECTED)
+  PHP_ME(Message, __construct, NULL, ZEND_ACC_PROTECTED)
   {NULL, NULL, NULL}
 };
 
@@ -210,6 +211,17 @@
 // PHP Methods
 // -----------------------------------------------------------------------------
 
+// At the first time the message is created, the class entry hasn't been
+// modified. As a result, the first created instance will be a normal zend
+// object. Here, we manually modify it to our message in such a case.
+PHP_METHOD(Message, __construct) {
+  if (Z_OBJVAL_P(getThis()).handlers != message_handlers) {
+    zend_class_entry* ce = Z_OBJCE_P(getThis());
+    zval_dtor(getThis());
+    Z_OBJVAL_P(getThis()) = message_create(ce TSRMLS_CC);
+  }
+}
+
 PHP_METHOD(Message, readOneof) {
   long index;
 
diff --git a/php/ext/google/protobuf/protobuf.h b/php/ext/google/protobuf/protobuf.h
index fb5879d..8022a9a 100644
--- a/php/ext/google/protobuf/protobuf.h
+++ b/php/ext/google/protobuf/protobuf.h
@@ -231,8 +231,8 @@
 };
 
 MessageLayout* create_layout(const upb_msgdef* msgdef);
-void layout_init(MessageLayout* layout, void* storage, zval** properties_table
-		 TSRMLS_DC);
+void layout_init(MessageLayout* layout, void* storage,
+                 zval** properties_table TSRMLS_DC);
 zval* layout_get(MessageLayout* layout, const void* storage,
                  const upb_fielddef* field, zval** cache TSRMLS_DC);
 void layout_set(MessageLayout* layout, MessageHeader* header,
@@ -241,6 +241,7 @@
 
 PHP_METHOD(Message, readOneof);
 PHP_METHOD(Message, writeOneof);
+PHP_METHOD(Message, __construct);
 
 // -----------------------------------------------------------------------------
 // Encode / Decode.
diff --git a/php/ext/google/protobuf/storage.c b/php/ext/google/protobuf/storage.c
index 1d25a91..8a2b3a2 100644
--- a/php/ext/google/protobuf/storage.c
+++ b/php/ext/google/protobuf/storage.c
@@ -458,8 +458,8 @@
   FREE(layout);
 }
 
-void layout_init(MessageLayout* layout, void* storage, zval** properties_table
-		 TSRMLS_DC) {
+void layout_init(MessageLayout* layout, void* storage,
+                 zval** properties_table TSRMLS_DC) {
   int i;
   upb_msg_field_iter it;
   for (upb_msg_field_begin(&it, layout->msgdef), i = 0; !upb_msg_field_done(&it);
@@ -479,8 +479,8 @@
       DEREF(memory, zval**) = property_ptr;
     } else if (upb_fielddef_label(field) == UPB_LABEL_REPEATED) {
       zval_ptr_dtor(property_ptr);
-      repeated_field_create_with_type(repeated_field_type, field, property_ptr
-				      TSRMLS_CC);
+      repeated_field_create_with_type(repeated_field_type, field,
+                                      property_ptr TSRMLS_CC);
       DEREF(memory, zval**) = property_ptr;
     } else {
       native_slot_init(upb_fielddef_type(field), memory, property_ptr);
diff --git a/php/phpunit.xml b/php/phpunit.xml
new file mode 100644
index 0000000..0191a60
--- /dev/null
+++ b/php/phpunit.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit bootstrap="./vendor/autoload.php"
+         colors="true">
+  <testsuites>
+    <testsuite name="protobuf-tests">
+      <file>tests/php_implementation_test.php</file>
+      <file>tests/array_test.php</file>
+      <file>tests/encode_decode_test.php</file>
+      <file>tests/generated_class_test.php</file>
+      <file>tests/map_field_test.php</file>
+      <file>tests/well_known_test.php</file>
+    </testsuite>
+  </testsuites>
+</phpunit>
diff --git a/php/src/GPBMetadata/Google/Protobuf/Internal/Descriptor.php b/php/src/GPBMetadata/Google/Protobuf/Internal/Descriptor.php
new file mode 100644
index 0000000..7c5c8df
--- /dev/null
+++ b/php/src/GPBMetadata/Google/Protobuf/Internal/Descriptor.php
@@ -0,0 +1,260 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+namespace GPBMetadata\Google\Protobuf\Internal;
+
+class Descriptor
+{
+    public static $is_initialized = false;
+
+    public static function initOnce() {
+        $pool = \Google\Protobuf\Internal\DescriptorPool::getGeneratedPool();
+
+        if (static::$is_initialized == true) {
+          return;
+        }
+        $pool->addMessage('google.protobuf.internal.FileDescriptorSet', \Google\Protobuf\Internal\FileDescriptorSet::class)
+            ->repeated('file', \Google\Protobuf\Internal\GPBType::MESSAGE, 1, 'google.protobuf.internal.FileDescriptorProto')
+            ->finalizeToPool();
+
+        $pool->addMessage('google.protobuf.internal.FileDescriptorProto', \Google\Protobuf\Internal\FileDescriptorProto::class)
+            ->optional('name', \Google\Protobuf\Internal\GPBType::STRING, 1)
+            ->optional('package', \Google\Protobuf\Internal\GPBType::STRING, 2)
+            ->repeated('dependency', \Google\Protobuf\Internal\GPBType::STRING, 3)
+            ->repeated('public_dependency', \Google\Protobuf\Internal\GPBType::INT32, 10)
+            ->repeated('weak_dependency', \Google\Protobuf\Internal\GPBType::INT32, 11)
+            ->repeated('message_type', \Google\Protobuf\Internal\GPBType::MESSAGE, 4, 'google.protobuf.internal.DescriptorProto')
+            ->repeated('enum_type', \Google\Protobuf\Internal\GPBType::MESSAGE, 5, 'google.protobuf.internal.EnumDescriptorProto')
+            ->repeated('service', \Google\Protobuf\Internal\GPBType::MESSAGE, 6, 'google.protobuf.internal.ServiceDescriptorProto')
+            ->repeated('extension', \Google\Protobuf\Internal\GPBType::MESSAGE, 7, 'google.protobuf.internal.FieldDescriptorProto')
+            ->optional('options', \Google\Protobuf\Internal\GPBType::MESSAGE, 8, 'google.protobuf.internal.FileOptions')
+            ->optional('source_code_info', \Google\Protobuf\Internal\GPBType::MESSAGE, 9, 'google.protobuf.internal.SourceCodeInfo')
+            ->optional('syntax', \Google\Protobuf\Internal\GPBType::STRING, 12)
+            ->finalizeToPool();
+
+        $pool->addMessage('google.protobuf.internal.DescriptorProto', \Google\Protobuf\Internal\DescriptorProto::class)
+            ->optional('name', \Google\Protobuf\Internal\GPBType::STRING, 1)
+            ->repeated('field', \Google\Protobuf\Internal\GPBType::MESSAGE, 2, 'google.protobuf.internal.FieldDescriptorProto')
+            ->repeated('extension', \Google\Protobuf\Internal\GPBType::MESSAGE, 6, 'google.protobuf.internal.FieldDescriptorProto')
+            ->repeated('nested_type', \Google\Protobuf\Internal\GPBType::MESSAGE, 3, 'google.protobuf.internal.DescriptorProto')
+            ->repeated('enum_type', \Google\Protobuf\Internal\GPBType::MESSAGE, 4, 'google.protobuf.internal.EnumDescriptorProto')
+            ->repeated('extension_range', \Google\Protobuf\Internal\GPBType::MESSAGE, 5, 'google.protobuf.internal.DescriptorProto.ExtensionRange')
+            ->repeated('oneof_decl', \Google\Protobuf\Internal\GPBType::MESSAGE, 8, 'google.protobuf.internal.OneofDescriptorProto')
+            ->optional('options', \Google\Protobuf\Internal\GPBType::MESSAGE, 7, 'google.protobuf.internal.MessageOptions')
+            ->repeated('reserved_range', \Google\Protobuf\Internal\GPBType::MESSAGE, 9, 'google.protobuf.internal.DescriptorProto.ReservedRange')
+            ->repeated('reserved_name', \Google\Protobuf\Internal\GPBType::STRING, 10)
+            ->finalizeToPool();
+
+        $pool->addMessage('google.protobuf.internal.DescriptorProto.ExtensionRange', \Google\Protobuf\Internal\DescriptorProto_ExtensionRange::class)
+            ->optional('start', \Google\Protobuf\Internal\GPBType::INT32, 1)
+            ->optional('end', \Google\Protobuf\Internal\GPBType::INT32, 2)
+            ->finalizeToPool();
+
+        $pool->addMessage('google.protobuf.internal.DescriptorProto.ReservedRange', \Google\Protobuf\Internal\DescriptorProto_ReservedRange::class)
+            ->optional('start', \Google\Protobuf\Internal\GPBType::INT32, 1)
+            ->optional('end', \Google\Protobuf\Internal\GPBType::INT32, 2)
+            ->finalizeToPool();
+
+        $pool->addMessage('google.protobuf.internal.FieldDescriptorProto', \Google\Protobuf\Internal\FieldDescriptorProto::class)
+            ->optional('name', \Google\Protobuf\Internal\GPBType::STRING, 1)
+            ->optional('number', \Google\Protobuf\Internal\GPBType::INT32, 3)
+            ->optional('label', \Google\Protobuf\Internal\GPBType::ENUM, 4, 'google.protobuf.internal.FieldDescriptorProto.Label')
+            ->optional('type', \Google\Protobuf\Internal\GPBType::ENUM, 5, 'google.protobuf.internal.FieldDescriptorProto.Type')
+            ->optional('type_name', \Google\Protobuf\Internal\GPBType::STRING, 6)
+            ->optional('extendee', \Google\Protobuf\Internal\GPBType::STRING, 2)
+            ->optional('default_value', \Google\Protobuf\Internal\GPBType::STRING, 7)
+            ->optional('oneof_index', \Google\Protobuf\Internal\GPBType::INT32, 9)
+            ->optional('json_name', \Google\Protobuf\Internal\GPBType::STRING, 10)
+            ->optional('options', \Google\Protobuf\Internal\GPBType::MESSAGE, 8, 'google.protobuf.internal.FieldOptions')
+            ->finalizeToPool();
+
+        $pool->addEnum('google.protobuf.internal.FieldDescriptorProto.Type', \Google\Protobuf\Internal\Type::class)
+            ->value("TYPE_DOUBLE", 1)
+            ->value("TYPE_FLOAT", 2)
+            ->value("TYPE_INT64", 3)
+            ->value("TYPE_UINT64", 4)
+            ->value("TYPE_INT32", 5)
+            ->value("TYPE_FIXED64", 6)
+            ->value("TYPE_FIXED32", 7)
+            ->value("TYPE_BOOL", 8)
+            ->value("TYPE_STRING", 9)
+            ->value("TYPE_GROUP", 10)
+            ->value("TYPE_MESSAGE", 11)
+            ->value("TYPE_BYTES", 12)
+            ->value("TYPE_UINT32", 13)
+            ->value("TYPE_ENUM", 14)
+            ->value("TYPE_SFIXED32", 15)
+            ->value("TYPE_SFIXED64", 16)
+            ->value("TYPE_SINT32", 17)
+            ->value("TYPE_SINT64", 18)
+            ->finalizeToPool();
+
+        $pool->addEnum('google.protobuf.internal.FieldDescriptorProto.Label', \Google\Protobuf\Internal\Label::class)
+            ->value("LABEL_OPTIONAL", 1)
+            ->value("LABEL_REQUIRED", 2)
+            ->value("LABEL_REPEATED", 3)
+            ->finalizeToPool();
+
+        $pool->addMessage('google.protobuf.internal.OneofDescriptorProto', \Google\Protobuf\Internal\OneofDescriptorProto::class)
+            ->optional('name', \Google\Protobuf\Internal\GPBType::STRING, 1)
+            ->optional('options', \Google\Protobuf\Internal\GPBType::MESSAGE, 2, 'google.protobuf.internal.OneofOptions')
+            ->finalizeToPool();
+
+        $pool->addMessage('google.protobuf.internal.EnumDescriptorProto', \Google\Protobuf\Internal\EnumDescriptorProto::class)
+            ->optional('name', \Google\Protobuf\Internal\GPBType::STRING, 1)
+            ->repeated('value', \Google\Protobuf\Internal\GPBType::MESSAGE, 2, 'google.protobuf.internal.EnumValueDescriptorProto')
+            ->optional('options', \Google\Protobuf\Internal\GPBType::MESSAGE, 3, 'google.protobuf.internal.EnumOptions')
+            ->finalizeToPool();
+
+        $pool->addMessage('google.protobuf.internal.EnumValueDescriptorProto', \Google\Protobuf\Internal\EnumValueDescriptorProto::class)
+            ->optional('name', \Google\Protobuf\Internal\GPBType::STRING, 1)
+            ->optional('number', \Google\Protobuf\Internal\GPBType::INT32, 2)
+            ->optional('options', \Google\Protobuf\Internal\GPBType::MESSAGE, 3, 'google.protobuf.internal.EnumValueOptions')
+            ->finalizeToPool();
+
+        $pool->addMessage('google.protobuf.internal.ServiceDescriptorProto', \Google\Protobuf\Internal\ServiceDescriptorProto::class)
+            ->optional('name', \Google\Protobuf\Internal\GPBType::STRING, 1)
+            ->repeated('method', \Google\Protobuf\Internal\GPBType::MESSAGE, 2, 'google.protobuf.internal.MethodDescriptorProto')
+            ->optional('options', \Google\Protobuf\Internal\GPBType::MESSAGE, 3, 'google.protobuf.internal.ServiceOptions')
+            ->finalizeToPool();
+
+        $pool->addMessage('google.protobuf.internal.MethodDescriptorProto', \Google\Protobuf\Internal\MethodDescriptorProto::class)
+            ->optional('name', \Google\Protobuf\Internal\GPBType::STRING, 1)
+            ->optional('input_type', \Google\Protobuf\Internal\GPBType::STRING, 2)
+            ->optional('output_type', \Google\Protobuf\Internal\GPBType::STRING, 3)
+            ->optional('options', \Google\Protobuf\Internal\GPBType::MESSAGE, 4, 'google.protobuf.internal.MethodOptions')
+            ->optional('client_streaming', \Google\Protobuf\Internal\GPBType::BOOL, 5)
+            ->optional('server_streaming', \Google\Protobuf\Internal\GPBType::BOOL, 6)
+            ->finalizeToPool();
+
+        $pool->addMessage('google.protobuf.internal.FileOptions', \Google\Protobuf\Internal\FileOptions::class)
+            ->optional('java_package', \Google\Protobuf\Internal\GPBType::STRING, 1)
+            ->optional('java_outer_classname', \Google\Protobuf\Internal\GPBType::STRING, 8)
+            ->optional('java_multiple_files', \Google\Protobuf\Internal\GPBType::BOOL, 10)
+            ->optional('java_generate_equals_and_hash', \Google\Protobuf\Internal\GPBType::BOOL, 20)
+            ->optional('java_string_check_utf8', \Google\Protobuf\Internal\GPBType::BOOL, 27)
+            ->optional('optimize_for', \Google\Protobuf\Internal\GPBType::ENUM, 9, 'google.protobuf.internal.FileOptions.OptimizeMode')
+            ->optional('go_package', \Google\Protobuf\Internal\GPBType::STRING, 11)
+            ->optional('cc_generic_services', \Google\Protobuf\Internal\GPBType::BOOL, 16)
+            ->optional('java_generic_services', \Google\Protobuf\Internal\GPBType::BOOL, 17)
+            ->optional('py_generic_services', \Google\Protobuf\Internal\GPBType::BOOL, 18)
+            ->optional('deprecated', \Google\Protobuf\Internal\GPBType::BOOL, 23)
+            ->optional('cc_enable_arenas', \Google\Protobuf\Internal\GPBType::BOOL, 31)
+            ->optional('objc_class_prefix', \Google\Protobuf\Internal\GPBType::STRING, 36)
+            ->optional('csharp_namespace', \Google\Protobuf\Internal\GPBType::STRING, 37)
+            ->optional('swift_prefix', \Google\Protobuf\Internal\GPBType::STRING, 39)
+            ->repeated('uninterpreted_option', \Google\Protobuf\Internal\GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
+            ->finalizeToPool();
+
+        $pool->addEnum('google.protobuf.internal.FileOptions.OptimizeMode', \Google\Protobuf\Internal\OptimizeMode::class)
+            ->value("SPEED", 1)
+            ->value("CODE_SIZE", 2)
+            ->value("LITE_RUNTIME", 3)
+            ->finalizeToPool();
+
+        $pool->addMessage('google.protobuf.internal.MessageOptions', \Google\Protobuf\Internal\MessageOptions::class)
+            ->optional('message_set_wire_format', \Google\Protobuf\Internal\GPBType::BOOL, 1)
+            ->optional('no_standard_descriptor_accessor', \Google\Protobuf\Internal\GPBType::BOOL, 2)
+            ->optional('deprecated', \Google\Protobuf\Internal\GPBType::BOOL, 3)
+            ->optional('map_entry', \Google\Protobuf\Internal\GPBType::BOOL, 7)
+            ->repeated('uninterpreted_option', \Google\Protobuf\Internal\GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
+            ->finalizeToPool();
+
+        $pool->addMessage('google.protobuf.internal.FieldOptions', \Google\Protobuf\Internal\FieldOptions::class)
+            ->optional('ctype', \Google\Protobuf\Internal\GPBType::ENUM, 1, 'google.protobuf.internal.FieldOptions.CType')
+            ->optional('packed', \Google\Protobuf\Internal\GPBType::BOOL, 2)
+            ->optional('jstype', \Google\Protobuf\Internal\GPBType::ENUM, 6, 'google.protobuf.internal.FieldOptions.JSType')
+            ->optional('lazy', \Google\Protobuf\Internal\GPBType::BOOL, 5)
+            ->optional('deprecated', \Google\Protobuf\Internal\GPBType::BOOL, 3)
+            ->optional('weak', \Google\Protobuf\Internal\GPBType::BOOL, 10)
+            ->repeated('uninterpreted_option', \Google\Protobuf\Internal\GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
+            ->finalizeToPool();
+
+        $pool->addEnum('google.protobuf.internal.FieldOptions.CType', \Google\Protobuf\Internal\CType::class)
+            ->value("STRING", 0)
+            ->value("CORD", 1)
+            ->value("STRING_PIECE", 2)
+            ->finalizeToPool();
+
+        $pool->addEnum('google.protobuf.internal.FieldOptions.JSType', \Google\Protobuf\Internal\JSType::class)
+            ->value("JS_NORMAL", 0)
+            ->value("JS_STRING", 1)
+            ->value("JS_NUMBER", 2)
+            ->finalizeToPool();
+
+        $pool->addMessage('google.protobuf.internal.OneofOptions', \Google\Protobuf\Internal\OneofOptions::class)
+            ->repeated('uninterpreted_option', \Google\Protobuf\Internal\GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
+            ->finalizeToPool();
+
+        $pool->addMessage('google.protobuf.internal.EnumOptions', \Google\Protobuf\Internal\EnumOptions::class)
+            ->optional('allow_alias', \Google\Protobuf\Internal\GPBType::BOOL, 2)
+            ->optional('deprecated', \Google\Protobuf\Internal\GPBType::BOOL, 3)
+            ->repeated('uninterpreted_option', \Google\Protobuf\Internal\GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
+            ->finalizeToPool();
+
+        $pool->addMessage('google.protobuf.internal.EnumValueOptions', \Google\Protobuf\Internal\EnumValueOptions::class)
+            ->optional('deprecated', \Google\Protobuf\Internal\GPBType::BOOL, 1)
+            ->repeated('uninterpreted_option', \Google\Protobuf\Internal\GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
+            ->finalizeToPool();
+
+        $pool->addMessage('google.protobuf.internal.ServiceOptions', \Google\Protobuf\Internal\ServiceOptions::class)
+            ->optional('deprecated', \Google\Protobuf\Internal\GPBType::BOOL, 33)
+            ->repeated('uninterpreted_option', \Google\Protobuf\Internal\GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
+            ->finalizeToPool();
+
+        $pool->addMessage('google.protobuf.internal.MethodOptions', \Google\Protobuf\Internal\MethodOptions::class)
+            ->optional('deprecated', \Google\Protobuf\Internal\GPBType::BOOL, 33)
+            ->optional('idempotency_level', \Google\Protobuf\Internal\GPBType::ENUM, 34, 'google.protobuf.internal.MethodOptions.IdempotencyLevel')
+            ->repeated('uninterpreted_option', \Google\Protobuf\Internal\GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
+            ->finalizeToPool();
+
+        $pool->addEnum('google.protobuf.internal.MethodOptions.IdempotencyLevel', \Google\Protobuf\Internal\IdempotencyLevel::class)
+            ->value("IDEMPOTENCY_UNKNOWN", 0)
+            ->value("NO_SIDE_EFFECTS", 1)
+            ->value("IDEMPOTENT", 2)
+            ->finalizeToPool();
+
+        $pool->addMessage('google.protobuf.internal.UninterpretedOption', \Google\Protobuf\Internal\UninterpretedOption::class)
+            ->repeated('name', \Google\Protobuf\Internal\GPBType::MESSAGE, 2, 'google.protobuf.internal.UninterpretedOption.NamePart')
+            ->optional('identifier_value', \Google\Protobuf\Internal\GPBType::STRING, 3)
+            ->optional('positive_int_value', \Google\Protobuf\Internal\GPBType::UINT64, 4)
+            ->optional('negative_int_value', \Google\Protobuf\Internal\GPBType::INT64, 5)
+            ->optional('double_value', \Google\Protobuf\Internal\GPBType::DOUBLE, 6)
+            ->optional('string_value', \Google\Protobuf\Internal\GPBType::BYTES, 7)
+            ->optional('aggregate_value', \Google\Protobuf\Internal\GPBType::STRING, 8)
+            ->finalizeToPool();
+
+        $pool->addMessage('google.protobuf.internal.UninterpretedOption.NamePart', \Google\Protobuf\Internal\UninterpretedOption_NamePart::class)
+            ->required('name_part', \Google\Protobuf\Internal\GPBType::STRING, 1)
+            ->required('is_extension', \Google\Protobuf\Internal\GPBType::BOOL, 2)
+            ->finalizeToPool();
+
+        $pool->addMessage('google.protobuf.internal.SourceCodeInfo', \Google\Protobuf\Internal\SourceCodeInfo::class)
+            ->repeated('location', \Google\Protobuf\Internal\GPBType::MESSAGE, 1, 'google.protobuf.internal.SourceCodeInfo.Location')
+            ->finalizeToPool();
+
+        $pool->addMessage('google.protobuf.internal.SourceCodeInfo.Location', \Google\Protobuf\Internal\SourceCodeInfo_Location::class)
+            ->repeated('path', \Google\Protobuf\Internal\GPBType::INT32, 1)
+            ->repeated('span', \Google\Protobuf\Internal\GPBType::INT32, 2)
+            ->optional('leading_comments', \Google\Protobuf\Internal\GPBType::STRING, 3)
+            ->optional('trailing_comments', \Google\Protobuf\Internal\GPBType::STRING, 4)
+            ->repeated('leading_detached_comments', \Google\Protobuf\Internal\GPBType::STRING, 6)
+            ->finalizeToPool();
+
+        $pool->addMessage('google.protobuf.internal.GeneratedCodeInfo', \Google\Protobuf\Internal\GeneratedCodeInfo::class)
+            ->repeated('annotation', \Google\Protobuf\Internal\GPBType::MESSAGE, 1, 'google.protobuf.internal.GeneratedCodeInfo.Annotation')
+            ->finalizeToPool();
+
+        $pool->addMessage('google.protobuf.internal.GeneratedCodeInfo.Annotation', \Google\Protobuf\Internal\GeneratedCodeInfo_Annotation::class)
+            ->repeated('path', \Google\Protobuf\Internal\GPBType::INT32, 1)
+            ->optional('source_file', \Google\Protobuf\Internal\GPBType::STRING, 2)
+            ->optional('begin', \Google\Protobuf\Internal\GPBType::INT32, 3)
+            ->optional('end', \Google\Protobuf\Internal\GPBType::INT32, 4)
+            ->finalizeToPool();
+
+        $pool->finish();
+        static::$is_initialized = true;
+    }
+}
+
diff --git a/php/src/Google/Protobuf/Internal/DescriptorProto.php b/php/src/Google/Protobuf/Internal/DescriptorProto.php
new file mode 100644
index 0000000..f076f6b
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/DescriptorProto.php
@@ -0,0 +1,325 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+namespace Google\Protobuf\Internal;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\GPBWire;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\InputStream;
+
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * <pre>
+ * Describes a message type.
+ * </pre>
+ *
+ * Protobuf type <code>google.protobuf.DescriptorProto</code>
+ */
+class DescriptorProto extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    private $name = '';
+    private $has_name = false;
+    /**
+     * <code>repeated .google.protobuf.FieldDescriptorProto field = 2;</code>
+     */
+    private $field;
+    private $has_field = false;
+    /**
+     * <code>repeated .google.protobuf.FieldDescriptorProto extension = 6;</code>
+     */
+    private $extension;
+    private $has_extension = false;
+    /**
+     * <code>repeated .google.protobuf.DescriptorProto nested_type = 3;</code>
+     */
+    private $nested_type;
+    private $has_nested_type = false;
+    /**
+     * <code>repeated .google.protobuf.EnumDescriptorProto enum_type = 4;</code>
+     */
+    private $enum_type;
+    private $has_enum_type = false;
+    /**
+     * <code>repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;</code>
+     */
+    private $extension_range;
+    private $has_extension_range = false;
+    /**
+     * <code>repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;</code>
+     */
+    private $oneof_decl;
+    private $has_oneof_decl = false;
+    /**
+     * <code>optional .google.protobuf.MessageOptions options = 7;</code>
+     */
+    private $options = null;
+    private $has_options = false;
+    /**
+     * <code>repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;</code>
+     */
+    private $reserved_range;
+    private $has_reserved_range = false;
+    /**
+     * <pre>
+     * Reserved field names, which may not be used by fields in the same message.
+     * A given name may only be reserved once.
+     * </pre>
+     *
+     * <code>repeated string reserved_name = 10;</code>
+     */
+    private $reserved_name;
+    private $has_reserved_name = false;
+
+    public function __construct() {
+        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
+        parent::__construct();
+    }
+
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public function setName($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->name = $var;
+        $this->has_name = true;
+    }
+
+    public function hasName()
+    {
+        return $this->has_name;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.FieldDescriptorProto field = 2;</code>
+     */
+    public function getField()
+    {
+        return $this->field;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.FieldDescriptorProto field = 2;</code>
+     */
+    public function setField(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\FieldDescriptorProto::class);
+        $this->field = $var;
+        $this->has_field = true;
+    }
+
+    public function hasField()
+    {
+        return $this->has_field;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.FieldDescriptorProto extension = 6;</code>
+     */
+    public function getExtension()
+    {
+        return $this->extension;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.FieldDescriptorProto extension = 6;</code>
+     */
+    public function setExtension(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\FieldDescriptorProto::class);
+        $this->extension = $var;
+        $this->has_extension = true;
+    }
+
+    public function hasExtension()
+    {
+        return $this->has_extension;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.DescriptorProto nested_type = 3;</code>
+     */
+    public function getNestedType()
+    {
+        return $this->nested_type;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.DescriptorProto nested_type = 3;</code>
+     */
+    public function setNestedType(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\DescriptorProto::class);
+        $this->nested_type = $var;
+        $this->has_nested_type = true;
+    }
+
+    public function hasNestedType()
+    {
+        return $this->has_nested_type;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.EnumDescriptorProto enum_type = 4;</code>
+     */
+    public function getEnumType()
+    {
+        return $this->enum_type;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.EnumDescriptorProto enum_type = 4;</code>
+     */
+    public function setEnumType(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\EnumDescriptorProto::class);
+        $this->enum_type = $var;
+        $this->has_enum_type = true;
+    }
+
+    public function hasEnumType()
+    {
+        return $this->has_enum_type;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;</code>
+     */
+    public function getExtensionRange()
+    {
+        return $this->extension_range;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;</code>
+     */
+    public function setExtensionRange(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\DescriptorProto_ExtensionRange::class);
+        $this->extension_range = $var;
+        $this->has_extension_range = true;
+    }
+
+    public function hasExtensionRange()
+    {
+        return $this->has_extension_range;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;</code>
+     */
+    public function getOneofDecl()
+    {
+        return $this->oneof_decl;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;</code>
+     */
+    public function setOneofDecl(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\OneofDescriptorProto::class);
+        $this->oneof_decl = $var;
+        $this->has_oneof_decl = true;
+    }
+
+    public function hasOneofDecl()
+    {
+        return $this->has_oneof_decl;
+    }
+
+    /**
+     * <code>optional .google.protobuf.MessageOptions options = 7;</code>
+     */
+    public function getOptions()
+    {
+        return $this->options;
+    }
+
+    /**
+     * <code>optional .google.protobuf.MessageOptions options = 7;</code>
+     */
+    public function setOptions(&$var)
+    {
+        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\MessageOptions::class);
+        $this->options = $var;
+        $this->has_options = true;
+    }
+
+    public function hasOptions()
+    {
+        return $this->has_options;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;</code>
+     */
+    public function getReservedRange()
+    {
+        return $this->reserved_range;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;</code>
+     */
+    public function setReservedRange(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\DescriptorProto_ReservedRange::class);
+        $this->reserved_range = $var;
+        $this->has_reserved_range = true;
+    }
+
+    public function hasReservedRange()
+    {
+        return $this->has_reserved_range;
+    }
+
+    /**
+     * <pre>
+     * Reserved field names, which may not be used by fields in the same message.
+     * A given name may only be reserved once.
+     * </pre>
+     *
+     * <code>repeated string reserved_name = 10;</code>
+     */
+    public function getReservedName()
+    {
+        return $this->reserved_name;
+    }
+
+    /**
+     * <pre>
+     * Reserved field names, which may not be used by fields in the same message.
+     * A given name may only be reserved once.
+     * </pre>
+     *
+     * <code>repeated string reserved_name = 10;</code>
+     */
+    public function setReservedName(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING);
+        $this->reserved_name = $var;
+        $this->has_reserved_name = true;
+    }
+
+    public function hasReservedName()
+    {
+        return $this->has_reserved_name;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/DescriptorProto_ExtensionRange.php b/php/src/Google/Protobuf/Internal/DescriptorProto_ExtensionRange.php
new file mode 100644
index 0000000..738a173
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/DescriptorProto_ExtensionRange.php
@@ -0,0 +1,82 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+namespace Google\Protobuf\Internal;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\GPBWire;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\InputStream;
+
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * Protobuf type <code>google.protobuf.DescriptorProto.ExtensionRange</code>
+ */
+class DescriptorProto_ExtensionRange extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <code>optional int32 start = 1;</code>
+     */
+    private $start = 0;
+    private $has_start = false;
+    /**
+     * <code>optional int32 end = 2;</code>
+     */
+    private $end = 0;
+    private $has_end = false;
+
+    public function __construct() {
+        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
+        parent::__construct();
+    }
+
+    /**
+     * <code>optional int32 start = 1;</code>
+     */
+    public function getStart()
+    {
+        return $this->start;
+    }
+
+    /**
+     * <code>optional int32 start = 1;</code>
+     */
+    public function setStart($var)
+    {
+        GPBUtil::checkInt32($var);
+        $this->start = $var;
+        $this->has_start = true;
+    }
+
+    public function hasStart()
+    {
+        return $this->has_start;
+    }
+
+    /**
+     * <code>optional int32 end = 2;</code>
+     */
+    public function getEnd()
+    {
+        return $this->end;
+    }
+
+    /**
+     * <code>optional int32 end = 2;</code>
+     */
+    public function setEnd($var)
+    {
+        GPBUtil::checkInt32($var);
+        $this->end = $var;
+        $this->has_end = true;
+    }
+
+    public function hasEnd()
+    {
+        return $this->has_end;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/DescriptorProto_ReservedRange.php b/php/src/Google/Protobuf/Internal/DescriptorProto_ReservedRange.php
new file mode 100644
index 0000000..be36b8a
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/DescriptorProto_ReservedRange.php
@@ -0,0 +1,112 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+namespace Google\Protobuf\Internal;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\GPBWire;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\InputStream;
+
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * <pre>
+ * Range of reserved tag numbers. Reserved tag numbers may not be used by
+ * fields or extension ranges in the same message. Reserved ranges may
+ * not overlap.
+ * </pre>
+ *
+ * Protobuf type <code>google.protobuf.DescriptorProto.ReservedRange</code>
+ */
+class DescriptorProto_ReservedRange extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <pre>
+     * Inclusive.
+     * </pre>
+     *
+     * <code>optional int32 start = 1;</code>
+     */
+    private $start = 0;
+    private $has_start = false;
+    /**
+     * <pre>
+     * Exclusive.
+     * </pre>
+     *
+     * <code>optional int32 end = 2;</code>
+     */
+    private $end = 0;
+    private $has_end = false;
+
+    public function __construct() {
+        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
+        parent::__construct();
+    }
+
+    /**
+     * <pre>
+     * Inclusive.
+     * </pre>
+     *
+     * <code>optional int32 start = 1;</code>
+     */
+    public function getStart()
+    {
+        return $this->start;
+    }
+
+    /**
+     * <pre>
+     * Inclusive.
+     * </pre>
+     *
+     * <code>optional int32 start = 1;</code>
+     */
+    public function setStart($var)
+    {
+        GPBUtil::checkInt32($var);
+        $this->start = $var;
+        $this->has_start = true;
+    }
+
+    public function hasStart()
+    {
+        return $this->has_start;
+    }
+
+    /**
+     * <pre>
+     * Exclusive.
+     * </pre>
+     *
+     * <code>optional int32 end = 2;</code>
+     */
+    public function getEnd()
+    {
+        return $this->end;
+    }
+
+    /**
+     * <pre>
+     * Exclusive.
+     * </pre>
+     *
+     * <code>optional int32 end = 2;</code>
+     */
+    public function setEnd($var)
+    {
+        GPBUtil::checkInt32($var);
+        $this->end = $var;
+        $this->has_end = true;
+    }
+
+    public function hasEnd()
+    {
+        return $this->has_end;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/EnumDescriptorProto.php b/php/src/Google/Protobuf/Internal/EnumDescriptorProto.php
new file mode 100644
index 0000000..9c5f245
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/EnumDescriptorProto.php
@@ -0,0 +1,114 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+namespace Google\Protobuf\Internal;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\GPBWire;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\InputStream;
+
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * <pre>
+ * Describes an enum type.
+ * </pre>
+ *
+ * Protobuf type <code>google.protobuf.EnumDescriptorProto</code>
+ */
+class EnumDescriptorProto extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    private $name = '';
+    private $has_name = false;
+    /**
+     * <code>repeated .google.protobuf.EnumValueDescriptorProto value = 2;</code>
+     */
+    private $value;
+    private $has_value = false;
+    /**
+     * <code>optional .google.protobuf.EnumOptions options = 3;</code>
+     */
+    private $options = null;
+    private $has_options = false;
+
+    public function __construct() {
+        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
+        parent::__construct();
+    }
+
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public function setName($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->name = $var;
+        $this->has_name = true;
+    }
+
+    public function hasName()
+    {
+        return $this->has_name;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.EnumValueDescriptorProto value = 2;</code>
+     */
+    public function getValue()
+    {
+        return $this->value;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.EnumValueDescriptorProto value = 2;</code>
+     */
+    public function setValue(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\EnumValueDescriptorProto::class);
+        $this->value = $var;
+        $this->has_value = true;
+    }
+
+    public function hasValue()
+    {
+        return $this->has_value;
+    }
+
+    /**
+     * <code>optional .google.protobuf.EnumOptions options = 3;</code>
+     */
+    public function getOptions()
+    {
+        return $this->options;
+    }
+
+    /**
+     * <code>optional .google.protobuf.EnumOptions options = 3;</code>
+     */
+    public function setOptions(&$var)
+    {
+        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\EnumOptions::class);
+        $this->options = $var;
+        $this->has_options = true;
+    }
+
+    public function hasOptions()
+    {
+        return $this->has_options;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/EnumOptions.php b/php/src/Google/Protobuf/Internal/EnumOptions.php
new file mode 100644
index 0000000..a9c4e0d
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/EnumOptions.php
@@ -0,0 +1,158 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+namespace Google\Protobuf\Internal;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\GPBWire;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\InputStream;
+
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * Protobuf type <code>google.protobuf.EnumOptions</code>
+ */
+class EnumOptions extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <pre>
+     * Set this option to true to allow mapping different tag names to the same
+     * value.
+     * </pre>
+     *
+     * <code>optional bool allow_alias = 2;</code>
+     */
+    private $allow_alias = false;
+    private $has_allow_alias = false;
+    /**
+     * <pre>
+     * Is this enum deprecated?
+     * Depending on the target platform, this can emit Deprecated annotations
+     * for the enum, or it will be completely ignored; in the very least, this
+     * is a formalization for deprecating enums.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 3 [default = false];</code>
+     */
+    private $deprecated = false;
+    private $has_deprecated = false;
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    private $uninterpreted_option;
+    private $has_uninterpreted_option = false;
+
+    public function __construct() {
+        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
+        parent::__construct();
+    }
+
+    /**
+     * <pre>
+     * Set this option to true to allow mapping different tag names to the same
+     * value.
+     * </pre>
+     *
+     * <code>optional bool allow_alias = 2;</code>
+     */
+    public function getAllowAlias()
+    {
+        return $this->allow_alias;
+    }
+
+    /**
+     * <pre>
+     * Set this option to true to allow mapping different tag names to the same
+     * value.
+     * </pre>
+     *
+     * <code>optional bool allow_alias = 2;</code>
+     */
+    public function setAllowAlias($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->allow_alias = $var;
+        $this->has_allow_alias = true;
+    }
+
+    public function hasAllowAlias()
+    {
+        return $this->has_allow_alias;
+    }
+
+    /**
+     * <pre>
+     * Is this enum deprecated?
+     * Depending on the target platform, this can emit Deprecated annotations
+     * for the enum, or it will be completely ignored; in the very least, this
+     * is a formalization for deprecating enums.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 3 [default = false];</code>
+     */
+    public function getDeprecated()
+    {
+        return $this->deprecated;
+    }
+
+    /**
+     * <pre>
+     * Is this enum deprecated?
+     * Depending on the target platform, this can emit Deprecated annotations
+     * for the enum, or it will be completely ignored; in the very least, this
+     * is a formalization for deprecating enums.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 3 [default = false];</code>
+     */
+    public function setDeprecated($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->deprecated = $var;
+        $this->has_deprecated = true;
+    }
+
+    public function hasDeprecated()
+    {
+        return $this->has_deprecated;
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function getUninterpretedOption()
+    {
+        return $this->uninterpreted_option;
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function setUninterpretedOption(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
+        $this->uninterpreted_option = $var;
+        $this->has_uninterpreted_option = true;
+    }
+
+    public function hasUninterpretedOption()
+    {
+        return $this->has_uninterpreted_option;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/EnumValueDescriptorProto.php b/php/src/Google/Protobuf/Internal/EnumValueDescriptorProto.php
new file mode 100644
index 0000000..94dc36e
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/EnumValueDescriptorProto.php
@@ -0,0 +1,114 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+namespace Google\Protobuf\Internal;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\GPBWire;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\InputStream;
+
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * <pre>
+ * Describes a value within an enum.
+ * </pre>
+ *
+ * Protobuf type <code>google.protobuf.EnumValueDescriptorProto</code>
+ */
+class EnumValueDescriptorProto extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    private $name = '';
+    private $has_name = false;
+    /**
+     * <code>optional int32 number = 2;</code>
+     */
+    private $number = 0;
+    private $has_number = false;
+    /**
+     * <code>optional .google.protobuf.EnumValueOptions options = 3;</code>
+     */
+    private $options = null;
+    private $has_options = false;
+
+    public function __construct() {
+        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
+        parent::__construct();
+    }
+
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public function setName($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->name = $var;
+        $this->has_name = true;
+    }
+
+    public function hasName()
+    {
+        return $this->has_name;
+    }
+
+    /**
+     * <code>optional int32 number = 2;</code>
+     */
+    public function getNumber()
+    {
+        return $this->number;
+    }
+
+    /**
+     * <code>optional int32 number = 2;</code>
+     */
+    public function setNumber($var)
+    {
+        GPBUtil::checkInt32($var);
+        $this->number = $var;
+        $this->has_number = true;
+    }
+
+    public function hasNumber()
+    {
+        return $this->has_number;
+    }
+
+    /**
+     * <code>optional .google.protobuf.EnumValueOptions options = 3;</code>
+     */
+    public function getOptions()
+    {
+        return $this->options;
+    }
+
+    /**
+     * <code>optional .google.protobuf.EnumValueOptions options = 3;</code>
+     */
+    public function setOptions(&$var)
+    {
+        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\EnumValueOptions::class);
+        $this->options = $var;
+        $this->has_options = true;
+    }
+
+    public function hasOptions()
+    {
+        return $this->has_options;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/EnumValueOptions.php b/php/src/Google/Protobuf/Internal/EnumValueOptions.php
new file mode 100644
index 0000000..6446ecd
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/EnumValueOptions.php
@@ -0,0 +1,115 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+namespace Google\Protobuf\Internal;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\GPBWire;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\InputStream;
+
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * Protobuf type <code>google.protobuf.EnumValueOptions</code>
+ */
+class EnumValueOptions extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <pre>
+     * Is this enum value deprecated?
+     * Depending on the target platform, this can emit Deprecated annotations
+     * for the enum value, or it will be completely ignored; in the very least,
+     * this is a formalization for deprecating enum values.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 1 [default = false];</code>
+     */
+    private $deprecated = false;
+    private $has_deprecated = false;
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    private $uninterpreted_option;
+    private $has_uninterpreted_option = false;
+
+    public function __construct() {
+        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
+        parent::__construct();
+    }
+
+    /**
+     * <pre>
+     * Is this enum value deprecated?
+     * Depending on the target platform, this can emit Deprecated annotations
+     * for the enum value, or it will be completely ignored; in the very least,
+     * this is a formalization for deprecating enum values.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 1 [default = false];</code>
+     */
+    public function getDeprecated()
+    {
+        return $this->deprecated;
+    }
+
+    /**
+     * <pre>
+     * Is this enum value deprecated?
+     * Depending on the target platform, this can emit Deprecated annotations
+     * for the enum value, or it will be completely ignored; in the very least,
+     * this is a formalization for deprecating enum values.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 1 [default = false];</code>
+     */
+    public function setDeprecated($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->deprecated = $var;
+        $this->has_deprecated = true;
+    }
+
+    public function hasDeprecated()
+    {
+        return $this->has_deprecated;
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function getUninterpretedOption()
+    {
+        return $this->uninterpreted_option;
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function setUninterpretedOption(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
+        $this->uninterpreted_option = $var;
+        $this->has_uninterpreted_option = true;
+    }
+
+    public function hasUninterpretedOption()
+    {
+        return $this->has_uninterpreted_option;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/FieldDescriptorProto.php b/php/src/Google/Protobuf/Internal/FieldDescriptorProto.php
new file mode 100644
index 0000000..6ae2cd4
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/FieldDescriptorProto.php
@@ -0,0 +1,424 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+namespace Google\Protobuf\Internal;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\GPBWire;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\InputStream;
+
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * <pre>
+ * Describes a field within a message.
+ * </pre>
+ *
+ * Protobuf type <code>google.protobuf.FieldDescriptorProto</code>
+ */
+class FieldDescriptorProto extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    private $name = '';
+    private $has_name = false;
+    /**
+     * <code>optional int32 number = 3;</code>
+     */
+    private $number = 0;
+    private $has_number = false;
+    /**
+     * <code>optional .google.protobuf.FieldDescriptorProto.Label label = 4;</code>
+     */
+    private $label = 0;
+    private $has_label = false;
+    /**
+     * <pre>
+     * If type_name is set, this need not be set.  If both this and type_name
+     * are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.
+     * </pre>
+     *
+     * <code>optional .google.protobuf.FieldDescriptorProto.Type type = 5;</code>
+     */
+    private $type = 0;
+    private $has_type = false;
+    /**
+     * <pre>
+     * For message and enum types, this is the name of the type.  If the name
+     * starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping
+     * rules are used to find the type (i.e. first the nested types within this
+     * message are searched, then within the parent, on up to the root
+     * namespace).
+     * </pre>
+     *
+     * <code>optional string type_name = 6;</code>
+     */
+    private $type_name = '';
+    private $has_type_name = false;
+    /**
+     * <pre>
+     * For extensions, this is the name of the type being extended.  It is
+     * resolved in the same manner as type_name.
+     * </pre>
+     *
+     * <code>optional string extendee = 2;</code>
+     */
+    private $extendee = '';
+    private $has_extendee = false;
+    /**
+     * <pre>
+     * For numeric types, contains the original text representation of the value.
+     * For booleans, "true" or "false".
+     * For strings, contains the default text contents (not escaped in any way).
+     * For bytes, contains the C escaped value.  All bytes &gt;= 128 are escaped.
+     * TODO(kenton):  Base-64 encode?
+     * </pre>
+     *
+     * <code>optional string default_value = 7;</code>
+     */
+    private $default_value = '';
+    private $has_default_value = false;
+    /**
+     * <pre>
+     * If set, gives the index of a oneof in the containing type's oneof_decl
+     * list.  This field is a member of that oneof.
+     * </pre>
+     *
+     * <code>optional int32 oneof_index = 9;</code>
+     */
+    private $oneof_index = 0;
+    private $has_oneof_index = false;
+    /**
+     * <pre>
+     * JSON name of this field. The value is set by protocol compiler. If the
+     * user has set a "json_name" option on this field, that option's value
+     * will be used. Otherwise, it's deduced from the field's name by converting
+     * it to camelCase.
+     * </pre>
+     *
+     * <code>optional string json_name = 10;</code>
+     */
+    private $json_name = '';
+    private $has_json_name = false;
+    /**
+     * <code>optional .google.protobuf.FieldOptions options = 8;</code>
+     */
+    private $options = null;
+    private $has_options = false;
+
+    public function __construct() {
+        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
+        parent::__construct();
+    }
+
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public function setName($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->name = $var;
+        $this->has_name = true;
+    }
+
+    public function hasName()
+    {
+        return $this->has_name;
+    }
+
+    /**
+     * <code>optional int32 number = 3;</code>
+     */
+    public function getNumber()
+    {
+        return $this->number;
+    }
+
+    /**
+     * <code>optional int32 number = 3;</code>
+     */
+    public function setNumber($var)
+    {
+        GPBUtil::checkInt32($var);
+        $this->number = $var;
+        $this->has_number = true;
+    }
+
+    public function hasNumber()
+    {
+        return $this->has_number;
+    }
+
+    /**
+     * <code>optional .google.protobuf.FieldDescriptorProto.Label label = 4;</code>
+     */
+    public function getLabel()
+    {
+        return $this->label;
+    }
+
+    /**
+     * <code>optional .google.protobuf.FieldDescriptorProto.Label label = 4;</code>
+     */
+    public function setLabel($var)
+    {
+        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FieldDescriptorProto_Label::class);
+        $this->label = $var;
+        $this->has_label = true;
+    }
+
+    public function hasLabel()
+    {
+        return $this->has_label;
+    }
+
+    /**
+     * <pre>
+     * If type_name is set, this need not be set.  If both this and type_name
+     * are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.
+     * </pre>
+     *
+     * <code>optional .google.protobuf.FieldDescriptorProto.Type type = 5;</code>
+     */
+    public function getType()
+    {
+        return $this->type;
+    }
+
+    /**
+     * <pre>
+     * If type_name is set, this need not be set.  If both this and type_name
+     * are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.
+     * </pre>
+     *
+     * <code>optional .google.protobuf.FieldDescriptorProto.Type type = 5;</code>
+     */
+    public function setType($var)
+    {
+        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FieldDescriptorProto_Type::class);
+        $this->type = $var;
+        $this->has_type = true;
+    }
+
+    public function hasType()
+    {
+        return $this->has_type;
+    }
+
+    /**
+     * <pre>
+     * For message and enum types, this is the name of the type.  If the name
+     * starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping
+     * rules are used to find the type (i.e. first the nested types within this
+     * message are searched, then within the parent, on up to the root
+     * namespace).
+     * </pre>
+     *
+     * <code>optional string type_name = 6;</code>
+     */
+    public function getTypeName()
+    {
+        return $this->type_name;
+    }
+
+    /**
+     * <pre>
+     * For message and enum types, this is the name of the type.  If the name
+     * starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping
+     * rules are used to find the type (i.e. first the nested types within this
+     * message are searched, then within the parent, on up to the root
+     * namespace).
+     * </pre>
+     *
+     * <code>optional string type_name = 6;</code>
+     */
+    public function setTypeName($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->type_name = $var;
+        $this->has_type_name = true;
+    }
+
+    public function hasTypeName()
+    {
+        return $this->has_type_name;
+    }
+
+    /**
+     * <pre>
+     * For extensions, this is the name of the type being extended.  It is
+     * resolved in the same manner as type_name.
+     * </pre>
+     *
+     * <code>optional string extendee = 2;</code>
+     */
+    public function getExtendee()
+    {
+        return $this->extendee;
+    }
+
+    /**
+     * <pre>
+     * For extensions, this is the name of the type being extended.  It is
+     * resolved in the same manner as type_name.
+     * </pre>
+     *
+     * <code>optional string extendee = 2;</code>
+     */
+    public function setExtendee($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->extendee = $var;
+        $this->has_extendee = true;
+    }
+
+    public function hasExtendee()
+    {
+        return $this->has_extendee;
+    }
+
+    /**
+     * <pre>
+     * For numeric types, contains the original text representation of the value.
+     * For booleans, "true" or "false".
+     * For strings, contains the default text contents (not escaped in any way).
+     * For bytes, contains the C escaped value.  All bytes &gt;= 128 are escaped.
+     * TODO(kenton):  Base-64 encode?
+     * </pre>
+     *
+     * <code>optional string default_value = 7;</code>
+     */
+    public function getDefaultValue()
+    {
+        return $this->default_value;
+    }
+
+    /**
+     * <pre>
+     * For numeric types, contains the original text representation of the value.
+     * For booleans, "true" or "false".
+     * For strings, contains the default text contents (not escaped in any way).
+     * For bytes, contains the C escaped value.  All bytes &gt;= 128 are escaped.
+     * TODO(kenton):  Base-64 encode?
+     * </pre>
+     *
+     * <code>optional string default_value = 7;</code>
+     */
+    public function setDefaultValue($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->default_value = $var;
+        $this->has_default_value = true;
+    }
+
+    public function hasDefaultValue()
+    {
+        return $this->has_default_value;
+    }
+
+    /**
+     * <pre>
+     * If set, gives the index of a oneof in the containing type's oneof_decl
+     * list.  This field is a member of that oneof.
+     * </pre>
+     *
+     * <code>optional int32 oneof_index = 9;</code>
+     */
+    public function getOneofIndex()
+    {
+        return $this->oneof_index;
+    }
+
+    /**
+     * <pre>
+     * If set, gives the index of a oneof in the containing type's oneof_decl
+     * list.  This field is a member of that oneof.
+     * </pre>
+     *
+     * <code>optional int32 oneof_index = 9;</code>
+     */
+    public function setOneofIndex($var)
+    {
+        GPBUtil::checkInt32($var);
+        $this->oneof_index = $var;
+        $this->has_oneof_index = true;
+    }
+
+    public function hasOneofIndex()
+    {
+        return $this->has_oneof_index;
+    }
+
+    /**
+     * <pre>
+     * JSON name of this field. The value is set by protocol compiler. If the
+     * user has set a "json_name" option on this field, that option's value
+     * will be used. Otherwise, it's deduced from the field's name by converting
+     * it to camelCase.
+     * </pre>
+     *
+     * <code>optional string json_name = 10;</code>
+     */
+    public function getJsonName()
+    {
+        return $this->json_name;
+    }
+
+    /**
+     * <pre>
+     * JSON name of this field. The value is set by protocol compiler. If the
+     * user has set a "json_name" option on this field, that option's value
+     * will be used. Otherwise, it's deduced from the field's name by converting
+     * it to camelCase.
+     * </pre>
+     *
+     * <code>optional string json_name = 10;</code>
+     */
+    public function setJsonName($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->json_name = $var;
+        $this->has_json_name = true;
+    }
+
+    public function hasJsonName()
+    {
+        return $this->has_json_name;
+    }
+
+    /**
+     * <code>optional .google.protobuf.FieldOptions options = 8;</code>
+     */
+    public function getOptions()
+    {
+        return $this->options;
+    }
+
+    /**
+     * <code>optional .google.protobuf.FieldOptions options = 8;</code>
+     */
+    public function setOptions(&$var)
+    {
+        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\FieldOptions::class);
+        $this->options = $var;
+        $this->has_options = true;
+    }
+
+    public function hasOptions()
+    {
+        return $this->has_options;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/FieldDescriptorProto_Label.php b/php/src/Google/Protobuf/Internal/FieldDescriptorProto_Label.php
new file mode 100644
index 0000000..06f2601
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/FieldDescriptorProto_Label.php
@@ -0,0 +1,29 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+/**
+ * Protobuf enum <code>google.protobuf.FieldDescriptorProto.Label</code>
+ */
+namespace Google\Protobuf\Internal;
+
+class FieldDescriptorProto_Label
+{
+    /**
+     * <pre>
+     * 0 is reserved for errors
+     * </pre>
+     *
+     * <code>LABEL_OPTIONAL = 1;</code>
+     */
+    const LABEL_OPTIONAL = 1;
+    /**
+     * <code>LABEL_REQUIRED = 2;</code>
+     */
+    const LABEL_REQUIRED = 2;
+    /**
+     * <code>LABEL_REPEATED = 3;</code>
+     */
+    const LABEL_REPEATED = 3;
+}
+
diff --git a/php/src/Google/Protobuf/Internal/FieldDescriptorProto_Type.php b/php/src/Google/Protobuf/Internal/FieldDescriptorProto_Type.php
new file mode 100644
index 0000000..9bda76c
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/FieldDescriptorProto_Type.php
@@ -0,0 +1,120 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+/**
+ * Protobuf enum <code>google.protobuf.FieldDescriptorProto.Type</code>
+ */
+namespace Google\Protobuf\Internal;
+
+class FieldDescriptorProto_Type
+{
+    /**
+     * <pre>
+     * 0 is reserved for errors.
+     * Order is weird for historical reasons.
+     * </pre>
+     *
+     * <code>TYPE_DOUBLE = 1;</code>
+     */
+    const TYPE_DOUBLE = 1;
+    /**
+     * <code>TYPE_FLOAT = 2;</code>
+     */
+    const TYPE_FLOAT = 2;
+    /**
+     * <pre>
+     * Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT64 if
+     * negative values are likely.
+     * </pre>
+     *
+     * <code>TYPE_INT64 = 3;</code>
+     */
+    const TYPE_INT64 = 3;
+    /**
+     * <code>TYPE_UINT64 = 4;</code>
+     */
+    const TYPE_UINT64 = 4;
+    /**
+     * <pre>
+     * Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT32 if
+     * negative values are likely.
+     * </pre>
+     *
+     * <code>TYPE_INT32 = 5;</code>
+     */
+    const TYPE_INT32 = 5;
+    /**
+     * <code>TYPE_FIXED64 = 6;</code>
+     */
+    const TYPE_FIXED64 = 6;
+    /**
+     * <code>TYPE_FIXED32 = 7;</code>
+     */
+    const TYPE_FIXED32 = 7;
+    /**
+     * <code>TYPE_BOOL = 8;</code>
+     */
+    const TYPE_BOOL = 8;
+    /**
+     * <code>TYPE_STRING = 9;</code>
+     */
+    const TYPE_STRING = 9;
+    /**
+     * <pre>
+     * Tag-delimited aggregate.
+     * </pre>
+     *
+     * <code>TYPE_GROUP = 10;</code>
+     */
+    const TYPE_GROUP = 10;
+    /**
+     * <pre>
+     * Length-delimited aggregate.
+     * </pre>
+     *
+     * <code>TYPE_MESSAGE = 11;</code>
+     */
+    const TYPE_MESSAGE = 11;
+    /**
+     * <pre>
+     * New in version 2.
+     * </pre>
+     *
+     * <code>TYPE_BYTES = 12;</code>
+     */
+    const TYPE_BYTES = 12;
+    /**
+     * <code>TYPE_UINT32 = 13;</code>
+     */
+    const TYPE_UINT32 = 13;
+    /**
+     * <code>TYPE_ENUM = 14;</code>
+     */
+    const TYPE_ENUM = 14;
+    /**
+     * <code>TYPE_SFIXED32 = 15;</code>
+     */
+    const TYPE_SFIXED32 = 15;
+    /**
+     * <code>TYPE_SFIXED64 = 16;</code>
+     */
+    const TYPE_SFIXED64 = 16;
+    /**
+     * <pre>
+     * Uses ZigZag encoding.
+     * </pre>
+     *
+     * <code>TYPE_SINT32 = 17;</code>
+     */
+    const TYPE_SINT32 = 17;
+    /**
+     * <pre>
+     * Uses ZigZag encoding.
+     * </pre>
+     *
+     * <code>TYPE_SINT64 = 18;</code>
+     */
+    const TYPE_SINT64 = 18;
+}
+
diff --git a/php/src/Google/Protobuf/Internal/FieldOptions.php b/php/src/Google/Protobuf/Internal/FieldOptions.php
new file mode 100644
index 0000000..af1393a
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/FieldOptions.php
@@ -0,0 +1,429 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+namespace Google\Protobuf\Internal;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\GPBWire;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\InputStream;
+
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * Protobuf type <code>google.protobuf.FieldOptions</code>
+ */
+class FieldOptions extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <pre>
+     * The ctype option instructs the C++ code generator to use a different
+     * representation of the field than it normally would.  See the specific
+     * options below.  This option is not yet implemented in the open source
+     * release -- sorry, we'll try to include it in a future version!
+     * </pre>
+     *
+     * <code>optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];</code>
+     */
+    private $ctype = 0;
+    private $has_ctype = false;
+    /**
+     * <pre>
+     * The packed option can be enabled for repeated primitive fields to enable
+     * a more efficient representation on the wire. Rather than repeatedly
+     * writing the tag and type for each element, the entire array is encoded as
+     * a single length-delimited blob. In proto3, only explicit setting it to
+     * false will avoid using packed encoding.
+     * </pre>
+     *
+     * <code>optional bool packed = 2;</code>
+     */
+    private $packed = false;
+    private $has_packed = false;
+    /**
+     * <pre>
+     * The jstype option determines the JavaScript type used for values of the
+     * field.  The option is permitted only for 64 bit integral and fixed types
+     * (int64, uint64, sint64, fixed64, sfixed64).  By default these types are
+     * represented as JavaScript strings.  This avoids loss of precision that can
+     * happen when a large value is converted to a floating point JavaScript
+     * numbers.  Specifying JS_NUMBER for the jstype causes the generated
+     * JavaScript code to use the JavaScript "number" type instead of strings.
+     * This option is an enum to permit additional types to be added,
+     * e.g. goog.math.Integer.
+     * </pre>
+     *
+     * <code>optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL];</code>
+     */
+    private $jstype = 0;
+    private $has_jstype = false;
+    /**
+     * <pre>
+     * Should this field be parsed lazily?  Lazy applies only to message-type
+     * fields.  It means that when the outer message is initially parsed, the
+     * inner message's contents will not be parsed but instead stored in encoded
+     * form.  The inner message will actually be parsed when it is first accessed.
+     * This is only a hint.  Implementations are free to choose whether to use
+     * eager or lazy parsing regardless of the value of this option.  However,
+     * setting this option true suggests that the protocol author believes that
+     * using lazy parsing on this field is worth the additional bookkeeping
+     * overhead typically needed to implement it.
+     * This option does not affect the public interface of any generated code;
+     * all method signatures remain the same.  Furthermore, thread-safety of the
+     * interface is not affected by this option; const methods remain safe to
+     * call from multiple threads concurrently, while non-const methods continue
+     * to require exclusive access.
+     * Note that implementations may choose not to check required fields within
+     * a lazy sub-message.  That is, calling IsInitialized() on the outer message
+     * may return true even if the inner message has missing required fields.
+     * This is necessary because otherwise the inner message would have to be
+     * parsed in order to perform the check, defeating the purpose of lazy
+     * parsing.  An implementation which chooses not to check required fields
+     * must be consistent about it.  That is, for any particular sub-message, the
+     * implementation must either *always* check its required fields, or *never*
+     * check its required fields, regardless of whether or not the message has
+     * been parsed.
+     * </pre>
+     *
+     * <code>optional bool lazy = 5 [default = false];</code>
+     */
+    private $lazy = false;
+    private $has_lazy = false;
+    /**
+     * <pre>
+     * Is this field deprecated?
+     * Depending on the target platform, this can emit Deprecated annotations
+     * for accessors, or it will be completely ignored; in the very least, this
+     * is a formalization for deprecating fields.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 3 [default = false];</code>
+     */
+    private $deprecated = false;
+    private $has_deprecated = false;
+    /**
+     * <pre>
+     * For Google-internal migration only. Do not use.
+     * </pre>
+     *
+     * <code>optional bool weak = 10 [default = false];</code>
+     */
+    private $weak = false;
+    private $has_weak = false;
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    private $uninterpreted_option;
+    private $has_uninterpreted_option = false;
+
+    public function __construct() {
+        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
+        parent::__construct();
+    }
+
+    /**
+     * <pre>
+     * The ctype option instructs the C++ code generator to use a different
+     * representation of the field than it normally would.  See the specific
+     * options below.  This option is not yet implemented in the open source
+     * release -- sorry, we'll try to include it in a future version!
+     * </pre>
+     *
+     * <code>optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];</code>
+     */
+    public function getCtype()
+    {
+        return $this->ctype;
+    }
+
+    /**
+     * <pre>
+     * The ctype option instructs the C++ code generator to use a different
+     * representation of the field than it normally would.  See the specific
+     * options below.  This option is not yet implemented in the open source
+     * release -- sorry, we'll try to include it in a future version!
+     * </pre>
+     *
+     * <code>optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];</code>
+     */
+    public function setCtype($var)
+    {
+        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FieldOptions_CType::class);
+        $this->ctype = $var;
+        $this->has_ctype = true;
+    }
+
+    public function hasCtype()
+    {
+        return $this->has_ctype;
+    }
+
+    /**
+     * <pre>
+     * The packed option can be enabled for repeated primitive fields to enable
+     * a more efficient representation on the wire. Rather than repeatedly
+     * writing the tag and type for each element, the entire array is encoded as
+     * a single length-delimited blob. In proto3, only explicit setting it to
+     * false will avoid using packed encoding.
+     * </pre>
+     *
+     * <code>optional bool packed = 2;</code>
+     */
+    public function getPacked()
+    {
+        return $this->packed;
+    }
+
+    /**
+     * <pre>
+     * The packed option can be enabled for repeated primitive fields to enable
+     * a more efficient representation on the wire. Rather than repeatedly
+     * writing the tag and type for each element, the entire array is encoded as
+     * a single length-delimited blob. In proto3, only explicit setting it to
+     * false will avoid using packed encoding.
+     * </pre>
+     *
+     * <code>optional bool packed = 2;</code>
+     */
+    public function setPacked($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->packed = $var;
+        $this->has_packed = true;
+    }
+
+    public function hasPacked()
+    {
+        return $this->has_packed;
+    }
+
+    /**
+     * <pre>
+     * The jstype option determines the JavaScript type used for values of the
+     * field.  The option is permitted only for 64 bit integral and fixed types
+     * (int64, uint64, sint64, fixed64, sfixed64).  By default these types are
+     * represented as JavaScript strings.  This avoids loss of precision that can
+     * happen when a large value is converted to a floating point JavaScript
+     * numbers.  Specifying JS_NUMBER for the jstype causes the generated
+     * JavaScript code to use the JavaScript "number" type instead of strings.
+     * This option is an enum to permit additional types to be added,
+     * e.g. goog.math.Integer.
+     * </pre>
+     *
+     * <code>optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL];</code>
+     */
+    public function getJstype()
+    {
+        return $this->jstype;
+    }
+
+    /**
+     * <pre>
+     * The jstype option determines the JavaScript type used for values of the
+     * field.  The option is permitted only for 64 bit integral and fixed types
+     * (int64, uint64, sint64, fixed64, sfixed64).  By default these types are
+     * represented as JavaScript strings.  This avoids loss of precision that can
+     * happen when a large value is converted to a floating point JavaScript
+     * numbers.  Specifying JS_NUMBER for the jstype causes the generated
+     * JavaScript code to use the JavaScript "number" type instead of strings.
+     * This option is an enum to permit additional types to be added,
+     * e.g. goog.math.Integer.
+     * </pre>
+     *
+     * <code>optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL];</code>
+     */
+    public function setJstype($var)
+    {
+        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FieldOptions_JSType::class);
+        $this->jstype = $var;
+        $this->has_jstype = true;
+    }
+
+    public function hasJstype()
+    {
+        return $this->has_jstype;
+    }
+
+    /**
+     * <pre>
+     * Should this field be parsed lazily?  Lazy applies only to message-type
+     * fields.  It means that when the outer message is initially parsed, the
+     * inner message's contents will not be parsed but instead stored in encoded
+     * form.  The inner message will actually be parsed when it is first accessed.
+     * This is only a hint.  Implementations are free to choose whether to use
+     * eager or lazy parsing regardless of the value of this option.  However,
+     * setting this option true suggests that the protocol author believes that
+     * using lazy parsing on this field is worth the additional bookkeeping
+     * overhead typically needed to implement it.
+     * This option does not affect the public interface of any generated code;
+     * all method signatures remain the same.  Furthermore, thread-safety of the
+     * interface is not affected by this option; const methods remain safe to
+     * call from multiple threads concurrently, while non-const methods continue
+     * to require exclusive access.
+     * Note that implementations may choose not to check required fields within
+     * a lazy sub-message.  That is, calling IsInitialized() on the outer message
+     * may return true even if the inner message has missing required fields.
+     * This is necessary because otherwise the inner message would have to be
+     * parsed in order to perform the check, defeating the purpose of lazy
+     * parsing.  An implementation which chooses not to check required fields
+     * must be consistent about it.  That is, for any particular sub-message, the
+     * implementation must either *always* check its required fields, or *never*
+     * check its required fields, regardless of whether or not the message has
+     * been parsed.
+     * </pre>
+     *
+     * <code>optional bool lazy = 5 [default = false];</code>
+     */
+    public function getLazy()
+    {
+        return $this->lazy;
+    }
+
+    /**
+     * <pre>
+     * Should this field be parsed lazily?  Lazy applies only to message-type
+     * fields.  It means that when the outer message is initially parsed, the
+     * inner message's contents will not be parsed but instead stored in encoded
+     * form.  The inner message will actually be parsed when it is first accessed.
+     * This is only a hint.  Implementations are free to choose whether to use
+     * eager or lazy parsing regardless of the value of this option.  However,
+     * setting this option true suggests that the protocol author believes that
+     * using lazy parsing on this field is worth the additional bookkeeping
+     * overhead typically needed to implement it.
+     * This option does not affect the public interface of any generated code;
+     * all method signatures remain the same.  Furthermore, thread-safety of the
+     * interface is not affected by this option; const methods remain safe to
+     * call from multiple threads concurrently, while non-const methods continue
+     * to require exclusive access.
+     * Note that implementations may choose not to check required fields within
+     * a lazy sub-message.  That is, calling IsInitialized() on the outer message
+     * may return true even if the inner message has missing required fields.
+     * This is necessary because otherwise the inner message would have to be
+     * parsed in order to perform the check, defeating the purpose of lazy
+     * parsing.  An implementation which chooses not to check required fields
+     * must be consistent about it.  That is, for any particular sub-message, the
+     * implementation must either *always* check its required fields, or *never*
+     * check its required fields, regardless of whether or not the message has
+     * been parsed.
+     * </pre>
+     *
+     * <code>optional bool lazy = 5 [default = false];</code>
+     */
+    public function setLazy($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->lazy = $var;
+        $this->has_lazy = true;
+    }
+
+    public function hasLazy()
+    {
+        return $this->has_lazy;
+    }
+
+    /**
+     * <pre>
+     * Is this field deprecated?
+     * Depending on the target platform, this can emit Deprecated annotations
+     * for accessors, or it will be completely ignored; in the very least, this
+     * is a formalization for deprecating fields.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 3 [default = false];</code>
+     */
+    public function getDeprecated()
+    {
+        return $this->deprecated;
+    }
+
+    /**
+     * <pre>
+     * Is this field deprecated?
+     * Depending on the target platform, this can emit Deprecated annotations
+     * for accessors, or it will be completely ignored; in the very least, this
+     * is a formalization for deprecating fields.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 3 [default = false];</code>
+     */
+    public function setDeprecated($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->deprecated = $var;
+        $this->has_deprecated = true;
+    }
+
+    public function hasDeprecated()
+    {
+        return $this->has_deprecated;
+    }
+
+    /**
+     * <pre>
+     * For Google-internal migration only. Do not use.
+     * </pre>
+     *
+     * <code>optional bool weak = 10 [default = false];</code>
+     */
+    public function getWeak()
+    {
+        return $this->weak;
+    }
+
+    /**
+     * <pre>
+     * For Google-internal migration only. Do not use.
+     * </pre>
+     *
+     * <code>optional bool weak = 10 [default = false];</code>
+     */
+    public function setWeak($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->weak = $var;
+        $this->has_weak = true;
+    }
+
+    public function hasWeak()
+    {
+        return $this->has_weak;
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function getUninterpretedOption()
+    {
+        return $this->uninterpreted_option;
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function setUninterpretedOption(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
+        $this->uninterpreted_option = $var;
+        $this->has_uninterpreted_option = true;
+    }
+
+    public function hasUninterpretedOption()
+    {
+        return $this->has_uninterpreted_option;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/FieldOptions_CType.php b/php/src/Google/Protobuf/Internal/FieldOptions_CType.php
new file mode 100644
index 0000000..2ff2a47
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/FieldOptions_CType.php
@@ -0,0 +1,29 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+/**
+ * Protobuf enum <code>google.protobuf.FieldOptions.CType</code>
+ */
+namespace Google\Protobuf\Internal;
+
+class FieldOptions_CType
+{
+    /**
+     * <pre>
+     * Default mode.
+     * </pre>
+     *
+     * <code>STRING = 0;</code>
+     */
+    const STRING = 0;
+    /**
+     * <code>CORD = 1;</code>
+     */
+    const CORD = 1;
+    /**
+     * <code>STRING_PIECE = 2;</code>
+     */
+    const STRING_PIECE = 2;
+}
+
diff --git a/php/src/Google/Protobuf/Internal/FieldOptions_JSType.php b/php/src/Google/Protobuf/Internal/FieldOptions_JSType.php
new file mode 100644
index 0000000..541c8ae
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/FieldOptions_JSType.php
@@ -0,0 +1,37 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+/**
+ * Protobuf enum <code>google.protobuf.FieldOptions.JSType</code>
+ */
+namespace Google\Protobuf\Internal;
+
+class FieldOptions_JSType
+{
+    /**
+     * <pre>
+     * Use the default type.
+     * </pre>
+     *
+     * <code>JS_NORMAL = 0;</code>
+     */
+    const JS_NORMAL = 0;
+    /**
+     * <pre>
+     * Use JavaScript strings.
+     * </pre>
+     *
+     * <code>JS_STRING = 1;</code>
+     */
+    const JS_STRING = 1;
+    /**
+     * <pre>
+     * Use JavaScript numbers.
+     * </pre>
+     *
+     * <code>JS_NUMBER = 2;</code>
+     */
+    const JS_NUMBER = 2;
+}
+
diff --git a/php/src/Google/Protobuf/Internal/FileDescriptorProto.php b/php/src/Google/Protobuf/Internal/FileDescriptorProto.php
new file mode 100644
index 0000000..39f6776
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/FileDescriptorProto.php
@@ -0,0 +1,477 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+namespace Google\Protobuf\Internal;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\GPBWire;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\InputStream;
+
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * <pre>
+ * Describes a complete .proto file.
+ * </pre>
+ *
+ * Protobuf type <code>google.protobuf.FileDescriptorProto</code>
+ */
+class FileDescriptorProto extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <pre>
+     * file name, relative to root of source tree
+     * </pre>
+     *
+     * <code>optional string name = 1;</code>
+     */
+    private $name = '';
+    private $has_name = false;
+    /**
+     * <pre>
+     * e.g. "foo", "foo.bar", etc.
+     * </pre>
+     *
+     * <code>optional string package = 2;</code>
+     */
+    private $package = '';
+    private $has_package = false;
+    /**
+     * <pre>
+     * Names of files imported by this file.
+     * </pre>
+     *
+     * <code>repeated string dependency = 3;</code>
+     */
+    private $dependency;
+    private $has_dependency = false;
+    /**
+     * <pre>
+     * Indexes of the public imported files in the dependency list above.
+     * </pre>
+     *
+     * <code>repeated int32 public_dependency = 10;</code>
+     */
+    private $public_dependency;
+    private $has_public_dependency = false;
+    /**
+     * <pre>
+     * Indexes of the weak imported files in the dependency list.
+     * For Google-internal migration only. Do not use.
+     * </pre>
+     *
+     * <code>repeated int32 weak_dependency = 11;</code>
+     */
+    private $weak_dependency;
+    private $has_weak_dependency = false;
+    /**
+     * <pre>
+     * All top-level definitions in this file.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.DescriptorProto message_type = 4;</code>
+     */
+    private $message_type;
+    private $has_message_type = false;
+    /**
+     * <code>repeated .google.protobuf.EnumDescriptorProto enum_type = 5;</code>
+     */
+    private $enum_type;
+    private $has_enum_type = false;
+    /**
+     * <code>repeated .google.protobuf.ServiceDescriptorProto service = 6;</code>
+     */
+    private $service;
+    private $has_service = false;
+    /**
+     * <code>repeated .google.protobuf.FieldDescriptorProto extension = 7;</code>
+     */
+    private $extension;
+    private $has_extension = false;
+    /**
+     * <code>optional .google.protobuf.FileOptions options = 8;</code>
+     */
+    private $options = null;
+    private $has_options = false;
+    /**
+     * <pre>
+     * This field contains optional information about the original source code.
+     * You may safely remove this entire field without harming runtime
+     * functionality of the descriptors -- the information is needed only by
+     * development tools.
+     * </pre>
+     *
+     * <code>optional .google.protobuf.SourceCodeInfo source_code_info = 9;</code>
+     */
+    private $source_code_info = null;
+    private $has_source_code_info = false;
+    /**
+     * <pre>
+     * The syntax of the proto file.
+     * The supported values are "proto2" and "proto3".
+     * </pre>
+     *
+     * <code>optional string syntax = 12;</code>
+     */
+    private $syntax = '';
+    private $has_syntax = false;
+
+    public function __construct() {
+        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
+        parent::__construct();
+    }
+
+    /**
+     * <pre>
+     * file name, relative to root of source tree
+     * </pre>
+     *
+     * <code>optional string name = 1;</code>
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * <pre>
+     * file name, relative to root of source tree
+     * </pre>
+     *
+     * <code>optional string name = 1;</code>
+     */
+    public function setName($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->name = $var;
+        $this->has_name = true;
+    }
+
+    public function hasName()
+    {
+        return $this->has_name;
+    }
+
+    /**
+     * <pre>
+     * e.g. "foo", "foo.bar", etc.
+     * </pre>
+     *
+     * <code>optional string package = 2;</code>
+     */
+    public function getPackage()
+    {
+        return $this->package;
+    }
+
+    /**
+     * <pre>
+     * e.g. "foo", "foo.bar", etc.
+     * </pre>
+     *
+     * <code>optional string package = 2;</code>
+     */
+    public function setPackage($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->package = $var;
+        $this->has_package = true;
+    }
+
+    public function hasPackage()
+    {
+        return $this->has_package;
+    }
+
+    /**
+     * <pre>
+     * Names of files imported by this file.
+     * </pre>
+     *
+     * <code>repeated string dependency = 3;</code>
+     */
+    public function getDependency()
+    {
+        return $this->dependency;
+    }
+
+    /**
+     * <pre>
+     * Names of files imported by this file.
+     * </pre>
+     *
+     * <code>repeated string dependency = 3;</code>
+     */
+    public function setDependency(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING);
+        $this->dependency = $var;
+        $this->has_dependency = true;
+    }
+
+    public function hasDependency()
+    {
+        return $this->has_dependency;
+    }
+
+    /**
+     * <pre>
+     * Indexes of the public imported files in the dependency list above.
+     * </pre>
+     *
+     * <code>repeated int32 public_dependency = 10;</code>
+     */
+    public function getPublicDependency()
+    {
+        return $this->public_dependency;
+    }
+
+    /**
+     * <pre>
+     * Indexes of the public imported files in the dependency list above.
+     * </pre>
+     *
+     * <code>repeated int32 public_dependency = 10;</code>
+     */
+    public function setPublicDependency(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::INT32);
+        $this->public_dependency = $var;
+        $this->has_public_dependency = true;
+    }
+
+    public function hasPublicDependency()
+    {
+        return $this->has_public_dependency;
+    }
+
+    /**
+     * <pre>
+     * Indexes of the weak imported files in the dependency list.
+     * For Google-internal migration only. Do not use.
+     * </pre>
+     *
+     * <code>repeated int32 weak_dependency = 11;</code>
+     */
+    public function getWeakDependency()
+    {
+        return $this->weak_dependency;
+    }
+
+    /**
+     * <pre>
+     * Indexes of the weak imported files in the dependency list.
+     * For Google-internal migration only. Do not use.
+     * </pre>
+     *
+     * <code>repeated int32 weak_dependency = 11;</code>
+     */
+    public function setWeakDependency(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::INT32);
+        $this->weak_dependency = $var;
+        $this->has_weak_dependency = true;
+    }
+
+    public function hasWeakDependency()
+    {
+        return $this->has_weak_dependency;
+    }
+
+    /**
+     * <pre>
+     * All top-level definitions in this file.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.DescriptorProto message_type = 4;</code>
+     */
+    public function getMessageType()
+    {
+        return $this->message_type;
+    }
+
+    /**
+     * <pre>
+     * All top-level definitions in this file.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.DescriptorProto message_type = 4;</code>
+     */
+    public function setMessageType(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\DescriptorProto::class);
+        $this->message_type = $var;
+        $this->has_message_type = true;
+    }
+
+    public function hasMessageType()
+    {
+        return $this->has_message_type;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.EnumDescriptorProto enum_type = 5;</code>
+     */
+    public function getEnumType()
+    {
+        return $this->enum_type;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.EnumDescriptorProto enum_type = 5;</code>
+     */
+    public function setEnumType(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\EnumDescriptorProto::class);
+        $this->enum_type = $var;
+        $this->has_enum_type = true;
+    }
+
+    public function hasEnumType()
+    {
+        return $this->has_enum_type;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.ServiceDescriptorProto service = 6;</code>
+     */
+    public function getService()
+    {
+        return $this->service;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.ServiceDescriptorProto service = 6;</code>
+     */
+    public function setService(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\ServiceDescriptorProto::class);
+        $this->service = $var;
+        $this->has_service = true;
+    }
+
+    public function hasService()
+    {
+        return $this->has_service;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.FieldDescriptorProto extension = 7;</code>
+     */
+    public function getExtension()
+    {
+        return $this->extension;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.FieldDescriptorProto extension = 7;</code>
+     */
+    public function setExtension(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\FieldDescriptorProto::class);
+        $this->extension = $var;
+        $this->has_extension = true;
+    }
+
+    public function hasExtension()
+    {
+        return $this->has_extension;
+    }
+
+    /**
+     * <code>optional .google.protobuf.FileOptions options = 8;</code>
+     */
+    public function getOptions()
+    {
+        return $this->options;
+    }
+
+    /**
+     * <code>optional .google.protobuf.FileOptions options = 8;</code>
+     */
+    public function setOptions(&$var)
+    {
+        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\FileOptions::class);
+        $this->options = $var;
+        $this->has_options = true;
+    }
+
+    public function hasOptions()
+    {
+        return $this->has_options;
+    }
+
+    /**
+     * <pre>
+     * This field contains optional information about the original source code.
+     * You may safely remove this entire field without harming runtime
+     * functionality of the descriptors -- the information is needed only by
+     * development tools.
+     * </pre>
+     *
+     * <code>optional .google.protobuf.SourceCodeInfo source_code_info = 9;</code>
+     */
+    public function getSourceCodeInfo()
+    {
+        return $this->source_code_info;
+    }
+
+    /**
+     * <pre>
+     * This field contains optional information about the original source code.
+     * You may safely remove this entire field without harming runtime
+     * functionality of the descriptors -- the information is needed only by
+     * development tools.
+     * </pre>
+     *
+     * <code>optional .google.protobuf.SourceCodeInfo source_code_info = 9;</code>
+     */
+    public function setSourceCodeInfo(&$var)
+    {
+        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\SourceCodeInfo::class);
+        $this->source_code_info = $var;
+        $this->has_source_code_info = true;
+    }
+
+    public function hasSourceCodeInfo()
+    {
+        return $this->has_source_code_info;
+    }
+
+    /**
+     * <pre>
+     * The syntax of the proto file.
+     * The supported values are "proto2" and "proto3".
+     * </pre>
+     *
+     * <code>optional string syntax = 12;</code>
+     */
+    public function getSyntax()
+    {
+        return $this->syntax;
+    }
+
+    /**
+     * <pre>
+     * The syntax of the proto file.
+     * The supported values are "proto2" and "proto3".
+     * </pre>
+     *
+     * <code>optional string syntax = 12;</code>
+     */
+    public function setSyntax($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->syntax = $var;
+        $this->has_syntax = true;
+    }
+
+    public function hasSyntax()
+    {
+        return $this->has_syntax;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/FileDescriptorSet.php b/php/src/Google/Protobuf/Internal/FileDescriptorSet.php
new file mode 100644
index 0000000..20a165c
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/FileDescriptorSet.php
@@ -0,0 +1,59 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+namespace Google\Protobuf\Internal;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\GPBWire;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\InputStream;
+
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * <pre>
+ * The protocol compiler can output a FileDescriptorSet containing the .proto
+ * files it parses.
+ * </pre>
+ *
+ * Protobuf type <code>google.protobuf.FileDescriptorSet</code>
+ */
+class FileDescriptorSet extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <code>repeated .google.protobuf.FileDescriptorProto file = 1;</code>
+     */
+    private $file;
+    private $has_file = false;
+
+    public function __construct() {
+        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
+        parent::__construct();
+    }
+
+    /**
+     * <code>repeated .google.protobuf.FileDescriptorProto file = 1;</code>
+     */
+    public function getFile()
+    {
+        return $this->file;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.FileDescriptorProto file = 1;</code>
+     */
+    public function setFile(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\FileDescriptorProto::class);
+        $this->file = $var;
+        $this->has_file = true;
+    }
+
+    public function hasFile()
+    {
+        return $this->has_file;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/FileOptions.php b/php/src/Google/Protobuf/Internal/FileOptions.php
new file mode 100644
index 0000000..2422f3e
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/FileOptions.php
@@ -0,0 +1,741 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+namespace Google\Protobuf\Internal;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\GPBWire;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\InputStream;
+
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * Protobuf type <code>google.protobuf.FileOptions</code>
+ */
+class FileOptions extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <pre>
+     * Sets the Java package where classes generated from this .proto will be
+     * placed.  By default, the proto package is used, but this is often
+     * inappropriate because proto packages do not normally start with backwards
+     * domain names.
+     * </pre>
+     *
+     * <code>optional string java_package = 1;</code>
+     */
+    private $java_package = '';
+    private $has_java_package = false;
+    /**
+     * <pre>
+     * If set, all the classes from the .proto file are wrapped in a single
+     * outer class with the given name.  This applies to both Proto1
+     * (equivalent to the old "--one_java_file" option) and Proto2 (where
+     * a .proto always translates to a single class, but you may want to
+     * explicitly choose the class name).
+     * </pre>
+     *
+     * <code>optional string java_outer_classname = 8;</code>
+     */
+    private $java_outer_classname = '';
+    private $has_java_outer_classname = false;
+    /**
+     * <pre>
+     * If set true, then the Java code generator will generate a separate .java
+     * file for each top-level message, enum, and service defined in the .proto
+     * file.  Thus, these types will *not* be nested inside the outer class
+     * named by java_outer_classname.  However, the outer class will still be
+     * generated to contain the file's getDescriptor() method as well as any
+     * top-level extensions defined in the file.
+     * </pre>
+     *
+     * <code>optional bool java_multiple_files = 10 [default = false];</code>
+     */
+    private $java_multiple_files = false;
+    private $has_java_multiple_files = false;
+    /**
+     * <pre>
+     * This option does nothing.
+     * </pre>
+     *
+     * <code>optional bool java_generate_equals_and_hash = 20 [deprecated = true];</code>
+     */
+    private $java_generate_equals_and_hash = false;
+    private $has_java_generate_equals_and_hash = false;
+    /**
+     * <pre>
+     * If set true, then the Java2 code generator will generate code that
+     * throws an exception whenever an attempt is made to assign a non-UTF-8
+     * byte sequence to a string field.
+     * Message reflection will do the same.
+     * However, an extension field still accepts non-UTF-8 byte sequences.
+     * This option has no effect on when used with the lite runtime.
+     * </pre>
+     *
+     * <code>optional bool java_string_check_utf8 = 27 [default = false];</code>
+     */
+    private $java_string_check_utf8 = false;
+    private $has_java_string_check_utf8 = false;
+    /**
+     * <code>optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];</code>
+     */
+    private $optimize_for = 0;
+    private $has_optimize_for = false;
+    /**
+     * <pre>
+     * Sets the Go package where structs generated from this .proto will be
+     * placed. If omitted, the Go package will be derived from the following:
+     *   - The basename of the package import path, if provided.
+     *   - Otherwise, the package statement in the .proto file, if present.
+     *   - Otherwise, the basename of the .proto file, without extension.
+     * </pre>
+     *
+     * <code>optional string go_package = 11;</code>
+     */
+    private $go_package = '';
+    private $has_go_package = false;
+    /**
+     * <pre>
+     * Should generic services be generated in each language?  "Generic" services
+     * are not specific to any particular RPC system.  They are generated by the
+     * main code generators in each language (without additional plugins).
+     * Generic services were the only kind of service generation supported by
+     * early versions of google.protobuf.
+     * Generic services are now considered deprecated in favor of using plugins
+     * that generate code specific to your particular RPC system.  Therefore,
+     * these default to false.  Old code which depends on generic services should
+     * explicitly set them to true.
+     * </pre>
+     *
+     * <code>optional bool cc_generic_services = 16 [default = false];</code>
+     */
+    private $cc_generic_services = false;
+    private $has_cc_generic_services = false;
+    /**
+     * <code>optional bool java_generic_services = 17 [default = false];</code>
+     */
+    private $java_generic_services = false;
+    private $has_java_generic_services = false;
+    /**
+     * <code>optional bool py_generic_services = 18 [default = false];</code>
+     */
+    private $py_generic_services = false;
+    private $has_py_generic_services = false;
+    /**
+     * <pre>
+     * Is this file deprecated?
+     * Depending on the target platform, this can emit Deprecated annotations
+     * for everything in the file, or it will be completely ignored; in the very
+     * least, this is a formalization for deprecating files.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 23 [default = false];</code>
+     */
+    private $deprecated = false;
+    private $has_deprecated = false;
+    /**
+     * <pre>
+     * Enables the use of arenas for the proto messages in this file. This applies
+     * only to generated classes for C++.
+     * </pre>
+     *
+     * <code>optional bool cc_enable_arenas = 31 [default = false];</code>
+     */
+    private $cc_enable_arenas = false;
+    private $has_cc_enable_arenas = false;
+    /**
+     * <pre>
+     * Sets the objective c class prefix which is prepended to all objective c
+     * generated classes from this .proto. There is no default.
+     * </pre>
+     *
+     * <code>optional string objc_class_prefix = 36;</code>
+     */
+    private $objc_class_prefix = '';
+    private $has_objc_class_prefix = false;
+    /**
+     * <pre>
+     * Namespace for generated classes; defaults to the package.
+     * </pre>
+     *
+     * <code>optional string csharp_namespace = 37;</code>
+     */
+    private $csharp_namespace = '';
+    private $has_csharp_namespace = false;
+    /**
+     * <pre>
+     * By default Swift generators will take the proto package and CamelCase it
+     * replacing '.' with underscore and use that to prefix the types/symbols
+     * defined. When this options is provided, they will use this value instead
+     * to prefix the types/symbols defined.
+     * </pre>
+     *
+     * <code>optional string swift_prefix = 39;</code>
+     */
+    private $swift_prefix = '';
+    private $has_swift_prefix = false;
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    private $uninterpreted_option;
+    private $has_uninterpreted_option = false;
+
+    public function __construct() {
+        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
+        parent::__construct();
+    }
+
+    /**
+     * <pre>
+     * Sets the Java package where classes generated from this .proto will be
+     * placed.  By default, the proto package is used, but this is often
+     * inappropriate because proto packages do not normally start with backwards
+     * domain names.
+     * </pre>
+     *
+     * <code>optional string java_package = 1;</code>
+     */
+    public function getJavaPackage()
+    {
+        return $this->java_package;
+    }
+
+    /**
+     * <pre>
+     * Sets the Java package where classes generated from this .proto will be
+     * placed.  By default, the proto package is used, but this is often
+     * inappropriate because proto packages do not normally start with backwards
+     * domain names.
+     * </pre>
+     *
+     * <code>optional string java_package = 1;</code>
+     */
+    public function setJavaPackage($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->java_package = $var;
+        $this->has_java_package = true;
+    }
+
+    public function hasJavaPackage()
+    {
+        return $this->has_java_package;
+    }
+
+    /**
+     * <pre>
+     * If set, all the classes from the .proto file are wrapped in a single
+     * outer class with the given name.  This applies to both Proto1
+     * (equivalent to the old "--one_java_file" option) and Proto2 (where
+     * a .proto always translates to a single class, but you may want to
+     * explicitly choose the class name).
+     * </pre>
+     *
+     * <code>optional string java_outer_classname = 8;</code>
+     */
+    public function getJavaOuterClassname()
+    {
+        return $this->java_outer_classname;
+    }
+
+    /**
+     * <pre>
+     * If set, all the classes from the .proto file are wrapped in a single
+     * outer class with the given name.  This applies to both Proto1
+     * (equivalent to the old "--one_java_file" option) and Proto2 (where
+     * a .proto always translates to a single class, but you may want to
+     * explicitly choose the class name).
+     * </pre>
+     *
+     * <code>optional string java_outer_classname = 8;</code>
+     */
+    public function setJavaOuterClassname($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->java_outer_classname = $var;
+        $this->has_java_outer_classname = true;
+    }
+
+    public function hasJavaOuterClassname()
+    {
+        return $this->has_java_outer_classname;
+    }
+
+    /**
+     * <pre>
+     * If set true, then the Java code generator will generate a separate .java
+     * file for each top-level message, enum, and service defined in the .proto
+     * file.  Thus, these types will *not* be nested inside the outer class
+     * named by java_outer_classname.  However, the outer class will still be
+     * generated to contain the file's getDescriptor() method as well as any
+     * top-level extensions defined in the file.
+     * </pre>
+     *
+     * <code>optional bool java_multiple_files = 10 [default = false];</code>
+     */
+    public function getJavaMultipleFiles()
+    {
+        return $this->java_multiple_files;
+    }
+
+    /**
+     * <pre>
+     * If set true, then the Java code generator will generate a separate .java
+     * file for each top-level message, enum, and service defined in the .proto
+     * file.  Thus, these types will *not* be nested inside the outer class
+     * named by java_outer_classname.  However, the outer class will still be
+     * generated to contain the file's getDescriptor() method as well as any
+     * top-level extensions defined in the file.
+     * </pre>
+     *
+     * <code>optional bool java_multiple_files = 10 [default = false];</code>
+     */
+    public function setJavaMultipleFiles($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->java_multiple_files = $var;
+        $this->has_java_multiple_files = true;
+    }
+
+    public function hasJavaMultipleFiles()
+    {
+        return $this->has_java_multiple_files;
+    }
+
+    /**
+     * <pre>
+     * This option does nothing.
+     * </pre>
+     *
+     * <code>optional bool java_generate_equals_and_hash = 20 [deprecated = true];</code>
+     */
+    public function getJavaGenerateEqualsAndHash()
+    {
+        return $this->java_generate_equals_and_hash;
+    }
+
+    /**
+     * <pre>
+     * This option does nothing.
+     * </pre>
+     *
+     * <code>optional bool java_generate_equals_and_hash = 20 [deprecated = true];</code>
+     */
+    public function setJavaGenerateEqualsAndHash($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->java_generate_equals_and_hash = $var;
+        $this->has_java_generate_equals_and_hash = true;
+    }
+
+    public function hasJavaGenerateEqualsAndHash()
+    {
+        return $this->has_java_generate_equals_and_hash;
+    }
+
+    /**
+     * <pre>
+     * If set true, then the Java2 code generator will generate code that
+     * throws an exception whenever an attempt is made to assign a non-UTF-8
+     * byte sequence to a string field.
+     * Message reflection will do the same.
+     * However, an extension field still accepts non-UTF-8 byte sequences.
+     * This option has no effect on when used with the lite runtime.
+     * </pre>
+     *
+     * <code>optional bool java_string_check_utf8 = 27 [default = false];</code>
+     */
+    public function getJavaStringCheckUtf8()
+    {
+        return $this->java_string_check_utf8;
+    }
+
+    /**
+     * <pre>
+     * If set true, then the Java2 code generator will generate code that
+     * throws an exception whenever an attempt is made to assign a non-UTF-8
+     * byte sequence to a string field.
+     * Message reflection will do the same.
+     * However, an extension field still accepts non-UTF-8 byte sequences.
+     * This option has no effect on when used with the lite runtime.
+     * </pre>
+     *
+     * <code>optional bool java_string_check_utf8 = 27 [default = false];</code>
+     */
+    public function setJavaStringCheckUtf8($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->java_string_check_utf8 = $var;
+        $this->has_java_string_check_utf8 = true;
+    }
+
+    public function hasJavaStringCheckUtf8()
+    {
+        return $this->has_java_string_check_utf8;
+    }
+
+    /**
+     * <code>optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];</code>
+     */
+    public function getOptimizeFor()
+    {
+        return $this->optimize_for;
+    }
+
+    /**
+     * <code>optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];</code>
+     */
+    public function setOptimizeFor($var)
+    {
+        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FileOptions_OptimizeMode::class);
+        $this->optimize_for = $var;
+        $this->has_optimize_for = true;
+    }
+
+    public function hasOptimizeFor()
+    {
+        return $this->has_optimize_for;
+    }
+
+    /**
+     * <pre>
+     * Sets the Go package where structs generated from this .proto will be
+     * placed. If omitted, the Go package will be derived from the following:
+     *   - The basename of the package import path, if provided.
+     *   - Otherwise, the package statement in the .proto file, if present.
+     *   - Otherwise, the basename of the .proto file, without extension.
+     * </pre>
+     *
+     * <code>optional string go_package = 11;</code>
+     */
+    public function getGoPackage()
+    {
+        return $this->go_package;
+    }
+
+    /**
+     * <pre>
+     * Sets the Go package where structs generated from this .proto will be
+     * placed. If omitted, the Go package will be derived from the following:
+     *   - The basename of the package import path, if provided.
+     *   - Otherwise, the package statement in the .proto file, if present.
+     *   - Otherwise, the basename of the .proto file, without extension.
+     * </pre>
+     *
+     * <code>optional string go_package = 11;</code>
+     */
+    public function setGoPackage($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->go_package = $var;
+        $this->has_go_package = true;
+    }
+
+    public function hasGoPackage()
+    {
+        return $this->has_go_package;
+    }
+
+    /**
+     * <pre>
+     * Should generic services be generated in each language?  "Generic" services
+     * are not specific to any particular RPC system.  They are generated by the
+     * main code generators in each language (without additional plugins).
+     * Generic services were the only kind of service generation supported by
+     * early versions of google.protobuf.
+     * Generic services are now considered deprecated in favor of using plugins
+     * that generate code specific to your particular RPC system.  Therefore,
+     * these default to false.  Old code which depends on generic services should
+     * explicitly set them to true.
+     * </pre>
+     *
+     * <code>optional bool cc_generic_services = 16 [default = false];</code>
+     */
+    public function getCcGenericServices()
+    {
+        return $this->cc_generic_services;
+    }
+
+    /**
+     * <pre>
+     * Should generic services be generated in each language?  "Generic" services
+     * are not specific to any particular RPC system.  They are generated by the
+     * main code generators in each language (without additional plugins).
+     * Generic services were the only kind of service generation supported by
+     * early versions of google.protobuf.
+     * Generic services are now considered deprecated in favor of using plugins
+     * that generate code specific to your particular RPC system.  Therefore,
+     * these default to false.  Old code which depends on generic services should
+     * explicitly set them to true.
+     * </pre>
+     *
+     * <code>optional bool cc_generic_services = 16 [default = false];</code>
+     */
+    public function setCcGenericServices($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->cc_generic_services = $var;
+        $this->has_cc_generic_services = true;
+    }
+
+    public function hasCcGenericServices()
+    {
+        return $this->has_cc_generic_services;
+    }
+
+    /**
+     * <code>optional bool java_generic_services = 17 [default = false];</code>
+     */
+    public function getJavaGenericServices()
+    {
+        return $this->java_generic_services;
+    }
+
+    /**
+     * <code>optional bool java_generic_services = 17 [default = false];</code>
+     */
+    public function setJavaGenericServices($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->java_generic_services = $var;
+        $this->has_java_generic_services = true;
+    }
+
+    public function hasJavaGenericServices()
+    {
+        return $this->has_java_generic_services;
+    }
+
+    /**
+     * <code>optional bool py_generic_services = 18 [default = false];</code>
+     */
+    public function getPyGenericServices()
+    {
+        return $this->py_generic_services;
+    }
+
+    /**
+     * <code>optional bool py_generic_services = 18 [default = false];</code>
+     */
+    public function setPyGenericServices($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->py_generic_services = $var;
+        $this->has_py_generic_services = true;
+    }
+
+    public function hasPyGenericServices()
+    {
+        return $this->has_py_generic_services;
+    }
+
+    /**
+     * <pre>
+     * Is this file deprecated?
+     * Depending on the target platform, this can emit Deprecated annotations
+     * for everything in the file, or it will be completely ignored; in the very
+     * least, this is a formalization for deprecating files.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 23 [default = false];</code>
+     */
+    public function getDeprecated()
+    {
+        return $this->deprecated;
+    }
+
+    /**
+     * <pre>
+     * Is this file deprecated?
+     * Depending on the target platform, this can emit Deprecated annotations
+     * for everything in the file, or it will be completely ignored; in the very
+     * least, this is a formalization for deprecating files.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 23 [default = false];</code>
+     */
+    public function setDeprecated($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->deprecated = $var;
+        $this->has_deprecated = true;
+    }
+
+    public function hasDeprecated()
+    {
+        return $this->has_deprecated;
+    }
+
+    /**
+     * <pre>
+     * Enables the use of arenas for the proto messages in this file. This applies
+     * only to generated classes for C++.
+     * </pre>
+     *
+     * <code>optional bool cc_enable_arenas = 31 [default = false];</code>
+     */
+    public function getCcEnableArenas()
+    {
+        return $this->cc_enable_arenas;
+    }
+
+    /**
+     * <pre>
+     * Enables the use of arenas for the proto messages in this file. This applies
+     * only to generated classes for C++.
+     * </pre>
+     *
+     * <code>optional bool cc_enable_arenas = 31 [default = false];</code>
+     */
+    public function setCcEnableArenas($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->cc_enable_arenas = $var;
+        $this->has_cc_enable_arenas = true;
+    }
+
+    public function hasCcEnableArenas()
+    {
+        return $this->has_cc_enable_arenas;
+    }
+
+    /**
+     * <pre>
+     * Sets the objective c class prefix which is prepended to all objective c
+     * generated classes from this .proto. There is no default.
+     * </pre>
+     *
+     * <code>optional string objc_class_prefix = 36;</code>
+     */
+    public function getObjcClassPrefix()
+    {
+        return $this->objc_class_prefix;
+    }
+
+    /**
+     * <pre>
+     * Sets the objective c class prefix which is prepended to all objective c
+     * generated classes from this .proto. There is no default.
+     * </pre>
+     *
+     * <code>optional string objc_class_prefix = 36;</code>
+     */
+    public function setObjcClassPrefix($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->objc_class_prefix = $var;
+        $this->has_objc_class_prefix = true;
+    }
+
+    public function hasObjcClassPrefix()
+    {
+        return $this->has_objc_class_prefix;
+    }
+
+    /**
+     * <pre>
+     * Namespace for generated classes; defaults to the package.
+     * </pre>
+     *
+     * <code>optional string csharp_namespace = 37;</code>
+     */
+    public function getCsharpNamespace()
+    {
+        return $this->csharp_namespace;
+    }
+
+    /**
+     * <pre>
+     * Namespace for generated classes; defaults to the package.
+     * </pre>
+     *
+     * <code>optional string csharp_namespace = 37;</code>
+     */
+    public function setCsharpNamespace($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->csharp_namespace = $var;
+        $this->has_csharp_namespace = true;
+    }
+
+    public function hasCsharpNamespace()
+    {
+        return $this->has_csharp_namespace;
+    }
+
+    /**
+     * <pre>
+     * By default Swift generators will take the proto package and CamelCase it
+     * replacing '.' with underscore and use that to prefix the types/symbols
+     * defined. When this options is provided, they will use this value instead
+     * to prefix the types/symbols defined.
+     * </pre>
+     *
+     * <code>optional string swift_prefix = 39;</code>
+     */
+    public function getSwiftPrefix()
+    {
+        return $this->swift_prefix;
+    }
+
+    /**
+     * <pre>
+     * By default Swift generators will take the proto package and CamelCase it
+     * replacing '.' with underscore and use that to prefix the types/symbols
+     * defined. When this options is provided, they will use this value instead
+     * to prefix the types/symbols defined.
+     * </pre>
+     *
+     * <code>optional string swift_prefix = 39;</code>
+     */
+    public function setSwiftPrefix($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->swift_prefix = $var;
+        $this->has_swift_prefix = true;
+    }
+
+    public function hasSwiftPrefix()
+    {
+        return $this->has_swift_prefix;
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function getUninterpretedOption()
+    {
+        return $this->uninterpreted_option;
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function setUninterpretedOption(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
+        $this->uninterpreted_option = $var;
+        $this->has_uninterpreted_option = true;
+    }
+
+    public function hasUninterpretedOption()
+    {
+        return $this->has_uninterpreted_option;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/FileOptions_OptimizeMode.php b/php/src/Google/Protobuf/Internal/FileOptions_OptimizeMode.php
new file mode 100644
index 0000000..7fd488e
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/FileOptions_OptimizeMode.php
@@ -0,0 +1,41 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+/**
+ * <pre>
+ * Generated classes can be optimized for speed or code size.
+ * </pre>
+ *
+ * Protobuf enum <code>google.protobuf.FileOptions.OptimizeMode</code>
+ */
+namespace Google\Protobuf\Internal;
+
+class FileOptions_OptimizeMode
+{
+    /**
+     * <pre>
+     * Generate complete code for parsing, serialization,
+     * </pre>
+     *
+     * <code>SPEED = 1;</code>
+     */
+    const SPEED = 1;
+    /**
+     * <pre>
+     * etc.
+     * </pre>
+     *
+     * <code>CODE_SIZE = 2;</code>
+     */
+    const CODE_SIZE = 2;
+    /**
+     * <pre>
+     * Generate code using MessageLite and the lite runtime.
+     * </pre>
+     *
+     * <code>LITE_RUNTIME = 3;</code>
+     */
+    const LITE_RUNTIME = 3;
+}
+
diff --git a/php/src/Google/Protobuf/Internal/GeneratedCodeInfo.php b/php/src/Google/Protobuf/Internal/GeneratedCodeInfo.php
new file mode 100644
index 0000000..8e493c2
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/GeneratedCodeInfo.php
@@ -0,0 +1,75 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+namespace Google\Protobuf\Internal;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\GPBWire;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\InputStream;
+
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * <pre>
+ * Describes the relationship between generated code and its original source
+ * file. A GeneratedCodeInfo message is associated with only one generated
+ * source file, but may contain references to different source .proto files.
+ * </pre>
+ *
+ * Protobuf type <code>google.protobuf.GeneratedCodeInfo</code>
+ */
+class GeneratedCodeInfo extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <pre>
+     * An Annotation connects some span of text in generated code to an element
+     * of its generating .proto file.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1;</code>
+     */
+    private $annotation;
+    private $has_annotation = false;
+
+    public function __construct() {
+        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
+        parent::__construct();
+    }
+
+    /**
+     * <pre>
+     * An Annotation connects some span of text in generated code to an element
+     * of its generating .proto file.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1;</code>
+     */
+    public function getAnnotation()
+    {
+        return $this->annotation;
+    }
+
+    /**
+     * <pre>
+     * An Annotation connects some span of text in generated code to an element
+     * of its generating .proto file.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1;</code>
+     */
+    public function setAnnotation(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\GeneratedCodeInfo_Annotation::class);
+        $this->annotation = $var;
+        $this->has_annotation = true;
+    }
+
+    public function hasAnnotation()
+    {
+        return $this->has_annotation;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/GeneratedCodeInfo_Annotation.php b/php/src/Google/Protobuf/Internal/GeneratedCodeInfo_Annotation.php
new file mode 100644
index 0000000..dcc7edf
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/GeneratedCodeInfo_Annotation.php
@@ -0,0 +1,198 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+namespace Google\Protobuf\Internal;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\GPBWire;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\InputStream;
+
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * Protobuf type <code>google.protobuf.GeneratedCodeInfo.Annotation</code>
+ */
+class GeneratedCodeInfo_Annotation extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <pre>
+     * Identifies the element in the original source .proto file. This field
+     * is formatted the same as SourceCodeInfo.Location.path.
+     * </pre>
+     *
+     * <code>repeated int32 path = 1 [packed = true];</code>
+     */
+    private $path;
+    private $has_path = false;
+    /**
+     * <pre>
+     * Identifies the filesystem path to the original source .proto.
+     * </pre>
+     *
+     * <code>optional string source_file = 2;</code>
+     */
+    private $source_file = '';
+    private $has_source_file = false;
+    /**
+     * <pre>
+     * Identifies the starting offset in bytes in the generated code
+     * that relates to the identified object.
+     * </pre>
+     *
+     * <code>optional int32 begin = 3;</code>
+     */
+    private $begin = 0;
+    private $has_begin = false;
+    /**
+     * <pre>
+     * Identifies the ending offset in bytes in the generated code that
+     * relates to the identified offset. The end offset should be one past
+     * the last relevant byte (so the length of the text = end - begin).
+     * </pre>
+     *
+     * <code>optional int32 end = 4;</code>
+     */
+    private $end = 0;
+    private $has_end = false;
+
+    public function __construct() {
+        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
+        parent::__construct();
+    }
+
+    /**
+     * <pre>
+     * Identifies the element in the original source .proto file. This field
+     * is formatted the same as SourceCodeInfo.Location.path.
+     * </pre>
+     *
+     * <code>repeated int32 path = 1 [packed = true];</code>
+     */
+    public function getPath()
+    {
+        return $this->path;
+    }
+
+    /**
+     * <pre>
+     * Identifies the element in the original source .proto file. This field
+     * is formatted the same as SourceCodeInfo.Location.path.
+     * </pre>
+     *
+     * <code>repeated int32 path = 1 [packed = true];</code>
+     */
+    public function setPath(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::INT32);
+        $this->path = $var;
+        $this->has_path = true;
+    }
+
+    public function hasPath()
+    {
+        return $this->has_path;
+    }
+
+    /**
+     * <pre>
+     * Identifies the filesystem path to the original source .proto.
+     * </pre>
+     *
+     * <code>optional string source_file = 2;</code>
+     */
+    public function getSourceFile()
+    {
+        return $this->source_file;
+    }
+
+    /**
+     * <pre>
+     * Identifies the filesystem path to the original source .proto.
+     * </pre>
+     *
+     * <code>optional string source_file = 2;</code>
+     */
+    public function setSourceFile($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->source_file = $var;
+        $this->has_source_file = true;
+    }
+
+    public function hasSourceFile()
+    {
+        return $this->has_source_file;
+    }
+
+    /**
+     * <pre>
+     * Identifies the starting offset in bytes in the generated code
+     * that relates to the identified object.
+     * </pre>
+     *
+     * <code>optional int32 begin = 3;</code>
+     */
+    public function getBegin()
+    {
+        return $this->begin;
+    }
+
+    /**
+     * <pre>
+     * Identifies the starting offset in bytes in the generated code
+     * that relates to the identified object.
+     * </pre>
+     *
+     * <code>optional int32 begin = 3;</code>
+     */
+    public function setBegin($var)
+    {
+        GPBUtil::checkInt32($var);
+        $this->begin = $var;
+        $this->has_begin = true;
+    }
+
+    public function hasBegin()
+    {
+        return $this->has_begin;
+    }
+
+    /**
+     * <pre>
+     * Identifies the ending offset in bytes in the generated code that
+     * relates to the identified offset. The end offset should be one past
+     * the last relevant byte (so the length of the text = end - begin).
+     * </pre>
+     *
+     * <code>optional int32 end = 4;</code>
+     */
+    public function getEnd()
+    {
+        return $this->end;
+    }
+
+    /**
+     * <pre>
+     * Identifies the ending offset in bytes in the generated code that
+     * relates to the identified offset. The end offset should be one past
+     * the last relevant byte (so the length of the text = end - begin).
+     * </pre>
+     *
+     * <code>optional int32 end = 4;</code>
+     */
+    public function setEnd($var)
+    {
+        GPBUtil::checkInt32($var);
+        $this->end = $var;
+        $this->has_end = true;
+    }
+
+    public function hasEnd()
+    {
+        return $this->has_end;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/MessageOptions.php b/php/src/Google/Protobuf/Internal/MessageOptions.php
new file mode 100644
index 0000000..e4a214c
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/MessageOptions.php
@@ -0,0 +1,334 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+namespace Google\Protobuf\Internal;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\GPBWire;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\InputStream;
+
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * Protobuf type <code>google.protobuf.MessageOptions</code>
+ */
+class MessageOptions extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <pre>
+     * Set true to use the old proto1 MessageSet wire format for extensions.
+     * This is provided for backwards-compatibility with the MessageSet wire
+     * format.  You should not use this for any other reason:  It's less
+     * efficient, has fewer features, and is more complicated.
+     * The message must be defined exactly as follows:
+     *   message Foo {
+     *     option message_set_wire_format = true;
+     *     extensions 4 to max;
+     *   }
+     * Note that the message cannot have any defined fields; MessageSets only
+     * have extensions.
+     * All extensions of your type must be singular messages; e.g. they cannot
+     * be int32s, enums, or repeated messages.
+     * Because this is an option, the above two restrictions are not enforced by
+     * the protocol compiler.
+     * </pre>
+     *
+     * <code>optional bool message_set_wire_format = 1 [default = false];</code>
+     */
+    private $message_set_wire_format = false;
+    private $has_message_set_wire_format = false;
+    /**
+     * <pre>
+     * Disables the generation of the standard "descriptor()" accessor, which can
+     * conflict with a field of the same name.  This is meant to make migration
+     * from proto1 easier; new code should avoid fields named "descriptor".
+     * </pre>
+     *
+     * <code>optional bool no_standard_descriptor_accessor = 2 [default = false];</code>
+     */
+    private $no_standard_descriptor_accessor = false;
+    private $has_no_standard_descriptor_accessor = false;
+    /**
+     * <pre>
+     * Is this message deprecated?
+     * Depending on the target platform, this can emit Deprecated annotations
+     * for the message, or it will be completely ignored; in the very least,
+     * this is a formalization for deprecating messages.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 3 [default = false];</code>
+     */
+    private $deprecated = false;
+    private $has_deprecated = false;
+    /**
+     * <pre>
+     * Whether the message is an automatically generated map entry type for the
+     * maps field.
+     * For maps fields:
+     *     map&lt;KeyType, ValueType&gt; map_field = 1;
+     * The parsed descriptor looks like:
+     *     message MapFieldEntry {
+     *         option map_entry = true;
+     *         optional KeyType key = 1;
+     *         optional ValueType value = 2;
+     *     }
+     *     repeated MapFieldEntry map_field = 1;
+     * Implementations may choose not to generate the map_entry=true message, but
+     * use a native map in the target language to hold the keys and values.
+     * The reflection APIs in such implementions still need to work as
+     * if the field is a repeated message field.
+     * NOTE: Do not set the option in .proto files. Always use the maps syntax
+     * instead. The option should only be implicitly set by the proto compiler
+     * parser.
+     * </pre>
+     *
+     * <code>optional bool map_entry = 7;</code>
+     */
+    private $map_entry = false;
+    private $has_map_entry = false;
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    private $uninterpreted_option;
+    private $has_uninterpreted_option = false;
+
+    public function __construct() {
+        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
+        parent::__construct();
+    }
+
+    /**
+     * <pre>
+     * Set true to use the old proto1 MessageSet wire format for extensions.
+     * This is provided for backwards-compatibility with the MessageSet wire
+     * format.  You should not use this for any other reason:  It's less
+     * efficient, has fewer features, and is more complicated.
+     * The message must be defined exactly as follows:
+     *   message Foo {
+     *     option message_set_wire_format = true;
+     *     extensions 4 to max;
+     *   }
+     * Note that the message cannot have any defined fields; MessageSets only
+     * have extensions.
+     * All extensions of your type must be singular messages; e.g. they cannot
+     * be int32s, enums, or repeated messages.
+     * Because this is an option, the above two restrictions are not enforced by
+     * the protocol compiler.
+     * </pre>
+     *
+     * <code>optional bool message_set_wire_format = 1 [default = false];</code>
+     */
+    public function getMessageSetWireFormat()
+    {
+        return $this->message_set_wire_format;
+    }
+
+    /**
+     * <pre>
+     * Set true to use the old proto1 MessageSet wire format for extensions.
+     * This is provided for backwards-compatibility with the MessageSet wire
+     * format.  You should not use this for any other reason:  It's less
+     * efficient, has fewer features, and is more complicated.
+     * The message must be defined exactly as follows:
+     *   message Foo {
+     *     option message_set_wire_format = true;
+     *     extensions 4 to max;
+     *   }
+     * Note that the message cannot have any defined fields; MessageSets only
+     * have extensions.
+     * All extensions of your type must be singular messages; e.g. they cannot
+     * be int32s, enums, or repeated messages.
+     * Because this is an option, the above two restrictions are not enforced by
+     * the protocol compiler.
+     * </pre>
+     *
+     * <code>optional bool message_set_wire_format = 1 [default = false];</code>
+     */
+    public function setMessageSetWireFormat($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->message_set_wire_format = $var;
+        $this->has_message_set_wire_format = true;
+    }
+
+    public function hasMessageSetWireFormat()
+    {
+        return $this->has_message_set_wire_format;
+    }
+
+    /**
+     * <pre>
+     * Disables the generation of the standard "descriptor()" accessor, which can
+     * conflict with a field of the same name.  This is meant to make migration
+     * from proto1 easier; new code should avoid fields named "descriptor".
+     * </pre>
+     *
+     * <code>optional bool no_standard_descriptor_accessor = 2 [default = false];</code>
+     */
+    public function getNoStandardDescriptorAccessor()
+    {
+        return $this->no_standard_descriptor_accessor;
+    }
+
+    /**
+     * <pre>
+     * Disables the generation of the standard "descriptor()" accessor, which can
+     * conflict with a field of the same name.  This is meant to make migration
+     * from proto1 easier; new code should avoid fields named "descriptor".
+     * </pre>
+     *
+     * <code>optional bool no_standard_descriptor_accessor = 2 [default = false];</code>
+     */
+    public function setNoStandardDescriptorAccessor($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->no_standard_descriptor_accessor = $var;
+        $this->has_no_standard_descriptor_accessor = true;
+    }
+
+    public function hasNoStandardDescriptorAccessor()
+    {
+        return $this->has_no_standard_descriptor_accessor;
+    }
+
+    /**
+     * <pre>
+     * Is this message deprecated?
+     * Depending on the target platform, this can emit Deprecated annotations
+     * for the message, or it will be completely ignored; in the very least,
+     * this is a formalization for deprecating messages.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 3 [default = false];</code>
+     */
+    public function getDeprecated()
+    {
+        return $this->deprecated;
+    }
+
+    /**
+     * <pre>
+     * Is this message deprecated?
+     * Depending on the target platform, this can emit Deprecated annotations
+     * for the message, or it will be completely ignored; in the very least,
+     * this is a formalization for deprecating messages.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 3 [default = false];</code>
+     */
+    public function setDeprecated($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->deprecated = $var;
+        $this->has_deprecated = true;
+    }
+
+    public function hasDeprecated()
+    {
+        return $this->has_deprecated;
+    }
+
+    /**
+     * <pre>
+     * Whether the message is an automatically generated map entry type for the
+     * maps field.
+     * For maps fields:
+     *     map&lt;KeyType, ValueType&gt; map_field = 1;
+     * The parsed descriptor looks like:
+     *     message MapFieldEntry {
+     *         option map_entry = true;
+     *         optional KeyType key = 1;
+     *         optional ValueType value = 2;
+     *     }
+     *     repeated MapFieldEntry map_field = 1;
+     * Implementations may choose not to generate the map_entry=true message, but
+     * use a native map in the target language to hold the keys and values.
+     * The reflection APIs in such implementions still need to work as
+     * if the field is a repeated message field.
+     * NOTE: Do not set the option in .proto files. Always use the maps syntax
+     * instead. The option should only be implicitly set by the proto compiler
+     * parser.
+     * </pre>
+     *
+     * <code>optional bool map_entry = 7;</code>
+     */
+    public function getMapEntry()
+    {
+        return $this->map_entry;
+    }
+
+    /**
+     * <pre>
+     * Whether the message is an automatically generated map entry type for the
+     * maps field.
+     * For maps fields:
+     *     map&lt;KeyType, ValueType&gt; map_field = 1;
+     * The parsed descriptor looks like:
+     *     message MapFieldEntry {
+     *         option map_entry = true;
+     *         optional KeyType key = 1;
+     *         optional ValueType value = 2;
+     *     }
+     *     repeated MapFieldEntry map_field = 1;
+     * Implementations may choose not to generate the map_entry=true message, but
+     * use a native map in the target language to hold the keys and values.
+     * The reflection APIs in such implementions still need to work as
+     * if the field is a repeated message field.
+     * NOTE: Do not set the option in .proto files. Always use the maps syntax
+     * instead. The option should only be implicitly set by the proto compiler
+     * parser.
+     * </pre>
+     *
+     * <code>optional bool map_entry = 7;</code>
+     */
+    public function setMapEntry($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->map_entry = $var;
+        $this->has_map_entry = true;
+    }
+
+    public function hasMapEntry()
+    {
+        return $this->has_map_entry;
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function getUninterpretedOption()
+    {
+        return $this->uninterpreted_option;
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function setUninterpretedOption(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
+        $this->uninterpreted_option = $var;
+        $this->has_uninterpreted_option = true;
+    }
+
+    public function hasUninterpretedOption()
+    {
+        return $this->has_uninterpreted_option;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/MethodDescriptorProto.php b/php/src/Google/Protobuf/Internal/MethodDescriptorProto.php
new file mode 100644
index 0000000..3d8df7a
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/MethodDescriptorProto.php
@@ -0,0 +1,237 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+namespace Google\Protobuf\Internal;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\GPBWire;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\InputStream;
+
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * <pre>
+ * Describes a method of a service.
+ * </pre>
+ *
+ * Protobuf type <code>google.protobuf.MethodDescriptorProto</code>
+ */
+class MethodDescriptorProto extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    private $name = '';
+    private $has_name = false;
+    /**
+     * <pre>
+     * Input and output type names.  These are resolved in the same way as
+     * FieldDescriptorProto.type_name, but must refer to a message type.
+     * </pre>
+     *
+     * <code>optional string input_type = 2;</code>
+     */
+    private $input_type = '';
+    private $has_input_type = false;
+    /**
+     * <code>optional string output_type = 3;</code>
+     */
+    private $output_type = '';
+    private $has_output_type = false;
+    /**
+     * <code>optional .google.protobuf.MethodOptions options = 4;</code>
+     */
+    private $options = null;
+    private $has_options = false;
+    /**
+     * <pre>
+     * Identifies if client streams multiple client messages
+     * </pre>
+     *
+     * <code>optional bool client_streaming = 5 [default = false];</code>
+     */
+    private $client_streaming = false;
+    private $has_client_streaming = false;
+    /**
+     * <pre>
+     * Identifies if server streams multiple server messages
+     * </pre>
+     *
+     * <code>optional bool server_streaming = 6 [default = false];</code>
+     */
+    private $server_streaming = false;
+    private $has_server_streaming = false;
+
+    public function __construct() {
+        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
+        parent::__construct();
+    }
+
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public function setName($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->name = $var;
+        $this->has_name = true;
+    }
+
+    public function hasName()
+    {
+        return $this->has_name;
+    }
+
+    /**
+     * <pre>
+     * Input and output type names.  These are resolved in the same way as
+     * FieldDescriptorProto.type_name, but must refer to a message type.
+     * </pre>
+     *
+     * <code>optional string input_type = 2;</code>
+     */
+    public function getInputType()
+    {
+        return $this->input_type;
+    }
+
+    /**
+     * <pre>
+     * Input and output type names.  These are resolved in the same way as
+     * FieldDescriptorProto.type_name, but must refer to a message type.
+     * </pre>
+     *
+     * <code>optional string input_type = 2;</code>
+     */
+    public function setInputType($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->input_type = $var;
+        $this->has_input_type = true;
+    }
+
+    public function hasInputType()
+    {
+        return $this->has_input_type;
+    }
+
+    /**
+     * <code>optional string output_type = 3;</code>
+     */
+    public function getOutputType()
+    {
+        return $this->output_type;
+    }
+
+    /**
+     * <code>optional string output_type = 3;</code>
+     */
+    public function setOutputType($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->output_type = $var;
+        $this->has_output_type = true;
+    }
+
+    public function hasOutputType()
+    {
+        return $this->has_output_type;
+    }
+
+    /**
+     * <code>optional .google.protobuf.MethodOptions options = 4;</code>
+     */
+    public function getOptions()
+    {
+        return $this->options;
+    }
+
+    /**
+     * <code>optional .google.protobuf.MethodOptions options = 4;</code>
+     */
+    public function setOptions(&$var)
+    {
+        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\MethodOptions::class);
+        $this->options = $var;
+        $this->has_options = true;
+    }
+
+    public function hasOptions()
+    {
+        return $this->has_options;
+    }
+
+    /**
+     * <pre>
+     * Identifies if client streams multiple client messages
+     * </pre>
+     *
+     * <code>optional bool client_streaming = 5 [default = false];</code>
+     */
+    public function getClientStreaming()
+    {
+        return $this->client_streaming;
+    }
+
+    /**
+     * <pre>
+     * Identifies if client streams multiple client messages
+     * </pre>
+     *
+     * <code>optional bool client_streaming = 5 [default = false];</code>
+     */
+    public function setClientStreaming($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->client_streaming = $var;
+        $this->has_client_streaming = true;
+    }
+
+    public function hasClientStreaming()
+    {
+        return $this->has_client_streaming;
+    }
+
+    /**
+     * <pre>
+     * Identifies if server streams multiple server messages
+     * </pre>
+     *
+     * <code>optional bool server_streaming = 6 [default = false];</code>
+     */
+    public function getServerStreaming()
+    {
+        return $this->server_streaming;
+    }
+
+    /**
+     * <pre>
+     * Identifies if server streams multiple server messages
+     * </pre>
+     *
+     * <code>optional bool server_streaming = 6 [default = false];</code>
+     */
+    public function setServerStreaming($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->server_streaming = $var;
+        $this->has_server_streaming = true;
+    }
+
+    public function hasServerStreaming()
+    {
+        return $this->has_server_streaming;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/MethodOptions.php b/php/src/Google/Protobuf/Internal/MethodOptions.php
new file mode 100644
index 0000000..3325e52
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/MethodOptions.php
@@ -0,0 +1,143 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+namespace Google\Protobuf\Internal;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\GPBWire;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\InputStream;
+
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * Protobuf type <code>google.protobuf.MethodOptions</code>
+ */
+class MethodOptions extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <pre>
+     * Is this method deprecated?
+     * Depending on the target platform, this can emit Deprecated annotations
+     * for the method, or it will be completely ignored; in the very least,
+     * this is a formalization for deprecating methods.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 33 [default = false];</code>
+     */
+    private $deprecated = false;
+    private $has_deprecated = false;
+    /**
+     * <code>optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN];</code>
+     */
+    private $idempotency_level = 0;
+    private $has_idempotency_level = false;
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    private $uninterpreted_option;
+    private $has_uninterpreted_option = false;
+
+    public function __construct() {
+        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
+        parent::__construct();
+    }
+
+    /**
+     * <pre>
+     * Is this method deprecated?
+     * Depending on the target platform, this can emit Deprecated annotations
+     * for the method, or it will be completely ignored; in the very least,
+     * this is a formalization for deprecating methods.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 33 [default = false];</code>
+     */
+    public function getDeprecated()
+    {
+        return $this->deprecated;
+    }
+
+    /**
+     * <pre>
+     * Is this method deprecated?
+     * Depending on the target platform, this can emit Deprecated annotations
+     * for the method, or it will be completely ignored; in the very least,
+     * this is a formalization for deprecating methods.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 33 [default = false];</code>
+     */
+    public function setDeprecated($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->deprecated = $var;
+        $this->has_deprecated = true;
+    }
+
+    public function hasDeprecated()
+    {
+        return $this->has_deprecated;
+    }
+
+    /**
+     * <code>optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN];</code>
+     */
+    public function getIdempotencyLevel()
+    {
+        return $this->idempotency_level;
+    }
+
+    /**
+     * <code>optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN];</code>
+     */
+    public function setIdempotencyLevel($var)
+    {
+        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\MethodOptions_IdempotencyLevel::class);
+        $this->idempotency_level = $var;
+        $this->has_idempotency_level = true;
+    }
+
+    public function hasIdempotencyLevel()
+    {
+        return $this->has_idempotency_level;
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function getUninterpretedOption()
+    {
+        return $this->uninterpreted_option;
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function setUninterpretedOption(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
+        $this->uninterpreted_option = $var;
+        $this->has_uninterpreted_option = true;
+    }
+
+    public function hasUninterpretedOption()
+    {
+        return $this->has_uninterpreted_option;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/MethodOptions_IdempotencyLevel.php b/php/src/Google/Protobuf/Internal/MethodOptions_IdempotencyLevel.php
new file mode 100644
index 0000000..62768b5
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/MethodOptions_IdempotencyLevel.php
@@ -0,0 +1,39 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+/**
+ * <pre>
+ * Is this method side-effect-free (or safe in HTTP parlance), or idempotent,
+ * or neither? HTTP based RPC implementation may choose GET verb for safe
+ * methods, and PUT verb for idempotent methods instead of the default POST.
+ * </pre>
+ *
+ * Protobuf enum <code>google.protobuf.MethodOptions.IdempotencyLevel</code>
+ */
+namespace Google\Protobuf\Internal;
+
+class MethodOptions_IdempotencyLevel
+{
+    /**
+     * <code>IDEMPOTENCY_UNKNOWN = 0;</code>
+     */
+    const IDEMPOTENCY_UNKNOWN = 0;
+    /**
+     * <pre>
+     * implies idempotent
+     * </pre>
+     *
+     * <code>NO_SIDE_EFFECTS = 1;</code>
+     */
+    const NO_SIDE_EFFECTS = 1;
+    /**
+     * <pre>
+     * idempotent, but may have side effects
+     * </pre>
+     *
+     * <code>IDEMPOTENT = 2;</code>
+     */
+    const IDEMPOTENT = 2;
+}
+
diff --git a/php/src/Google/Protobuf/Internal/OneofDescriptorProto.php b/php/src/Google/Protobuf/Internal/OneofDescriptorProto.php
new file mode 100644
index 0000000..e5fbe37
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/OneofDescriptorProto.php
@@ -0,0 +1,86 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+namespace Google\Protobuf\Internal;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\GPBWire;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\InputStream;
+
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * <pre>
+ * Describes a oneof.
+ * </pre>
+ *
+ * Protobuf type <code>google.protobuf.OneofDescriptorProto</code>
+ */
+class OneofDescriptorProto extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    private $name = '';
+    private $has_name = false;
+    /**
+     * <code>optional .google.protobuf.OneofOptions options = 2;</code>
+     */
+    private $options = null;
+    private $has_options = false;
+
+    public function __construct() {
+        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
+        parent::__construct();
+    }
+
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public function setName($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->name = $var;
+        $this->has_name = true;
+    }
+
+    public function hasName()
+    {
+        return $this->has_name;
+    }
+
+    /**
+     * <code>optional .google.protobuf.OneofOptions options = 2;</code>
+     */
+    public function getOptions()
+    {
+        return $this->options;
+    }
+
+    /**
+     * <code>optional .google.protobuf.OneofOptions options = 2;</code>
+     */
+    public function setOptions(&$var)
+    {
+        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\OneofOptions::class);
+        $this->options = $var;
+        $this->has_options = true;
+    }
+
+    public function hasOptions()
+    {
+        return $this->has_options;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/OneofOptions.php b/php/src/Google/Protobuf/Internal/OneofOptions.php
new file mode 100644
index 0000000..083d992
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/OneofOptions.php
@@ -0,0 +1,66 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+namespace Google\Protobuf\Internal;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\GPBWire;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\InputStream;
+
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * Protobuf type <code>google.protobuf.OneofOptions</code>
+ */
+class OneofOptions extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    private $uninterpreted_option;
+    private $has_uninterpreted_option = false;
+
+    public function __construct() {
+        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
+        parent::__construct();
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function getUninterpretedOption()
+    {
+        return $this->uninterpreted_option;
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function setUninterpretedOption(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
+        $this->uninterpreted_option = $var;
+        $this->has_uninterpreted_option = true;
+    }
+
+    public function hasUninterpretedOption()
+    {
+        return $this->has_uninterpreted_option;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/ServiceDescriptorProto.php b/php/src/Google/Protobuf/Internal/ServiceDescriptorProto.php
new file mode 100644
index 0000000..624bde8
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/ServiceDescriptorProto.php
@@ -0,0 +1,114 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+namespace Google\Protobuf\Internal;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\GPBWire;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\InputStream;
+
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * <pre>
+ * Describes a service.
+ * </pre>
+ *
+ * Protobuf type <code>google.protobuf.ServiceDescriptorProto</code>
+ */
+class ServiceDescriptorProto extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    private $name = '';
+    private $has_name = false;
+    /**
+     * <code>repeated .google.protobuf.MethodDescriptorProto method = 2;</code>
+     */
+    private $method;
+    private $has_method = false;
+    /**
+     * <code>optional .google.protobuf.ServiceOptions options = 3;</code>
+     */
+    private $options = null;
+    private $has_options = false;
+
+    public function __construct() {
+        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
+        parent::__construct();
+    }
+
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public function setName($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->name = $var;
+        $this->has_name = true;
+    }
+
+    public function hasName()
+    {
+        return $this->has_name;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.MethodDescriptorProto method = 2;</code>
+     */
+    public function getMethod()
+    {
+        return $this->method;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.MethodDescriptorProto method = 2;</code>
+     */
+    public function setMethod(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\MethodDescriptorProto::class);
+        $this->method = $var;
+        $this->has_method = true;
+    }
+
+    public function hasMethod()
+    {
+        return $this->has_method;
+    }
+
+    /**
+     * <code>optional .google.protobuf.ServiceOptions options = 3;</code>
+     */
+    public function getOptions()
+    {
+        return $this->options;
+    }
+
+    /**
+     * <code>optional .google.protobuf.ServiceOptions options = 3;</code>
+     */
+    public function setOptions(&$var)
+    {
+        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\ServiceOptions::class);
+        $this->options = $var;
+        $this->has_options = true;
+    }
+
+    public function hasOptions()
+    {
+        return $this->has_options;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/ServiceOptions.php b/php/src/Google/Protobuf/Internal/ServiceOptions.php
new file mode 100644
index 0000000..5f3564e
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/ServiceOptions.php
@@ -0,0 +1,115 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+namespace Google\Protobuf\Internal;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\GPBWire;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\InputStream;
+
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * Protobuf type <code>google.protobuf.ServiceOptions</code>
+ */
+class ServiceOptions extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <pre>
+     * Is this service deprecated?
+     * Depending on the target platform, this can emit Deprecated annotations
+     * for the service, or it will be completely ignored; in the very least,
+     * this is a formalization for deprecating services.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 33 [default = false];</code>
+     */
+    private $deprecated = false;
+    private $has_deprecated = false;
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    private $uninterpreted_option;
+    private $has_uninterpreted_option = false;
+
+    public function __construct() {
+        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
+        parent::__construct();
+    }
+
+    /**
+     * <pre>
+     * Is this service deprecated?
+     * Depending on the target platform, this can emit Deprecated annotations
+     * for the service, or it will be completely ignored; in the very least,
+     * this is a formalization for deprecating services.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 33 [default = false];</code>
+     */
+    public function getDeprecated()
+    {
+        return $this->deprecated;
+    }
+
+    /**
+     * <pre>
+     * Is this service deprecated?
+     * Depending on the target platform, this can emit Deprecated annotations
+     * for the service, or it will be completely ignored; in the very least,
+     * this is a formalization for deprecating services.
+     * </pre>
+     *
+     * <code>optional bool deprecated = 33 [default = false];</code>
+     */
+    public function setDeprecated($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->deprecated = $var;
+        $this->has_deprecated = true;
+    }
+
+    public function hasDeprecated()
+    {
+        return $this->has_deprecated;
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function getUninterpretedOption()
+    {
+        return $this->uninterpreted_option;
+    }
+
+    /**
+     * <pre>
+     * The parser stores options it doesn't recognize here. See above.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;</code>
+     */
+    public function setUninterpretedOption(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
+        $this->uninterpreted_option = $var;
+        $this->has_uninterpreted_option = true;
+    }
+
+    public function hasUninterpretedOption()
+    {
+        return $this->has_uninterpreted_option;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/SourceCodeInfo.php b/php/src/Google/Protobuf/Internal/SourceCodeInfo.php
new file mode 100644
index 0000000..d2352dd
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/SourceCodeInfo.php
@@ -0,0 +1,191 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+namespace Google\Protobuf\Internal;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\GPBWire;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\InputStream;
+
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * <pre>
+ * Encapsulates information about the original source file from which a
+ * FileDescriptorProto was generated.
+ * </pre>
+ *
+ * Protobuf type <code>google.protobuf.SourceCodeInfo</code>
+ */
+class SourceCodeInfo extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <pre>
+     * A Location identifies a piece of source code in a .proto file which
+     * corresponds to a particular definition.  This information is intended
+     * to be useful to IDEs, code indexers, documentation generators, and similar
+     * tools.
+     * For example, say we have a file like:
+     *   message Foo {
+     *     optional string foo = 1;
+     *   }
+     * Let's look at just the field definition:
+     *   optional string foo = 1;
+     *   ^       ^^     ^^  ^  ^^^
+     *   a       bc     de  f  ghi
+     * We have the following locations:
+     *   span   path               represents
+     *   [a,i)  [ 4, 0, 2, 0 ]     The whole field definition.
+     *   [a,b)  [ 4, 0, 2, 0, 4 ]  The label (optional).
+     *   [c,d)  [ 4, 0, 2, 0, 5 ]  The type (string).
+     *   [e,f)  [ 4, 0, 2, 0, 1 ]  The name (foo).
+     *   [g,h)  [ 4, 0, 2, 0, 3 ]  The number (1).
+     * Notes:
+     * - A location may refer to a repeated field itself (i.e. not to any
+     *   particular index within it).  This is used whenever a set of elements are
+     *   logically enclosed in a single code segment.  For example, an entire
+     *   extend block (possibly containing multiple extension definitions) will
+     *   have an outer location whose path refers to the "extensions" repeated
+     *   field without an index.
+     * - Multiple locations may have the same path.  This happens when a single
+     *   logical declaration is spread out across multiple places.  The most
+     *   obvious example is the "extend" block again -- there may be multiple
+     *   extend blocks in the same scope, each of which will have the same path.
+     * - A location's span is not always a subset of its parent's span.  For
+     *   example, the "extendee" of an extension declaration appears at the
+     *   beginning of the "extend" block and is shared by all extensions within
+     *   the block.
+     * - Just because a location's span is a subset of some other location's span
+     *   does not mean that it is a descendent.  For example, a "group" defines
+     *   both a type and a field in a single declaration.  Thus, the locations
+     *   corresponding to the type and field and their components will overlap.
+     * - Code which tries to interpret locations should probably be designed to
+     *   ignore those that it doesn't understand, as more types of locations could
+     *   be recorded in the future.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.SourceCodeInfo.Location location = 1;</code>
+     */
+    private $location;
+    private $has_location = false;
+
+    public function __construct() {
+        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
+        parent::__construct();
+    }
+
+    /**
+     * <pre>
+     * A Location identifies a piece of source code in a .proto file which
+     * corresponds to a particular definition.  This information is intended
+     * to be useful to IDEs, code indexers, documentation generators, and similar
+     * tools.
+     * For example, say we have a file like:
+     *   message Foo {
+     *     optional string foo = 1;
+     *   }
+     * Let's look at just the field definition:
+     *   optional string foo = 1;
+     *   ^       ^^     ^^  ^  ^^^
+     *   a       bc     de  f  ghi
+     * We have the following locations:
+     *   span   path               represents
+     *   [a,i)  [ 4, 0, 2, 0 ]     The whole field definition.
+     *   [a,b)  [ 4, 0, 2, 0, 4 ]  The label (optional).
+     *   [c,d)  [ 4, 0, 2, 0, 5 ]  The type (string).
+     *   [e,f)  [ 4, 0, 2, 0, 1 ]  The name (foo).
+     *   [g,h)  [ 4, 0, 2, 0, 3 ]  The number (1).
+     * Notes:
+     * - A location may refer to a repeated field itself (i.e. not to any
+     *   particular index within it).  This is used whenever a set of elements are
+     *   logically enclosed in a single code segment.  For example, an entire
+     *   extend block (possibly containing multiple extension definitions) will
+     *   have an outer location whose path refers to the "extensions" repeated
+     *   field without an index.
+     * - Multiple locations may have the same path.  This happens when a single
+     *   logical declaration is spread out across multiple places.  The most
+     *   obvious example is the "extend" block again -- there may be multiple
+     *   extend blocks in the same scope, each of which will have the same path.
+     * - A location's span is not always a subset of its parent's span.  For
+     *   example, the "extendee" of an extension declaration appears at the
+     *   beginning of the "extend" block and is shared by all extensions within
+     *   the block.
+     * - Just because a location's span is a subset of some other location's span
+     *   does not mean that it is a descendent.  For example, a "group" defines
+     *   both a type and a field in a single declaration.  Thus, the locations
+     *   corresponding to the type and field and their components will overlap.
+     * - Code which tries to interpret locations should probably be designed to
+     *   ignore those that it doesn't understand, as more types of locations could
+     *   be recorded in the future.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.SourceCodeInfo.Location location = 1;</code>
+     */
+    public function getLocation()
+    {
+        return $this->location;
+    }
+
+    /**
+     * <pre>
+     * A Location identifies a piece of source code in a .proto file which
+     * corresponds to a particular definition.  This information is intended
+     * to be useful to IDEs, code indexers, documentation generators, and similar
+     * tools.
+     * For example, say we have a file like:
+     *   message Foo {
+     *     optional string foo = 1;
+     *   }
+     * Let's look at just the field definition:
+     *   optional string foo = 1;
+     *   ^       ^^     ^^  ^  ^^^
+     *   a       bc     de  f  ghi
+     * We have the following locations:
+     *   span   path               represents
+     *   [a,i)  [ 4, 0, 2, 0 ]     The whole field definition.
+     *   [a,b)  [ 4, 0, 2, 0, 4 ]  The label (optional).
+     *   [c,d)  [ 4, 0, 2, 0, 5 ]  The type (string).
+     *   [e,f)  [ 4, 0, 2, 0, 1 ]  The name (foo).
+     *   [g,h)  [ 4, 0, 2, 0, 3 ]  The number (1).
+     * Notes:
+     * - A location may refer to a repeated field itself (i.e. not to any
+     *   particular index within it).  This is used whenever a set of elements are
+     *   logically enclosed in a single code segment.  For example, an entire
+     *   extend block (possibly containing multiple extension definitions) will
+     *   have an outer location whose path refers to the "extensions" repeated
+     *   field without an index.
+     * - Multiple locations may have the same path.  This happens when a single
+     *   logical declaration is spread out across multiple places.  The most
+     *   obvious example is the "extend" block again -- there may be multiple
+     *   extend blocks in the same scope, each of which will have the same path.
+     * - A location's span is not always a subset of its parent's span.  For
+     *   example, the "extendee" of an extension declaration appears at the
+     *   beginning of the "extend" block and is shared by all extensions within
+     *   the block.
+     * - Just because a location's span is a subset of some other location's span
+     *   does not mean that it is a descendent.  For example, a "group" defines
+     *   both a type and a field in a single declaration.  Thus, the locations
+     *   corresponding to the type and field and their components will overlap.
+     * - Code which tries to interpret locations should probably be designed to
+     *   ignore those that it doesn't understand, as more types of locations could
+     *   be recorded in the future.
+     * </pre>
+     *
+     * <code>repeated .google.protobuf.SourceCodeInfo.Location location = 1;</code>
+     */
+    public function setLocation(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\SourceCodeInfo_Location::class);
+        $this->location = $var;
+        $this->has_location = true;
+    }
+
+    public function hasLocation()
+    {
+        return $this->has_location;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/SourceCodeInfo_Location.php b/php/src/Google/Protobuf/Internal/SourceCodeInfo_Location.php
new file mode 100644
index 0000000..d1bdb16
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/SourceCodeInfo_Location.php
@@ -0,0 +1,379 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+namespace Google\Protobuf\Internal;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\GPBWire;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\InputStream;
+
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * Protobuf type <code>google.protobuf.SourceCodeInfo.Location</code>
+ */
+class SourceCodeInfo_Location extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <pre>
+     * Identifies which part of the FileDescriptorProto was defined at this
+     * location.
+     * Each element is a field number or an index.  They form a path from
+     * the root FileDescriptorProto to the place where the definition.  For
+     * example, this path:
+     *   [ 4, 3, 2, 7, 1 ]
+     * refers to:
+     *   file.message_type(3)  // 4, 3
+     *       .field(7)         // 2, 7
+     *       .name()           // 1
+     * This is because FileDescriptorProto.message_type has field number 4:
+     *   repeated DescriptorProto message_type = 4;
+     * and DescriptorProto.field has field number 2:
+     *   repeated FieldDescriptorProto field = 2;
+     * and FieldDescriptorProto.name has field number 1:
+     *   optional string name = 1;
+     * Thus, the above path gives the location of a field name.  If we removed
+     * the last element:
+     *   [ 4, 3, 2, 7 ]
+     * this path refers to the whole field declaration (from the beginning
+     * of the label to the terminating semicolon).
+     * </pre>
+     *
+     * <code>repeated int32 path = 1 [packed = true];</code>
+     */
+    private $path;
+    private $has_path = false;
+    /**
+     * <pre>
+     * Always has exactly three or four elements: start line, start column,
+     * end line (optional, otherwise assumed same as start line), end column.
+     * These are packed into a single field for efficiency.  Note that line
+     * and column numbers are zero-based -- typically you will want to add
+     * 1 to each before displaying to a user.
+     * </pre>
+     *
+     * <code>repeated int32 span = 2 [packed = true];</code>
+     */
+    private $span;
+    private $has_span = false;
+    /**
+     * <pre>
+     * If this SourceCodeInfo represents a complete declaration, these are any
+     * comments appearing before and after the declaration which appear to be
+     * attached to the declaration.
+     * A series of line comments appearing on consecutive lines, with no other
+     * tokens appearing on those lines, will be treated as a single comment.
+     * leading_detached_comments will keep paragraphs of comments that appear
+     * before (but not connected to) the current element. Each paragraph,
+     * separated by empty lines, will be one comment element in the repeated
+     * field.
+     * Only the comment content is provided; comment markers (e.g. //) are
+     * stripped out.  For block comments, leading whitespace and an asterisk
+     * will be stripped from the beginning of each line other than the first.
+     * Newlines are included in the output.
+     * Examples:
+     *   optional int32 foo = 1;  // Comment attached to foo.
+     *   // Comment attached to bar.
+     *   optional int32 bar = 2;
+     *   optional string baz = 3;
+     *   // Comment attached to baz.
+     *   // Another line attached to baz.
+     *   // Comment attached to qux.
+     *   //
+     *   // Another line attached to qux.
+     *   optional double qux = 4;
+     *   // Detached comment for corge. This is not leading or trailing comments
+     *   // to qux or corge because there are blank lines separating it from
+     *   // both.
+     *   // Detached comment for corge paragraph 2.
+     *   optional string corge = 5;
+     *   /&#42; Block comment attached
+     *    * to corge.  Leading asterisks
+     *    * will be removed. *&#47;
+     *   /&#42; Block comment attached to
+     *    * grault. *&#47;
+     *   optional int32 grault = 6;
+     *   // ignored detached comments.
+     * </pre>
+     *
+     * <code>optional string leading_comments = 3;</code>
+     */
+    private $leading_comments = '';
+    private $has_leading_comments = false;
+    /**
+     * <code>optional string trailing_comments = 4;</code>
+     */
+    private $trailing_comments = '';
+    private $has_trailing_comments = false;
+    /**
+     * <code>repeated string leading_detached_comments = 6;</code>
+     */
+    private $leading_detached_comments;
+    private $has_leading_detached_comments = false;
+
+    public function __construct() {
+        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
+        parent::__construct();
+    }
+
+    /**
+     * <pre>
+     * Identifies which part of the FileDescriptorProto was defined at this
+     * location.
+     * Each element is a field number or an index.  They form a path from
+     * the root FileDescriptorProto to the place where the definition.  For
+     * example, this path:
+     *   [ 4, 3, 2, 7, 1 ]
+     * refers to:
+     *   file.message_type(3)  // 4, 3
+     *       .field(7)         // 2, 7
+     *       .name()           // 1
+     * This is because FileDescriptorProto.message_type has field number 4:
+     *   repeated DescriptorProto message_type = 4;
+     * and DescriptorProto.field has field number 2:
+     *   repeated FieldDescriptorProto field = 2;
+     * and FieldDescriptorProto.name has field number 1:
+     *   optional string name = 1;
+     * Thus, the above path gives the location of a field name.  If we removed
+     * the last element:
+     *   [ 4, 3, 2, 7 ]
+     * this path refers to the whole field declaration (from the beginning
+     * of the label to the terminating semicolon).
+     * </pre>
+     *
+     * <code>repeated int32 path = 1 [packed = true];</code>
+     */
+    public function getPath()
+    {
+        return $this->path;
+    }
+
+    /**
+     * <pre>
+     * Identifies which part of the FileDescriptorProto was defined at this
+     * location.
+     * Each element is a field number or an index.  They form a path from
+     * the root FileDescriptorProto to the place where the definition.  For
+     * example, this path:
+     *   [ 4, 3, 2, 7, 1 ]
+     * refers to:
+     *   file.message_type(3)  // 4, 3
+     *       .field(7)         // 2, 7
+     *       .name()           // 1
+     * This is because FileDescriptorProto.message_type has field number 4:
+     *   repeated DescriptorProto message_type = 4;
+     * and DescriptorProto.field has field number 2:
+     *   repeated FieldDescriptorProto field = 2;
+     * and FieldDescriptorProto.name has field number 1:
+     *   optional string name = 1;
+     * Thus, the above path gives the location of a field name.  If we removed
+     * the last element:
+     *   [ 4, 3, 2, 7 ]
+     * this path refers to the whole field declaration (from the beginning
+     * of the label to the terminating semicolon).
+     * </pre>
+     *
+     * <code>repeated int32 path = 1 [packed = true];</code>
+     */
+    public function setPath(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::INT32);
+        $this->path = $var;
+        $this->has_path = true;
+    }
+
+    public function hasPath()
+    {
+        return $this->has_path;
+    }
+
+    /**
+     * <pre>
+     * Always has exactly three or four elements: start line, start column,
+     * end line (optional, otherwise assumed same as start line), end column.
+     * These are packed into a single field for efficiency.  Note that line
+     * and column numbers are zero-based -- typically you will want to add
+     * 1 to each before displaying to a user.
+     * </pre>
+     *
+     * <code>repeated int32 span = 2 [packed = true];</code>
+     */
+    public function getSpan()
+    {
+        return $this->span;
+    }
+
+    /**
+     * <pre>
+     * Always has exactly three or four elements: start line, start column,
+     * end line (optional, otherwise assumed same as start line), end column.
+     * These are packed into a single field for efficiency.  Note that line
+     * and column numbers are zero-based -- typically you will want to add
+     * 1 to each before displaying to a user.
+     * </pre>
+     *
+     * <code>repeated int32 span = 2 [packed = true];</code>
+     */
+    public function setSpan(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::INT32);
+        $this->span = $var;
+        $this->has_span = true;
+    }
+
+    public function hasSpan()
+    {
+        return $this->has_span;
+    }
+
+    /**
+     * <pre>
+     * If this SourceCodeInfo represents a complete declaration, these are any
+     * comments appearing before and after the declaration which appear to be
+     * attached to the declaration.
+     * A series of line comments appearing on consecutive lines, with no other
+     * tokens appearing on those lines, will be treated as a single comment.
+     * leading_detached_comments will keep paragraphs of comments that appear
+     * before (but not connected to) the current element. Each paragraph,
+     * separated by empty lines, will be one comment element in the repeated
+     * field.
+     * Only the comment content is provided; comment markers (e.g. //) are
+     * stripped out.  For block comments, leading whitespace and an asterisk
+     * will be stripped from the beginning of each line other than the first.
+     * Newlines are included in the output.
+     * Examples:
+     *   optional int32 foo = 1;  // Comment attached to foo.
+     *   // Comment attached to bar.
+     *   optional int32 bar = 2;
+     *   optional string baz = 3;
+     *   // Comment attached to baz.
+     *   // Another line attached to baz.
+     *   // Comment attached to qux.
+     *   //
+     *   // Another line attached to qux.
+     *   optional double qux = 4;
+     *   // Detached comment for corge. This is not leading or trailing comments
+     *   // to qux or corge because there are blank lines separating it from
+     *   // both.
+     *   // Detached comment for corge paragraph 2.
+     *   optional string corge = 5;
+     *   /&#42; Block comment attached
+     *    * to corge.  Leading asterisks
+     *    * will be removed. *&#47;
+     *   /&#42; Block comment attached to
+     *    * grault. *&#47;
+     *   optional int32 grault = 6;
+     *   // ignored detached comments.
+     * </pre>
+     *
+     * <code>optional string leading_comments = 3;</code>
+     */
+    public function getLeadingComments()
+    {
+        return $this->leading_comments;
+    }
+
+    /**
+     * <pre>
+     * If this SourceCodeInfo represents a complete declaration, these are any
+     * comments appearing before and after the declaration which appear to be
+     * attached to the declaration.
+     * A series of line comments appearing on consecutive lines, with no other
+     * tokens appearing on those lines, will be treated as a single comment.
+     * leading_detached_comments will keep paragraphs of comments that appear
+     * before (but not connected to) the current element. Each paragraph,
+     * separated by empty lines, will be one comment element in the repeated
+     * field.
+     * Only the comment content is provided; comment markers (e.g. //) are
+     * stripped out.  For block comments, leading whitespace and an asterisk
+     * will be stripped from the beginning of each line other than the first.
+     * Newlines are included in the output.
+     * Examples:
+     *   optional int32 foo = 1;  // Comment attached to foo.
+     *   // Comment attached to bar.
+     *   optional int32 bar = 2;
+     *   optional string baz = 3;
+     *   // Comment attached to baz.
+     *   // Another line attached to baz.
+     *   // Comment attached to qux.
+     *   //
+     *   // Another line attached to qux.
+     *   optional double qux = 4;
+     *   // Detached comment for corge. This is not leading or trailing comments
+     *   // to qux or corge because there are blank lines separating it from
+     *   // both.
+     *   // Detached comment for corge paragraph 2.
+     *   optional string corge = 5;
+     *   /&#42; Block comment attached
+     *    * to corge.  Leading asterisks
+     *    * will be removed. *&#47;
+     *   /&#42; Block comment attached to
+     *    * grault. *&#47;
+     *   optional int32 grault = 6;
+     *   // ignored detached comments.
+     * </pre>
+     *
+     * <code>optional string leading_comments = 3;</code>
+     */
+    public function setLeadingComments($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->leading_comments = $var;
+        $this->has_leading_comments = true;
+    }
+
+    public function hasLeadingComments()
+    {
+        return $this->has_leading_comments;
+    }
+
+    /**
+     * <code>optional string trailing_comments = 4;</code>
+     */
+    public function getTrailingComments()
+    {
+        return $this->trailing_comments;
+    }
+
+    /**
+     * <code>optional string trailing_comments = 4;</code>
+     */
+    public function setTrailingComments($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->trailing_comments = $var;
+        $this->has_trailing_comments = true;
+    }
+
+    public function hasTrailingComments()
+    {
+        return $this->has_trailing_comments;
+    }
+
+    /**
+     * <code>repeated string leading_detached_comments = 6;</code>
+     */
+    public function getLeadingDetachedComments()
+    {
+        return $this->leading_detached_comments;
+    }
+
+    /**
+     * <code>repeated string leading_detached_comments = 6;</code>
+     */
+    public function setLeadingDetachedComments(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING);
+        $this->leading_detached_comments = $var;
+        $this->has_leading_detached_comments = true;
+    }
+
+    public function hasLeadingDetachedComments()
+    {
+        return $this->has_leading_detached_comments;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/UninterpretedOption.php b/php/src/Google/Protobuf/Internal/UninterpretedOption.php
new file mode 100644
index 0000000..c0f4831
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/UninterpretedOption.php
@@ -0,0 +1,246 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+namespace Google\Protobuf\Internal;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\GPBWire;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\InputStream;
+
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * <pre>
+ * A message representing a option the parser does not recognize. This only
+ * appears in options protos created by the compiler::Parser class.
+ * DescriptorPool resolves these when building Descriptor objects. Therefore,
+ * options protos in descriptor objects (e.g. returned by Descriptor::options(),
+ * or produced by Descriptor::CopyTo()) will never have UninterpretedOptions
+ * in them.
+ * </pre>
+ *
+ * Protobuf type <code>google.protobuf.UninterpretedOption</code>
+ */
+class UninterpretedOption extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <code>repeated .google.protobuf.UninterpretedOption.NamePart name = 2;</code>
+     */
+    private $name;
+    private $has_name = false;
+    /**
+     * <pre>
+     * The value of the uninterpreted option, in whatever type the tokenizer
+     * identified it as during parsing. Exactly one of these should be set.
+     * </pre>
+     *
+     * <code>optional string identifier_value = 3;</code>
+     */
+    private $identifier_value = '';
+    private $has_identifier_value = false;
+    /**
+     * <code>optional uint64 positive_int_value = 4;</code>
+     */
+    private $positive_int_value = 0;
+    private $has_positive_int_value = false;
+    /**
+     * <code>optional int64 negative_int_value = 5;</code>
+     */
+    private $negative_int_value = 0;
+    private $has_negative_int_value = false;
+    /**
+     * <code>optional double double_value = 6;</code>
+     */
+    private $double_value = 0.0;
+    private $has_double_value = false;
+    /**
+     * <code>optional bytes string_value = 7;</code>
+     */
+    private $string_value = '';
+    private $has_string_value = false;
+    /**
+     * <code>optional string aggregate_value = 8;</code>
+     */
+    private $aggregate_value = '';
+    private $has_aggregate_value = false;
+
+    public function __construct() {
+        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
+        parent::__construct();
+    }
+
+    /**
+     * <code>repeated .google.protobuf.UninterpretedOption.NamePart name = 2;</code>
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * <code>repeated .google.protobuf.UninterpretedOption.NamePart name = 2;</code>
+     */
+    public function setName(&$var)
+    {
+        GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption_NamePart::class);
+        $this->name = $var;
+        $this->has_name = true;
+    }
+
+    public function hasName()
+    {
+        return $this->has_name;
+    }
+
+    /**
+     * <pre>
+     * The value of the uninterpreted option, in whatever type the tokenizer
+     * identified it as during parsing. Exactly one of these should be set.
+     * </pre>
+     *
+     * <code>optional string identifier_value = 3;</code>
+     */
+    public function getIdentifierValue()
+    {
+        return $this->identifier_value;
+    }
+
+    /**
+     * <pre>
+     * The value of the uninterpreted option, in whatever type the tokenizer
+     * identified it as during parsing. Exactly one of these should be set.
+     * </pre>
+     *
+     * <code>optional string identifier_value = 3;</code>
+     */
+    public function setIdentifierValue($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->identifier_value = $var;
+        $this->has_identifier_value = true;
+    }
+
+    public function hasIdentifierValue()
+    {
+        return $this->has_identifier_value;
+    }
+
+    /**
+     * <code>optional uint64 positive_int_value = 4;</code>
+     */
+    public function getPositiveIntValue()
+    {
+        return $this->positive_int_value;
+    }
+
+    /**
+     * <code>optional uint64 positive_int_value = 4;</code>
+     */
+    public function setPositiveIntValue($var)
+    {
+        GPBUtil::checkUint64($var);
+        $this->positive_int_value = $var;
+        $this->has_positive_int_value = true;
+    }
+
+    public function hasPositiveIntValue()
+    {
+        return $this->has_positive_int_value;
+    }
+
+    /**
+     * <code>optional int64 negative_int_value = 5;</code>
+     */
+    public function getNegativeIntValue()
+    {
+        return $this->negative_int_value;
+    }
+
+    /**
+     * <code>optional int64 negative_int_value = 5;</code>
+     */
+    public function setNegativeIntValue($var)
+    {
+        GPBUtil::checkInt64($var);
+        $this->negative_int_value = $var;
+        $this->has_negative_int_value = true;
+    }
+
+    public function hasNegativeIntValue()
+    {
+        return $this->has_negative_int_value;
+    }
+
+    /**
+     * <code>optional double double_value = 6;</code>
+     */
+    public function getDoubleValue()
+    {
+        return $this->double_value;
+    }
+
+    /**
+     * <code>optional double double_value = 6;</code>
+     */
+    public function setDoubleValue($var)
+    {
+        GPBUtil::checkDouble($var);
+        $this->double_value = $var;
+        $this->has_double_value = true;
+    }
+
+    public function hasDoubleValue()
+    {
+        return $this->has_double_value;
+    }
+
+    /**
+     * <code>optional bytes string_value = 7;</code>
+     */
+    public function getStringValue()
+    {
+        return $this->string_value;
+    }
+
+    /**
+     * <code>optional bytes string_value = 7;</code>
+     */
+    public function setStringValue($var)
+    {
+        GPBUtil::checkString($var, False);
+        $this->string_value = $var;
+        $this->has_string_value = true;
+    }
+
+    public function hasStringValue()
+    {
+        return $this->has_string_value;
+    }
+
+    /**
+     * <code>optional string aggregate_value = 8;</code>
+     */
+    public function getAggregateValue()
+    {
+        return $this->aggregate_value;
+    }
+
+    /**
+     * <code>optional string aggregate_value = 8;</code>
+     */
+    public function setAggregateValue($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->aggregate_value = $var;
+        $this->has_aggregate_value = true;
+    }
+
+    public function hasAggregateValue()
+    {
+        return $this->has_aggregate_value;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/Internal/UninterpretedOption_NamePart.php b/php/src/Google/Protobuf/Internal/UninterpretedOption_NamePart.php
new file mode 100644
index 0000000..86484d2
--- /dev/null
+++ b/php/src/Google/Protobuf/Internal/UninterpretedOption_NamePart.php
@@ -0,0 +1,90 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/protobuf/descriptor.proto
+
+namespace Google\Protobuf\Internal;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\GPBWire;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\InputStream;
+
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * <pre>
+ * The name of the uninterpreted option.  Each string represents a segment in
+ * a dot-separated name.  is_extension is true iff a segment represents an
+ * extension (denoted with parentheses in options specs in .proto files).
+ * E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents
+ * "foo.(bar.baz).qux".
+ * </pre>
+ *
+ * Protobuf type <code>google.protobuf.UninterpretedOption.NamePart</code>
+ */
+class UninterpretedOption_NamePart extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * <code>required string name_part = 1;</code>
+     */
+    private $name_part = '';
+    private $has_name_part = false;
+    /**
+     * <code>required bool is_extension = 2;</code>
+     */
+    private $is_extension = false;
+    private $has_is_extension = false;
+
+    public function __construct() {
+        \GPBMetadata\Google\Protobuf\Internal\Descriptor::initOnce();
+        parent::__construct();
+    }
+
+    /**
+     * <code>required string name_part = 1;</code>
+     */
+    public function getNamePart()
+    {
+        return $this->name_part;
+    }
+
+    /**
+     * <code>required string name_part = 1;</code>
+     */
+    public function setNamePart($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->name_part = $var;
+        $this->has_name_part = true;
+    }
+
+    public function hasNamePart()
+    {
+        return $this->has_name_part;
+    }
+
+    /**
+     * <code>required bool is_extension = 2;</code>
+     */
+    public function getIsExtension()
+    {
+        return $this->is_extension;
+    }
+
+    /**
+     * <code>required bool is_extension = 2;</code>
+     */
+    public function setIsExtension($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->is_extension = $var;
+        $this->has_is_extension = true;
+    }
+
+    public function hasIsExtension()
+    {
+        return $this->has_is_extension;
+    }
+
+}
+
diff --git a/php/src/Google/Protobuf/descriptor_internal.pb.php b/php/src/Google/Protobuf/descriptor_internal.pb.php
deleted file mode 100644
index 161a9f5..0000000
--- a/php/src/Google/Protobuf/descriptor_internal.pb.php
+++ /dev/null
@@ -1,2532 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/descriptor.proto
-
-namespace Google\Protobuf\Internal;
-
-use Google\Protobuf\Internal\DescriptorPool;
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\GPBWire;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\InputStream;
-
-use Google\Protobuf\Internal\GPBUtil;
-
-class FileDescriptorSet extends \Google\Protobuf\Internal\Message
-{
-    private $file;
-    private $has_file = false;
-
-    public function getFile()
-    {
-        return $this->file;
-    }
-
-    public function setFile(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\FileDescriptorProto::class);
-        $this->file = $var;
-        $this->has_file = true;
-    }
-
-    public function hasFile()
-    {
-        return $this->has_file;
-    }
-
-}
-
-class FileDescriptorProto extends \Google\Protobuf\Internal\Message
-{
-    private $name = '';
-    private $has_name = false;
-    private $package = '';
-    private $has_package = false;
-    private $dependency;
-    private $has_dependency = false;
-    private $public_dependency;
-    private $has_public_dependency = false;
-    private $weak_dependency;
-    private $has_weak_dependency = false;
-    private $message_type;
-    private $has_message_type = false;
-    private $enum_type;
-    private $has_enum_type = false;
-    private $service;
-    private $has_service = false;
-    private $extension;
-    private $has_extension = false;
-    private $options = null;
-    private $has_options = false;
-    private $source_code_info = null;
-    private $has_source_code_info = false;
-    private $syntax = '';
-    private $has_syntax = false;
-
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-        $this->has_name = true;
-    }
-
-    public function hasName()
-    {
-        return $this->has_name;
-    }
-
-    public function getPackage()
-    {
-        return $this->package;
-    }
-
-    public function setPackage($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->package = $var;
-        $this->has_package = true;
-    }
-
-    public function hasPackage()
-    {
-        return $this->has_package;
-    }
-
-    public function getDependency()
-    {
-        return $this->dependency;
-    }
-
-    public function setDependency(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::STRING);
-        $this->dependency = $var;
-        $this->has_dependency = true;
-    }
-
-    public function hasDependency()
-    {
-        return $this->has_dependency;
-    }
-
-    public function getPublicDependency()
-    {
-        return $this->public_dependency;
-    }
-
-    public function setPublicDependency(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::INT32);
-        $this->public_dependency = $var;
-        $this->has_public_dependency = true;
-    }
-
-    public function hasPublicDependency()
-    {
-        return $this->has_public_dependency;
-    }
-
-    public function getWeakDependency()
-    {
-        return $this->weak_dependency;
-    }
-
-    public function setWeakDependency(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::INT32);
-        $this->weak_dependency = $var;
-        $this->has_weak_dependency = true;
-    }
-
-    public function hasWeakDependency()
-    {
-        return $this->has_weak_dependency;
-    }
-
-    public function getMessageType()
-    {
-        return $this->message_type;
-    }
-
-    public function setMessageType(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\DescriptorProto::class);
-        $this->message_type = $var;
-        $this->has_message_type = true;
-    }
-
-    public function hasMessageType()
-    {
-        return $this->has_message_type;
-    }
-
-    public function getEnumType()
-    {
-        return $this->enum_type;
-    }
-
-    public function setEnumType(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\EnumDescriptorProto::class);
-        $this->enum_type = $var;
-        $this->has_enum_type = true;
-    }
-
-    public function hasEnumType()
-    {
-        return $this->has_enum_type;
-    }
-
-    public function getService()
-    {
-        return $this->service;
-    }
-
-    public function setService(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\ServiceDescriptorProto::class);
-        $this->service = $var;
-        $this->has_service = true;
-    }
-
-    public function hasService()
-    {
-        return $this->has_service;
-    }
-
-    public function getExtension()
-    {
-        return $this->extension;
-    }
-
-    public function setExtension(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\FieldDescriptorProto::class);
-        $this->extension = $var;
-        $this->has_extension = true;
-    }
-
-    public function hasExtension()
-    {
-        return $this->has_extension;
-    }
-
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    public function setOptions(&$var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\FileOptions::class);
-        $this->options = $var;
-        $this->has_options = true;
-    }
-
-    public function hasOptions()
-    {
-        return $this->has_options;
-    }
-
-    public function getSourceCodeInfo()
-    {
-        return $this->source_code_info;
-    }
-
-    public function setSourceCodeInfo(&$var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\SourceCodeInfo::class);
-        $this->source_code_info = $var;
-        $this->has_source_code_info = true;
-    }
-
-    public function hasSourceCodeInfo()
-    {
-        return $this->has_source_code_info;
-    }
-
-    public function getSyntax()
-    {
-        return $this->syntax;
-    }
-
-    public function setSyntax($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->syntax = $var;
-        $this->has_syntax = true;
-    }
-
-    public function hasSyntax()
-    {
-        return $this->has_syntax;
-    }
-
-}
-
-class DescriptorProto extends \Google\Protobuf\Internal\Message
-{
-    private $name = '';
-    private $has_name = false;
-    private $field;
-    private $has_field = false;
-    private $extension;
-    private $has_extension = false;
-    private $nested_type;
-    private $has_nested_type = false;
-    private $enum_type;
-    private $has_enum_type = false;
-    private $extension_range;
-    private $has_extension_range = false;
-    private $oneof_decl;
-    private $has_oneof_decl = false;
-    private $options = null;
-    private $has_options = false;
-    private $reserved_range;
-    private $has_reserved_range = false;
-    private $reserved_name;
-    private $has_reserved_name = false;
-
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-        $this->has_name = true;
-    }
-
-    public function hasName()
-    {
-        return $this->has_name;
-    }
-
-    public function getField()
-    {
-        return $this->field;
-    }
-
-    public function setField(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\FieldDescriptorProto::class);
-        $this->field = $var;
-        $this->has_field = true;
-    }
-
-    public function hasField()
-    {
-        return $this->has_field;
-    }
-
-    public function getExtension()
-    {
-        return $this->extension;
-    }
-
-    public function setExtension(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\FieldDescriptorProto::class);
-        $this->extension = $var;
-        $this->has_extension = true;
-    }
-
-    public function hasExtension()
-    {
-        return $this->has_extension;
-    }
-
-    public function getNestedType()
-    {
-        return $this->nested_type;
-    }
-
-    public function setNestedType(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\DescriptorProto::class);
-        $this->nested_type = $var;
-        $this->has_nested_type = true;
-    }
-
-    public function hasNestedType()
-    {
-        return $this->has_nested_type;
-    }
-
-    public function getEnumType()
-    {
-        return $this->enum_type;
-    }
-
-    public function setEnumType(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\EnumDescriptorProto::class);
-        $this->enum_type = $var;
-        $this->has_enum_type = true;
-    }
-
-    public function hasEnumType()
-    {
-        return $this->has_enum_type;
-    }
-
-    public function getExtensionRange()
-    {
-        return $this->extension_range;
-    }
-
-    public function setExtensionRange(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\DescriptorProto_ExtensionRange::class);
-        $this->extension_range = $var;
-        $this->has_extension_range = true;
-    }
-
-    public function hasExtensionRange()
-    {
-        return $this->has_extension_range;
-    }
-
-    public function getOneofDecl()
-    {
-        return $this->oneof_decl;
-    }
-
-    public function setOneofDecl(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\OneofDescriptorProto::class);
-        $this->oneof_decl = $var;
-        $this->has_oneof_decl = true;
-    }
-
-    public function hasOneofDecl()
-    {
-        return $this->has_oneof_decl;
-    }
-
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    public function setOptions(&$var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\MessageOptions::class);
-        $this->options = $var;
-        $this->has_options = true;
-    }
-
-    public function hasOptions()
-    {
-        return $this->has_options;
-    }
-
-    public function getReservedRange()
-    {
-        return $this->reserved_range;
-    }
-
-    public function setReservedRange(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\DescriptorProto_ReservedRange::class);
-        $this->reserved_range = $var;
-        $this->has_reserved_range = true;
-    }
-
-    public function hasReservedRange()
-    {
-        return $this->has_reserved_range;
-    }
-
-    public function getReservedName()
-    {
-        return $this->reserved_name;
-    }
-
-    public function setReservedName(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::STRING);
-        $this->reserved_name = $var;
-        $this->has_reserved_name = true;
-    }
-
-    public function hasReservedName()
-    {
-        return $this->has_reserved_name;
-    }
-
-}
-
-class DescriptorProto_ExtensionRange extends \Google\Protobuf\Internal\Message
-{
-    private $start = 0;
-    private $has_start = false;
-    private $end = 0;
-    private $has_end = false;
-
-    public function getStart()
-    {
-        return $this->start;
-    }
-
-    public function setStart($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->start = $var;
-        $this->has_start = true;
-    }
-
-    public function hasStart()
-    {
-        return $this->has_start;
-    }
-
-    public function getEnd()
-    {
-        return $this->end;
-    }
-
-    public function setEnd($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->end = $var;
-        $this->has_end = true;
-    }
-
-    public function hasEnd()
-    {
-        return $this->has_end;
-    }
-
-}
-
-class DescriptorProto_ReservedRange extends \Google\Protobuf\Internal\Message
-{
-    private $start = 0;
-    private $has_start = false;
-    private $end = 0;
-    private $has_end = false;
-
-    public function getStart()
-    {
-        return $this->start;
-    }
-
-    public function setStart($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->start = $var;
-        $this->has_start = true;
-    }
-
-    public function hasStart()
-    {
-        return $this->has_start;
-    }
-
-    public function getEnd()
-    {
-        return $this->end;
-    }
-
-    public function setEnd($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->end = $var;
-        $this->has_end = true;
-    }
-
-    public function hasEnd()
-    {
-        return $this->has_end;
-    }
-
-}
-
-class FieldDescriptorProto extends \Google\Protobuf\Internal\Message
-{
-    private $name = '';
-    private $has_name = false;
-    private $number = 0;
-    private $has_number = false;
-    private $label = 0;
-    private $has_label = false;
-    private $type = 0;
-    private $has_type = false;
-    private $type_name = '';
-    private $has_type_name = false;
-    private $extendee = '';
-    private $has_extendee = false;
-    private $default_value = '';
-    private $has_default_value = false;
-    private $oneof_index = 0;
-    private $has_oneof_index = false;
-    private $json_name = '';
-    private $has_json_name = false;
-    private $options = null;
-    private $has_options = false;
-
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-        $this->has_name = true;
-    }
-
-    public function hasName()
-    {
-        return $this->has_name;
-    }
-
-    public function getNumber()
-    {
-        return $this->number;
-    }
-
-    public function setNumber($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->number = $var;
-        $this->has_number = true;
-    }
-
-    public function hasNumber()
-    {
-        return $this->has_number;
-    }
-
-    public function getLabel()
-    {
-        return $this->label;
-    }
-
-    public function setLabel($var)
-    {
-        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FieldDescriptorProto_Label::class);
-        $this->label = $var;
-        $this->has_label = true;
-    }
-
-    public function hasLabel()
-    {
-        return $this->has_label;
-    }
-
-    public function getType()
-    {
-        return $this->type;
-    }
-
-    public function setType($var)
-    {
-        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FieldDescriptorProto_Type::class);
-        $this->type = $var;
-        $this->has_type = true;
-    }
-
-    public function hasType()
-    {
-        return $this->has_type;
-    }
-
-    public function getTypeName()
-    {
-        return $this->type_name;
-    }
-
-    public function setTypeName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->type_name = $var;
-        $this->has_type_name = true;
-    }
-
-    public function hasTypeName()
-    {
-        return $this->has_type_name;
-    }
-
-    public function getExtendee()
-    {
-        return $this->extendee;
-    }
-
-    public function setExtendee($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->extendee = $var;
-        $this->has_extendee = true;
-    }
-
-    public function hasExtendee()
-    {
-        return $this->has_extendee;
-    }
-
-    public function getDefaultValue()
-    {
-        return $this->default_value;
-    }
-
-    public function setDefaultValue($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->default_value = $var;
-        $this->has_default_value = true;
-    }
-
-    public function hasDefaultValue()
-    {
-        return $this->has_default_value;
-    }
-
-    public function getOneofIndex()
-    {
-        return $this->oneof_index;
-    }
-
-    public function setOneofIndex($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->oneof_index = $var;
-        $this->has_oneof_index = true;
-    }
-
-    public function hasOneofIndex()
-    {
-        return $this->has_oneof_index;
-    }
-
-    public function getJsonName()
-    {
-        return $this->json_name;
-    }
-
-    public function setJsonName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->json_name = $var;
-        $this->has_json_name = true;
-    }
-
-    public function hasJsonName()
-    {
-        return $this->has_json_name;
-    }
-
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    public function setOptions(&$var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\FieldOptions::class);
-        $this->options = $var;
-        $this->has_options = true;
-    }
-
-    public function hasOptions()
-    {
-        return $this->has_options;
-    }
-
-}
-
-class FieldDescriptorProto_Type
-{
-    const TYPE_DOUBLE = 1;
-    const TYPE_FLOAT = 2;
-    const TYPE_INT64 = 3;
-    const TYPE_UINT64 = 4;
-    const TYPE_INT32 = 5;
-    const TYPE_FIXED64 = 6;
-    const TYPE_FIXED32 = 7;
-    const TYPE_BOOL = 8;
-    const TYPE_STRING = 9;
-    const TYPE_GROUP = 10;
-    const TYPE_MESSAGE = 11;
-    const TYPE_BYTES = 12;
-    const TYPE_UINT32 = 13;
-    const TYPE_ENUM = 14;
-    const TYPE_SFIXED32 = 15;
-    const TYPE_SFIXED64 = 16;
-    const TYPE_SINT32 = 17;
-    const TYPE_SINT64 = 18;
-}
-
-class FieldDescriptorProto_Label
-{
-    const LABEL_OPTIONAL = 1;
-    const LABEL_REQUIRED = 2;
-    const LABEL_REPEATED = 3;
-}
-
-class OneofDescriptorProto extends \Google\Protobuf\Internal\Message
-{
-    private $name = '';
-    private $has_name = false;
-    private $options = null;
-    private $has_options = false;
-
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-        $this->has_name = true;
-    }
-
-    public function hasName()
-    {
-        return $this->has_name;
-    }
-
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    public function setOptions(&$var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\OneofOptions::class);
-        $this->options = $var;
-        $this->has_options = true;
-    }
-
-    public function hasOptions()
-    {
-        return $this->has_options;
-    }
-
-}
-
-class EnumDescriptorProto extends \Google\Protobuf\Internal\Message
-{
-    private $name = '';
-    private $has_name = false;
-    private $value;
-    private $has_value = false;
-    private $options = null;
-    private $has_options = false;
-
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-        $this->has_name = true;
-    }
-
-    public function hasName()
-    {
-        return $this->has_name;
-    }
-
-    public function getValue()
-    {
-        return $this->value;
-    }
-
-    public function setValue(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\EnumValueDescriptorProto::class);
-        $this->value = $var;
-        $this->has_value = true;
-    }
-
-    public function hasValue()
-    {
-        return $this->has_value;
-    }
-
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    public function setOptions(&$var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\EnumOptions::class);
-        $this->options = $var;
-        $this->has_options = true;
-    }
-
-    public function hasOptions()
-    {
-        return $this->has_options;
-    }
-
-}
-
-class EnumValueDescriptorProto extends \Google\Protobuf\Internal\Message
-{
-    private $name = '';
-    private $has_name = false;
-    private $number = 0;
-    private $has_number = false;
-    private $options = null;
-    private $has_options = false;
-
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-        $this->has_name = true;
-    }
-
-    public function hasName()
-    {
-        return $this->has_name;
-    }
-
-    public function getNumber()
-    {
-        return $this->number;
-    }
-
-    public function setNumber($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->number = $var;
-        $this->has_number = true;
-    }
-
-    public function hasNumber()
-    {
-        return $this->has_number;
-    }
-
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    public function setOptions(&$var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\EnumValueOptions::class);
-        $this->options = $var;
-        $this->has_options = true;
-    }
-
-    public function hasOptions()
-    {
-        return $this->has_options;
-    }
-
-}
-
-class ServiceDescriptorProto extends \Google\Protobuf\Internal\Message
-{
-    private $name = '';
-    private $has_name = false;
-    private $method;
-    private $has_method = false;
-    private $options = null;
-    private $has_options = false;
-
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-        $this->has_name = true;
-    }
-
-    public function hasName()
-    {
-        return $this->has_name;
-    }
-
-    public function getMethod()
-    {
-        return $this->method;
-    }
-
-    public function setMethod(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\MethodDescriptorProto::class);
-        $this->method = $var;
-        $this->has_method = true;
-    }
-
-    public function hasMethod()
-    {
-        return $this->has_method;
-    }
-
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    public function setOptions(&$var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\ServiceOptions::class);
-        $this->options = $var;
-        $this->has_options = true;
-    }
-
-    public function hasOptions()
-    {
-        return $this->has_options;
-    }
-
-}
-
-class MethodDescriptorProto extends \Google\Protobuf\Internal\Message
-{
-    private $name = '';
-    private $has_name = false;
-    private $input_type = '';
-    private $has_input_type = false;
-    private $output_type = '';
-    private $has_output_type = false;
-    private $options = null;
-    private $has_options = false;
-    private $client_streaming = false;
-    private $has_client_streaming = false;
-    private $server_streaming = false;
-    private $has_server_streaming = false;
-
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    public function setName($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name = $var;
-        $this->has_name = true;
-    }
-
-    public function hasName()
-    {
-        return $this->has_name;
-    }
-
-    public function getInputType()
-    {
-        return $this->input_type;
-    }
-
-    public function setInputType($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->input_type = $var;
-        $this->has_input_type = true;
-    }
-
-    public function hasInputType()
-    {
-        return $this->has_input_type;
-    }
-
-    public function getOutputType()
-    {
-        return $this->output_type;
-    }
-
-    public function setOutputType($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->output_type = $var;
-        $this->has_output_type = true;
-    }
-
-    public function hasOutputType()
-    {
-        return $this->has_output_type;
-    }
-
-    public function getOptions()
-    {
-        return $this->options;
-    }
-
-    public function setOptions(&$var)
-    {
-        GPBUtil::checkMessage($var, \Google\Protobuf\Internal\MethodOptions::class);
-        $this->options = $var;
-        $this->has_options = true;
-    }
-
-    public function hasOptions()
-    {
-        return $this->has_options;
-    }
-
-    public function getClientStreaming()
-    {
-        return $this->client_streaming;
-    }
-
-    public function setClientStreaming($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->client_streaming = $var;
-        $this->has_client_streaming = true;
-    }
-
-    public function hasClientStreaming()
-    {
-        return $this->has_client_streaming;
-    }
-
-    public function getServerStreaming()
-    {
-        return $this->server_streaming;
-    }
-
-    public function setServerStreaming($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->server_streaming = $var;
-        $this->has_server_streaming = true;
-    }
-
-    public function hasServerStreaming()
-    {
-        return $this->has_server_streaming;
-    }
-
-}
-
-class FileOptions extends \Google\Protobuf\Internal\Message
-{
-    private $java_package = '';
-    private $has_java_package = false;
-    private $java_outer_classname = '';
-    private $has_java_outer_classname = false;
-    private $java_multiple_files = false;
-    private $has_java_multiple_files = false;
-    private $java_generate_equals_and_hash = false;
-    private $has_java_generate_equals_and_hash = false;
-    private $java_string_check_utf8 = false;
-    private $has_java_string_check_utf8 = false;
-    private $optimize_for = 0;
-    private $has_optimize_for = false;
-    private $go_package = '';
-    private $has_go_package = false;
-    private $cc_generic_services = false;
-    private $has_cc_generic_services = false;
-    private $java_generic_services = false;
-    private $has_java_generic_services = false;
-    private $py_generic_services = false;
-    private $has_py_generic_services = false;
-    private $deprecated = false;
-    private $has_deprecated = false;
-    private $cc_enable_arenas = false;
-    private $has_cc_enable_arenas = false;
-    private $objc_class_prefix = '';
-    private $has_objc_class_prefix = false;
-    private $csharp_namespace = '';
-    private $has_csharp_namespace = false;
-    private $uninterpreted_option;
-    private $has_uninterpreted_option = false;
-
-    public function getJavaPackage()
-    {
-        return $this->java_package;
-    }
-
-    public function setJavaPackage($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->java_package = $var;
-        $this->has_java_package = true;
-    }
-
-    public function hasJavaPackage()
-    {
-        return $this->has_java_package;
-    }
-
-    public function getJavaOuterClassname()
-    {
-        return $this->java_outer_classname;
-    }
-
-    public function setJavaOuterClassname($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->java_outer_classname = $var;
-        $this->has_java_outer_classname = true;
-    }
-
-    public function hasJavaOuterClassname()
-    {
-        return $this->has_java_outer_classname;
-    }
-
-    public function getJavaMultipleFiles()
-    {
-        return $this->java_multiple_files;
-    }
-
-    public function setJavaMultipleFiles($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->java_multiple_files = $var;
-        $this->has_java_multiple_files = true;
-    }
-
-    public function hasJavaMultipleFiles()
-    {
-        return $this->has_java_multiple_files;
-    }
-
-    public function getJavaGenerateEqualsAndHash()
-    {
-        return $this->java_generate_equals_and_hash;
-    }
-
-    public function setJavaGenerateEqualsAndHash($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->java_generate_equals_and_hash = $var;
-        $this->has_java_generate_equals_and_hash = true;
-    }
-
-    public function hasJavaGenerateEqualsAndHash()
-    {
-        return $this->has_java_generate_equals_and_hash;
-    }
-
-    public function getJavaStringCheckUtf8()
-    {
-        return $this->java_string_check_utf8;
-    }
-
-    public function setJavaStringCheckUtf8($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->java_string_check_utf8 = $var;
-        $this->has_java_string_check_utf8 = true;
-    }
-
-    public function hasJavaStringCheckUtf8()
-    {
-        return $this->has_java_string_check_utf8;
-    }
-
-    public function getOptimizeFor()
-    {
-        return $this->optimize_for;
-    }
-
-    public function setOptimizeFor($var)
-    {
-        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FileOptions_OptimizeMode::class);
-        $this->optimize_for = $var;
-        $this->has_optimize_for = true;
-    }
-
-    public function hasOptimizeFor()
-    {
-        return $this->has_optimize_for;
-    }
-
-    public function getGoPackage()
-    {
-        return $this->go_package;
-    }
-
-    public function setGoPackage($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->go_package = $var;
-        $this->has_go_package = true;
-    }
-
-    public function hasGoPackage()
-    {
-        return $this->has_go_package;
-    }
-
-    public function getCcGenericServices()
-    {
-        return $this->cc_generic_services;
-    }
-
-    public function setCcGenericServices($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->cc_generic_services = $var;
-        $this->has_cc_generic_services = true;
-    }
-
-    public function hasCcGenericServices()
-    {
-        return $this->has_cc_generic_services;
-    }
-
-    public function getJavaGenericServices()
-    {
-        return $this->java_generic_services;
-    }
-
-    public function setJavaGenericServices($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->java_generic_services = $var;
-        $this->has_java_generic_services = true;
-    }
-
-    public function hasJavaGenericServices()
-    {
-        return $this->has_java_generic_services;
-    }
-
-    public function getPyGenericServices()
-    {
-        return $this->py_generic_services;
-    }
-
-    public function setPyGenericServices($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->py_generic_services = $var;
-        $this->has_py_generic_services = true;
-    }
-
-    public function hasPyGenericServices()
-    {
-        return $this->has_py_generic_services;
-    }
-
-    public function getDeprecated()
-    {
-        return $this->deprecated;
-    }
-
-    public function setDeprecated($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->deprecated = $var;
-        $this->has_deprecated = true;
-    }
-
-    public function hasDeprecated()
-    {
-        return $this->has_deprecated;
-    }
-
-    public function getCcEnableArenas()
-    {
-        return $this->cc_enable_arenas;
-    }
-
-    public function setCcEnableArenas($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->cc_enable_arenas = $var;
-        $this->has_cc_enable_arenas = true;
-    }
-
-    public function hasCcEnableArenas()
-    {
-        return $this->has_cc_enable_arenas;
-    }
-
-    public function getObjcClassPrefix()
-    {
-        return $this->objc_class_prefix;
-    }
-
-    public function setObjcClassPrefix($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->objc_class_prefix = $var;
-        $this->has_objc_class_prefix = true;
-    }
-
-    public function hasObjcClassPrefix()
-    {
-        return $this->has_objc_class_prefix;
-    }
-
-    public function getCsharpNamespace()
-    {
-        return $this->csharp_namespace;
-    }
-
-    public function setCsharpNamespace($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->csharp_namespace = $var;
-        $this->has_csharp_namespace = true;
-    }
-
-    public function hasCsharpNamespace()
-    {
-        return $this->has_csharp_namespace;
-    }
-
-    public function getUninterpretedOption()
-    {
-        return $this->uninterpreted_option;
-    }
-
-    public function setUninterpretedOption(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
-        $this->uninterpreted_option = $var;
-        $this->has_uninterpreted_option = true;
-    }
-
-    public function hasUninterpretedOption()
-    {
-        return $this->has_uninterpreted_option;
-    }
-
-}
-
-class FileOptions_OptimizeMode
-{
-    const SPEED = 1;
-    const CODE_SIZE = 2;
-    const LITE_RUNTIME = 3;
-}
-
-class MessageOptions extends \Google\Protobuf\Internal\Message
-{
-    private $message_set_wire_format = false;
-    private $has_message_set_wire_format = false;
-    private $no_standard_descriptor_accessor = false;
-    private $has_no_standard_descriptor_accessor = false;
-    private $deprecated = false;
-    private $has_deprecated = false;
-    private $map_entry = false;
-    private $has_map_entry = false;
-    private $uninterpreted_option;
-    private $has_uninterpreted_option = false;
-
-    public function getMessageSetWireFormat()
-    {
-        return $this->message_set_wire_format;
-    }
-
-    public function setMessageSetWireFormat($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->message_set_wire_format = $var;
-        $this->has_message_set_wire_format = true;
-    }
-
-    public function hasMessageSetWireFormat()
-    {
-        return $this->has_message_set_wire_format;
-    }
-
-    public function getNoStandardDescriptorAccessor()
-    {
-        return $this->no_standard_descriptor_accessor;
-    }
-
-    public function setNoStandardDescriptorAccessor($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->no_standard_descriptor_accessor = $var;
-        $this->has_no_standard_descriptor_accessor = true;
-    }
-
-    public function hasNoStandardDescriptorAccessor()
-    {
-        return $this->has_no_standard_descriptor_accessor;
-    }
-
-    public function getDeprecated()
-    {
-        return $this->deprecated;
-    }
-
-    public function setDeprecated($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->deprecated = $var;
-        $this->has_deprecated = true;
-    }
-
-    public function hasDeprecated()
-    {
-        return $this->has_deprecated;
-    }
-
-    public function getMapEntry()
-    {
-        return $this->map_entry;
-    }
-
-    public function setMapEntry($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->map_entry = $var;
-        $this->has_map_entry = true;
-    }
-
-    public function hasMapEntry()
-    {
-        return $this->has_map_entry;
-    }
-
-    public function getUninterpretedOption()
-    {
-        return $this->uninterpreted_option;
-    }
-
-    public function setUninterpretedOption(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
-        $this->uninterpreted_option = $var;
-        $this->has_uninterpreted_option = true;
-    }
-
-    public function hasUninterpretedOption()
-    {
-        return $this->has_uninterpreted_option;
-    }
-
-}
-
-class FieldOptions extends \Google\Protobuf\Internal\Message
-{
-    private $ctype = 0;
-    private $has_ctype = false;
-    private $packed = false;
-    private $has_packed = false;
-    private $jstype = 0;
-    private $has_jstype = false;
-    private $lazy = false;
-    private $has_lazy = false;
-    private $deprecated = false;
-    private $has_deprecated = false;
-    private $weak = false;
-    private $has_weak = false;
-    private $uninterpreted_option;
-    private $has_uninterpreted_option = false;
-
-    public function getCtype()
-    {
-        return $this->ctype;
-    }
-
-    public function setCtype($var)
-    {
-        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FieldOptions_CType::class);
-        $this->ctype = $var;
-        $this->has_ctype = true;
-    }
-
-    public function hasCtype()
-    {
-        return $this->has_ctype;
-    }
-
-    public function getPacked()
-    {
-        return $this->packed;
-    }
-
-    public function setPacked($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->packed = $var;
-        $this->has_packed = true;
-    }
-
-    public function hasPacked()
-    {
-        return $this->has_packed;
-    }
-
-    public function getJstype()
-    {
-        return $this->jstype;
-    }
-
-    public function setJstype($var)
-    {
-        GPBUtil::checkEnum($var, \Google\Protobuf\Internal\FieldOptions_JSType::class);
-        $this->jstype = $var;
-        $this->has_jstype = true;
-    }
-
-    public function hasJstype()
-    {
-        return $this->has_jstype;
-    }
-
-    public function getLazy()
-    {
-        return $this->lazy;
-    }
-
-    public function setLazy($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->lazy = $var;
-        $this->has_lazy = true;
-    }
-
-    public function hasLazy()
-    {
-        return $this->has_lazy;
-    }
-
-    public function getDeprecated()
-    {
-        return $this->deprecated;
-    }
-
-    public function setDeprecated($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->deprecated = $var;
-        $this->has_deprecated = true;
-    }
-
-    public function hasDeprecated()
-    {
-        return $this->has_deprecated;
-    }
-
-    public function getWeak()
-    {
-        return $this->weak;
-    }
-
-    public function setWeak($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->weak = $var;
-        $this->has_weak = true;
-    }
-
-    public function hasWeak()
-    {
-        return $this->has_weak;
-    }
-
-    public function getUninterpretedOption()
-    {
-        return $this->uninterpreted_option;
-    }
-
-    public function setUninterpretedOption(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
-        $this->uninterpreted_option = $var;
-        $this->has_uninterpreted_option = true;
-    }
-
-    public function hasUninterpretedOption()
-    {
-        return $this->has_uninterpreted_option;
-    }
-
-}
-
-class FieldOptions_CType
-{
-    const STRING = 0;
-    const CORD = 1;
-    const STRING_PIECE = 2;
-}
-
-class FieldOptions_JSType
-{
-    const JS_NORMAL = 0;
-    const JS_STRING = 1;
-    const JS_NUMBER = 2;
-}
-
-class OneofOptions extends \Google\Protobuf\Internal\Message
-{
-    private $uninterpreted_option;
-    private $has_uninterpreted_option = false;
-
-    public function getUninterpretedOption()
-    {
-        return $this->uninterpreted_option;
-    }
-
-    public function setUninterpretedOption(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
-        $this->uninterpreted_option = $var;
-        $this->has_uninterpreted_option = true;
-    }
-
-    public function hasUninterpretedOption()
-    {
-        return $this->has_uninterpreted_option;
-    }
-
-}
-
-class EnumOptions extends \Google\Protobuf\Internal\Message
-{
-    private $allow_alias = false;
-    private $has_allow_alias = false;
-    private $deprecated = false;
-    private $has_deprecated = false;
-    private $uninterpreted_option;
-    private $has_uninterpreted_option = false;
-
-    public function getAllowAlias()
-    {
-        return $this->allow_alias;
-    }
-
-    public function setAllowAlias($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->allow_alias = $var;
-        $this->has_allow_alias = true;
-    }
-
-    public function hasAllowAlias()
-    {
-        return $this->has_allow_alias;
-    }
-
-    public function getDeprecated()
-    {
-        return $this->deprecated;
-    }
-
-    public function setDeprecated($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->deprecated = $var;
-        $this->has_deprecated = true;
-    }
-
-    public function hasDeprecated()
-    {
-        return $this->has_deprecated;
-    }
-
-    public function getUninterpretedOption()
-    {
-        return $this->uninterpreted_option;
-    }
-
-    public function setUninterpretedOption(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
-        $this->uninterpreted_option = $var;
-        $this->has_uninterpreted_option = true;
-    }
-
-    public function hasUninterpretedOption()
-    {
-        return $this->has_uninterpreted_option;
-    }
-
-}
-
-class EnumValueOptions extends \Google\Protobuf\Internal\Message
-{
-    private $deprecated = false;
-    private $has_deprecated = false;
-    private $uninterpreted_option;
-    private $has_uninterpreted_option = false;
-
-    public function getDeprecated()
-    {
-        return $this->deprecated;
-    }
-
-    public function setDeprecated($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->deprecated = $var;
-        $this->has_deprecated = true;
-    }
-
-    public function hasDeprecated()
-    {
-        return $this->has_deprecated;
-    }
-
-    public function getUninterpretedOption()
-    {
-        return $this->uninterpreted_option;
-    }
-
-    public function setUninterpretedOption(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
-        $this->uninterpreted_option = $var;
-        $this->has_uninterpreted_option = true;
-    }
-
-    public function hasUninterpretedOption()
-    {
-        return $this->has_uninterpreted_option;
-    }
-
-}
-
-class ServiceOptions extends \Google\Protobuf\Internal\Message
-{
-    private $deprecated = false;
-    private $has_deprecated = false;
-    private $uninterpreted_option;
-    private $has_uninterpreted_option = false;
-
-    public function getDeprecated()
-    {
-        return $this->deprecated;
-    }
-
-    public function setDeprecated($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->deprecated = $var;
-        $this->has_deprecated = true;
-    }
-
-    public function hasDeprecated()
-    {
-        return $this->has_deprecated;
-    }
-
-    public function getUninterpretedOption()
-    {
-        return $this->uninterpreted_option;
-    }
-
-    public function setUninterpretedOption(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
-        $this->uninterpreted_option = $var;
-        $this->has_uninterpreted_option = true;
-    }
-
-    public function hasUninterpretedOption()
-    {
-        return $this->has_uninterpreted_option;
-    }
-
-}
-
-class MethodOptions extends \Google\Protobuf\Internal\Message
-{
-    private $deprecated = false;
-    private $has_deprecated = false;
-    private $uninterpreted_option;
-    private $has_uninterpreted_option = false;
-
-    public function getDeprecated()
-    {
-        return $this->deprecated;
-    }
-
-    public function setDeprecated($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->deprecated = $var;
-        $this->has_deprecated = true;
-    }
-
-    public function hasDeprecated()
-    {
-        return $this->has_deprecated;
-    }
-
-    public function getUninterpretedOption()
-    {
-        return $this->uninterpreted_option;
-    }
-
-    public function setUninterpretedOption(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption::class);
-        $this->uninterpreted_option = $var;
-        $this->has_uninterpreted_option = true;
-    }
-
-    public function hasUninterpretedOption()
-    {
-        return $this->has_uninterpreted_option;
-    }
-
-}
-
-class UninterpretedOption extends \Google\Protobuf\Internal\Message
-{
-    private $name;
-    private $has_name = false;
-    private $identifier_value = '';
-    private $has_identifier_value = false;
-    private $positive_int_value = 0;
-    private $has_positive_int_value = false;
-    private $negative_int_value = 0;
-    private $has_negative_int_value = false;
-    private $double_value = 0.0;
-    private $has_double_value = false;
-    private $string_value = '';
-    private $has_string_value = false;
-    private $aggregate_value = '';
-    private $has_aggregate_value = false;
-
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    public function setName(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\UninterpretedOption_NamePart::class);
-        $this->name = $var;
-        $this->has_name = true;
-    }
-
-    public function hasName()
-    {
-        return $this->has_name;
-    }
-
-    public function getIdentifierValue()
-    {
-        return $this->identifier_value;
-    }
-
-    public function setIdentifierValue($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->identifier_value = $var;
-        $this->has_identifier_value = true;
-    }
-
-    public function hasIdentifierValue()
-    {
-        return $this->has_identifier_value;
-    }
-
-    public function getPositiveIntValue()
-    {
-        return $this->positive_int_value;
-    }
-
-    public function setPositiveIntValue($var)
-    {
-        GPBUtil::checkUint64($var);
-        $this->positive_int_value = $var;
-        $this->has_positive_int_value = true;
-    }
-
-    public function hasPositiveIntValue()
-    {
-        return $this->has_positive_int_value;
-    }
-
-    public function getNegativeIntValue()
-    {
-        return $this->negative_int_value;
-    }
-
-    public function setNegativeIntValue($var)
-    {
-        GPBUtil::checkInt64($var);
-        $this->negative_int_value = $var;
-        $this->has_negative_int_value = true;
-    }
-
-    public function hasNegativeIntValue()
-    {
-        return $this->has_negative_int_value;
-    }
-
-    public function getDoubleValue()
-    {
-        return $this->double_value;
-    }
-
-    public function setDoubleValue($var)
-    {
-        GPBUtil::checkDouble($var);
-        $this->double_value = $var;
-        $this->has_double_value = true;
-    }
-
-    public function hasDoubleValue()
-    {
-        return $this->has_double_value;
-    }
-
-    public function getStringValue()
-    {
-        return $this->string_value;
-    }
-
-    public function setStringValue($var)
-    {
-        GPBUtil::checkString($var, False);
-        $this->string_value = $var;
-        $this->has_string_value = true;
-    }
-
-    public function hasStringValue()
-    {
-        return $this->has_string_value;
-    }
-
-    public function getAggregateValue()
-    {
-        return $this->aggregate_value;
-    }
-
-    public function setAggregateValue($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->aggregate_value = $var;
-        $this->has_aggregate_value = true;
-    }
-
-    public function hasAggregateValue()
-    {
-        return $this->has_aggregate_value;
-    }
-
-}
-
-class UninterpretedOption_NamePart extends \Google\Protobuf\Internal\Message
-{
-    private $name_part = '';
-    private $has_name_part = false;
-    private $is_extension = false;
-    private $has_is_extension = false;
-
-    public function getNamePart()
-    {
-        return $this->name_part;
-    }
-
-    public function setNamePart($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->name_part = $var;
-        $this->has_name_part = true;
-    }
-
-    public function hasNamePart()
-    {
-        return $this->has_name_part;
-    }
-
-    public function getIsExtension()
-    {
-        return $this->is_extension;
-    }
-
-    public function setIsExtension($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->is_extension = $var;
-        $this->has_is_extension = true;
-    }
-
-    public function hasIsExtension()
-    {
-        return $this->has_is_extension;
-    }
-
-}
-
-class SourceCodeInfo extends \Google\Protobuf\Internal\Message
-{
-    private $location;
-    private $has_location = false;
-
-    public function getLocation()
-    {
-        return $this->location;
-    }
-
-    public function setLocation(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\SourceCodeInfo_Location::class);
-        $this->location = $var;
-        $this->has_location = true;
-    }
-
-    public function hasLocation()
-    {
-        return $this->has_location;
-    }
-
-}
-
-class SourceCodeInfo_Location extends \Google\Protobuf\Internal\Message
-{
-    private $path;
-    private $has_path = false;
-    private $span;
-    private $has_span = false;
-    private $leading_comments = '';
-    private $has_leading_comments = false;
-    private $trailing_comments = '';
-    private $has_trailing_comments = false;
-    private $leading_detached_comments;
-    private $has_leading_detached_comments = false;
-
-    public function getPath()
-    {
-        return $this->path;
-    }
-
-    public function setPath(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::INT32);
-        $this->path = $var;
-        $this->has_path = true;
-    }
-
-    public function hasPath()
-    {
-        return $this->has_path;
-    }
-
-    public function getSpan()
-    {
-        return $this->span;
-    }
-
-    public function setSpan(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::INT32);
-        $this->span = $var;
-        $this->has_span = true;
-    }
-
-    public function hasSpan()
-    {
-        return $this->has_span;
-    }
-
-    public function getLeadingComments()
-    {
-        return $this->leading_comments;
-    }
-
-    public function setLeadingComments($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->leading_comments = $var;
-        $this->has_leading_comments = true;
-    }
-
-    public function hasLeadingComments()
-    {
-        return $this->has_leading_comments;
-    }
-
-    public function getTrailingComments()
-    {
-        return $this->trailing_comments;
-    }
-
-    public function setTrailingComments($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->trailing_comments = $var;
-        $this->has_trailing_comments = true;
-    }
-
-    public function hasTrailingComments()
-    {
-        return $this->has_trailing_comments;
-    }
-
-    public function getLeadingDetachedComments()
-    {
-        return $this->leading_detached_comments;
-    }
-
-    public function setLeadingDetachedComments(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::STRING);
-        $this->leading_detached_comments = $var;
-        $this->has_leading_detached_comments = true;
-    }
-
-    public function hasLeadingDetachedComments()
-    {
-        return $this->has_leading_detached_comments;
-    }
-
-}
-
-class GeneratedCodeInfo extends \Google\Protobuf\Internal\Message
-{
-    private $annotation;
-    private $has_annotation = false;
-
-    public function getAnnotation()
-    {
-        return $this->annotation;
-    }
-
-    public function setAnnotation(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Google\Protobuf\Internal\GeneratedCodeInfo_Annotation::class);
-        $this->annotation = $var;
-        $this->has_annotation = true;
-    }
-
-    public function hasAnnotation()
-    {
-        return $this->has_annotation;
-    }
-
-}
-
-class GeneratedCodeInfo_Annotation extends \Google\Protobuf\Internal\Message
-{
-    private $path;
-    private $has_path = false;
-    private $source_file = '';
-    private $has_source_file = false;
-    private $begin = 0;
-    private $has_begin = false;
-    private $end = 0;
-    private $has_end = false;
-
-    public function getPath()
-    {
-        return $this->path;
-    }
-
-    public function setPath(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::INT32);
-        $this->path = $var;
-        $this->has_path = true;
-    }
-
-    public function hasPath()
-    {
-        return $this->has_path;
-    }
-
-    public function getSourceFile()
-    {
-        return $this->source_file;
-    }
-
-    public function setSourceFile($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->source_file = $var;
-        $this->has_source_file = true;
-    }
-
-    public function hasSourceFile()
-    {
-        return $this->has_source_file;
-    }
-
-    public function getBegin()
-    {
-        return $this->begin;
-    }
-
-    public function setBegin($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->begin = $var;
-        $this->has_begin = true;
-    }
-
-    public function hasBegin()
-    {
-        return $this->has_begin;
-    }
-
-    public function getEnd()
-    {
-        return $this->end;
-    }
-
-    public function setEnd($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->end = $var;
-        $this->has_end = true;
-    }
-
-    public function hasEnd()
-    {
-        return $this->has_end;
-    }
-
-}
-
-$pool = DescriptorPool::getGeneratedPool();
-
-$pool->addMessage('google.protobuf.internal.FileDescriptorSet', FileDescriptorSet::class)
-    ->repeated('file', GPBType::MESSAGE, 1, 'google.protobuf.internal.FileDescriptorProto')
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.FileDescriptorProto', FileDescriptorProto::class)
-    ->optional('name', GPBType::STRING, 1)
-    ->optional('package', GPBType::STRING, 2)
-    ->repeated('dependency', GPBType::STRING, 3)
-    ->repeated('public_dependency', GPBType::INT32, 10)
-    ->repeated('weak_dependency', GPBType::INT32, 11)
-    ->repeated('message_type', GPBType::MESSAGE, 4, 'google.protobuf.internal.DescriptorProto')
-    ->repeated('enum_type', GPBType::MESSAGE, 5, 'google.protobuf.internal.EnumDescriptorProto')
-    ->repeated('service', GPBType::MESSAGE, 6, 'google.protobuf.internal.ServiceDescriptorProto')
-    ->repeated('extension', GPBType::MESSAGE, 7, 'google.protobuf.internal.FieldDescriptorProto')
-    ->optional('options', GPBType::MESSAGE, 8, 'google.protobuf.internal.FileOptions')
-    ->optional('source_code_info', GPBType::MESSAGE, 9, 'google.protobuf.internal.SourceCodeInfo')
-    ->optional('syntax', GPBType::STRING, 12)
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.DescriptorProto', DescriptorProto::class)
-    ->optional('name', GPBType::STRING, 1)
-    ->repeated('field', GPBType::MESSAGE, 2, 'google.protobuf.internal.FieldDescriptorProto')
-    ->repeated('extension', GPBType::MESSAGE, 6, 'google.protobuf.internal.FieldDescriptorProto')
-    ->repeated('nested_type', GPBType::MESSAGE, 3, 'google.protobuf.internal.DescriptorProto')
-    ->repeated('enum_type', GPBType::MESSAGE, 4, 'google.protobuf.internal.EnumDescriptorProto')
-    ->repeated('extension_range', GPBType::MESSAGE, 5, 'google.protobuf.internal.DescriptorProto.ExtensionRange')
-    ->repeated('oneof_decl', GPBType::MESSAGE, 8, 'google.protobuf.internal.OneofDescriptorProto')
-    ->optional('options', GPBType::MESSAGE, 7, 'google.protobuf.internal.MessageOptions')
-    ->repeated('reserved_range', GPBType::MESSAGE, 9, 'google.protobuf.internal.DescriptorProto.ReservedRange')
-    ->repeated('reserved_name', GPBType::STRING, 10)
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.DescriptorProto.ExtensionRange', DescriptorProto_ExtensionRange::class)
-    ->optional('start', GPBType::INT32, 1)
-    ->optional('end', GPBType::INT32, 2)
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.DescriptorProto.ReservedRange', DescriptorProto_ReservedRange::class)
-    ->optional('start', GPBType::INT32, 1)
-    ->optional('end', GPBType::INT32, 2)
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.FieldDescriptorProto', FieldDescriptorProto::class)
-    ->optional('name', GPBType::STRING, 1)
-    ->optional('number', GPBType::INT32, 3)
-    ->optional('label', GPBType::ENUM, 4, 'google.protobuf.internal.FieldDescriptorProto.Label')
-    ->optional('type', GPBType::ENUM, 5, 'google.protobuf.internal.FieldDescriptorProto.Type')
-    ->optional('type_name', GPBType::STRING, 6)
-    ->optional('extendee', GPBType::STRING, 2)
-    ->optional('default_value', GPBType::STRING, 7)
-    ->optional('oneof_index', GPBType::INT32, 9)
-    ->optional('json_name', GPBType::STRING, 10)
-    ->optional('options', GPBType::MESSAGE, 8, 'google.protobuf.internal.FieldOptions')
-    ->finalizeToPool();
-
-$pool->addEnum('google.protobuf.internal.FieldDescriptorProto.Type', Type::class)
-    ->value("TYPE_DOUBLE", 1)
-    ->value("TYPE_FLOAT", 2)
-    ->value("TYPE_INT64", 3)
-    ->value("TYPE_UINT64", 4)
-    ->value("TYPE_INT32", 5)
-    ->value("TYPE_FIXED64", 6)
-    ->value("TYPE_FIXED32", 7)
-    ->value("TYPE_BOOL", 8)
-    ->value("TYPE_STRING", 9)
-    ->value("TYPE_GROUP", 10)
-    ->value("TYPE_MESSAGE", 11)
-    ->value("TYPE_BYTES", 12)
-    ->value("TYPE_UINT32", 13)
-    ->value("TYPE_ENUM", 14)
-    ->value("TYPE_SFIXED32", 15)
-    ->value("TYPE_SFIXED64", 16)
-    ->value("TYPE_SINT32", 17)
-    ->value("TYPE_SINT64", 18)
-    ->finalizeToPool();
-
-$pool->addEnum('google.protobuf.internal.FieldDescriptorProto.Label', Label::class)
-    ->value("LABEL_OPTIONAL", 1)
-    ->value("LABEL_REQUIRED", 2)
-    ->value("LABEL_REPEATED", 3)
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.OneofDescriptorProto', OneofDescriptorProto::class)
-    ->optional('name', GPBType::STRING, 1)
-    ->optional('options', GPBType::MESSAGE, 2, 'google.protobuf.internal.OneofOptions')
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.EnumDescriptorProto', EnumDescriptorProto::class)
-    ->optional('name', GPBType::STRING, 1)
-    ->repeated('value', GPBType::MESSAGE, 2, 'google.protobuf.internal.EnumValueDescriptorProto')
-    ->optional('options', GPBType::MESSAGE, 3, 'google.protobuf.internal.EnumOptions')
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.EnumValueDescriptorProto', EnumValueDescriptorProto::class)
-    ->optional('name', GPBType::STRING, 1)
-    ->optional('number', GPBType::INT32, 2)
-    ->optional('options', GPBType::MESSAGE, 3, 'google.protobuf.internal.EnumValueOptions')
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.ServiceDescriptorProto', ServiceDescriptorProto::class)
-    ->optional('name', GPBType::STRING, 1)
-    ->repeated('method', GPBType::MESSAGE, 2, 'google.protobuf.internal.MethodDescriptorProto')
-    ->optional('options', GPBType::MESSAGE, 3, 'google.protobuf.internal.ServiceOptions')
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.MethodDescriptorProto', MethodDescriptorProto::class)
-    ->optional('name', GPBType::STRING, 1)
-    ->optional('input_type', GPBType::STRING, 2)
-    ->optional('output_type', GPBType::STRING, 3)
-    ->optional('options', GPBType::MESSAGE, 4, 'google.protobuf.internal.MethodOptions')
-    ->optional('client_streaming', GPBType::BOOL, 5)
-    ->optional('server_streaming', GPBType::BOOL, 6)
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.FileOptions', FileOptions::class)
-    ->optional('java_package', GPBType::STRING, 1)
-    ->optional('java_outer_classname', GPBType::STRING, 8)
-    ->optional('java_multiple_files', GPBType::BOOL, 10)
-    ->optional('java_generate_equals_and_hash', GPBType::BOOL, 20)
-    ->optional('java_string_check_utf8', GPBType::BOOL, 27)
-    ->optional('optimize_for', GPBType::ENUM, 9, 'google.protobuf.internal.FileOptions.OptimizeMode')
-    ->optional('go_package', GPBType::STRING, 11)
-    ->optional('cc_generic_services', GPBType::BOOL, 16)
-    ->optional('java_generic_services', GPBType::BOOL, 17)
-    ->optional('py_generic_services', GPBType::BOOL, 18)
-    ->optional('deprecated', GPBType::BOOL, 23)
-    ->optional('cc_enable_arenas', GPBType::BOOL, 31)
-    ->optional('objc_class_prefix', GPBType::STRING, 36)
-    ->optional('csharp_namespace', GPBType::STRING, 37)
-    ->repeated('uninterpreted_option', GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
-    ->finalizeToPool();
-
-$pool->addEnum('google.protobuf.internal.FileOptions.OptimizeMode', OptimizeMode::class)
-    ->value("SPEED", 1)
-    ->value("CODE_SIZE", 2)
-    ->value("LITE_RUNTIME", 3)
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.MessageOptions', MessageOptions::class)
-    ->optional('message_set_wire_format', GPBType::BOOL, 1)
-    ->optional('no_standard_descriptor_accessor', GPBType::BOOL, 2)
-    ->optional('deprecated', GPBType::BOOL, 3)
-    ->optional('map_entry', GPBType::BOOL, 7)
-    ->repeated('uninterpreted_option', GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.FieldOptions', FieldOptions::class)
-    ->optional('ctype', GPBType::ENUM, 1, 'google.protobuf.internal.FieldOptions.CType')
-    ->optional('packed', GPBType::BOOL, 2)
-    ->optional('jstype', GPBType::ENUM, 6, 'google.protobuf.internal.FieldOptions.JSType')
-    ->optional('lazy', GPBType::BOOL, 5)
-    ->optional('deprecated', GPBType::BOOL, 3)
-    ->optional('weak', GPBType::BOOL, 10)
-    ->repeated('uninterpreted_option', GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
-    ->finalizeToPool();
-
-$pool->addEnum('google.protobuf.internal.FieldOptions.CType', CType::class)
-    ->value("STRING", 0)
-    ->value("CORD", 1)
-    ->value("STRING_PIECE", 2)
-    ->finalizeToPool();
-
-$pool->addEnum('google.protobuf.internal.FieldOptions.JSType', JSType::class)
-    ->value("JS_NORMAL", 0)
-    ->value("JS_STRING", 1)
-    ->value("JS_NUMBER", 2)
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.OneofOptions', OneofOptions::class)
-    ->repeated('uninterpreted_option', GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.EnumOptions', EnumOptions::class)
-    ->optional('allow_alias', GPBType::BOOL, 2)
-    ->optional('deprecated', GPBType::BOOL, 3)
-    ->repeated('uninterpreted_option', GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.EnumValueOptions', EnumValueOptions::class)
-    ->optional('deprecated', GPBType::BOOL, 1)
-    ->repeated('uninterpreted_option', GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.ServiceOptions', ServiceOptions::class)
-    ->optional('deprecated', GPBType::BOOL, 33)
-    ->repeated('uninterpreted_option', GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.MethodOptions', MethodOptions::class)
-    ->optional('deprecated', GPBType::BOOL, 33)
-    ->repeated('uninterpreted_option', GPBType::MESSAGE, 999, 'google.protobuf.internal.UninterpretedOption')
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.UninterpretedOption', UninterpretedOption::class)
-    ->repeated('name', GPBType::MESSAGE, 2, 'google.protobuf.internal.UninterpretedOption.NamePart')
-    ->optional('identifier_value', GPBType::STRING, 3)
-    ->optional('positive_int_value', GPBType::UINT64, 4)
-    ->optional('negative_int_value', GPBType::INT64, 5)
-    ->optional('double_value', GPBType::DOUBLE, 6)
-    ->optional('string_value', GPBType::BYTES, 7)
-    ->optional('aggregate_value', GPBType::STRING, 8)
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.UninterpretedOption.NamePart', UninterpretedOption_NamePart::class)
-    ->required('name_part', GPBType::STRING, 1)
-    ->required('is_extension', GPBType::BOOL, 2)
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.SourceCodeInfo', SourceCodeInfo::class)
-    ->repeated('location', GPBType::MESSAGE, 1, 'google.protobuf.internal.SourceCodeInfo.Location')
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.SourceCodeInfo.Location', SourceCodeInfo_Location::class)
-    ->repeated('path', GPBType::INT32, 1)
-    ->repeated('span', GPBType::INT32, 2)
-    ->optional('leading_comments', GPBType::STRING, 3)
-    ->optional('trailing_comments', GPBType::STRING, 4)
-    ->repeated('leading_detached_comments', GPBType::STRING, 6)
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.GeneratedCodeInfo', GeneratedCodeInfo::class)
-    ->repeated('annotation', GPBType::MESSAGE, 1, 'google.protobuf.internal.GeneratedCodeInfo.Annotation')
-    ->finalizeToPool();
-
-$pool->addMessage('google.protobuf.internal.GeneratedCodeInfo.Annotation', GeneratedCodeInfo_Annotation::class)
-    ->repeated('path', GPBType::INT32, 1)
-    ->optional('source_file', GPBType::STRING, 2)
-    ->optional('begin', GPBType::INT32, 3)
-    ->optional('end', GPBType::INT32, 4)
-    ->finalizeToPool();
-
-$pool->finish();
diff --git a/php/tests/array_test.php b/php/tests/array_test.php
index a79a08b..a4cad71 100644
--- a/php/tests/array_test.php
+++ b/php/tests/array_test.php
@@ -1,6 +1,5 @@
 <?php
 
-require_once('test.pb.php');
 require_once('test_util.php');
 
 use Google\Protobuf\Internal\RepeatedField;
diff --git a/php/tests/autoload.php b/php/tests/autoload.php
new file mode 100755
index 0000000..0a917fc
--- /dev/null
+++ b/php/tests/autoload.php
@@ -0,0 +1,25 @@
+<?php
+
+function getGeneratedFiles($dir, &$results = array())
+{
+    $files = scandir($dir);
+
+    foreach ($files as $key => $value) {
+        $path = realpath($dir.DIRECTORY_SEPARATOR.$value);
+        if (!is_dir($path)) {
+            $results[] = $path;
+        } else if ($value != "." && $value != "..") {
+            getGeneratedFiles($path, $results);
+        }
+    }
+    return $results;
+}
+
+foreach (getGeneratedFiles("generated") as $filename)
+{
+    if (!is_dir($filename)) {
+        include_once $filename;
+    }
+
+}
+
diff --git a/php/tests/encode_decode_test.php b/php/tests/encode_decode_test.php
index d07907c..af9c041 100644
--- a/php/tests/encode_decode_test.php
+++ b/php/tests/encode_decode_test.php
@@ -1,6 +1,5 @@
 <?php
 
-require_once('test.pb.php');
 require_once('test_base.php');
 require_once('test_util.php');
 
diff --git a/php/tests/gdb_test.sh b/php/tests/gdb_test.sh
new file mode 100755
index 0000000..3c0d97a
--- /dev/null
+++ b/php/tests/gdb_test.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+# gdb --args php -dextension=../ext/google/protobuf/modules/protobuf.so `which
+# phpunit` --bootstrap autoload.php tmp_test.php
+#
+gdb --args php -dextension=../ext/google/protobuf/modules/protobuf.so `which phpunit` --bootstrap autoload.php encode_decode_test.php
+#
+# # gdb --args php -dextension=../ext/google/protobuf/modules/protobuf.so
+# memory_leak_test.php
+#
+# # USE_ZEND_ALLOC=0 valgrind --leak-check=yes php
+# -dextension=../ext/google/protobuf/modules/protobuf.so memory_leak_test.php
diff --git a/php/tests/generated_class_test.php b/php/tests/generated_class_test.php
index b3ecd3a..27912ec 100644
--- a/php/tests/generated_class_test.php
+++ b/php/tests/generated_class_test.php
@@ -1,7 +1,6 @@
 <?php
 
-require_once('test.pb.php');
-require_once('test_no_namespace.pb.php');
+require_once('generated/NoNameSpace.php');
 require_once('test_util.php');
 
 use Google\Protobuf\Internal\RepeatedField;
diff --git a/php/tests/google/protobuf/empty.pb.php b/php/tests/google/protobuf/empty.pb.php
deleted file mode 100644
index fdd0fe4..0000000
--- a/php/tests/google/protobuf/empty.pb.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: google/protobuf/empty.proto
-
-namespace Google\Protobuf;
-
-use Google\Protobuf\Internal\DescriptorPool;
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-class GPBEmpty extends \Google\Protobuf\Internal\Message
-{
-
-}
-
-$pool = DescriptorPool::getGeneratedPool();
-
-$pool->internalAddGeneratedFile(hex2bin(
-    "0ab7010a1b676f6f676c652f70726f746f6275662f656d7074792e70726f" .
-    "746f120f676f6f676c652e70726f746f62756622070a05456d7074794276" .
-    "0a13636f6d2e676f6f676c652e70726f746f627566420a456d7074795072" .
-    "6f746f50015a276769746875622e636f6d2f676f6c616e672f70726f746f" .
-    "6275662f7074797065732f656d707479f80101a20203475042aa021e476f" .
-    "6f676c652e50726f746f6275662e57656c6c4b6e6f776e54797065736206" .
-    "70726f746f33"
-));
-
diff --git a/php/tests/map_field_test.php b/php/tests/map_field_test.php
index 4e42361..d4ec44f 100644
--- a/php/tests/map_field_test.php
+++ b/php/tests/map_field_test.php
@@ -1,6 +1,5 @@
 <?php
 
-require_once('test.pb.php');
 require_once('test_util.php');
 
 use Google\Protobuf\Internal\GPBType;
diff --git a/php/tests/memory_leak_test.php b/php/tests/memory_leak_test.php
index ec54597..af32727 100644
--- a/php/tests/memory_leak_test.php
+++ b/php/tests/memory_leak_test.php
@@ -2,7 +2,15 @@
 
 # phpunit has memory leak by itself. Thus, it cannot be used to test memory leak.
 
-require_once('test.pb.php');
+require_once('generated/Bar/TestInclude.php');
+require_once('generated/Foo/TestEnum.php');
+require_once('generated/Foo/TestMessage.php');
+require_once('generated/Foo/TestMessage_Sub.php');
+require_once('generated/Foo/TestPackedMessage.php');
+require_once('generated/Foo/TestPhpDoc.php');
+require_once('generated/Foo/TestUnpackedMessage.php');
+require_once('generated/GPBMetadata/Proto/Test.php');
+require_once('generated/GPBMetadata/Proto/TestInclude.php');
 require_once('test_util.php');
 
 use Google\Protobuf\Internal\RepeatedField;
diff --git a/php/tests/php_implementation_test.php b/php/tests/php_implementation_test.php
index 485956c..4f626f1 100644
--- a/php/tests/php_implementation_test.php
+++ b/php/tests/php_implementation_test.php
@@ -1,6 +1,5 @@
 <?php
 
-require_once('test.pb.php');
 require_once('test_base.php');
 require_once('test_util.php');
 
diff --git a/php/tests/test.proto b/php/tests/proto/test.proto
similarity index 98%
rename from php/tests/test.proto
rename to php/tests/proto/test.proto
index f15f629..fc283a0 100644
--- a/php/tests/test.proto
+++ b/php/tests/proto/test.proto
@@ -1,6 +1,6 @@
 syntax = "proto3";
 
-import 'test_include.proto';
+import 'proto/test_include.proto';
 
 package foo;
 
diff --git a/php/tests/test_include.proto b/php/tests/proto/test_include.proto
similarity index 100%
rename from php/tests/test_include.proto
rename to php/tests/proto/test_include.proto
diff --git a/php/tests/test_no_namespace.proto b/php/tests/proto/test_no_namespace.proto
similarity index 100%
rename from php/tests/test_no_namespace.proto
rename to php/tests/proto/test_no_namespace.proto
diff --git a/php/tests/test.pb.php b/php/tests/test.pb.php
deleted file mode 100644
index 87332ae..0000000
--- a/php/tests/test.pb.php
+++ /dev/null
@@ -1,2325 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: test.proto
-
-namespace Foo;
-
-require_once('test_include.pb.php');
-use Google\Protobuf\Internal\DescriptorPool;
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Protobuf type <code>foo.TestMessage</code>
- */
-class TestMessage extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * <pre>
-     * Singular
-     * </pre>
-     *
-     * <code>optional int32 optional_int32 = 1;</code>
-     */
-    private $optional_int32 = 0;
-    /**
-     * <code>optional int64 optional_int64 = 2;</code>
-     */
-    private $optional_int64 = 0;
-    /**
-     * <code>optional uint32 optional_uint32 = 3;</code>
-     */
-    private $optional_uint32 = 0;
-    /**
-     * <code>optional uint64 optional_uint64 = 4;</code>
-     */
-    private $optional_uint64 = 0;
-    /**
-     * <code>optional sint32 optional_sint32 = 5;</code>
-     */
-    private $optional_sint32 = 0;
-    /**
-     * <code>optional sint64 optional_sint64 = 6;</code>
-     */
-    private $optional_sint64 = 0;
-    /**
-     * <code>optional fixed32 optional_fixed32 = 7;</code>
-     */
-    private $optional_fixed32 = 0;
-    /**
-     * <code>optional fixed64 optional_fixed64 = 8;</code>
-     */
-    private $optional_fixed64 = 0;
-    /**
-     * <code>optional sfixed32 optional_sfixed32 = 9;</code>
-     */
-    private $optional_sfixed32 = 0;
-    /**
-     * <code>optional sfixed64 optional_sfixed64 = 10;</code>
-     */
-    private $optional_sfixed64 = 0;
-    /**
-     * <code>optional float optional_float = 11;</code>
-     */
-    private $optional_float = 0.0;
-    /**
-     * <code>optional double optional_double = 12;</code>
-     */
-    private $optional_double = 0.0;
-    /**
-     * <code>optional bool optional_bool = 13;</code>
-     */
-    private $optional_bool = false;
-    /**
-     * <code>optional string optional_string = 14;</code>
-     */
-    private $optional_string = '';
-    /**
-     * <code>optional bytes optional_bytes = 15;</code>
-     */
-    private $optional_bytes = '';
-    /**
-     * <code>optional .foo.TestEnum optional_enum = 16;</code>
-     */
-    private $optional_enum = 0;
-    /**
-     * <code>optional .foo.TestMessage.Sub optional_message = 17;</code>
-     */
-    private $optional_message = null;
-    /**
-     * <code>optional .bar.TestInclude optional_included_message = 18;</code>
-     */
-    private $optional_included_message = null;
-    /**
-     * <code>optional .foo.TestMessage recursive = 19;</code>
-     */
-    private $recursive = null;
-    /**
-     * <pre>
-     * Repeated
-     * </pre>
-     *
-     * <code>repeated int32 repeated_int32 = 31;</code>
-     */
-    private $repeated_int32;
-    /**
-     * <code>repeated int64 repeated_int64 = 32;</code>
-     */
-    private $repeated_int64;
-    /**
-     * <code>repeated uint32 repeated_uint32 = 33;</code>
-     */
-    private $repeated_uint32;
-    /**
-     * <code>repeated uint64 repeated_uint64 = 34;</code>
-     */
-    private $repeated_uint64;
-    /**
-     * <code>repeated sint32 repeated_sint32 = 35;</code>
-     */
-    private $repeated_sint32;
-    /**
-     * <code>repeated sint64 repeated_sint64 = 36;</code>
-     */
-    private $repeated_sint64;
-    /**
-     * <code>repeated fixed32 repeated_fixed32 = 37;</code>
-     */
-    private $repeated_fixed32;
-    /**
-     * <code>repeated fixed64 repeated_fixed64 = 38;</code>
-     */
-    private $repeated_fixed64;
-    /**
-     * <code>repeated sfixed32 repeated_sfixed32 = 39;</code>
-     */
-    private $repeated_sfixed32;
-    /**
-     * <code>repeated sfixed64 repeated_sfixed64 = 40;</code>
-     */
-    private $repeated_sfixed64;
-    /**
-     * <code>repeated float repeated_float = 41;</code>
-     */
-    private $repeated_float;
-    /**
-     * <code>repeated double repeated_double = 42;</code>
-     */
-    private $repeated_double;
-    /**
-     * <code>repeated bool repeated_bool = 43;</code>
-     */
-    private $repeated_bool;
-    /**
-     * <code>repeated string repeated_string = 44;</code>
-     */
-    private $repeated_string;
-    /**
-     * <code>repeated bytes repeated_bytes = 45;</code>
-     */
-    private $repeated_bytes;
-    /**
-     * <code>repeated .foo.TestEnum repeated_enum = 46;</code>
-     */
-    private $repeated_enum;
-    /**
-     * <code>repeated .foo.TestMessage.Sub repeated_message = 47;</code>
-     */
-    private $repeated_message;
-    /**
-     * <code>repeated .foo.TestMessage repeated_recursive = 48;</code>
-     */
-    private $repeated_recursive;
-    /**
-     * <code>map&lt;int32, int32&gt; map_int32_int32 = 71;</code>
-     */
-    private $map_int32_int32;
-    /**
-     * <code>map&lt;int64, int64&gt; map_int64_int64 = 72;</code>
-     */
-    private $map_int64_int64;
-    /**
-     * <code>map&lt;uint32, uint32&gt; map_uint32_uint32 = 73;</code>
-     */
-    private $map_uint32_uint32;
-    /**
-     * <code>map&lt;uint64, uint64&gt; map_uint64_uint64 = 74;</code>
-     */
-    private $map_uint64_uint64;
-    /**
-     * <code>map&lt;sint32, sint32&gt; map_sint32_sint32 = 75;</code>
-     */
-    private $map_sint32_sint32;
-    /**
-     * <code>map&lt;sint64, sint64&gt; map_sint64_sint64 = 76;</code>
-     */
-    private $map_sint64_sint64;
-    /**
-     * <code>map&lt;fixed32, fixed32&gt; map_fixed32_fixed32 = 77;</code>
-     */
-    private $map_fixed32_fixed32;
-    /**
-     * <code>map&lt;fixed64, fixed64&gt; map_fixed64_fixed64 = 78;</code>
-     */
-    private $map_fixed64_fixed64;
-    /**
-     * <code>map&lt;sfixed32, sfixed32&gt; map_sfixed32_sfixed32 = 79;</code>
-     */
-    private $map_sfixed32_sfixed32;
-    /**
-     * <code>map&lt;sfixed64, sfixed64&gt; map_sfixed64_sfixed64 = 80;</code>
-     */
-    private $map_sfixed64_sfixed64;
-    /**
-     * <code>map&lt;int32, float&gt; map_int32_float = 81;</code>
-     */
-    private $map_int32_float;
-    /**
-     * <code>map&lt;int32, double&gt; map_int32_double = 82;</code>
-     */
-    private $map_int32_double;
-    /**
-     * <code>map&lt;bool, bool&gt; map_bool_bool = 83;</code>
-     */
-    private $map_bool_bool;
-    /**
-     * <code>map&lt;string, string&gt; map_string_string = 84;</code>
-     */
-    private $map_string_string;
-    /**
-     * <code>map&lt;int32, bytes&gt; map_int32_bytes = 85;</code>
-     */
-    private $map_int32_bytes;
-    /**
-     * <code>map&lt;int32, .foo.TestEnum&gt; map_int32_enum = 86;</code>
-     */
-    private $map_int32_enum;
-    /**
-     * <code>map&lt;int32, .foo.TestMessage.Sub&gt; map_int32_message = 87;</code>
-     */
-    private $map_int32_message;
-    /**
-     * <code>map&lt;int32, .foo.TestMessage&gt; map_recursive = 88;</code>
-     */
-    private $map_recursive;
-    protected $my_oneof;
-
-    /**
-     * <pre>
-     * Singular
-     * </pre>
-     *
-     * <code>optional int32 optional_int32 = 1;</code>
-     */
-    public function getOptionalInt32()
-    {
-        return $this->optional_int32;
-    }
-
-    /**
-     * <pre>
-     * Singular
-     * </pre>
-     *
-     * <code>optional int32 optional_int32 = 1;</code>
-     */
-    public function setOptionalInt32($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->optional_int32 = $var;
-    }
-
-    /**
-     * <code>optional int64 optional_int64 = 2;</code>
-     */
-    public function getOptionalInt64()
-    {
-        return $this->optional_int64;
-    }
-
-    /**
-     * <code>optional int64 optional_int64 = 2;</code>
-     */
-    public function setOptionalInt64($var)
-    {
-        GPBUtil::checkInt64($var);
-        $this->optional_int64 = $var;
-    }
-
-    /**
-     * <code>optional uint32 optional_uint32 = 3;</code>
-     */
-    public function getOptionalUint32()
-    {
-        return $this->optional_uint32;
-    }
-
-    /**
-     * <code>optional uint32 optional_uint32 = 3;</code>
-     */
-    public function setOptionalUint32($var)
-    {
-        GPBUtil::checkUint32($var);
-        $this->optional_uint32 = $var;
-    }
-
-    /**
-     * <code>optional uint64 optional_uint64 = 4;</code>
-     */
-    public function getOptionalUint64()
-    {
-        return $this->optional_uint64;
-    }
-
-    /**
-     * <code>optional uint64 optional_uint64 = 4;</code>
-     */
-    public function setOptionalUint64($var)
-    {
-        GPBUtil::checkUint64($var);
-        $this->optional_uint64 = $var;
-    }
-
-    /**
-     * <code>optional sint32 optional_sint32 = 5;</code>
-     */
-    public function getOptionalSint32()
-    {
-        return $this->optional_sint32;
-    }
-
-    /**
-     * <code>optional sint32 optional_sint32 = 5;</code>
-     */
-    public function setOptionalSint32($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->optional_sint32 = $var;
-    }
-
-    /**
-     * <code>optional sint64 optional_sint64 = 6;</code>
-     */
-    public function getOptionalSint64()
-    {
-        return $this->optional_sint64;
-    }
-
-    /**
-     * <code>optional sint64 optional_sint64 = 6;</code>
-     */
-    public function setOptionalSint64($var)
-    {
-        GPBUtil::checkInt64($var);
-        $this->optional_sint64 = $var;
-    }
-
-    /**
-     * <code>optional fixed32 optional_fixed32 = 7;</code>
-     */
-    public function getOptionalFixed32()
-    {
-        return $this->optional_fixed32;
-    }
-
-    /**
-     * <code>optional fixed32 optional_fixed32 = 7;</code>
-     */
-    public function setOptionalFixed32($var)
-    {
-        GPBUtil::checkUint32($var);
-        $this->optional_fixed32 = $var;
-    }
-
-    /**
-     * <code>optional fixed64 optional_fixed64 = 8;</code>
-     */
-    public function getOptionalFixed64()
-    {
-        return $this->optional_fixed64;
-    }
-
-    /**
-     * <code>optional fixed64 optional_fixed64 = 8;</code>
-     */
-    public function setOptionalFixed64($var)
-    {
-        GPBUtil::checkUint64($var);
-        $this->optional_fixed64 = $var;
-    }
-
-    /**
-     * <code>optional sfixed32 optional_sfixed32 = 9;</code>
-     */
-    public function getOptionalSfixed32()
-    {
-        return $this->optional_sfixed32;
-    }
-
-    /**
-     * <code>optional sfixed32 optional_sfixed32 = 9;</code>
-     */
-    public function setOptionalSfixed32($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->optional_sfixed32 = $var;
-    }
-
-    /**
-     * <code>optional sfixed64 optional_sfixed64 = 10;</code>
-     */
-    public function getOptionalSfixed64()
-    {
-        return $this->optional_sfixed64;
-    }
-
-    /**
-     * <code>optional sfixed64 optional_sfixed64 = 10;</code>
-     */
-    public function setOptionalSfixed64($var)
-    {
-        GPBUtil::checkInt64($var);
-        $this->optional_sfixed64 = $var;
-    }
-
-    /**
-     * <code>optional float optional_float = 11;</code>
-     */
-    public function getOptionalFloat()
-    {
-        return $this->optional_float;
-    }
-
-    /**
-     * <code>optional float optional_float = 11;</code>
-     */
-    public function setOptionalFloat($var)
-    {
-        GPBUtil::checkFloat($var);
-        $this->optional_float = $var;
-    }
-
-    /**
-     * <code>optional double optional_double = 12;</code>
-     */
-    public function getOptionalDouble()
-    {
-        return $this->optional_double;
-    }
-
-    /**
-     * <code>optional double optional_double = 12;</code>
-     */
-    public function setOptionalDouble($var)
-    {
-        GPBUtil::checkDouble($var);
-        $this->optional_double = $var;
-    }
-
-    /**
-     * <code>optional bool optional_bool = 13;</code>
-     */
-    public function getOptionalBool()
-    {
-        return $this->optional_bool;
-    }
-
-    /**
-     * <code>optional bool optional_bool = 13;</code>
-     */
-    public function setOptionalBool($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->optional_bool = $var;
-    }
-
-    /**
-     * <code>optional string optional_string = 14;</code>
-     */
-    public function getOptionalString()
-    {
-        return $this->optional_string;
-    }
-
-    /**
-     * <code>optional string optional_string = 14;</code>
-     */
-    public function setOptionalString($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->optional_string = $var;
-    }
-
-    /**
-     * <code>optional bytes optional_bytes = 15;</code>
-     */
-    public function getOptionalBytes()
-    {
-        return $this->optional_bytes;
-    }
-
-    /**
-     * <code>optional bytes optional_bytes = 15;</code>
-     */
-    public function setOptionalBytes($var)
-    {
-        GPBUtil::checkString($var, False);
-        $this->optional_bytes = $var;
-    }
-
-    /**
-     * <code>optional .foo.TestEnum optional_enum = 16;</code>
-     */
-    public function getOptionalEnum()
-    {
-        return $this->optional_enum;
-    }
-
-    /**
-     * <code>optional .foo.TestEnum optional_enum = 16;</code>
-     */
-    public function setOptionalEnum($var)
-    {
-        GPBUtil::checkEnum($var, \Foo\TestEnum::class);
-        $this->optional_enum = $var;
-    }
-
-    /**
-     * <code>optional .foo.TestMessage.Sub optional_message = 17;</code>
-     */
-    public function getOptionalMessage()
-    {
-        return $this->optional_message;
-    }
-
-    /**
-     * <code>optional .foo.TestMessage.Sub optional_message = 17;</code>
-     */
-    public function setOptionalMessage(&$var)
-    {
-        GPBUtil::checkMessage($var, \Foo\TestMessage_Sub::class);
-        $this->optional_message = $var;
-    }
-
-    /**
-     * <code>optional .bar.TestInclude optional_included_message = 18;</code>
-     */
-    public function getOptionalIncludedMessage()
-    {
-        return $this->optional_included_message;
-    }
-
-    /**
-     * <code>optional .bar.TestInclude optional_included_message = 18;</code>
-     */
-    public function setOptionalIncludedMessage(&$var)
-    {
-        GPBUtil::checkMessage($var, \Bar\TestInclude::class);
-        $this->optional_included_message = $var;
-    }
-
-    /**
-     * <code>optional .foo.TestMessage recursive = 19;</code>
-     */
-    public function getRecursive()
-    {
-        return $this->recursive;
-    }
-
-    /**
-     * <code>optional .foo.TestMessage recursive = 19;</code>
-     */
-    public function setRecursive(&$var)
-    {
-        GPBUtil::checkMessage($var, \Foo\TestMessage::class);
-        $this->recursive = $var;
-    }
-
-    /**
-     * <pre>
-     * Repeated
-     * </pre>
-     *
-     * <code>repeated int32 repeated_int32 = 31;</code>
-     */
-    public function getRepeatedInt32()
-    {
-        return $this->repeated_int32;
-    }
-
-    /**
-     * <pre>
-     * Repeated
-     * </pre>
-     *
-     * <code>repeated int32 repeated_int32 = 31;</code>
-     */
-    public function setRepeatedInt32(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::INT32);
-        $this->repeated_int32 = $var;
-    }
-
-    /**
-     * <code>repeated int64 repeated_int64 = 32;</code>
-     */
-    public function getRepeatedInt64()
-    {
-        return $this->repeated_int64;
-    }
-
-    /**
-     * <code>repeated int64 repeated_int64 = 32;</code>
-     */
-    public function setRepeatedInt64(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::INT64);
-        $this->repeated_int64 = $var;
-    }
-
-    /**
-     * <code>repeated uint32 repeated_uint32 = 33;</code>
-     */
-    public function getRepeatedUint32()
-    {
-        return $this->repeated_uint32;
-    }
-
-    /**
-     * <code>repeated uint32 repeated_uint32 = 33;</code>
-     */
-    public function setRepeatedUint32(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::UINT32);
-        $this->repeated_uint32 = $var;
-    }
-
-    /**
-     * <code>repeated uint64 repeated_uint64 = 34;</code>
-     */
-    public function getRepeatedUint64()
-    {
-        return $this->repeated_uint64;
-    }
-
-    /**
-     * <code>repeated uint64 repeated_uint64 = 34;</code>
-     */
-    public function setRepeatedUint64(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::UINT64);
-        $this->repeated_uint64 = $var;
-    }
-
-    /**
-     * <code>repeated sint32 repeated_sint32 = 35;</code>
-     */
-    public function getRepeatedSint32()
-    {
-        return $this->repeated_sint32;
-    }
-
-    /**
-     * <code>repeated sint32 repeated_sint32 = 35;</code>
-     */
-    public function setRepeatedSint32(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::SINT32);
-        $this->repeated_sint32 = $var;
-    }
-
-    /**
-     * <code>repeated sint64 repeated_sint64 = 36;</code>
-     */
-    public function getRepeatedSint64()
-    {
-        return $this->repeated_sint64;
-    }
-
-    /**
-     * <code>repeated sint64 repeated_sint64 = 36;</code>
-     */
-    public function setRepeatedSint64(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::SINT64);
-        $this->repeated_sint64 = $var;
-    }
-
-    /**
-     * <code>repeated fixed32 repeated_fixed32 = 37;</code>
-     */
-    public function getRepeatedFixed32()
-    {
-        return $this->repeated_fixed32;
-    }
-
-    /**
-     * <code>repeated fixed32 repeated_fixed32 = 37;</code>
-     */
-    public function setRepeatedFixed32(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::FIXED32);
-        $this->repeated_fixed32 = $var;
-    }
-
-    /**
-     * <code>repeated fixed64 repeated_fixed64 = 38;</code>
-     */
-    public function getRepeatedFixed64()
-    {
-        return $this->repeated_fixed64;
-    }
-
-    /**
-     * <code>repeated fixed64 repeated_fixed64 = 38;</code>
-     */
-    public function setRepeatedFixed64(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::FIXED64);
-        $this->repeated_fixed64 = $var;
-    }
-
-    /**
-     * <code>repeated sfixed32 repeated_sfixed32 = 39;</code>
-     */
-    public function getRepeatedSfixed32()
-    {
-        return $this->repeated_sfixed32;
-    }
-
-    /**
-     * <code>repeated sfixed32 repeated_sfixed32 = 39;</code>
-     */
-    public function setRepeatedSfixed32(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::SFIXED32);
-        $this->repeated_sfixed32 = $var;
-    }
-
-    /**
-     * <code>repeated sfixed64 repeated_sfixed64 = 40;</code>
-     */
-    public function getRepeatedSfixed64()
-    {
-        return $this->repeated_sfixed64;
-    }
-
-    /**
-     * <code>repeated sfixed64 repeated_sfixed64 = 40;</code>
-     */
-    public function setRepeatedSfixed64(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::SFIXED64);
-        $this->repeated_sfixed64 = $var;
-    }
-
-    /**
-     * <code>repeated float repeated_float = 41;</code>
-     */
-    public function getRepeatedFloat()
-    {
-        return $this->repeated_float;
-    }
-
-    /**
-     * <code>repeated float repeated_float = 41;</code>
-     */
-    public function setRepeatedFloat(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::FLOAT);
-        $this->repeated_float = $var;
-    }
-
-    /**
-     * <code>repeated double repeated_double = 42;</code>
-     */
-    public function getRepeatedDouble()
-    {
-        return $this->repeated_double;
-    }
-
-    /**
-     * <code>repeated double repeated_double = 42;</code>
-     */
-    public function setRepeatedDouble(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::DOUBLE);
-        $this->repeated_double = $var;
-    }
-
-    /**
-     * <code>repeated bool repeated_bool = 43;</code>
-     */
-    public function getRepeatedBool()
-    {
-        return $this->repeated_bool;
-    }
-
-    /**
-     * <code>repeated bool repeated_bool = 43;</code>
-     */
-    public function setRepeatedBool(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::BOOL);
-        $this->repeated_bool = $var;
-    }
-
-    /**
-     * <code>repeated string repeated_string = 44;</code>
-     */
-    public function getRepeatedString()
-    {
-        return $this->repeated_string;
-    }
-
-    /**
-     * <code>repeated string repeated_string = 44;</code>
-     */
-    public function setRepeatedString(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::STRING);
-        $this->repeated_string = $var;
-    }
-
-    /**
-     * <code>repeated bytes repeated_bytes = 45;</code>
-     */
-    public function getRepeatedBytes()
-    {
-        return $this->repeated_bytes;
-    }
-
-    /**
-     * <code>repeated bytes repeated_bytes = 45;</code>
-     */
-    public function setRepeatedBytes(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::BYTES);
-        $this->repeated_bytes = $var;
-    }
-
-    /**
-     * <code>repeated .foo.TestEnum repeated_enum = 46;</code>
-     */
-    public function getRepeatedEnum()
-    {
-        return $this->repeated_enum;
-    }
-
-    /**
-     * <code>repeated .foo.TestEnum repeated_enum = 46;</code>
-     */
-    public function setRepeatedEnum(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::ENUM, Foo\TestEnum::class);
-        $this->repeated_enum = $var;
-    }
-
-    /**
-     * <code>repeated .foo.TestMessage.Sub repeated_message = 47;</code>
-     */
-    public function getRepeatedMessage()
-    {
-        return $this->repeated_message;
-    }
-
-    /**
-     * <code>repeated .foo.TestMessage.Sub repeated_message = 47;</code>
-     */
-    public function setRepeatedMessage(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Foo\TestMessage_Sub::class);
-        $this->repeated_message = $var;
-    }
-
-    /**
-     * <code>repeated .foo.TestMessage repeated_recursive = 48;</code>
-     */
-    public function getRepeatedRecursive()
-    {
-        return $this->repeated_recursive;
-    }
-
-    /**
-     * <code>repeated .foo.TestMessage repeated_recursive = 48;</code>
-     */
-    public function setRepeatedRecursive(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::MESSAGE, \Foo\TestMessage::class);
-        $this->repeated_recursive = $var;
-    }
-
-    /**
-     * <code>optional int32 oneof_int32 = 51;</code>
-     */
-    public function getOneofInt32()
-    {
-        return $this->readOneof(51);
-    }
-
-    /**
-     * <code>optional int32 oneof_int32 = 51;</code>
-     */
-    public function setOneofInt32($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->writeOneof(51, $var);
-    }
-
-    /**
-     * <code>optional int64 oneof_int64 = 52;</code>
-     */
-    public function getOneofInt64()
-    {
-        return $this->readOneof(52);
-    }
-
-    /**
-     * <code>optional int64 oneof_int64 = 52;</code>
-     */
-    public function setOneofInt64($var)
-    {
-        GPBUtil::checkInt64($var);
-        $this->writeOneof(52, $var);
-    }
-
-    /**
-     * <code>optional uint32 oneof_uint32 = 53;</code>
-     */
-    public function getOneofUint32()
-    {
-        return $this->readOneof(53);
-    }
-
-    /**
-     * <code>optional uint32 oneof_uint32 = 53;</code>
-     */
-    public function setOneofUint32($var)
-    {
-        GPBUtil::checkUint32($var);
-        $this->writeOneof(53, $var);
-    }
-
-    /**
-     * <code>optional uint64 oneof_uint64 = 54;</code>
-     */
-    public function getOneofUint64()
-    {
-        return $this->readOneof(54);
-    }
-
-    /**
-     * <code>optional uint64 oneof_uint64 = 54;</code>
-     */
-    public function setOneofUint64($var)
-    {
-        GPBUtil::checkUint64($var);
-        $this->writeOneof(54, $var);
-    }
-
-    /**
-     * <code>optional uint32 oneof_sint32 = 55;</code>
-     */
-    public function getOneofSint32()
-    {
-        return $this->readOneof(55);
-    }
-
-    /**
-     * <code>optional uint32 oneof_sint32 = 55;</code>
-     */
-    public function setOneofSint32($var)
-    {
-        GPBUtil::checkUint32($var);
-        $this->writeOneof(55, $var);
-    }
-
-    /**
-     * <code>optional uint64 oneof_sint64 = 56;</code>
-     */
-    public function getOneofSint64()
-    {
-        return $this->readOneof(56);
-    }
-
-    /**
-     * <code>optional uint64 oneof_sint64 = 56;</code>
-     */
-    public function setOneofSint64($var)
-    {
-        GPBUtil::checkUint64($var);
-        $this->writeOneof(56, $var);
-    }
-
-    /**
-     * <code>optional uint32 oneof_fixed32 = 57;</code>
-     */
-    public function getOneofFixed32()
-    {
-        return $this->readOneof(57);
-    }
-
-    /**
-     * <code>optional uint32 oneof_fixed32 = 57;</code>
-     */
-    public function setOneofFixed32($var)
-    {
-        GPBUtil::checkUint32($var);
-        $this->writeOneof(57, $var);
-    }
-
-    /**
-     * <code>optional uint64 oneof_fixed64 = 58;</code>
-     */
-    public function getOneofFixed64()
-    {
-        return $this->readOneof(58);
-    }
-
-    /**
-     * <code>optional uint64 oneof_fixed64 = 58;</code>
-     */
-    public function setOneofFixed64($var)
-    {
-        GPBUtil::checkUint64($var);
-        $this->writeOneof(58, $var);
-    }
-
-    /**
-     * <code>optional uint32 oneof_sfixed32 = 59;</code>
-     */
-    public function getOneofSfixed32()
-    {
-        return $this->readOneof(59);
-    }
-
-    /**
-     * <code>optional uint32 oneof_sfixed32 = 59;</code>
-     */
-    public function setOneofSfixed32($var)
-    {
-        GPBUtil::checkUint32($var);
-        $this->writeOneof(59, $var);
-    }
-
-    /**
-     * <code>optional uint64 oneof_sfixed64 = 60;</code>
-     */
-    public function getOneofSfixed64()
-    {
-        return $this->readOneof(60);
-    }
-
-    /**
-     * <code>optional uint64 oneof_sfixed64 = 60;</code>
-     */
-    public function setOneofSfixed64($var)
-    {
-        GPBUtil::checkUint64($var);
-        $this->writeOneof(60, $var);
-    }
-
-    /**
-     * <code>optional double oneof_double = 61;</code>
-     */
-    public function getOneofDouble()
-    {
-        return $this->readOneof(61);
-    }
-
-    /**
-     * <code>optional double oneof_double = 61;</code>
-     */
-    public function setOneofDouble($var)
-    {
-        GPBUtil::checkDouble($var);
-        $this->writeOneof(61, $var);
-    }
-
-    /**
-     * <code>optional float oneof_float = 62;</code>
-     */
-    public function getOneofFloat()
-    {
-        return $this->readOneof(62);
-    }
-
-    /**
-     * <code>optional float oneof_float = 62;</code>
-     */
-    public function setOneofFloat($var)
-    {
-        GPBUtil::checkFloat($var);
-        $this->writeOneof(62, $var);
-    }
-
-    /**
-     * <code>optional bool oneof_bool = 63;</code>
-     */
-    public function getOneofBool()
-    {
-        return $this->readOneof(63);
-    }
-
-    /**
-     * <code>optional bool oneof_bool = 63;</code>
-     */
-    public function setOneofBool($var)
-    {
-        GPBUtil::checkBool($var);
-        $this->writeOneof(63, $var);
-    }
-
-    /**
-     * <code>optional string oneof_string = 64;</code>
-     */
-    public function getOneofString()
-    {
-        return $this->readOneof(64);
-    }
-
-    /**
-     * <code>optional string oneof_string = 64;</code>
-     */
-    public function setOneofString($var)
-    {
-        GPBUtil::checkString($var, True);
-        $this->writeOneof(64, $var);
-    }
-
-    /**
-     * <code>optional bytes oneof_bytes = 65;</code>
-     */
-    public function getOneofBytes()
-    {
-        return $this->readOneof(65);
-    }
-
-    /**
-     * <code>optional bytes oneof_bytes = 65;</code>
-     */
-    public function setOneofBytes($var)
-    {
-        GPBUtil::checkString($var, False);
-        $this->writeOneof(65, $var);
-    }
-
-    /**
-     * <code>optional .foo.TestEnum oneof_enum = 66;</code>
-     */
-    public function getOneofEnum()
-    {
-        return $this->readOneof(66);
-    }
-
-    /**
-     * <code>optional .foo.TestEnum oneof_enum = 66;</code>
-     */
-    public function setOneofEnum($var)
-    {
-        GPBUtil::checkEnum($var, \Foo\TestEnum::class);
-        $this->writeOneof(66, $var);
-    }
-
-    /**
-     * <code>optional .foo.TestMessage.Sub oneof_message = 67;</code>
-     */
-    public function getOneofMessage()
-    {
-        return $this->readOneof(67);
-    }
-
-    /**
-     * <code>optional .foo.TestMessage.Sub oneof_message = 67;</code>
-     */
-    public function setOneofMessage(&$var)
-    {
-        GPBUtil::checkMessage($var, \Foo\TestMessage_Sub::class);
-        $this->writeOneof(67, $var);
-    }
-
-    /**
-     * <code>map&lt;int32, int32&gt; map_int32_int32 = 71;</code>
-     */
-    public function getMapInt32Int32()
-    {
-        return $this->map_int32_int32;
-    }
-
-    /**
-     * <code>map&lt;int32, int32&gt; map_int32_int32 = 71;</code>
-     */
-    public function setMapInt32Int32(&$var)
-    {
-        $this->map_int32_int32 = $var;
-    }
-
-    /**
-     * <code>map&lt;int64, int64&gt; map_int64_int64 = 72;</code>
-     */
-    public function getMapInt64Int64()
-    {
-        return $this->map_int64_int64;
-    }
-
-    /**
-     * <code>map&lt;int64, int64&gt; map_int64_int64 = 72;</code>
-     */
-    public function setMapInt64Int64(&$var)
-    {
-        $this->map_int64_int64 = $var;
-    }
-
-    /**
-     * <code>map&lt;uint32, uint32&gt; map_uint32_uint32 = 73;</code>
-     */
-    public function getMapUint32Uint32()
-    {
-        return $this->map_uint32_uint32;
-    }
-
-    /**
-     * <code>map&lt;uint32, uint32&gt; map_uint32_uint32 = 73;</code>
-     */
-    public function setMapUint32Uint32(&$var)
-    {
-        $this->map_uint32_uint32 = $var;
-    }
-
-    /**
-     * <code>map&lt;uint64, uint64&gt; map_uint64_uint64 = 74;</code>
-     */
-    public function getMapUint64Uint64()
-    {
-        return $this->map_uint64_uint64;
-    }
-
-    /**
-     * <code>map&lt;uint64, uint64&gt; map_uint64_uint64 = 74;</code>
-     */
-    public function setMapUint64Uint64(&$var)
-    {
-        $this->map_uint64_uint64 = $var;
-    }
-
-    /**
-     * <code>map&lt;sint32, sint32&gt; map_sint32_sint32 = 75;</code>
-     */
-    public function getMapSint32Sint32()
-    {
-        return $this->map_sint32_sint32;
-    }
-
-    /**
-     * <code>map&lt;sint32, sint32&gt; map_sint32_sint32 = 75;</code>
-     */
-    public function setMapSint32Sint32(&$var)
-    {
-        $this->map_sint32_sint32 = $var;
-    }
-
-    /**
-     * <code>map&lt;sint64, sint64&gt; map_sint64_sint64 = 76;</code>
-     */
-    public function getMapSint64Sint64()
-    {
-        return $this->map_sint64_sint64;
-    }
-
-    /**
-     * <code>map&lt;sint64, sint64&gt; map_sint64_sint64 = 76;</code>
-     */
-    public function setMapSint64Sint64(&$var)
-    {
-        $this->map_sint64_sint64 = $var;
-    }
-
-    /**
-     * <code>map&lt;fixed32, fixed32&gt; map_fixed32_fixed32 = 77;</code>
-     */
-    public function getMapFixed32Fixed32()
-    {
-        return $this->map_fixed32_fixed32;
-    }
-
-    /**
-     * <code>map&lt;fixed32, fixed32&gt; map_fixed32_fixed32 = 77;</code>
-     */
-    public function setMapFixed32Fixed32(&$var)
-    {
-        $this->map_fixed32_fixed32 = $var;
-    }
-
-    /**
-     * <code>map&lt;fixed64, fixed64&gt; map_fixed64_fixed64 = 78;</code>
-     */
-    public function getMapFixed64Fixed64()
-    {
-        return $this->map_fixed64_fixed64;
-    }
-
-    /**
-     * <code>map&lt;fixed64, fixed64&gt; map_fixed64_fixed64 = 78;</code>
-     */
-    public function setMapFixed64Fixed64(&$var)
-    {
-        $this->map_fixed64_fixed64 = $var;
-    }
-
-    /**
-     * <code>map&lt;sfixed32, sfixed32&gt; map_sfixed32_sfixed32 = 79;</code>
-     */
-    public function getMapSfixed32Sfixed32()
-    {
-        return $this->map_sfixed32_sfixed32;
-    }
-
-    /**
-     * <code>map&lt;sfixed32, sfixed32&gt; map_sfixed32_sfixed32 = 79;</code>
-     */
-    public function setMapSfixed32Sfixed32(&$var)
-    {
-        $this->map_sfixed32_sfixed32 = $var;
-    }
-
-    /**
-     * <code>map&lt;sfixed64, sfixed64&gt; map_sfixed64_sfixed64 = 80;</code>
-     */
-    public function getMapSfixed64Sfixed64()
-    {
-        return $this->map_sfixed64_sfixed64;
-    }
-
-    /**
-     * <code>map&lt;sfixed64, sfixed64&gt; map_sfixed64_sfixed64 = 80;</code>
-     */
-    public function setMapSfixed64Sfixed64(&$var)
-    {
-        $this->map_sfixed64_sfixed64 = $var;
-    }
-
-    /**
-     * <code>map&lt;int32, float&gt; map_int32_float = 81;</code>
-     */
-    public function getMapInt32Float()
-    {
-        return $this->map_int32_float;
-    }
-
-    /**
-     * <code>map&lt;int32, float&gt; map_int32_float = 81;</code>
-     */
-    public function setMapInt32Float(&$var)
-    {
-        $this->map_int32_float = $var;
-    }
-
-    /**
-     * <code>map&lt;int32, double&gt; map_int32_double = 82;</code>
-     */
-    public function getMapInt32Double()
-    {
-        return $this->map_int32_double;
-    }
-
-    /**
-     * <code>map&lt;int32, double&gt; map_int32_double = 82;</code>
-     */
-    public function setMapInt32Double(&$var)
-    {
-        $this->map_int32_double = $var;
-    }
-
-    /**
-     * <code>map&lt;bool, bool&gt; map_bool_bool = 83;</code>
-     */
-    public function getMapBoolBool()
-    {
-        return $this->map_bool_bool;
-    }
-
-    /**
-     * <code>map&lt;bool, bool&gt; map_bool_bool = 83;</code>
-     */
-    public function setMapBoolBool(&$var)
-    {
-        $this->map_bool_bool = $var;
-    }
-
-    /**
-     * <code>map&lt;string, string&gt; map_string_string = 84;</code>
-     */
-    public function getMapStringString()
-    {
-        return $this->map_string_string;
-    }
-
-    /**
-     * <code>map&lt;string, string&gt; map_string_string = 84;</code>
-     */
-    public function setMapStringString(&$var)
-    {
-        $this->map_string_string = $var;
-    }
-
-    /**
-     * <code>map&lt;int32, bytes&gt; map_int32_bytes = 85;</code>
-     */
-    public function getMapInt32Bytes()
-    {
-        return $this->map_int32_bytes;
-    }
-
-    /**
-     * <code>map&lt;int32, bytes&gt; map_int32_bytes = 85;</code>
-     */
-    public function setMapInt32Bytes(&$var)
-    {
-        $this->map_int32_bytes = $var;
-    }
-
-    /**
-     * <code>map&lt;int32, .foo.TestEnum&gt; map_int32_enum = 86;</code>
-     */
-    public function getMapInt32Enum()
-    {
-        return $this->map_int32_enum;
-    }
-
-    /**
-     * <code>map&lt;int32, .foo.TestEnum&gt; map_int32_enum = 86;</code>
-     */
-    public function setMapInt32Enum(&$var)
-    {
-        $this->map_int32_enum = $var;
-    }
-
-    /**
-     * <code>map&lt;int32, .foo.TestMessage.Sub&gt; map_int32_message = 87;</code>
-     */
-    public function getMapInt32Message()
-    {
-        return $this->map_int32_message;
-    }
-
-    /**
-     * <code>map&lt;int32, .foo.TestMessage.Sub&gt; map_int32_message = 87;</code>
-     */
-    public function setMapInt32Message(&$var)
-    {
-        $this->map_int32_message = $var;
-    }
-
-    /**
-     * <code>map&lt;int32, .foo.TestMessage&gt; map_recursive = 88;</code>
-     */
-    public function getMapRecursive()
-    {
-        return $this->map_recursive;
-    }
-
-    /**
-     * <code>map&lt;int32, .foo.TestMessage&gt; map_recursive = 88;</code>
-     */
-    public function setMapRecursive(&$var)
-    {
-        $this->map_recursive = $var;
-    }
-
-    public function getMyOneof()
-    {
-        return $this->my_oneof;
-    }
-
-}
-
-/**
- * Protobuf type <code>foo.TestMessage.Sub</code>
- */
-class TestMessage_Sub extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * <code>optional int32 a = 1;</code>
-     */
-    private $a = 0;
-
-    /**
-     * <code>optional int32 a = 1;</code>
-     */
-    public function getA()
-    {
-        return $this->a;
-    }
-
-    /**
-     * <code>optional int32 a = 1;</code>
-     */
-    public function setA($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->a = $var;
-    }
-
-}
-
-/**
- * Protobuf type <code>foo.TestPackedMessage</code>
- */
-class TestPackedMessage extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * <code>repeated int32 repeated_int32 = 90 [packed = true];</code>
-     */
-    private $repeated_int32;
-    /**
-     * <code>repeated int64 repeated_int64 = 91 [packed = true];</code>
-     */
-    private $repeated_int64;
-    /**
-     * <code>repeated uint32 repeated_uint32 = 92 [packed = true];</code>
-     */
-    private $repeated_uint32;
-    /**
-     * <code>repeated uint64 repeated_uint64 = 93 [packed = true];</code>
-     */
-    private $repeated_uint64;
-    /**
-     * <code>repeated sint32 repeated_sint32 = 94 [packed = true];</code>
-     */
-    private $repeated_sint32;
-    /**
-     * <code>repeated sint64 repeated_sint64 = 95 [packed = true];</code>
-     */
-    private $repeated_sint64;
-    /**
-     * <code>repeated fixed32 repeated_fixed32 = 96 [packed = true];</code>
-     */
-    private $repeated_fixed32;
-    /**
-     * <code>repeated fixed64 repeated_fixed64 = 97 [packed = true];</code>
-     */
-    private $repeated_fixed64;
-    /**
-     * <code>repeated sfixed32 repeated_sfixed32 = 98 [packed = true];</code>
-     */
-    private $repeated_sfixed32;
-    /**
-     * <code>repeated sfixed64 repeated_sfixed64 = 99 [packed = true];</code>
-     */
-    private $repeated_sfixed64;
-    /**
-     * <code>repeated float repeated_float = 100 [packed = true];</code>
-     */
-    private $repeated_float;
-    /**
-     * <code>repeated double repeated_double = 101 [packed = true];</code>
-     */
-    private $repeated_double;
-    /**
-     * <code>repeated bool repeated_bool = 102 [packed = true];</code>
-     */
-    private $repeated_bool;
-    /**
-     * <code>repeated .foo.TestEnum repeated_enum = 103 [packed = true];</code>
-     */
-    private $repeated_enum;
-
-    /**
-     * <code>repeated int32 repeated_int32 = 90 [packed = true];</code>
-     */
-    public function getRepeatedInt32()
-    {
-        return $this->repeated_int32;
-    }
-
-    /**
-     * <code>repeated int32 repeated_int32 = 90 [packed = true];</code>
-     */
-    public function setRepeatedInt32(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::INT32);
-        $this->repeated_int32 = $var;
-    }
-
-    /**
-     * <code>repeated int64 repeated_int64 = 91 [packed = true];</code>
-     */
-    public function getRepeatedInt64()
-    {
-        return $this->repeated_int64;
-    }
-
-    /**
-     * <code>repeated int64 repeated_int64 = 91 [packed = true];</code>
-     */
-    public function setRepeatedInt64(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::INT64);
-        $this->repeated_int64 = $var;
-    }
-
-    /**
-     * <code>repeated uint32 repeated_uint32 = 92 [packed = true];</code>
-     */
-    public function getRepeatedUint32()
-    {
-        return $this->repeated_uint32;
-    }
-
-    /**
-     * <code>repeated uint32 repeated_uint32 = 92 [packed = true];</code>
-     */
-    public function setRepeatedUint32(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::UINT32);
-        $this->repeated_uint32 = $var;
-    }
-
-    /**
-     * <code>repeated uint64 repeated_uint64 = 93 [packed = true];</code>
-     */
-    public function getRepeatedUint64()
-    {
-        return $this->repeated_uint64;
-    }
-
-    /**
-     * <code>repeated uint64 repeated_uint64 = 93 [packed = true];</code>
-     */
-    public function setRepeatedUint64(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::UINT64);
-        $this->repeated_uint64 = $var;
-    }
-
-    /**
-     * <code>repeated sint32 repeated_sint32 = 94 [packed = true];</code>
-     */
-    public function getRepeatedSint32()
-    {
-        return $this->repeated_sint32;
-    }
-
-    /**
-     * <code>repeated sint32 repeated_sint32 = 94 [packed = true];</code>
-     */
-    public function setRepeatedSint32(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::SINT32);
-        $this->repeated_sint32 = $var;
-    }
-
-    /**
-     * <code>repeated sint64 repeated_sint64 = 95 [packed = true];</code>
-     */
-    public function getRepeatedSint64()
-    {
-        return $this->repeated_sint64;
-    }
-
-    /**
-     * <code>repeated sint64 repeated_sint64 = 95 [packed = true];</code>
-     */
-    public function setRepeatedSint64(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::SINT64);
-        $this->repeated_sint64 = $var;
-    }
-
-    /**
-     * <code>repeated fixed32 repeated_fixed32 = 96 [packed = true];</code>
-     */
-    public function getRepeatedFixed32()
-    {
-        return $this->repeated_fixed32;
-    }
-
-    /**
-     * <code>repeated fixed32 repeated_fixed32 = 96 [packed = true];</code>
-     */
-    public function setRepeatedFixed32(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::FIXED32);
-        $this->repeated_fixed32 = $var;
-    }
-
-    /**
-     * <code>repeated fixed64 repeated_fixed64 = 97 [packed = true];</code>
-     */
-    public function getRepeatedFixed64()
-    {
-        return $this->repeated_fixed64;
-    }
-
-    /**
-     * <code>repeated fixed64 repeated_fixed64 = 97 [packed = true];</code>
-     */
-    public function setRepeatedFixed64(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::FIXED64);
-        $this->repeated_fixed64 = $var;
-    }
-
-    /**
-     * <code>repeated sfixed32 repeated_sfixed32 = 98 [packed = true];</code>
-     */
-    public function getRepeatedSfixed32()
-    {
-        return $this->repeated_sfixed32;
-    }
-
-    /**
-     * <code>repeated sfixed32 repeated_sfixed32 = 98 [packed = true];</code>
-     */
-    public function setRepeatedSfixed32(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::SFIXED32);
-        $this->repeated_sfixed32 = $var;
-    }
-
-    /**
-     * <code>repeated sfixed64 repeated_sfixed64 = 99 [packed = true];</code>
-     */
-    public function getRepeatedSfixed64()
-    {
-        return $this->repeated_sfixed64;
-    }
-
-    /**
-     * <code>repeated sfixed64 repeated_sfixed64 = 99 [packed = true];</code>
-     */
-    public function setRepeatedSfixed64(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::SFIXED64);
-        $this->repeated_sfixed64 = $var;
-    }
-
-    /**
-     * <code>repeated float repeated_float = 100 [packed = true];</code>
-     */
-    public function getRepeatedFloat()
-    {
-        return $this->repeated_float;
-    }
-
-    /**
-     * <code>repeated float repeated_float = 100 [packed = true];</code>
-     */
-    public function setRepeatedFloat(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::FLOAT);
-        $this->repeated_float = $var;
-    }
-
-    /**
-     * <code>repeated double repeated_double = 101 [packed = true];</code>
-     */
-    public function getRepeatedDouble()
-    {
-        return $this->repeated_double;
-    }
-
-    /**
-     * <code>repeated double repeated_double = 101 [packed = true];</code>
-     */
-    public function setRepeatedDouble(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::DOUBLE);
-        $this->repeated_double = $var;
-    }
-
-    /**
-     * <code>repeated bool repeated_bool = 102 [packed = true];</code>
-     */
-    public function getRepeatedBool()
-    {
-        return $this->repeated_bool;
-    }
-
-    /**
-     * <code>repeated bool repeated_bool = 102 [packed = true];</code>
-     */
-    public function setRepeatedBool(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::BOOL);
-        $this->repeated_bool = $var;
-    }
-
-    /**
-     * <code>repeated .foo.TestEnum repeated_enum = 103 [packed = true];</code>
-     */
-    public function getRepeatedEnum()
-    {
-        return $this->repeated_enum;
-    }
-
-    /**
-     * <code>repeated .foo.TestEnum repeated_enum = 103 [packed = true];</code>
-     */
-    public function setRepeatedEnum(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::ENUM, Foo\TestEnum::class);
-        $this->repeated_enum = $var;
-    }
-
-}
-
-/**
- * <pre>
- * Need to be in sync with TestPackedMessage.
- * </pre>
- *
- * Protobuf type <code>foo.TestUnpackedMessage</code>
- */
-class TestUnpackedMessage extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * <code>repeated int32 repeated_int32 = 90 [packed = false];</code>
-     */
-    private $repeated_int32;
-    /**
-     * <code>repeated int64 repeated_int64 = 91 [packed = false];</code>
-     */
-    private $repeated_int64;
-    /**
-     * <code>repeated uint32 repeated_uint32 = 92 [packed = false];</code>
-     */
-    private $repeated_uint32;
-    /**
-     * <code>repeated uint64 repeated_uint64 = 93 [packed = false];</code>
-     */
-    private $repeated_uint64;
-    /**
-     * <code>repeated sint32 repeated_sint32 = 94 [packed = false];</code>
-     */
-    private $repeated_sint32;
-    /**
-     * <code>repeated sint64 repeated_sint64 = 95 [packed = false];</code>
-     */
-    private $repeated_sint64;
-    /**
-     * <code>repeated fixed32 repeated_fixed32 = 96 [packed = false];</code>
-     */
-    private $repeated_fixed32;
-    /**
-     * <code>repeated fixed64 repeated_fixed64 = 97 [packed = false];</code>
-     */
-    private $repeated_fixed64;
-    /**
-     * <code>repeated sfixed32 repeated_sfixed32 = 98 [packed = false];</code>
-     */
-    private $repeated_sfixed32;
-    /**
-     * <code>repeated sfixed64 repeated_sfixed64 = 99 [packed = false];</code>
-     */
-    private $repeated_sfixed64;
-    /**
-     * <code>repeated float repeated_float = 100 [packed = false];</code>
-     */
-    private $repeated_float;
-    /**
-     * <code>repeated double repeated_double = 101 [packed = false];</code>
-     */
-    private $repeated_double;
-    /**
-     * <code>repeated bool repeated_bool = 102 [packed = false];</code>
-     */
-    private $repeated_bool;
-    /**
-     * <code>repeated .foo.TestEnum repeated_enum = 103 [packed = false];</code>
-     */
-    private $repeated_enum;
-
-    /**
-     * <code>repeated int32 repeated_int32 = 90 [packed = false];</code>
-     */
-    public function getRepeatedInt32()
-    {
-        return $this->repeated_int32;
-    }
-
-    /**
-     * <code>repeated int32 repeated_int32 = 90 [packed = false];</code>
-     */
-    public function setRepeatedInt32(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::INT32);
-        $this->repeated_int32 = $var;
-    }
-
-    /**
-     * <code>repeated int64 repeated_int64 = 91 [packed = false];</code>
-     */
-    public function getRepeatedInt64()
-    {
-        return $this->repeated_int64;
-    }
-
-    /**
-     * <code>repeated int64 repeated_int64 = 91 [packed = false];</code>
-     */
-    public function setRepeatedInt64(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::INT64);
-        $this->repeated_int64 = $var;
-    }
-
-    /**
-     * <code>repeated uint32 repeated_uint32 = 92 [packed = false];</code>
-     */
-    public function getRepeatedUint32()
-    {
-        return $this->repeated_uint32;
-    }
-
-    /**
-     * <code>repeated uint32 repeated_uint32 = 92 [packed = false];</code>
-     */
-    public function setRepeatedUint32(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::UINT32);
-        $this->repeated_uint32 = $var;
-    }
-
-    /**
-     * <code>repeated uint64 repeated_uint64 = 93 [packed = false];</code>
-     */
-    public function getRepeatedUint64()
-    {
-        return $this->repeated_uint64;
-    }
-
-    /**
-     * <code>repeated uint64 repeated_uint64 = 93 [packed = false];</code>
-     */
-    public function setRepeatedUint64(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::UINT64);
-        $this->repeated_uint64 = $var;
-    }
-
-    /**
-     * <code>repeated sint32 repeated_sint32 = 94 [packed = false];</code>
-     */
-    public function getRepeatedSint32()
-    {
-        return $this->repeated_sint32;
-    }
-
-    /**
-     * <code>repeated sint32 repeated_sint32 = 94 [packed = false];</code>
-     */
-    public function setRepeatedSint32(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::SINT32);
-        $this->repeated_sint32 = $var;
-    }
-
-    /**
-     * <code>repeated sint64 repeated_sint64 = 95 [packed = false];</code>
-     */
-    public function getRepeatedSint64()
-    {
-        return $this->repeated_sint64;
-    }
-
-    /**
-     * <code>repeated sint64 repeated_sint64 = 95 [packed = false];</code>
-     */
-    public function setRepeatedSint64(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::SINT64);
-        $this->repeated_sint64 = $var;
-    }
-
-    /**
-     * <code>repeated fixed32 repeated_fixed32 = 96 [packed = false];</code>
-     */
-    public function getRepeatedFixed32()
-    {
-        return $this->repeated_fixed32;
-    }
-
-    /**
-     * <code>repeated fixed32 repeated_fixed32 = 96 [packed = false];</code>
-     */
-    public function setRepeatedFixed32(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::FIXED32);
-        $this->repeated_fixed32 = $var;
-    }
-
-    /**
-     * <code>repeated fixed64 repeated_fixed64 = 97 [packed = false];</code>
-     */
-    public function getRepeatedFixed64()
-    {
-        return $this->repeated_fixed64;
-    }
-
-    /**
-     * <code>repeated fixed64 repeated_fixed64 = 97 [packed = false];</code>
-     */
-    public function setRepeatedFixed64(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::FIXED64);
-        $this->repeated_fixed64 = $var;
-    }
-
-    /**
-     * <code>repeated sfixed32 repeated_sfixed32 = 98 [packed = false];</code>
-     */
-    public function getRepeatedSfixed32()
-    {
-        return $this->repeated_sfixed32;
-    }
-
-    /**
-     * <code>repeated sfixed32 repeated_sfixed32 = 98 [packed = false];</code>
-     */
-    public function setRepeatedSfixed32(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::SFIXED32);
-        $this->repeated_sfixed32 = $var;
-    }
-
-    /**
-     * <code>repeated sfixed64 repeated_sfixed64 = 99 [packed = false];</code>
-     */
-    public function getRepeatedSfixed64()
-    {
-        return $this->repeated_sfixed64;
-    }
-
-    /**
-     * <code>repeated sfixed64 repeated_sfixed64 = 99 [packed = false];</code>
-     */
-    public function setRepeatedSfixed64(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::SFIXED64);
-        $this->repeated_sfixed64 = $var;
-    }
-
-    /**
-     * <code>repeated float repeated_float = 100 [packed = false];</code>
-     */
-    public function getRepeatedFloat()
-    {
-        return $this->repeated_float;
-    }
-
-    /**
-     * <code>repeated float repeated_float = 100 [packed = false];</code>
-     */
-    public function setRepeatedFloat(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::FLOAT);
-        $this->repeated_float = $var;
-    }
-
-    /**
-     * <code>repeated double repeated_double = 101 [packed = false];</code>
-     */
-    public function getRepeatedDouble()
-    {
-        return $this->repeated_double;
-    }
-
-    /**
-     * <code>repeated double repeated_double = 101 [packed = false];</code>
-     */
-    public function setRepeatedDouble(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::DOUBLE);
-        $this->repeated_double = $var;
-    }
-
-    /**
-     * <code>repeated bool repeated_bool = 102 [packed = false];</code>
-     */
-    public function getRepeatedBool()
-    {
-        return $this->repeated_bool;
-    }
-
-    /**
-     * <code>repeated bool repeated_bool = 102 [packed = false];</code>
-     */
-    public function setRepeatedBool(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::BOOL);
-        $this->repeated_bool = $var;
-    }
-
-    /**
-     * <code>repeated .foo.TestEnum repeated_enum = 103 [packed = false];</code>
-     */
-    public function getRepeatedEnum()
-    {
-        return $this->repeated_enum;
-    }
-
-    /**
-     * <code>repeated .foo.TestEnum repeated_enum = 103 [packed = false];</code>
-     */
-    public function setRepeatedEnum(&$var)
-    {
-        GPBUtil::checkRepeatedField($var, GPBType::ENUM, Foo\TestEnum::class);
-        $this->repeated_enum = $var;
-    }
-
-}
-
-/**
- * <pre>
- * /&#42;*&#47;&#64;&lt;&gt;&amp;&#92;{
- * </pre>
- *
- * Protobuf type <code>foo.TestPhpDoc</code>
- */
-class TestPhpDoc extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * <code>optional int32 a = 1;</code>
-     */
-    private $a = 0;
-
-    /**
-     * <code>optional int32 a = 1;</code>
-     */
-    public function getA()
-    {
-        return $this->a;
-    }
-
-    /**
-     * <code>optional int32 a = 1;</code>
-     */
-    public function setA($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->a = $var;
-    }
-
-}
-
-/**
- * Protobuf enum <code>foo.TestEnum</code>
- */
-class TestEnum
-{
-    /**
-     * <code>ZERO = 0;</code>
-     */
-    const ZERO = 0;
-    /**
-     * <code>ONE = 1;</code>
-     */
-    const ONE = 1;
-}
-
-$pool = DescriptorPool::getGeneratedPool();
-
-$pool->internalAddGeneratedFile(hex2bin(
-    "0a9c250a0a746573742e70726f746f1203666f6f1a12746573745f696e63" .
-    "6c7564652e70726f746f22be1d0a0b546573744d65737361676512160a0e" .
-    "6f7074696f6e616c5f696e74333218012001280512160a0e6f7074696f6e" .
-    "616c5f696e74363418022001280312170a0f6f7074696f6e616c5f75696e" .
-    "74333218032001280d12170a0f6f7074696f6e616c5f75696e7436341804" .
-    "2001280412170a0f6f7074696f6e616c5f73696e74333218052001281112" .
-    "170a0f6f7074696f6e616c5f73696e74363418062001281212180a106f70" .
-    "74696f6e616c5f6669786564333218072001280712180a106f7074696f6e" .
-    "616c5f6669786564363418082001280612190a116f7074696f6e616c5f73" .
-    "6669786564333218092001280f12190a116f7074696f6e616c5f73666978" .
-    "65643634180a2001281012160a0e6f7074696f6e616c5f666c6f6174180b" .
-    "2001280212170a0f6f7074696f6e616c5f646f75626c65180c2001280112" .
-    "150a0d6f7074696f6e616c5f626f6f6c180d2001280812170a0f6f707469" .
-    "6f6e616c5f737472696e67180e2001280912160a0e6f7074696f6e616c5f" .
-    "6279746573180f2001280c12240a0d6f7074696f6e616c5f656e756d1810" .
-    "2001280e320d2e666f6f2e54657374456e756d122e0a106f7074696f6e61" .
-    "6c5f6d65737361676518112001280b32142e666f6f2e546573744d657373" .
-    "6167652e53756212330a196f7074696f6e616c5f696e636c756465645f6d" .
-    "65737361676518122001280b32102e6261722e54657374496e636c756465" .
-    "12230a0972656375727369766518132001280b32102e666f6f2e54657374" .
-    "4d65737361676512160a0e72657065617465645f696e743332181f200328" .
-    "0512160a0e72657065617465645f696e74363418202003280312170a0f72" .
-    "657065617465645f75696e74333218212003280d12170a0f726570656174" .
-    "65645f75696e74363418222003280412170a0f72657065617465645f7369" .
-    "6e74333218232003281112170a0f72657065617465645f73696e74363418" .
-    "242003281212180a1072657065617465645f666978656433321825200328" .
-    "0712180a1072657065617465645f6669786564363418262003280612190a" .
-    "1172657065617465645f736669786564333218272003280f12190a117265" .
-    "7065617465645f736669786564363418282003281012160a0e7265706561" .
-    "7465645f666c6f617418292003280212170a0f72657065617465645f646f" .
-    "75626c65182a2003280112150a0d72657065617465645f626f6f6c182b20" .
-    "03280812170a0f72657065617465645f737472696e67182c200328091216" .
-    "0a0e72657065617465645f6279746573182d2003280c12240a0d72657065" .
-    "617465645f656e756d182e2003280e320d2e666f6f2e54657374456e756d" .
-    "122e0a1072657065617465645f6d657373616765182f2003280b32142e66" .
-    "6f6f2e546573744d6573736167652e537562122c0a127265706561746564" .
-    "5f72656375727369766518302003280b32102e666f6f2e546573744d6573" .
-    "7361676512150a0b6f6e656f665f696e743332183320012805480012150a" .
-    "0b6f6e656f665f696e743634183420012803480012160a0c6f6e656f665f" .
-    "75696e74333218352001280d480012160a0c6f6e656f665f75696e743634" .
-    "183620012804480012160a0c6f6e656f665f73696e74333218372001280d" .
-    "480012160a0c6f6e656f665f73696e743634183820012804480012170a0d" .
-    "6f6e656f665f6669786564333218392001280d480012170a0d6f6e656f66" .
-    "5f66697865643634183a20012804480012180a0e6f6e656f665f73666978" .
-    "65643332183b2001280d480012180a0e6f6e656f665f7366697865643634" .
-    "183c20012804480012160a0c6f6e656f665f646f75626c65183d20012801" .
-    "480012150a0b6f6e656f665f666c6f6174183e20012802480012140a0a6f" .
-    "6e656f665f626f6f6c183f20012808480012160a0c6f6e656f665f737472" .
-    "696e67184020012809480012150a0b6f6e656f665f627974657318412001" .
-    "280c480012230a0a6f6e656f665f656e756d18422001280e320d2e666f6f" .
-    "2e54657374456e756d4800122d0a0d6f6e656f665f6d6573736167651843" .
-    "2001280b32142e666f6f2e546573744d6573736167652e5375624800123c" .
-    "0a0f6d61705f696e7433325f696e74333218472003280b32232e666f6f2e" .
-    "546573744d6573736167652e4d6170496e743332496e743332456e747279" .
-    "123c0a0f6d61705f696e7436345f696e74363418482003280b32232e666f" .
-    "6f2e546573744d6573736167652e4d6170496e743634496e743634456e74" .
-    "727912400a116d61705f75696e7433325f75696e74333218492003280b32" .
-    "252e666f6f2e546573744d6573736167652e4d617055696e74333255696e" .
-    "743332456e74727912400a116d61705f75696e7436345f75696e74363418" .
-    "4a2003280b32252e666f6f2e546573744d6573736167652e4d617055696e" .
-    "74363455696e743634456e74727912400a116d61705f73696e7433325f73" .
-    "696e743332184b2003280b32252e666f6f2e546573744d6573736167652e" .
-    "4d617053696e74333253696e743332456e74727912400a116d61705f7369" .
-    "6e7436345f73696e743634184c2003280b32252e666f6f2e546573744d65" .
-    "73736167652e4d617053696e74363453696e743634456e74727912440a13" .
-    "6d61705f666978656433325f66697865643332184d2003280b32272e666f" .
-    "6f2e546573744d6573736167652e4d617046697865643332466978656433" .
-    "32456e74727912440a136d61705f666978656436345f6669786564363418" .
-    "4e2003280b32272e666f6f2e546573744d6573736167652e4d6170466978" .
-    "6564363446697865643634456e74727912480a156d61705f736669786564" .
-    "33325f7366697865643332184f2003280b32292e666f6f2e546573744d65" .
-    "73736167652e4d617053666978656433325366697865643332456e747279" .
-    "12480a156d61705f73666978656436345f73666978656436341850200328" .
-    "0b32292e666f6f2e546573744d6573736167652e4d617053666978656436" .
-    "345366697865643634456e747279123c0a0f6d61705f696e7433325f666c" .
-    "6f617418512003280b32232e666f6f2e546573744d6573736167652e4d61" .
-    "70496e743332466c6f6174456e747279123e0a106d61705f696e7433325f" .
-    "646f75626c6518522003280b32242e666f6f2e546573744d657373616765" .
-    "2e4d6170496e743332446f75626c65456e74727912380a0d6d61705f626f" .
-    "6f6c5f626f6f6c18532003280b32212e666f6f2e546573744d6573736167" .
-    "652e4d6170426f6f6c426f6f6c456e74727912400a116d61705f73747269" .
-    "6e675f737472696e6718542003280b32252e666f6f2e546573744d657373" .
-    "6167652e4d6170537472696e67537472696e67456e747279123c0a0f6d61" .
-    "705f696e7433325f627974657318552003280b32232e666f6f2e54657374" .
-    "4d6573736167652e4d6170496e7433324279746573456e747279123a0a0e" .
-    "6d61705f696e7433325f656e756d18562003280b32222e666f6f2e546573" .
-    "744d6573736167652e4d6170496e743332456e756d456e74727912400a11" .
-    "6d61705f696e7433325f6d65737361676518572003280b32252e666f6f2e" .
-    "546573744d6573736167652e4d6170496e7433324d657373616765456e74" .
-    "727912390a0d6d61705f72656375727369766518582003280b32222e666f" .
-    "6f2e546573744d6573736167652e4d6170526563757273697665456e7472" .
-    "791a340a124d6170496e743332496e743332456e747279120b0a036b6579" .
-    "180120012805120d0a0576616c75651802200128053a0238011a340a124d" .
-    "6170496e743634496e743634456e747279120b0a036b6579180120012803" .
-    "120d0a0576616c75651802200128033a0238011a360a144d617055696e74" .
-    "333255696e743332456e747279120b0a036b657918012001280d120d0a05" .
-    "76616c756518022001280d3a0238011a360a144d617055696e7436345569" .
-    "6e743634456e747279120b0a036b6579180120012804120d0a0576616c75" .
-    "651802200128043a0238011a360a144d617053696e74333253696e743332" .
-    "456e747279120b0a036b6579180120012811120d0a0576616c7565180220" .
-    "0128113a0238011a360a144d617053696e74363453696e743634456e7472" .
-    "79120b0a036b6579180120012812120d0a0576616c75651802200128123a" .
-    "0238011a380a164d61704669786564333246697865643332456e74727912" .
-    "0b0a036b6579180120012807120d0a0576616c75651802200128073a0238" .
-    "011a380a164d61704669786564363446697865643634456e747279120b0a" .
-    "036b6579180120012806120d0a0576616c75651802200128063a0238011a" .
-    "3a0a184d617053666978656433325366697865643332456e747279120b0a" .
-    "036b657918012001280f120d0a0576616c756518022001280f3a0238011a" .
-    "3a0a184d617053666978656436345366697865643634456e747279120b0a" .
-    "036b6579180120012810120d0a0576616c75651802200128103a0238011a" .
-    "340a124d6170496e743332466c6f6174456e747279120b0a036b65791801" .
-    "20012805120d0a0576616c75651802200128023a0238011a350a134d6170" .
-    "496e743332446f75626c65456e747279120b0a036b657918012001280512" .
-    "0d0a0576616c75651802200128013a0238011a320a104d6170426f6f6c42" .
-    "6f6f6c456e747279120b0a036b6579180120012808120d0a0576616c7565" .
-    "1802200128083a0238011a360a144d6170537472696e67537472696e6745" .
-    "6e747279120b0a036b6579180120012809120d0a0576616c756518022001" .
-    "28093a0238011a340a124d6170496e7433324279746573456e747279120b" .
-    "0a036b6579180120012805120d0a0576616c756518022001280c3a023801" .
-    "1a420a114d6170496e743332456e756d456e747279120b0a036b65791801" .
-    "20012805121c0a0576616c756518022001280e320d2e666f6f2e54657374" .
-    "456e756d3a0238011a4c0a144d6170496e7433324d657373616765456e74" .
-    "7279120b0a036b657918012001280512230a0576616c756518022001280b" .
-    "32142e666f6f2e546573744d6573736167652e5375623a0238011a450a11" .
-    "4d6170526563757273697665456e747279120b0a036b6579180120012805" .
-    "121f0a0576616c756518022001280b32102e666f6f2e546573744d657373" .
-    "6167653a0238011a100a0353756212090a0161180120012805420a0a086d" .
-    "795f6f6e656f6622b7030a11546573745061636b65644d65737361676512" .
-    "1a0a0e72657065617465645f696e743332185a2003280542021001121a0a" .
-    "0e72657065617465645f696e743634185b2003280342021001121b0a0f72" .
-    "657065617465645f75696e743332185c2003280d42021001121b0a0f7265" .
-    "7065617465645f75696e743634185d2003280442021001121b0a0f726570" .
-    "65617465645f73696e743332185e2003281142021001121b0a0f72657065" .
-    "617465645f73696e743634185f2003281242021001121c0a107265706561" .
-    "7465645f6669786564333218602003280742021001121c0a107265706561" .
-    "7465645f6669786564363418612003280642021001121d0a117265706561" .
-    "7465645f736669786564333218622003280f42021001121d0a1172657065" .
-    "617465645f736669786564363418632003281042021001121a0a0e726570" .
-    "65617465645f666c6f617418642003280242021001121b0a0f7265706561" .
-    "7465645f646f75626c651865200328014202100112190a0d726570656174" .
-    "65645f626f6f6c1866200328084202100112280a0d72657065617465645f" .
-    "656e756d18672003280e320d2e666f6f2e54657374456e756d4202100122" .
-    "b9030a1354657374556e7061636b65644d657373616765121a0a0e726570" .
-    "65617465645f696e743332185a2003280542021000121a0a0e7265706561" .
-    "7465645f696e743634185b2003280342021000121b0a0f72657065617465" .
-    "645f75696e743332185c2003280d42021000121b0a0f7265706561746564" .
-    "5f75696e743634185d2003280442021000121b0a0f72657065617465645f" .
-    "73696e743332185e2003281142021000121b0a0f72657065617465645f73" .
-    "696e743634185f2003281242021000121c0a1072657065617465645f6669" .
-    "786564333218602003280742021000121c0a1072657065617465645f6669" .
-    "786564363418612003280642021000121d0a1172657065617465645f7366" .
-    "69786564333218622003280f42021000121d0a1172657065617465645f73" .
-    "6669786564363418632003281042021000121a0a0e72657065617465645f" .
-    "666c6f617418642003280242021000121b0a0f72657065617465645f646f" .
-    "75626c651865200328014202100012190a0d72657065617465645f626f6f" .
-    "6c1866200328084202100012280a0d72657065617465645f656e756d1867" .
-    "2003280e320d2e666f6f2e54657374456e756d4202100022170a0a546573" .
-    "74506870446f6312090a01611801200128052a1d0a0854657374456e756d" .
-    "12080a045a45524f100012070a034f4e451001620670726f746f33"
-));
-
diff --git a/php/tests/test.sh b/php/tests/test.sh
index a6ca89b..3635d86 100755
--- a/php/tests/test.sh
+++ b/php/tests/test.sh
@@ -1,14 +1,11 @@
 #!/bin/bash
 
-# Generate test file
-../../src/protoc --php_out=. test.proto test_include.proto
-
 # Compile c extension
 pushd ../ext/google/protobuf/
 make clean
 set -e
 # Add following in configure for debug: --enable-debug CFLAGS='-g -O0'
-phpize && ./configure && make
+phpize && ./configure  --enable-debug CFLAGS='-g -O0' && make
 popd
 
 tests=( array_test.php encode_decode_test.php generated_class_test.php map_field_test.php well_known_test.php )
@@ -18,7 +15,7 @@
   echo "****************************"
   echo "* $t"
   echo "****************************"
-  php -dextension=../ext/google/protobuf/modules/protobuf.so `which phpunit` $t
+  php -dextension=../ext/google/protobuf/modules/protobuf.so `which phpunit` --bootstrap autoload.php $t
   echo ""
 done
 
diff --git a/php/tests/test_include.pb.php b/php/tests/test_include.pb.php
deleted file mode 100644
index 11ff59c..0000000
--- a/php/tests/test_include.pb.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: test_include.proto
-
-namespace Bar;
-
-use Google\Protobuf\Internal\DescriptorPool;
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-/**
- * Protobuf type <code>bar.TestInclude</code>
- */
-class TestInclude extends \Google\Protobuf\Internal\Message
-{
-    /**
-     * <code>optional int32 a = 1;</code>
-     */
-    private $a = 0;
-
-    /**
-     * <code>optional int32 a = 1;</code>
-     */
-    public function getA()
-    {
-        return $this->a;
-    }
-
-    /**
-     * <code>optional int32 a = 1;</code>
-     */
-    public function setA($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->a = $var;
-    }
-
-}
-
-$pool = DescriptorPool::getGeneratedPool();
-
-$pool->internalAddGeneratedFile(hex2bin(
-    "0a3b0a12746573745f696e636c7564652e70726f746f120362617222180a" .
-    "0b54657374496e636c75646512090a0161180120012805620670726f746f" .
-    "33"
-));
-
diff --git a/php/tests/test_no_namespace.pb.php b/php/tests/test_no_namespace.pb.php
deleted file mode 100644
index 2f92c95..0000000
--- a/php/tests/test_no_namespace.pb.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: test_no_namespace.proto
-
-use Google\Protobuf\Internal\DescriptorPool;
-use Google\Protobuf\Internal\GPBType;
-use Google\Protobuf\Internal\RepeatedField;
-use Google\Protobuf\Internal\GPBUtil;
-
-class NoNameSpace extends \Google\Protobuf\Internal\Message
-{
-    private $a = 0;
-
-    public function getA()
-    {
-        return $this->a;
-    }
-
-    public function setA($var)
-    {
-        GPBUtil::checkInt32($var);
-        $this->a = $var;
-    }
-
-}
-
-$pool = DescriptorPool::getGeneratedPool();
-
-$pool->internalAddGeneratedFile(hex2bin(
-    "0a3b0a17746573745f6e6f5f6e616d6573706163652e70726f746f22180a" .
-    "0b4e6f4e616d65537061636512090a0161180120012805620670726f746f" .
-    "33"
-));
-
diff --git a/php/tests/well_known_test.php b/php/tests/well_known_test.php
index 30715ba..40ff1c8 100644
--- a/php/tests/well_known_test.php
+++ b/php/tests/well_known_test.php
@@ -1,7 +1,5 @@
 <?php
 
-require_once("google/protobuf/empty.pb.php");
-
 use Google\Protobuf\GPBEmpty;
 
 class WellKnownTest extends PHPUnit_Framework_TestCase {